1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef ARCH_X86_TOPOLOGY_H
3 #define ARCH_X86_TOPOLOGY_H
7 unsigned int dom_shifts
[TOPO_MAX_DOMAIN
];
8 unsigned int dom_ncpus
[TOPO_MAX_DOMAIN
];
10 /* Legacy CPUID[1]:EBX[23:16] number of logical processors */
11 unsigned int ebx1_nproc_shift
;
13 /* AMD specific node ID which cannot be mapped into APIC space. */
14 u16 amd_nodes_per_pkg
;
18 void cpu_init_topology(struct cpuinfo_x86
*c
);
19 void cpu_parse_topology(struct cpuinfo_x86
*c
);
20 void topology_set_dom(struct topo_scan
*tscan
, enum x86_topology_domains dom
,
21 unsigned int shift
, unsigned int ncpus
);
22 bool cpu_parse_topology_ext(struct topo_scan
*tscan
);
23 void cpu_parse_topology_amd(struct topo_scan
*tscan
);
24 void cpu_topology_fixup_amd(struct topo_scan
*tscan
);
26 static inline u32
topo_shift_apicid(u32 apicid
, enum x86_topology_domains dom
)
28 if (dom
== TOPO_SMT_DOMAIN
)
30 return apicid
>> x86_topo_system
.dom_shifts
[dom
- 1];
33 static inline u32
topo_relative_domain_id(u32 apicid
, enum x86_topology_domains dom
)
35 if (dom
!= TOPO_SMT_DOMAIN
)
36 apicid
>>= x86_topo_system
.dom_shifts
[dom
- 1];
37 return apicid
& (x86_topo_system
.dom_size
[dom
] - 1);
40 static inline u32
topo_domain_mask(enum x86_topology_domains dom
)
42 return (1U << x86_topo_system
.dom_shifts
[dom
]) - 1;
46 * Update a domain level after the fact without propagating. Used to fixup
47 * broken CPUID enumerations.
49 static inline void topology_update_dom(struct topo_scan
*tscan
, enum x86_topology_domains dom
,
50 unsigned int shift
, unsigned int ncpus
)
52 tscan
->dom_shifts
[dom
] = shift
;
53 tscan
->dom_ncpus
[dom
] = ncpus
;
56 #ifdef CONFIG_X86_LOCAL_APIC
57 unsigned int topology_unit_count(u32 apicid
, enum x86_topology_domains which_units
,
58 enum x86_topology_domains at_level
);
60 static inline unsigned int topology_unit_count(u32 apicid
, enum x86_topology_domains which_units
,
61 enum x86_topology_domains at_level
)
67 #endif /* ARCH_X86_TOPOLOGY_H */