1 // SPDX-License-Identifier: GPL-2.0
3 #include <linux/debugfs.h>
6 #include <asm/processor.h>
10 static int cpu_debug_show(struct seq_file
*m
, void *p
)
12 unsigned long cpu
= (unsigned long)m
->private;
13 struct cpuinfo_x86
*c
= per_cpu_ptr(&cpu_info
, cpu
);
15 seq_printf(m
, "online: %d\n", cpu_online(cpu
));
19 seq_printf(m
, "initial_apicid: %x\n", c
->topo
.initial_apicid
);
20 seq_printf(m
, "apicid: %x\n", c
->topo
.apicid
);
21 seq_printf(m
, "pkg_id: %u\n", c
->topo
.pkg_id
);
22 seq_printf(m
, "die_id: %u\n", c
->topo
.die_id
);
23 seq_printf(m
, "cu_id: %u\n", c
->topo
.cu_id
);
24 seq_printf(m
, "core_id: %u\n", c
->topo
.core_id
);
25 seq_printf(m
, "logical_pkg_id: %u\n", c
->topo
.logical_pkg_id
);
26 seq_printf(m
, "logical_die_id: %u\n", c
->topo
.logical_die_id
);
27 seq_printf(m
, "llc_id: %u\n", c
->topo
.llc_id
);
28 seq_printf(m
, "l2c_id: %u\n", c
->topo
.l2c_id
);
29 seq_printf(m
, "amd_node_id: %u\n", c
->topo
.amd_node_id
);
30 seq_printf(m
, "amd_nodes_per_pkg: %u\n", topology_amd_nodes_per_pkg());
31 seq_printf(m
, "num_threads: %u\n", __num_threads_per_package
);
32 seq_printf(m
, "num_cores: %u\n", __num_cores_per_package
);
33 seq_printf(m
, "max_dies_per_pkg: %u\n", __max_dies_per_package
);
34 seq_printf(m
, "max_threads_per_core:%u\n", __max_threads_per_core
);
38 static int cpu_debug_open(struct inode
*inode
, struct file
*file
)
40 return single_open(file
, cpu_debug_show
, inode
->i_private
);
43 static const struct file_operations dfs_cpu_ops
= {
44 .open
= cpu_debug_open
,
47 .release
= single_release
,
50 static int dom_debug_show(struct seq_file
*m
, void *p
)
52 static const char *domain_names
[TOPO_MAX_DOMAIN
] = {
53 [TOPO_SMT_DOMAIN
] = "Thread",
54 [TOPO_CORE_DOMAIN
] = "Core",
55 [TOPO_MODULE_DOMAIN
] = "Module",
56 [TOPO_TILE_DOMAIN
] = "Tile",
57 [TOPO_DIE_DOMAIN
] = "Die",
58 [TOPO_DIEGRP_DOMAIN
] = "DieGrp",
59 [TOPO_PKG_DOMAIN
] = "Package",
61 unsigned int dom
, nthreads
= 1;
63 for (dom
= 0; dom
< TOPO_MAX_DOMAIN
; dom
++) {
64 nthreads
*= x86_topo_system
.dom_size
[dom
];
65 seq_printf(m
, "domain: %-10s shift: %u dom_size: %5u max_threads: %5u\n",
66 domain_names
[dom
], x86_topo_system
.dom_shifts
[dom
],
67 x86_topo_system
.dom_size
[dom
], nthreads
);
72 static int dom_debug_open(struct inode
*inode
, struct file
*file
)
74 return single_open(file
, dom_debug_show
, inode
->i_private
);
77 static const struct file_operations dfs_dom_ops
= {
78 .open
= dom_debug_open
,
81 .release
= single_release
,
84 static __init
int cpu_init_debugfs(void)
86 struct dentry
*dir
, *base
= debugfs_create_dir("topo", arch_debugfs_dir
);
90 debugfs_create_file("domains", 0444, base
, NULL
, &dfs_dom_ops
);
92 dir
= debugfs_create_dir("cpus", base
);
93 for_each_possible_cpu(id
) {
94 sprintf(name
, "%lu", id
);
95 debugfs_create_file(name
, 0444, dir
, (void *)id
, &dfs_cpu_ops
);
99 late_initcall(cpu_init_debugfs
);