xref: /linux/arch/x86/kernel/cpu/topology.h (revision 3a2c4d55e32ad65efebdb6de44eef3bfa08bb49d)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef ARCH_X86_TOPOLOGY_H
3 #define ARCH_X86_TOPOLOGY_H
4 
5 struct topo_scan {
6 	struct cpuinfo_x86	*c;
7 	unsigned int		dom_shifts[TOPO_MAX_DOMAIN];
8 	unsigned int		dom_ncpus[TOPO_MAX_DOMAIN];
9 
10 	/* Legacy CPUID[1]:EBX[23:16] number of logical processors */
11 	unsigned int		ebx1_nproc_shift;
12 
13 	/* AMD specific node ID which cannot be mapped into APIC space. */
14 	u16			amd_nodes_per_pkg;
15 	u16			amd_node_id;
16 };
17 
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);
25 enum x86_topology_cpu_type get_topology_cpu_type(struct cpuinfo_x86 *c);
26 
27 static inline u32 topo_shift_apicid(u32 apicid, enum x86_topology_domains dom)
28 {
29 	if (dom == TOPO_SMT_DOMAIN)
30 		return apicid;
31 	return apicid >> x86_topo_system.dom_shifts[dom - 1];
32 }
33 
34 static inline u32 topo_relative_domain_id(u32 apicid, enum x86_topology_domains dom)
35 {
36 	if (dom != TOPO_SMT_DOMAIN)
37 		apicid >>= x86_topo_system.dom_shifts[dom - 1];
38 	return apicid & (x86_topo_system.dom_size[dom] - 1);
39 }
40 
41 static inline u32 topo_domain_mask(enum x86_topology_domains dom)
42 {
43 	return (1U << x86_topo_system.dom_shifts[dom]) - 1;
44 }
45 
46 /*
47  * Update a domain level after the fact without propagating. Used to fixup
48  * broken CPUID enumerations.
49  */
50 static inline void topology_update_dom(struct topo_scan *tscan, enum x86_topology_domains dom,
51 				       unsigned int shift, unsigned int ncpus)
52 {
53 	tscan->dom_shifts[dom] = shift;
54 	tscan->dom_ncpus[dom] = ncpus;
55 }
56 
57 #ifdef CONFIG_X86_LOCAL_APIC
58 unsigned int topology_unit_count(u32 apicid, enum x86_topology_domains which_units,
59 				 enum x86_topology_domains at_level);
60 #else
61 static inline unsigned int topology_unit_count(u32 apicid, enum x86_topology_domains which_units,
62 					       enum x86_topology_domains at_level)
63 {
64 	return 1;
65 }
66 #endif
67 
68 #endif /* ARCH_X86_TOPOLOGY_H */
69