1 #ifndef _ASM_X86_MICROCODE_H 2 #define _ASM_X86_MICROCODE_H 3 4 struct cpu_signature { 5 unsigned int sig; 6 unsigned int pf; 7 unsigned int rev; 8 }; 9 10 struct device; 11 12 enum ucode_state { UCODE_ERROR, UCODE_OK, UCODE_NFOUND }; 13 14 struct microcode_ops { 15 enum ucode_state (*request_microcode_user) (int cpu, 16 const void __user *buf, size_t size); 17 18 enum ucode_state (*request_microcode_fw) (int cpu, 19 struct device *device); 20 21 void (*microcode_fini_cpu) (int cpu); 22 23 /* 24 * The generic 'microcode_core' part guarantees that 25 * the callbacks below run on a target cpu when they 26 * are being called. 27 * See also the "Synchronization" section in microcode_core.c. 28 */ 29 int (*apply_microcode) (int cpu); 30 int (*collect_cpu_info) (int cpu, struct cpu_signature *csig); 31 }; 32 33 struct ucode_cpu_info { 34 struct cpu_signature cpu_sig; 35 int valid; 36 void *mc; 37 }; 38 extern struct ucode_cpu_info ucode_cpu_info[]; 39 40 #ifdef CONFIG_MICROCODE_INTEL 41 extern struct microcode_ops * __init init_intel_microcode(void); 42 #else 43 static inline struct microcode_ops * __init init_intel_microcode(void) 44 { 45 return NULL; 46 } 47 #endif /* CONFIG_MICROCODE_INTEL */ 48 49 #ifdef CONFIG_MICROCODE_AMD 50 extern struct microcode_ops * __init init_amd_microcode(void); 51 extern void __exit exit_amd_microcode(void); 52 53 static inline void get_ucode_data(void *to, const u8 *from, size_t n) 54 { 55 memcpy(to, from, n); 56 } 57 58 #else 59 static inline struct microcode_ops * __init init_amd_microcode(void) 60 { 61 return NULL; 62 } 63 static inline void __exit exit_amd_microcode(void) {} 64 #endif 65 66 #endif /* _ASM_X86_MICROCODE_H */ 67