1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef __PERF_CPUTOPO_H
3#define __PERF_CPUTOPO_H
4
5#include <linux/types.h>
6
7struct cpu_topology {
8	/* The number of unique package_cpus_lists below. */
9	u32	  package_cpus_lists;
10	/* The number of unique die_cpu_lists below. */
11	u32	  die_cpus_lists;
12	/* The number of unique core_cpu_lists below. */
13	u32	  core_cpus_lists;
14	/*
15	 * An array of strings where each string is unique and read from
16	 * /sys/devices/system/cpu/cpuX/topology/package_cpus_list. From the ABI
17	 * each of these is a human-readable list of CPUs sharing the same
18	 * physical_package_id. The format is like 0-3, 8-11, 14,17.
19	 */
20	const char **package_cpus_list;
21	/*
22	 * An array of string where each string is unique and from
23	 * /sys/devices/system/cpu/cpuX/topology/die_cpus_list. From the ABI
24	 * each of these is a human-readable list of CPUs within the same die.
25	 * The format is like 0-3, 8-11, 14,17.
26	 */
27	const char **die_cpus_list;
28	/*
29	 * An array of string where each string is unique and from
30	 * /sys/devices/system/cpu/cpuX/topology/core_cpus_list. From the ABI
31	 * each of these is a human-readable list of CPUs within the same
32	 * core. The format is like 0-3, 8-11, 14,17.
33	 */
34	const char **core_cpus_list;
35};
36
37struct numa_topology_node {
38	char		*cpus;
39	u32		 node;
40	u64		 mem_total;
41	u64		 mem_free;
42};
43
44struct numa_topology {
45	u32				nr;
46	struct numa_topology_node	nodes[];
47};
48
49struct hybrid_topology_node {
50	char		*pmu_name;
51	char		*cpus;
52};
53
54struct hybrid_topology {
55	u32				nr;
56	struct hybrid_topology_node	nodes[];
57};
58
59/*
60 * The topology for online CPUs, lazily created.
61 */
62const struct cpu_topology *online_topology(void);
63
64struct cpu_topology *cpu_topology__new(void);
65void cpu_topology__delete(struct cpu_topology *tp);
66/* Determine from the core list whether SMT was enabled. */
67bool cpu_topology__smt_on(const struct cpu_topology *topology);
68/* Are the sets of SMT siblings all enabled or all disabled in user_requested_cpus. */
69bool cpu_topology__core_wide(const struct cpu_topology *topology,
70			     const char *user_requested_cpu_list);
71
72struct numa_topology *numa_topology__new(void);
73void numa_topology__delete(struct numa_topology *tp);
74
75struct hybrid_topology *hybrid_topology__new(void);
76void hybrid_topology__delete(struct hybrid_topology *tp);
77
78#endif /* __PERF_CPUTOPO_H */
79