| #ifndef _ASM_X86_MICROCODE_H | |
| #define _ASM_X86_MICROCODE_H | |
| struct cpu_signature { | |
| unsigned int sig; | |
| unsigned int pf; | |
| unsigned int rev; | |
| }; | |
| struct device; | |
| enum ucode_state { UCODE_ERROR, UCODE_OK, UCODE_NFOUND }; | |
| struct microcode_ops { | |
| enum ucode_state (*request_microcode_user) (int cpu, | |
| const void __user *buf, size_t size); | |
| enum ucode_state (*request_microcode_fw) (int cpu, | |
| struct device *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. | |
| */ | |
| int (*apply_microcode) (int cpu); | |
| int (*collect_cpu_info) (int cpu, struct cpu_signature *csig); | |
| }; | |
| struct ucode_cpu_info { | |
| struct cpu_signature cpu_sig; | |
| int valid; | |
| void *mc; | |
| }; | |
| extern struct ucode_cpu_info ucode_cpu_info[]; | |
| #ifdef CONFIG_MICROCODE_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_MICROCODE_INTEL */ | |
| #ifdef CONFIG_MICROCODE_AMD | |
| extern struct microcode_ops * __init init_amd_microcode(void); | |
| static inline void get_ucode_data(void *to, const u8 *from, size_t n) | |
| { | |
| memcpy(to, from, n); | |
| } | |
| #else | |
| static inline struct microcode_ops * __init init_amd_microcode(void) | |
| { | |
| return NULL; | |
| } | |
| #endif | |
| #endif /* _ASM_X86_MICROCODE_H */ |