diff options
Diffstat (limited to 'arch/x86/include/asm/microcode_amd.h')
-rw-r--r-- | arch/x86/include/asm/microcode_amd.h | 78 |
1 files changed, 78 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 */ | ||