summaryrefslogtreecommitdiffstats
path: root/include/asm-x86/microcode.h
blob: 7ceff48fa6578a2be909efe9669e064d9a2836b3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#ifndef ASM_X86__MICROCODE_H
#define ASM_X86__MICROCODE_H

extern int microcode_init(void *opaque, struct module *module);
extern void microcode_exit(void);

struct cpu_signature;

struct microcode_ops {
	long (*get_next_ucode)(void **mc, long offset);
	long (*microcode_get_next_ucode)(void **mc, long offset);
	int (*get_matching_microcode)(void *mc, int cpu);
	int (*microcode_sanity_check)(void *mc);
	int (*cpu_request_microcode)(int cpu);
	int (*collect_cpu_info)(int cpu_num, struct cpu_signature *csig);
	void (*apply_microcode)(int cpu);
	void (*microcode_fini_cpu)(int cpu);
	void (*clear_patch)(void *data);
};

struct microcode_header_intel {
	unsigned int            hdrver;
	unsigned int            rev;
	unsigned int            date;
	unsigned int            sig;
	unsigned int            cksum;
	unsigned int            ldrver;
	unsigned int            pf;
	unsigned int            datasize;
	unsigned int            totalsize;
	unsigned int            reserved[3];
};

struct microcode_intel {
	struct microcode_header_intel hdr;
	unsigned int            bits[0];
};

/* microcode format is extended from prescott processors */
struct extended_signature {
	unsigned int            sig;
	unsigned int            pf;
	unsigned int            cksum;
};

struct extended_sigtable {
	unsigned int            count;
	unsigned int            cksum;
	unsigned int            reserved[3];
	struct extended_signature sigs[0];
};

struct equiv_cpu_entry {
	unsigned int installed_cpu;
	unsigned int fixed_errata_mask;
	unsigned int fixed_errata_compare;
	unsigned int equiv_cpu;
};

struct microcode_header_amd {
	unsigned int  data_code;
	unsigned int  patch_id;
	unsigned char mc_patch_data_id[2];
	unsigned char mc_patch_data_len;
	unsigned char init_flag;
	unsigned int  mc_patch_data_checksum;
	unsigned int  nb_dev_id;
	unsigned int  sb_dev_id;
	unsigned char processor_rev_id[2];
	unsigned char nb_rev_id;
	unsigned char sb_rev_id;
	unsigned char bios_api_rev;
	unsigned char reserved1[3];
	unsigned int  match_reg[8];
};

struct microcode_amd {
	struct microcode_header_amd hdr;
	unsigned int mpb[0];
};

struct cpu_signature {
	unsigned int sig;
	unsigned int pf;
	unsigned int rev;
};

struct ucode_cpu_info {
	struct cpu_signature cpu_sig;
	int valid;
	union {
		struct microcode_intel *mc_intel;
		struct microcode_amd *mc_amd;
		void *valid_mc;
	} mc;
};
extern struct ucode_cpu_info ucode_cpu_info[];

#endif /* ASM_X86__MICROCODE_H */