blob: e2887facdb4a9a351a5d9b23742f1cd98313c28a [file] [log] [blame]
Dmitry Adamushkod45de402008-08-20 00:22:26 +02001#ifndef ASM_X86__MICROCODE_H
2#define ASM_X86__MICROCODE_H
3
Peter Oruba8d86f392008-07-28 18:44:21 +02004extern int microcode_init(void *opaque, struct module *module);
5extern void microcode_exit(void);
6
Dmitry Adamushkod45de402008-08-20 00:22:26 +02007struct cpu_signature;
Dmitry Adamushkoa0a29b62008-09-11 23:27:52 +02008struct device;
Dmitry Adamushkod45de402008-08-20 00:22:26 +02009
Peter Oruba26bf7a42008-07-28 18:44:20 +020010struct microcode_ops {
Dmitry Adamushkoa0a29b62008-09-11 23:27:52 +020011 int (*request_microcode_user) (int cpu, const void __user *buf, size_t size);
12 int (*request_microcode_fw) (int cpu, struct device *device);
13
14 void (*apply_microcode) (int cpu);
15
16 int (*collect_cpu_info) (int cpu, struct cpu_signature *csig);
17 void (*microcode_fini_cpu) (int cpu);
Peter Oruba26bf7a42008-07-28 18:44:20 +020018};
19
Peter Orubad4ee3662008-07-28 18:44:18 +020020struct microcode_header_intel {
Peter Oruba9a56a0f2008-07-28 18:44:13 +020021 unsigned int hdrver;
22 unsigned int rev;
23 unsigned int date;
24 unsigned int sig;
25 unsigned int cksum;
26 unsigned int ldrver;
27 unsigned int pf;
28 unsigned int datasize;
29 unsigned int totalsize;
30 unsigned int reserved[3];
31};
32
Peter Orubad4ee3662008-07-28 18:44:18 +020033struct microcode_intel {
34 struct microcode_header_intel hdr;
Peter Oruba9a56a0f2008-07-28 18:44:13 +020035 unsigned int bits[0];
36};
37
Peter Oruba9a56a0f2008-07-28 18:44:13 +020038/* microcode format is extended from prescott processors */
39struct extended_signature {
40 unsigned int sig;
41 unsigned int pf;
42 unsigned int cksum;
43};
44
45struct extended_sigtable {
46 unsigned int count;
47 unsigned int cksum;
48 unsigned int reserved[3];
49 struct extended_signature sigs[0];
50};
Peter Orubac3b71bc2008-07-28 18:44:15 +020051
Peter Oruba9835fd42008-07-28 18:44:19 +020052struct equiv_cpu_entry {
53 unsigned int installed_cpu;
54 unsigned int fixed_errata_mask;
55 unsigned int fixed_errata_compare;
56 unsigned int equiv_cpu;
57};
58
59struct microcode_header_amd {
60 unsigned int data_code;
61 unsigned int patch_id;
62 unsigned char mc_patch_data_id[2];
63 unsigned char mc_patch_data_len;
64 unsigned char init_flag;
65 unsigned int mc_patch_data_checksum;
66 unsigned int nb_dev_id;
67 unsigned int sb_dev_id;
68 unsigned char processor_rev_id[2];
69 unsigned char nb_rev_id;
70 unsigned char sb_rev_id;
71 unsigned char bios_api_rev;
72 unsigned char reserved1[3];
73 unsigned int match_reg[8];
74};
75
76struct microcode_amd {
77 struct microcode_header_amd hdr;
78 unsigned int mpb[0];
79};
80
Dmitry Adamushkod45de402008-08-20 00:22:26 +020081struct cpu_signature {
Peter Orubac3b71bc2008-07-28 18:44:15 +020082 unsigned int sig;
83 unsigned int pf;
84 unsigned int rev;
Dmitry Adamushkod45de402008-08-20 00:22:26 +020085};
86
87struct ucode_cpu_info {
88 struct cpu_signature cpu_sig;
89 int valid;
Peter Orubad4ee3662008-07-28 18:44:18 +020090 union {
91 struct microcode_intel *mc_intel;
Peter Oruba9835fd42008-07-28 18:44:19 +020092 struct microcode_amd *mc_amd;
Dmitry Adamushkod45de402008-08-20 00:22:26 +020093 void *valid_mc;
Peter Orubad4ee3662008-07-28 18:44:18 +020094 } mc;
Peter Orubac3b71bc2008-07-28 18:44:15 +020095};
Dmitry Adamushkod45de402008-08-20 00:22:26 +020096extern struct ucode_cpu_info ucode_cpu_info[];
97
98#endif /* ASM_X86__MICROCODE_H */