microcode.h 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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. void reload_early_microcode(void);
  68. #else
  69. static inline void __init load_ucode_bsp(void) {}
  70. static inline void load_ucode_ap(void) {}
  71. static inline int __init save_microcode_in_initrd(void)
  72. {
  73. return 0;
  74. }
  75. static inline void reload_early_microcode(void) {}
  76. #endif
  77. #endif /* _ASM_X86_MICROCODE_H */