}
 #endif /* CONFIG_X86_VMX_FEATURE_NAMES */
 
+static void clear_sgx_caps(void)
+{
+       setup_clear_cpu_cap(X86_FEATURE_SGX);
+       setup_clear_cpu_cap(X86_FEATURE_SGX_LC);
+}
+
 void init_ia32_feat_ctl(struct cpuinfo_x86 *c)
 {
        bool tboot = tboot_enabled();
+       bool enable_sgx;
        u64 msr;
 
        if (rdmsrl_safe(MSR_IA32_FEAT_CTL, &msr)) {
                clear_cpu_cap(c, X86_FEATURE_VMX);
+               clear_sgx_caps();
                return;
        }
 
+       /*
+        * Enable SGX if and only if the kernel supports SGX and Launch Control
+        * is supported, i.e. disable SGX if the LE hash MSRs can't be written.
+        */
+       enable_sgx = cpu_has(c, X86_FEATURE_SGX) &&
+                    cpu_has(c, X86_FEATURE_SGX_LC) &&
+                    IS_ENABLED(CONFIG_X86_SGX);
+
        if (msr & FEAT_CTL_LOCKED)
                goto update_caps;
 
                        msr |= FEAT_CTL_VMX_ENABLED_INSIDE_SMX;
        }
 
+       if (enable_sgx)
+               msr |= FEAT_CTL_SGX_ENABLED | FEAT_CTL_SGX_LC_ENABLED;
+
        wrmsrl(MSR_IA32_FEAT_CTL, msr);
 
 update_caps:
        set_cpu_cap(c, X86_FEATURE_MSR_IA32_FEAT_CTL);
 
        if (!cpu_has(c, X86_FEATURE_VMX))
-               return;
+               goto update_sgx;
 
        if ( (tboot && !(msr & FEAT_CTL_VMX_ENABLED_INSIDE_SMX)) ||
            (!tboot && !(msr & FEAT_CTL_VMX_ENABLED_OUTSIDE_SMX))) {
                init_vmx_capabilities(c);
 #endif
        }
+
+update_sgx:
+       if (!(msr & FEAT_CTL_SGX_ENABLED) ||
+           !(msr & FEAT_CTL_SGX_LC_ENABLED) || !enable_sgx) {
+               if (enable_sgx)
+                       pr_err_once("SGX disabled by BIOS\n");
+               clear_sgx_caps();
+       }
 }