Skip to content

Commit d02a0ef

Browse files
KAGA-KOKObp3tk0v
authored andcommitted
x86/microcode: Move core specific defines to local header
There is no reason to expose all of this globally. Move everything which is not required outside of the microcode specific code to local header files and into the respective source files. No functional change. Signed-off-by: Thomas Gleixner <[email protected]> Signed-off-by: Borislav Petkov (AMD) <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent b0e67db commit d02a0ef

File tree

7 files changed

+223
-227
lines changed

7 files changed

+223
-227
lines changed

arch/x86/include/asm/microcode.h

Lines changed: 47 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -2,138 +2,77 @@
22
#ifndef _ASM_X86_MICROCODE_H
33
#define _ASM_X86_MICROCODE_H
44

5-
#include <linux/earlycpio.h>
6-
#include <linux/initrd.h>
7-
8-
#include <asm/cpu.h>
9-
#include <asm/microcode_amd.h>
10-
#include <asm/microcode_intel.h>
11-
12-
struct ucode_patch {
13-
struct list_head plist;
14-
void *data; /* Intel uses only this one */
15-
unsigned int size;
16-
u32 patch_id;
17-
u16 equiv_cpu;
18-
};
19-
20-
extern struct list_head microcode_cache;
21-
225
struct cpu_signature {
236
unsigned int sig;
247
unsigned int pf;
258
unsigned int rev;
269
};
2710

28-
struct device;
29-
30-
enum ucode_state {
31-
UCODE_OK = 0,
32-
UCODE_NEW,
33-
UCODE_UPDATED,
34-
UCODE_NFOUND,
35-
UCODE_ERROR,
36-
};
37-
38-
struct microcode_ops {
39-
enum ucode_state (*request_microcode_fw) (int cpu, struct device *);
40-
41-
void (*microcode_fini_cpu) (int cpu);
42-
43-
/*
44-
* The generic 'microcode_core' part guarantees that
45-
* the callbacks below run on a target cpu when they
46-
* are being called.
47-
* See also the "Synchronization" section in microcode_core.c.
48-
*/
49-
enum ucode_state (*apply_microcode) (int cpu);
50-
int (*collect_cpu_info) (int cpu, struct cpu_signature *csig);
51-
};
52-
5311
struct ucode_cpu_info {
5412
struct cpu_signature cpu_sig;
5513
void *mc;
5614
};
57-
extern struct ucode_cpu_info ucode_cpu_info[];
58-
struct cpio_data find_microcode_in_initrd(const char *path, bool use_pa);
5915

60-
#ifdef CONFIG_CPU_SUP_INTEL
61-
extern struct microcode_ops * __init init_intel_microcode(void);
62-
#else
63-
static inline struct microcode_ops * __init init_intel_microcode(void)
64-
{
65-
return NULL;
66-
}
67-
#endif /* CONFIG_CPU_SUP_INTEL */
68-
69-
#ifdef CONFIG_CPU_SUP_AMD
70-
extern struct microcode_ops * __init init_amd_microcode(void);
71-
extern void __exit exit_amd_microcode(void);
16+
#ifdef CONFIG_MICROCODE
17+
void load_ucode_bsp(void);
18+
void load_ucode_ap(void);
19+
void microcode_bsp_resume(void);
7220
#else
73-
static inline struct microcode_ops * __init init_amd_microcode(void)
74-
{
75-
return NULL;
76-
}
77-
static inline void __exit exit_amd_microcode(void) {}
21+
static inline void load_ucode_bsp(void) { }
22+
static inline void load_ucode_ap(void) { }
23+
static inline void microcode_bsp_resume(void) { }
7824
#endif
7925

80-
#define MAX_UCODE_COUNT 128
26+
#ifdef CONFIG_CPU_SUP_INTEL
27+
/* Intel specific microcode defines. Public for IFS */
28+
struct microcode_header_intel {
29+
unsigned int hdrver;
30+
unsigned int rev;
31+
unsigned int date;
32+
unsigned int sig;
33+
unsigned int cksum;
34+
unsigned int ldrver;
35+
unsigned int pf;
36+
unsigned int datasize;
37+
unsigned int totalsize;
38+
unsigned int metasize;
39+
unsigned int reserved[2];
40+
};
8141

82-
#define QCHAR(a, b, c, d) ((a) + ((b) << 8) + ((c) << 16) + ((d) << 24))
83-
#define CPUID_INTEL1 QCHAR('G', 'e', 'n', 'u')
84-
#define CPUID_INTEL2 QCHAR('i', 'n', 'e', 'I')
85-
#define CPUID_INTEL3 QCHAR('n', 't', 'e', 'l')
86-
#define CPUID_AMD1 QCHAR('A', 'u', 't', 'h')
87-
#define CPUID_AMD2 QCHAR('e', 'n', 't', 'i')
88-
#define CPUID_AMD3 QCHAR('c', 'A', 'M', 'D')
42+
struct microcode_intel {
43+
struct microcode_header_intel hdr;
44+
unsigned int bits[];
45+
};
8946

90-
#define CPUID_IS(a, b, c, ebx, ecx, edx) \
91-
(!((ebx ^ (a))|(edx ^ (b))|(ecx ^ (c))))
47+
#define DEFAULT_UCODE_DATASIZE (2000)
48+
#define MC_HEADER_SIZE (sizeof(struct microcode_header_intel))
49+
#define MC_HEADER_TYPE_MICROCODE 1
50+
#define MC_HEADER_TYPE_IFS 2
9251

93-
/*
94-
* In early loading microcode phase on BSP, boot_cpu_data is not set up yet.
95-
* x86_cpuid_vendor() gets vendor id for BSP.
96-
*
97-
* In 32 bit AP case, accessing boot_cpu_data needs linear address. To simplify
98-
* coding, we still use x86_cpuid_vendor() to get vendor id for AP.
99-
*
100-
* x86_cpuid_vendor() gets vendor information directly from CPUID.
101-
*/
102-
static inline int x86_cpuid_vendor(void)
52+
static inline int intel_microcode_get_datasize(struct microcode_header_intel *hdr)
10353
{
104-
u32 eax = 0x00000000;
105-
u32 ebx, ecx = 0, edx;
106-
107-
native_cpuid(&eax, &ebx, &ecx, &edx);
108-
109-
if (CPUID_IS(CPUID_INTEL1, CPUID_INTEL2, CPUID_INTEL3, ebx, ecx, edx))
110-
return X86_VENDOR_INTEL;
111-
112-
if (CPUID_IS(CPUID_AMD1, CPUID_AMD2, CPUID_AMD3, ebx, ecx, edx))
113-
return X86_VENDOR_AMD;
114-
115-
return X86_VENDOR_UNKNOWN;
54+
return hdr->datasize ? : DEFAULT_UCODE_DATASIZE;
11655
}
11756

118-
static inline unsigned int x86_cpuid_family(void)
57+
static inline u32 intel_get_microcode_revision(void)
11958
{
120-
u32 eax = 0x00000001;
121-
u32 ebx, ecx = 0, edx;
59+
u32 rev, dummy;
60+
61+
native_wrmsrl(MSR_IA32_UCODE_REV, 0);
12262

123-
native_cpuid(&eax, &ebx, &ecx, &edx);
63+
/* As documented in the SDM: Do a CPUID 1 here */
64+
native_cpuid_eax(1);
12465

125-
return x86_family(eax);
66+
/* get the current revision from MSR 0x8B */
67+
native_rdmsr(MSR_IA32_UCODE_REV, dummy, rev);
68+
69+
return rev;
12670
}
12771

128-
#ifdef CONFIG_MICROCODE
129-
extern void __init load_ucode_bsp(void);
130-
extern void load_ucode_ap(void);
131-
extern bool initrd_gone;
132-
void microcode_bsp_resume(void);
133-
#else
134-
static inline void __init load_ucode_bsp(void) { }
135-
static inline void load_ucode_ap(void) { }
136-
static inline void microcode_bsp_resume(void) { }
137-
#endif
72+
void show_ucode_info_early(void);
73+
74+
#else /* CONFIG_CPU_SUP_INTEL */
75+
static inline void show_ucode_info_early(void) { }
76+
#endif /* !CONFIG_CPU_SUP_INTEL */
13877

13978
#endif /* _ASM_X86_MICROCODE_H */

arch/x86/include/asm/microcode_amd.h

Lines changed: 0 additions & 54 deletions
This file was deleted.

arch/x86/include/asm/microcode_intel.h

Lines changed: 0 additions & 63 deletions
This file was deleted.

arch/x86/kernel/cpu/microcode/amd.c

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,47 @@
3535
#include <asm/cpu.h>
3636
#include <asm/msr.h>
3737

38+
#include "internal.h"
39+
40+
#define UCODE_MAGIC 0x00414d44
41+
#define UCODE_EQUIV_CPU_TABLE_TYPE 0x00000000
42+
#define UCODE_UCODE_TYPE 0x00000001
43+
44+
#define SECTION_HDR_SIZE 8
45+
#define CONTAINER_HDR_SZ 12
46+
47+
struct equiv_cpu_entry {
48+
u32 installed_cpu;
49+
u32 fixed_errata_mask;
50+
u32 fixed_errata_compare;
51+
u16 equiv_cpu;
52+
u16 res;
53+
} __packed;
54+
55+
struct microcode_header_amd {
56+
u32 data_code;
57+
u32 patch_id;
58+
u16 mc_patch_data_id;
59+
u8 mc_patch_data_len;
60+
u8 init_flag;
61+
u32 mc_patch_data_checksum;
62+
u32 nb_dev_id;
63+
u32 sb_dev_id;
64+
u16 processor_rev_id;
65+
u8 nb_rev_id;
66+
u8 sb_rev_id;
67+
u8 bios_api_rev;
68+
u8 reserved1[3];
69+
u32 match_reg[8];
70+
} __packed;
71+
72+
struct microcode_amd {
73+
struct microcode_header_amd hdr;
74+
unsigned int mpb[];
75+
};
76+
77+
#define PATCH_MAX_SIZE (3 * PAGE_SIZE)
78+
3879
static struct equiv_cpu_table {
3980
unsigned int num_entries;
4081
struct equiv_cpu_entry *entry;

arch/x86/kernel/cpu/microcode/core.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,12 @@
3333

3434
#include <asm/cpu_device_id.h>
3535
#include <asm/perf_event.h>
36-
#include <asm/microcode.h>
3736
#include <asm/processor.h>
3837
#include <asm/cmdline.h>
3938
#include <asm/setup.h>
4039

40+
#include "internal.h"
41+
4142
#define DRIVER_VERSION "2.2"
4243

4344
static struct microcode_ops *microcode_ops;

arch/x86/kernel/cpu/microcode/intel.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,12 @@
3232

3333
#include <asm/intel-family.h>
3434
#include <asm/processor.h>
35-
#include <asm/microcode.h>
3635
#include <asm/tlbflush.h>
3736
#include <asm/setup.h>
3837
#include <asm/msr.h>
3938

39+
#include "internal.h"
40+
4041
static const char ucode_path[] = "kernel/x86/microcode/GenuineIntel.bin";
4142

4243
/* Current microcode patch used in early patching on the APs. */

0 commit comments

Comments
 (0)