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