blob: f98bd6625318210adb03615f3b282b6454db319d [file] [log] [blame]
H. Peter Anvin1965aae2008-10-22 22:26:29 -07001#ifndef _ASM_X86_MICROCODE_H
2#define _ASM_X86_MICROCODE_H
Dmitry Adamushkod45de402008-08-20 00:22:26 +02003
Dmitry Adamushko18dbc912008-09-23 12:08:44 +02004struct cpu_signature {
5 unsigned int sig;
6 unsigned int pf;
7 unsigned int rev;
8};
Peter Oruba8d86f392008-07-28 18:44:21 +02009
Dmitry Adamushkoa0a29b62008-09-11 23:27:52 +020010struct device;
Dmitry Adamushkod45de402008-08-20 00:22:26 +020011
Dmitry Adamushko871b72d2009-05-11 23:48:27 +020012enum ucode_state { UCODE_ERROR, UCODE_OK, UCODE_NFOUND };
13
Peter Oruba26bf7a42008-07-28 18:44:20 +020014struct microcode_ops {
Dmitry Adamushko871b72d2009-05-11 23:48:27 +020015 enum ucode_state (*request_microcode_user) (int cpu,
16 const void __user *buf, size_t size);
Dmitry Adamushkoa0a29b62008-09-11 23:27:52 +020017
Borislav Petkov48e30682012-07-26 15:51:00 +020018 enum ucode_state (*request_microcode_fw) (int cpu, struct device *,
19 bool refresh_fw);
Dmitry Adamushkoa0a29b62008-09-11 23:27:52 +020020
Dmitry Adamushkoa0a29b62008-09-11 23:27:52 +020021 void (*microcode_fini_cpu) (int cpu);
Dmitry Adamushko871b72d2009-05-11 23:48:27 +020022
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);
Peter Oruba26bf7a42008-07-28 18:44:20 +020031};
32
Dmitry Adamushkod45de402008-08-20 00:22:26 +020033struct ucode_cpu_info {
Dmitry Adamushko871b72d2009-05-11 23:48:27 +020034 struct cpu_signature cpu_sig;
35 int valid;
36 void *mc;
Peter Orubac3b71bc2008-07-28 18:44:15 +020037};
Dmitry Adamushkod45de402008-08-20 00:22:26 +020038extern struct ucode_cpu_info ucode_cpu_info[];
39
Dmitry Adamushko18dbc912008-09-23 12:08:44 +020040#ifdef CONFIG_MICROCODE_INTEL
41extern struct microcode_ops * __init init_intel_microcode(void);
42#else
43static 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
50extern struct microcode_ops * __init init_amd_microcode(void);
Borislav Petkovf72c1a52011-12-02 16:50:04 +010051extern void __exit exit_amd_microcode(void);
Dmitry Adamushko18dbc912008-09-23 12:08:44 +020052#else
53static inline struct microcode_ops * __init init_amd_microcode(void)
54{
55 return NULL;
56}
Borislav Petkovf72c1a52011-12-02 16:50:04 +010057static inline void __exit exit_amd_microcode(void) {}
Dmitry Adamushko18dbc912008-09-23 12:08:44 +020058#endif
59
Fenghua Yua8ebf6d2012-12-20 23:44:25 -080060#ifdef CONFIG_MICROCODE_EARLY
61#define MAX_UCODE_COUNT 128
62extern void __init load_ucode_bsp(void);
Paul Gortmaker148f9bb2013-06-18 18:23:59 -040063extern void load_ucode_ap(void);
Fenghua Yua8ebf6d2012-12-20 23:44:25 -080064extern int __init save_microcode_in_initrd(void);
65#else
66static inline void __init load_ucode_bsp(void) {}
Paul Gortmaker148f9bb2013-06-18 18:23:59 -040067static inline void load_ucode_ap(void) {}
Fenghua Yua8ebf6d2012-12-20 23:44:25 -080068static inline int __init save_microcode_in_initrd(void)
69{
70 return 0;
71}
72#endif
73
H. Peter Anvin1965aae2008-10-22 22:26:29 -070074#endif /* _ASM_X86_MICROCODE_H */