mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-12 12:59:51 +00:00
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 <tglx@linutronix.de> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Link: https://lore.kernel.org/r/20230812195727.952876381@linutronix.de
This commit is contained in:
committed by
Borislav Petkov (AMD)
parent
b0e67db12d
commit
d02a0efd0f
@@ -2,138 +2,77 @@
|
||||
#ifndef _ASM_X86_MICROCODE_H
|
||||
#define _ASM_X86_MICROCODE_H
|
||||
|
||||
#include <linux/earlycpio.h>
|
||||
#include <linux/initrd.h>
|
||||
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/microcode_amd.h>
|
||||
#include <asm/microcode_intel.h>
|
||||
|
||||
struct ucode_patch {
|
||||
struct list_head plist;
|
||||
void *data; /* Intel uses only this one */
|
||||
unsigned int size;
|
||||
u32 patch_id;
|
||||
u16 equiv_cpu;
|
||||
};
|
||||
|
||||
extern struct list_head microcode_cache;
|
||||
|
||||
struct cpu_signature {
|
||||
unsigned int sig;
|
||||
unsigned int pf;
|
||||
unsigned int rev;
|
||||
};
|
||||
|
||||
struct device;
|
||||
|
||||
enum ucode_state {
|
||||
UCODE_OK = 0,
|
||||
UCODE_NEW,
|
||||
UCODE_UPDATED,
|
||||
UCODE_NFOUND,
|
||||
UCODE_ERROR,
|
||||
};
|
||||
|
||||
struct microcode_ops {
|
||||
enum ucode_state (*request_microcode_fw) (int cpu, struct device *);
|
||||
|
||||
void (*microcode_fini_cpu) (int cpu);
|
||||
|
||||
/*
|
||||
* The generic 'microcode_core' part guarantees that
|
||||
* the callbacks below run on a target cpu when they
|
||||
* are being called.
|
||||
* See also the "Synchronization" section in microcode_core.c.
|
||||
*/
|
||||
enum ucode_state (*apply_microcode) (int cpu);
|
||||
int (*collect_cpu_info) (int cpu, struct cpu_signature *csig);
|
||||
};
|
||||
|
||||
struct ucode_cpu_info {
|
||||
struct cpu_signature cpu_sig;
|
||||
void *mc;
|
||||
};
|
||||
extern struct ucode_cpu_info ucode_cpu_info[];
|
||||
struct cpio_data find_microcode_in_initrd(const char *path, bool use_pa);
|
||||
|
||||
#ifdef CONFIG_CPU_SUP_INTEL
|
||||
extern struct microcode_ops * __init init_intel_microcode(void);
|
||||
#else
|
||||
static inline struct microcode_ops * __init init_intel_microcode(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
#endif /* CONFIG_CPU_SUP_INTEL */
|
||||
|
||||
#ifdef CONFIG_CPU_SUP_AMD
|
||||
extern struct microcode_ops * __init init_amd_microcode(void);
|
||||
extern void __exit exit_amd_microcode(void);
|
||||
#else
|
||||
static inline struct microcode_ops * __init init_amd_microcode(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
static inline void __exit exit_amd_microcode(void) {}
|
||||
#endif
|
||||
|
||||
#define MAX_UCODE_COUNT 128
|
||||
|
||||
#define QCHAR(a, b, c, d) ((a) + ((b) << 8) + ((c) << 16) + ((d) << 24))
|
||||
#define CPUID_INTEL1 QCHAR('G', 'e', 'n', 'u')
|
||||
#define CPUID_INTEL2 QCHAR('i', 'n', 'e', 'I')
|
||||
#define CPUID_INTEL3 QCHAR('n', 't', 'e', 'l')
|
||||
#define CPUID_AMD1 QCHAR('A', 'u', 't', 'h')
|
||||
#define CPUID_AMD2 QCHAR('e', 'n', 't', 'i')
|
||||
#define CPUID_AMD3 QCHAR('c', 'A', 'M', 'D')
|
||||
|
||||
#define CPUID_IS(a, b, c, ebx, ecx, edx) \
|
||||
(!((ebx ^ (a))|(edx ^ (b))|(ecx ^ (c))))
|
||||
|
||||
/*
|
||||
* In early loading microcode phase on BSP, boot_cpu_data is not set up yet.
|
||||
* x86_cpuid_vendor() gets vendor id for BSP.
|
||||
*
|
||||
* In 32 bit AP case, accessing boot_cpu_data needs linear address. To simplify
|
||||
* coding, we still use x86_cpuid_vendor() to get vendor id for AP.
|
||||
*
|
||||
* x86_cpuid_vendor() gets vendor information directly from CPUID.
|
||||
*/
|
||||
static inline int x86_cpuid_vendor(void)
|
||||
{
|
||||
u32 eax = 0x00000000;
|
||||
u32 ebx, ecx = 0, edx;
|
||||
|
||||
native_cpuid(&eax, &ebx, &ecx, &edx);
|
||||
|
||||
if (CPUID_IS(CPUID_INTEL1, CPUID_INTEL2, CPUID_INTEL3, ebx, ecx, edx))
|
||||
return X86_VENDOR_INTEL;
|
||||
|
||||
if (CPUID_IS(CPUID_AMD1, CPUID_AMD2, CPUID_AMD3, ebx, ecx, edx))
|
||||
return X86_VENDOR_AMD;
|
||||
|
||||
return X86_VENDOR_UNKNOWN;
|
||||
}
|
||||
|
||||
static inline unsigned int x86_cpuid_family(void)
|
||||
{
|
||||
u32 eax = 0x00000001;
|
||||
u32 ebx, ecx = 0, edx;
|
||||
|
||||
native_cpuid(&eax, &ebx, &ecx, &edx);
|
||||
|
||||
return x86_family(eax);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MICROCODE
|
||||
extern void __init load_ucode_bsp(void);
|
||||
extern void load_ucode_ap(void);
|
||||
extern bool initrd_gone;
|
||||
void load_ucode_bsp(void);
|
||||
void load_ucode_ap(void);
|
||||
void microcode_bsp_resume(void);
|
||||
#else
|
||||
static inline void __init load_ucode_bsp(void) { }
|
||||
static inline void load_ucode_ap(void) { }
|
||||
static inline void microcode_bsp_resume(void) { }
|
||||
static inline void load_ucode_bsp(void) { }
|
||||
static inline void load_ucode_ap(void) { }
|
||||
static inline void microcode_bsp_resume(void) { }
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CPU_SUP_INTEL
|
||||
/* Intel specific microcode defines. Public for IFS */
|
||||
struct microcode_header_intel {
|
||||
unsigned int hdrver;
|
||||
unsigned int rev;
|
||||
unsigned int date;
|
||||
unsigned int sig;
|
||||
unsigned int cksum;
|
||||
unsigned int ldrver;
|
||||
unsigned int pf;
|
||||
unsigned int datasize;
|
||||
unsigned int totalsize;
|
||||
unsigned int metasize;
|
||||
unsigned int reserved[2];
|
||||
};
|
||||
|
||||
struct microcode_intel {
|
||||
struct microcode_header_intel hdr;
|
||||
unsigned int bits[];
|
||||
};
|
||||
|
||||
#define DEFAULT_UCODE_DATASIZE (2000)
|
||||
#define MC_HEADER_SIZE (sizeof(struct microcode_header_intel))
|
||||
#define MC_HEADER_TYPE_MICROCODE 1
|
||||
#define MC_HEADER_TYPE_IFS 2
|
||||
|
||||
static inline int intel_microcode_get_datasize(struct microcode_header_intel *hdr)
|
||||
{
|
||||
return hdr->datasize ? : DEFAULT_UCODE_DATASIZE;
|
||||
}
|
||||
|
||||
static inline u32 intel_get_microcode_revision(void)
|
||||
{
|
||||
u32 rev, dummy;
|
||||
|
||||
native_wrmsrl(MSR_IA32_UCODE_REV, 0);
|
||||
|
||||
/* As documented in the SDM: Do a CPUID 1 here */
|
||||
native_cpuid_eax(1);
|
||||
|
||||
/* get the current revision from MSR 0x8B */
|
||||
native_rdmsr(MSR_IA32_UCODE_REV, dummy, rev);
|
||||
|
||||
return rev;
|
||||
}
|
||||
|
||||
void show_ucode_info_early(void);
|
||||
|
||||
#else /* CONFIG_CPU_SUP_INTEL */
|
||||
static inline void show_ucode_info_early(void) { }
|
||||
#endif /* !CONFIG_CPU_SUP_INTEL */
|
||||
|
||||
#endif /* _ASM_X86_MICROCODE_H */
|
||||
|
||||
Reference in New Issue
Block a user