diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-07-02 19:28:10 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-07-02 19:28:10 -0400 |
commit | fdd78889aad2ec85b2f5a8ed232215dca7a22a3b (patch) | |
tree | d99e66e9afe26bebf89204d15443c42b9345bc21 /arch/x86/include | |
parent | d652df0b2f0b9c2e655be0d6f90989fae0a511b4 (diff) | |
parent | 9608d33b8210c993af4430d661a6474946480c9b (diff) |
Merge branch 'x86-microcode-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 microcode loading update from Ingo Molnar:
"Two main changes that improve microcode loading on AMD CPUs:
- Add support for all-in-one binary microcode files that concatenate
the microcode images of multiple processor families, by Jacob Shin
- Add early microcode loading (embedded in the initrd) support, also
by Jacob Shin"
* 'x86-microcode-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
x86, microcode, amd: Another early loading fixup
x86, microcode, amd: Allow multiple families' bin files appended together
x86, microcode, amd: Make find_ucode_in_initrd() __init
x86, microcode, amd: Fix warnings and errors on with CONFIG_MICROCODE=m
x86, microcode, amd: Early microcode patch loading support for AMD
x86, microcode, amd: Refactor functions to prepare for early loading
x86, microcode: Vendor abstract out save_microcode_in_initrd()
x86, microcode, intel: Correct typo in printk
Diffstat (limited to 'arch/x86/include')
-rw-r--r-- | arch/x86/include/asm/microcode_amd.h | 78 | ||||
-rw-r--r-- | arch/x86/include/asm/microcode_intel.h | 2 |
2 files changed, 80 insertions, 0 deletions
diff --git a/arch/x86/include/asm/microcode_amd.h b/arch/x86/include/asm/microcode_amd.h new file mode 100644 index 000000000000..c6b043f40271 --- /dev/null +++ b/arch/x86/include/asm/microcode_amd.h | |||
@@ -0,0 +1,78 @@ | |||
1 | #ifndef _ASM_X86_MICROCODE_AMD_H | ||
2 | #define _ASM_X86_MICROCODE_AMD_H | ||
3 | |||
4 | #include <asm/microcode.h> | ||
5 | |||
6 | #define UCODE_MAGIC 0x00414d44 | ||
7 | #define UCODE_EQUIV_CPU_TABLE_TYPE 0x00000000 | ||
8 | #define UCODE_UCODE_TYPE 0x00000001 | ||
9 | |||
10 | #define SECTION_HDR_SIZE 8 | ||
11 | #define CONTAINER_HDR_SZ 12 | ||
12 | |||
13 | struct equiv_cpu_entry { | ||
14 | u32 installed_cpu; | ||
15 | u32 fixed_errata_mask; | ||
16 | u32 fixed_errata_compare; | ||
17 | u16 equiv_cpu; | ||
18 | u16 res; | ||
19 | } __attribute__((packed)); | ||
20 | |||
21 | struct microcode_header_amd { | ||
22 | u32 data_code; | ||
23 | u32 patch_id; | ||
24 | u16 mc_patch_data_id; | ||
25 | u8 mc_patch_data_len; | ||
26 | u8 init_flag; | ||
27 | u32 mc_patch_data_checksum; | ||
28 | u32 nb_dev_id; | ||
29 | u32 sb_dev_id; | ||
30 | u16 processor_rev_id; | ||
31 | u8 nb_rev_id; | ||
32 | u8 sb_rev_id; | ||
33 | u8 bios_api_rev; | ||
34 | u8 reserved1[3]; | ||
35 | u32 match_reg[8]; | ||
36 | } __attribute__((packed)); | ||
37 | |||
38 | struct microcode_amd { | ||
39 | struct microcode_header_amd hdr; | ||
40 | unsigned int mpb[0]; | ||
41 | }; | ||
42 | |||
43 | static inline u16 find_equiv_id(struct equiv_cpu_entry *equiv_cpu_table, | ||
44 | unsigned int sig) | ||
45 | { | ||
46 | int i = 0; | ||
47 | |||
48 | if (!equiv_cpu_table) | ||
49 | return 0; | ||
50 | |||
51 | while (equiv_cpu_table[i].installed_cpu != 0) { | ||
52 | if (sig == equiv_cpu_table[i].installed_cpu) | ||
53 | return equiv_cpu_table[i].equiv_cpu; | ||
54 | |||
55 | i++; | ||
56 | } | ||
57 | return 0; | ||
58 | } | ||
59 | |||
60 | extern int __apply_microcode_amd(struct microcode_amd *mc_amd); | ||
61 | extern int apply_microcode_amd(int cpu); | ||
62 | extern enum ucode_state load_microcode_amd(int cpu, const u8 *data, size_t size); | ||
63 | |||
64 | #ifdef CONFIG_MICROCODE_AMD_EARLY | ||
65 | #ifdef CONFIG_X86_32 | ||
66 | #define MPB_MAX_SIZE PAGE_SIZE | ||
67 | extern u8 amd_bsp_mpb[MPB_MAX_SIZE]; | ||
68 | #endif | ||
69 | extern void __init load_ucode_amd_bsp(void); | ||
70 | extern void __cpuinit load_ucode_amd_ap(void); | ||
71 | extern int __init save_microcode_in_initrd_amd(void); | ||
72 | #else | ||
73 | static inline void __init load_ucode_amd_bsp(void) {} | ||
74 | static inline void __cpuinit load_ucode_amd_ap(void) {} | ||
75 | static inline int __init save_microcode_in_initrd_amd(void) { return -EINVAL; } | ||
76 | #endif | ||
77 | |||
78 | #endif /* _ASM_X86_MICROCODE_AMD_H */ | ||
diff --git a/arch/x86/include/asm/microcode_intel.h b/arch/x86/include/asm/microcode_intel.h index 5356f927d411..87a085333cbf 100644 --- a/arch/x86/include/asm/microcode_intel.h +++ b/arch/x86/include/asm/microcode_intel.h | |||
@@ -67,10 +67,12 @@ update_match_revision(struct microcode_header_intel *mc_header, int rev); | |||
67 | extern void __init load_ucode_intel_bsp(void); | 67 | extern void __init load_ucode_intel_bsp(void); |
68 | extern void __cpuinit load_ucode_intel_ap(void); | 68 | extern void __cpuinit load_ucode_intel_ap(void); |
69 | extern void show_ucode_info_early(void); | 69 | extern void show_ucode_info_early(void); |
70 | extern int __init save_microcode_in_initrd_intel(void); | ||
70 | #else | 71 | #else |
71 | static inline __init void load_ucode_intel_bsp(void) {} | 72 | static inline __init void load_ucode_intel_bsp(void) {} |
72 | static inline __cpuinit void load_ucode_intel_ap(void) {} | 73 | static inline __cpuinit void load_ucode_intel_ap(void) {} |
73 | static inline void show_ucode_info_early(void) {} | 74 | static inline void show_ucode_info_early(void) {} |
75 | static inline int __init save_microcode_in_initrd_intel(void) { return -EINVAL; } | ||
74 | #endif | 76 | #endif |
75 | 77 | ||
76 | #if defined(CONFIG_MICROCODE_INTEL_EARLY) && defined(CONFIG_HOTPLUG_CPU) | 78 | #if defined(CONFIG_MICROCODE_INTEL_EARLY) && defined(CONFIG_HOTPLUG_CPU) |