mirror of
https://github.com/torvalds/linux.git
synced 2024-12-02 09:01:34 +00:00
3205c9833d
Similar to other sizing information the number of cores per package can be established from the topology bitmap. Provide a function for retrieving that information and replace the buggy hack in the CPUID evaluation with it. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Tested-by: Michael Kelley <mhklinux@outlook.com> Tested-by: Sohil Mehta <sohil.mehta@intel.com> Link: https://lore.kernel.org/r/20240213210252.956858282@linutronix.de
68 lines
2.0 KiB
C
68 lines
2.0 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef ARCH_X86_TOPOLOGY_H
|
|
#define ARCH_X86_TOPOLOGY_H
|
|
|
|
struct topo_scan {
|
|
struct cpuinfo_x86 *c;
|
|
unsigned int dom_shifts[TOPO_MAX_DOMAIN];
|
|
unsigned int dom_ncpus[TOPO_MAX_DOMAIN];
|
|
|
|
/* Legacy CPUID[1]:EBX[23:16] number of logical processors */
|
|
unsigned int ebx1_nproc_shift;
|
|
|
|
/* AMD specific node ID which cannot be mapped into APIC space. */
|
|
u16 amd_nodes_per_pkg;
|
|
u16 amd_node_id;
|
|
};
|
|
|
|
void cpu_init_topology(struct cpuinfo_x86 *c);
|
|
void cpu_parse_topology(struct cpuinfo_x86 *c);
|
|
void topology_set_dom(struct topo_scan *tscan, enum x86_topology_domains dom,
|
|
unsigned int shift, unsigned int ncpus);
|
|
bool cpu_parse_topology_ext(struct topo_scan *tscan);
|
|
void cpu_parse_topology_amd(struct topo_scan *tscan);
|
|
void cpu_topology_fixup_amd(struct topo_scan *tscan);
|
|
|
|
static inline u32 topo_shift_apicid(u32 apicid, enum x86_topology_domains dom)
|
|
{
|
|
if (dom == TOPO_SMT_DOMAIN)
|
|
return apicid;
|
|
return apicid >> x86_topo_system.dom_shifts[dom - 1];
|
|
}
|
|
|
|
static inline u32 topo_relative_domain_id(u32 apicid, enum x86_topology_domains dom)
|
|
{
|
|
if (dom != TOPO_SMT_DOMAIN)
|
|
apicid >>= x86_topo_system.dom_shifts[dom - 1];
|
|
return apicid & (x86_topo_system.dom_size[dom] - 1);
|
|
}
|
|
|
|
static inline u32 topo_domain_mask(enum x86_topology_domains dom)
|
|
{
|
|
return (1U << x86_topo_system.dom_shifts[dom]) - 1;
|
|
}
|
|
|
|
/*
|
|
* Update a domain level after the fact without propagating. Used to fixup
|
|
* broken CPUID enumerations.
|
|
*/
|
|
static inline void topology_update_dom(struct topo_scan *tscan, enum x86_topology_domains dom,
|
|
unsigned int shift, unsigned int ncpus)
|
|
{
|
|
tscan->dom_shifts[dom] = shift;
|
|
tscan->dom_ncpus[dom] = ncpus;
|
|
}
|
|
|
|
#ifdef CONFIG_X86_LOCAL_APIC
|
|
unsigned int topology_unit_count(u32 apicid, enum x86_topology_domains which_units,
|
|
enum x86_topology_domains at_level);
|
|
#else
|
|
static inline unsigned int topology_unit_count(u32 apicid, enum x86_topology_domains which_units,
|
|
enum x86_topology_domains at_level)
|
|
{
|
|
return 1;
|
|
}
|
|
#endif
|
|
|
|
#endif /* ARCH_X86_TOPOLOGY_H */
|