x86/microcode: Use the firmware_loader built-in API
authorBorislav Petkov <bp@suse.de>
Thu, 21 Oct 2021 15:58:36 +0000 (08:58 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 22 Oct 2021 12:13:50 +0000 (14:13 +0200)
The microcode loader has been looping through __start_builtin_fw down to
__end_builtin_fw to look for possibly built-in firmware for microcode
updates.

Now that the firmware loader code has exported an API for looping
through the kernel's built-in firmware section, use it and drop the x86
implementation in favor.

Signed-off-by: Borislav Petkov <bp@suse.de>
Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
Link: https://lore.kernel.org/r/20211021155843.1969401-4-mcgrof@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/x86/include/asm/microcode.h
arch/x86/kernel/cpu/microcode/amd.c
arch/x86/kernel/cpu/microcode/core.c
arch/x86/kernel/cpu/microcode/intel.c

index ab45a22..d6bfdfb 100644 (file)
@@ -130,14 +130,11 @@ static inline unsigned int x86_cpuid_family(void)
 extern void __init load_ucode_bsp(void);
 extern void load_ucode_ap(void);
 void reload_early_microcode(void);
-extern bool get_builtin_firmware(struct cpio_data *cd, const char *name);
 extern bool initrd_gone;
 #else
 static inline void __init load_ucode_bsp(void)                 { }
 static inline void load_ucode_ap(void)                         { }
 static inline void reload_early_microcode(void)                        { }
-static inline bool
-get_builtin_firmware(struct cpio_data *cd, const char *name)   { return false; }
 #endif
 
 #endif /* _ASM_X86_MICROCODE_H */
index 3d4a483..8b2fcdf 100644 (file)
@@ -456,17 +456,23 @@ apply_microcode_early_amd(u32 cpuid_1_eax, void *ucode, size_t size, bool save_p
 
 static bool get_builtin_microcode(struct cpio_data *cp, unsigned int family)
 {
-#ifdef CONFIG_X86_64
        char fw_name[36] = "amd-ucode/microcode_amd.bin";
+       struct firmware fw;
+
+       if (IS_ENABLED(CONFIG_X86_32))
+               return false;
 
        if (family >= 0x15)
                snprintf(fw_name, sizeof(fw_name),
                         "amd-ucode/microcode_amd_fam%.2xh.bin", family);
 
-       return get_builtin_firmware(cp, fw_name);
-#else
+       if (firmware_request_builtin(&fw, fw_name)) {
+               cp->size = fw.size;
+               cp->data = (void *)fw.data;
+               return true;
+       }
+
        return false;
-#endif
 }
 
 static void __load_ucode_amd(unsigned int cpuid_1_eax, struct cpio_data *ret)
index efb69be..f955d25 100644 (file)
@@ -140,23 +140,6 @@ static bool __init check_loader_disabled_bsp(void)
        return *res;
 }
 
-extern struct builtin_fw __start_builtin_fw[];
-extern struct builtin_fw __end_builtin_fw[];
-
-bool get_builtin_firmware(struct cpio_data *cd, const char *name)
-{
-       struct builtin_fw *b_fw;
-
-       for (b_fw = __start_builtin_fw; b_fw != __end_builtin_fw; b_fw++) {
-               if (!strcmp(name, b_fw->name)) {
-                       cd->size = b_fw->size;
-                       cd->data = b_fw->data;
-                       return true;
-               }
-       }
-       return false;
-}
-
 void __init load_ucode_bsp(void)
 {
        unsigned int cpuid_1_eax;
index 7e8e07b..d28a9f8 100644 (file)
@@ -456,6 +456,7 @@ static void save_mc_for_early(struct ucode_cpu_info *uci, u8 *mc, unsigned int s
 static bool load_builtin_intel_microcode(struct cpio_data *cp)
 {
        unsigned int eax = 1, ebx, ecx = 0, edx;
+       struct firmware fw;
        char name[30];
 
        if (IS_ENABLED(CONFIG_X86_32))
@@ -466,7 +467,13 @@ static bool load_builtin_intel_microcode(struct cpio_data *cp)
        sprintf(name, "intel-ucode/%02x-%02x-%02x",
                      x86_family(eax), x86_model(eax), x86_stepping(eax));
 
-       return get_builtin_firmware(cp, name);
+       if (firmware_request_builtin(&fw, name)) {
+               cp->size = fw.size;
+               cp->data = (void *)fw.data;
+               return true;
+       }
+
+       return false;
 }
 
 /*