xref: /aosp_15_r20/external/cpuinfo/src/x86/api.h (revision 2b54f0db79fd8303838913b20ff3780cddaa909f)
1*2b54f0dbSXin Li #pragma once
2*2b54f0dbSXin Li 
3*2b54f0dbSXin Li #include <stdbool.h>
4*2b54f0dbSXin Li #include <stdint.h>
5*2b54f0dbSXin Li 
6*2b54f0dbSXin Li #include <cpuinfo.h>
7*2b54f0dbSXin Li #include <cpuinfo/common.h>
8*2b54f0dbSXin Li 
9*2b54f0dbSXin Li 
10*2b54f0dbSXin Li struct cpuid_regs {
11*2b54f0dbSXin Li 	uint32_t eax;
12*2b54f0dbSXin Li 	uint32_t ebx;
13*2b54f0dbSXin Li 	uint32_t ecx;
14*2b54f0dbSXin Li 	uint32_t edx;
15*2b54f0dbSXin Li };
16*2b54f0dbSXin Li 
17*2b54f0dbSXin Li struct cpuinfo_x86_cache {
18*2b54f0dbSXin Li 	uint32_t size;
19*2b54f0dbSXin Li 	uint32_t associativity;
20*2b54f0dbSXin Li 	uint32_t sets;
21*2b54f0dbSXin Li 	uint32_t partitions;
22*2b54f0dbSXin Li 	uint32_t line_size;
23*2b54f0dbSXin Li 	uint32_t flags;
24*2b54f0dbSXin Li 	uint32_t apic_bits;
25*2b54f0dbSXin Li };
26*2b54f0dbSXin Li 
27*2b54f0dbSXin Li struct cpuinfo_x86_caches {
28*2b54f0dbSXin Li 	struct cpuinfo_trace_cache trace;
29*2b54f0dbSXin Li 	struct cpuinfo_x86_cache l1i;
30*2b54f0dbSXin Li 	struct cpuinfo_x86_cache l1d;
31*2b54f0dbSXin Li 	struct cpuinfo_x86_cache l2;
32*2b54f0dbSXin Li 	struct cpuinfo_x86_cache l3;
33*2b54f0dbSXin Li 	struct cpuinfo_x86_cache l4;
34*2b54f0dbSXin Li 	uint32_t prefetch_size;
35*2b54f0dbSXin Li };
36*2b54f0dbSXin Li 
37*2b54f0dbSXin Li struct cpuinfo_x86_model_info {
38*2b54f0dbSXin Li 	uint32_t model;
39*2b54f0dbSXin Li 	uint32_t family;
40*2b54f0dbSXin Li 
41*2b54f0dbSXin Li 	uint32_t base_model;
42*2b54f0dbSXin Li 	uint32_t base_family;
43*2b54f0dbSXin Li 	uint32_t stepping;
44*2b54f0dbSXin Li 	uint32_t extended_model;
45*2b54f0dbSXin Li 	uint32_t extended_family;
46*2b54f0dbSXin Li 	uint32_t processor_type;
47*2b54f0dbSXin Li };
48*2b54f0dbSXin Li 
49*2b54f0dbSXin Li struct cpuinfo_x86_topology {
50*2b54f0dbSXin Li 	uint32_t apic_id;
51*2b54f0dbSXin Li 	uint32_t thread_bits_offset;
52*2b54f0dbSXin Li 	uint32_t thread_bits_length;
53*2b54f0dbSXin Li 	uint32_t core_bits_offset;
54*2b54f0dbSXin Li 	uint32_t core_bits_length;
55*2b54f0dbSXin Li };
56*2b54f0dbSXin Li 
57*2b54f0dbSXin Li struct cpuinfo_x86_processor {
58*2b54f0dbSXin Li 	uint32_t cpuid;
59*2b54f0dbSXin Li 	enum cpuinfo_vendor vendor;
60*2b54f0dbSXin Li 	enum cpuinfo_uarch uarch;
61*2b54f0dbSXin Li #ifdef __linux__
62*2b54f0dbSXin Li 	int linux_id;
63*2b54f0dbSXin Li #endif
64*2b54f0dbSXin Li 	struct cpuinfo_x86_caches cache;
65*2b54f0dbSXin Li 	struct {
66*2b54f0dbSXin Li 		struct cpuinfo_tlb itlb_4KB;
67*2b54f0dbSXin Li 		struct cpuinfo_tlb itlb_2MB;
68*2b54f0dbSXin Li 		struct cpuinfo_tlb itlb_4MB;
69*2b54f0dbSXin Li 		struct cpuinfo_tlb dtlb0_4KB;
70*2b54f0dbSXin Li 		struct cpuinfo_tlb dtlb0_2MB;
71*2b54f0dbSXin Li 		struct cpuinfo_tlb dtlb0_4MB;
72*2b54f0dbSXin Li 		struct cpuinfo_tlb dtlb_4KB;
73*2b54f0dbSXin Li 		struct cpuinfo_tlb dtlb_2MB;
74*2b54f0dbSXin Li 		struct cpuinfo_tlb dtlb_4MB;
75*2b54f0dbSXin Li 		struct cpuinfo_tlb dtlb_1GB;
76*2b54f0dbSXin Li 		struct cpuinfo_tlb stlb2_4KB;
77*2b54f0dbSXin Li 		struct cpuinfo_tlb stlb2_2MB;
78*2b54f0dbSXin Li 		struct cpuinfo_tlb stlb2_1GB;
79*2b54f0dbSXin Li 	} tlb;
80*2b54f0dbSXin Li 	struct cpuinfo_x86_topology topology;
81*2b54f0dbSXin Li 	char brand_string[CPUINFO_PACKAGE_NAME_MAX];
82*2b54f0dbSXin Li };
83*2b54f0dbSXin Li 
84*2b54f0dbSXin Li CPUINFO_INTERNAL void cpuinfo_x86_init_processor(struct cpuinfo_x86_processor* processor);
85*2b54f0dbSXin Li 
86*2b54f0dbSXin Li CPUINFO_INTERNAL enum cpuinfo_vendor cpuinfo_x86_decode_vendor(uint32_t ebx, uint32_t ecx, uint32_t edx);
87*2b54f0dbSXin Li CPUINFO_INTERNAL struct cpuinfo_x86_model_info cpuinfo_x86_decode_model_info(uint32_t eax);
88*2b54f0dbSXin Li CPUINFO_INTERNAL enum cpuinfo_uarch cpuinfo_x86_decode_uarch(
89*2b54f0dbSXin Li 	enum cpuinfo_vendor vendor,
90*2b54f0dbSXin Li 	const struct cpuinfo_x86_model_info* model_info);
91*2b54f0dbSXin Li 
92*2b54f0dbSXin Li CPUINFO_INTERNAL struct cpuinfo_x86_isa cpuinfo_x86_detect_isa(
93*2b54f0dbSXin Li 	const struct cpuid_regs basic_info, const struct cpuid_regs extended_info,
94*2b54f0dbSXin Li 	uint32_t max_base_index, uint32_t max_extended_index,
95*2b54f0dbSXin Li 	enum cpuinfo_vendor vendor, enum cpuinfo_uarch uarch);
96*2b54f0dbSXin Li 
97*2b54f0dbSXin Li CPUINFO_INTERNAL void cpuinfo_x86_detect_topology(
98*2b54f0dbSXin Li 	uint32_t max_base_index,
99*2b54f0dbSXin Li 	uint32_t max_extended_index,
100*2b54f0dbSXin Li 	struct cpuid_regs leaf1,
101*2b54f0dbSXin Li 	struct cpuinfo_x86_topology* topology);
102*2b54f0dbSXin Li 
103*2b54f0dbSXin Li CPUINFO_INTERNAL void cpuinfo_x86_detect_cache(
104*2b54f0dbSXin Li 	uint32_t max_base_index, uint32_t max_extended_index,
105*2b54f0dbSXin Li 	bool amd_topology_extensions,
106*2b54f0dbSXin Li 	enum cpuinfo_vendor vendor,
107*2b54f0dbSXin Li 	const struct cpuinfo_x86_model_info* model_info,
108*2b54f0dbSXin Li 	struct cpuinfo_x86_caches* cache,
109*2b54f0dbSXin Li 	struct cpuinfo_tlb* itlb_4KB,
110*2b54f0dbSXin Li 	struct cpuinfo_tlb* itlb_2MB,
111*2b54f0dbSXin Li 	struct cpuinfo_tlb* itlb_4MB,
112*2b54f0dbSXin Li 	struct cpuinfo_tlb* dtlb0_4KB,
113*2b54f0dbSXin Li 	struct cpuinfo_tlb* dtlb0_2MB,
114*2b54f0dbSXin Li 	struct cpuinfo_tlb* dtlb0_4MB,
115*2b54f0dbSXin Li 	struct cpuinfo_tlb* dtlb_4KB,
116*2b54f0dbSXin Li 	struct cpuinfo_tlb* dtlb_2MB,
117*2b54f0dbSXin Li 	struct cpuinfo_tlb* dtlb_4MB,
118*2b54f0dbSXin Li 	struct cpuinfo_tlb* dtlb_1GB,
119*2b54f0dbSXin Li 	struct cpuinfo_tlb* stlb2_4KB,
120*2b54f0dbSXin Li 	struct cpuinfo_tlb* stlb2_2MB,
121*2b54f0dbSXin Li 	struct cpuinfo_tlb* stlb2_1GB,
122*2b54f0dbSXin Li 	uint32_t* log2_package_cores_max);
123*2b54f0dbSXin Li 
124*2b54f0dbSXin Li CPUINFO_INTERNAL void cpuinfo_x86_decode_cache_descriptor(
125*2b54f0dbSXin Li 	uint8_t descriptor, enum cpuinfo_vendor vendor,
126*2b54f0dbSXin Li 	const struct cpuinfo_x86_model_info* model_info,
127*2b54f0dbSXin Li 	struct cpuinfo_x86_caches* cache,
128*2b54f0dbSXin Li 	struct cpuinfo_tlb* itlb_4KB,
129*2b54f0dbSXin Li 	struct cpuinfo_tlb* itlb_2MB,
130*2b54f0dbSXin Li 	struct cpuinfo_tlb* itlb_4MB,
131*2b54f0dbSXin Li 	struct cpuinfo_tlb* dtlb0_4KB,
132*2b54f0dbSXin Li 	struct cpuinfo_tlb* dtlb0_2MB,
133*2b54f0dbSXin Li 	struct cpuinfo_tlb* dtlb0_4MB,
134*2b54f0dbSXin Li 	struct cpuinfo_tlb* dtlb_4KB,
135*2b54f0dbSXin Li 	struct cpuinfo_tlb* dtlb_2MB,
136*2b54f0dbSXin Li 	struct cpuinfo_tlb* dtlb_4MB,
137*2b54f0dbSXin Li 	struct cpuinfo_tlb* dtlb_1GB,
138*2b54f0dbSXin Li 	struct cpuinfo_tlb* stlb2_4KB,
139*2b54f0dbSXin Li 	struct cpuinfo_tlb* stlb2_2MB,
140*2b54f0dbSXin Li 	struct cpuinfo_tlb* stlb2_1GB,
141*2b54f0dbSXin Li 	uint32_t* prefetch_size);
142*2b54f0dbSXin Li 
143*2b54f0dbSXin Li CPUINFO_INTERNAL bool cpuinfo_x86_decode_deterministic_cache_parameters(
144*2b54f0dbSXin Li 	struct cpuid_regs regs,
145*2b54f0dbSXin Li 	struct cpuinfo_x86_caches* cache,
146*2b54f0dbSXin Li 	uint32_t* package_cores_max);
147*2b54f0dbSXin Li 
148*2b54f0dbSXin Li CPUINFO_INTERNAL bool cpuinfo_x86_decode_cache_properties(
149*2b54f0dbSXin Li 	struct cpuid_regs regs,
150*2b54f0dbSXin Li 	struct cpuinfo_x86_caches* cache);
151*2b54f0dbSXin Li 
152*2b54f0dbSXin Li CPUINFO_INTERNAL uint32_t cpuinfo_x86_normalize_brand_string(
153*2b54f0dbSXin Li 	const char raw_name[48],
154*2b54f0dbSXin Li 	char normalized_name[48]);
155*2b54f0dbSXin Li 
156*2b54f0dbSXin Li CPUINFO_INTERNAL uint32_t cpuinfo_x86_format_package_name(
157*2b54f0dbSXin Li 	enum cpuinfo_vendor vendor,
158*2b54f0dbSXin Li 	const char normalized_brand_string[48],
159*2b54f0dbSXin Li 	char package_name[CPUINFO_PACKAGE_NAME_MAX]);
160