microcode.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #ifndef _ASM_X86_MICROCODE_H
  2. #define _ASM_X86_MICROCODE_H
  3. #define native_rdmsr(msr, val1, val2) \
  4. do { \
  5. u64 __val = native_read_msr((msr)); \
  6. (void)((val1) = (u32)__val); \
  7. (void)((val2) = (u32)(__val >> 32)); \
  8. } while (0)
  9. #define native_wrmsr(msr, low, high) \
  10. native_write_msr(msr, low, high)
  11. #define native_wrmsrl(msr, val) \
  12. native_write_msr((msr), \
  13. (u32)((u64)(val)), \
  14. (u32)((u64)(val) >> 32))
  15. struct cpu_signature {
  16. unsigned int sig;
  17. unsigned int pf;
  18. unsigned int rev;
  19. };
  20. struct device;
  21. enum ucode_state { UCODE_ERROR, UCODE_OK, UCODE_NFOUND };
  22. extern bool dis_ucode_ldr;
  23. struct microcode_ops {
  24. enum ucode_state (*request_microcode_user) (int cpu,
  25. const void __user *buf, size_t size);
  26. enum ucode_state (*request_microcode_fw) (int cpu, struct device *,
  27. bool refresh_fw);
  28. void (*microcode_fini_cpu) (int cpu);
  29. /*
  30. * The generic 'microcode_core' part guarantees that
  31. * the callbacks below run on a target cpu when they
  32. * are being called.
  33. * See also the "Synchronization" section in microcode_core.c.
  34. */
  35. int (*apply_microcode) (int cpu);
  36. int (*collect_cpu_info) (int cpu, struct cpu_signature *csig);
  37. };
  38. struct ucode_cpu_info {
  39. struct cpu_signature cpu_sig;
  40. int valid;
  41. void *mc;
  42. };
  43. extern struct ucode_cpu_info ucode_cpu_info[];
  44. #ifdef CONFIG_MICROCODE_INTEL
  45. extern struct microcode_ops * __init init_intel_microcode(void);
  46. #else
  47. static inline struct microcode_ops * __init init_intel_microcode(void)
  48. {
  49. return NULL;
  50. }
  51. #endif /* CONFIG_MICROCODE_INTEL */
  52. #ifdef CONFIG_MICROCODE_AMD
  53. extern struct microcode_ops * __init init_amd_microcode(void);
  54. extern void __exit exit_amd_microcode(void);
  55. #else
  56. static inline struct microcode_ops * __init init_amd_microcode(void)
  57. {
  58. return NULL;
  59. }
  60. static inline void __exit exit_amd_microcode(void) {}
  61. #endif
  62. #ifdef CONFIG_MICROCODE_EARLY
  63. #define MAX_UCODE_COUNT 128
  64. extern void __init load_ucode_bsp(void);
  65. extern void load_ucode_ap(void);
  66. extern int __init save_microcode_in_initrd(void);
  67. #else
  68. static inline void __init load_ucode_bsp(void) {}
  69. static inline void load_ucode_ap(void) {}
  70. static inline int __init save_microcode_in_initrd(void)
  71. {
  72. return 0;
  73. }
  74. #endif
  75. #endif /* _ASM_X86_MICROCODE_H */