xref: /linux/drivers/gpu/drm/xe/xe_tile_debugfs.c (revision c17ee635fd3a482b2ad2bf5e269755c2eae5f25e)
1a85ead6dSMichal Wajdeczko // SPDX-License-Identifier: MIT
2a85ead6dSMichal Wajdeczko /*
3a85ead6dSMichal Wajdeczko  * Copyright © 2025 Intel Corporation
4a85ead6dSMichal Wajdeczko  */
5a85ead6dSMichal Wajdeczko 
6a85ead6dSMichal Wajdeczko #include <linux/debugfs.h>
7a85ead6dSMichal Wajdeczko #include <drm/drm_debugfs.h>
8a85ead6dSMichal Wajdeczko 
9126d33f6SMichal Wajdeczko #include "xe_ggtt.h"
10a85ead6dSMichal Wajdeczko #include "xe_pm.h"
11a85ead6dSMichal Wajdeczko #include "xe_sa.h"
12a85ead6dSMichal Wajdeczko #include "xe_tile_debugfs.h"
13a85ead6dSMichal Wajdeczko 
14a85ead6dSMichal Wajdeczko static struct xe_tile *node_to_tile(struct drm_info_node *node)
15a85ead6dSMichal Wajdeczko {
16a85ead6dSMichal Wajdeczko 	return node->dent->d_parent->d_inode->i_private;
17a85ead6dSMichal Wajdeczko }
18a85ead6dSMichal Wajdeczko 
19a85ead6dSMichal Wajdeczko /**
208cd71c40SMichal Wajdeczko  * xe_tile_debugfs_simple_show() - A show callback for struct drm_info_list
21a85ead6dSMichal Wajdeczko  * @m: the &seq_file
22a85ead6dSMichal Wajdeczko  * @data: data used by the drm debugfs helpers
23a85ead6dSMichal Wajdeczko  *
24a85ead6dSMichal Wajdeczko  * This callback can be used in struct drm_info_list to describe debugfs
25a85ead6dSMichal Wajdeczko  * files that are &xe_tile specific.
26a85ead6dSMichal Wajdeczko  *
27a85ead6dSMichal Wajdeczko  * It is assumed that those debugfs files will be created on directory entry
28a85ead6dSMichal Wajdeczko  * which struct dentry d_inode->i_private points to &xe_tile.
29a85ead6dSMichal Wajdeczko  *
30a85ead6dSMichal Wajdeczko  *      /sys/kernel/debug/dri/0/
31a85ead6dSMichal Wajdeczko  *      ├── tile0/		# tile = dentry->d_inode->i_private
32a85ead6dSMichal Wajdeczko  *      │   │   ├── id		# tile = dentry->d_parent->d_inode->i_private
33a85ead6dSMichal Wajdeczko  *
34a85ead6dSMichal Wajdeczko  * This function assumes that &m->private will be set to the &struct
35a85ead6dSMichal Wajdeczko  * drm_info_node corresponding to the instance of the info on a given &struct
36a85ead6dSMichal Wajdeczko  * drm_minor (see struct drm_info_list.show for details).
37a85ead6dSMichal Wajdeczko  *
38a85ead6dSMichal Wajdeczko  * This function also assumes that struct drm_info_list.data will point to the
39a85ead6dSMichal Wajdeczko  * function code that will actually print a file content::
40a85ead6dSMichal Wajdeczko  *
41a85ead6dSMichal Wajdeczko  *   int (*print)(struct xe_tile *, struct drm_printer *)
42a85ead6dSMichal Wajdeczko  *
43a85ead6dSMichal Wajdeczko  * Example::
44a85ead6dSMichal Wajdeczko  *
45a85ead6dSMichal Wajdeczko  *    int tile_id(struct xe_tile *tile, struct drm_printer *p)
46a85ead6dSMichal Wajdeczko  *    {
47a85ead6dSMichal Wajdeczko  *        drm_printf(p, "%u\n", tile->id);
48a85ead6dSMichal Wajdeczko  *        return 0;
49a85ead6dSMichal Wajdeczko  *    }
50a85ead6dSMichal Wajdeczko  *
51a85ead6dSMichal Wajdeczko  *    static const struct drm_info_list info[] = {
52a85ead6dSMichal Wajdeczko  *        { name = "id", .show = tile_debugfs_simple_show, .data = tile_id },
53a85ead6dSMichal Wajdeczko  *    };
54a85ead6dSMichal Wajdeczko  *
55a85ead6dSMichal Wajdeczko  *    dir = debugfs_create_dir("tile0", parent);
56a85ead6dSMichal Wajdeczko  *    dir->d_inode->i_private = tile;
57a85ead6dSMichal Wajdeczko  *    drm_debugfs_create_files(info, ARRAY_SIZE(info), dir, minor);
58a85ead6dSMichal Wajdeczko  *
59a85ead6dSMichal Wajdeczko  * Return: 0 on success or a negative error code on failure.
60a85ead6dSMichal Wajdeczko  */
618cd71c40SMichal Wajdeczko int xe_tile_debugfs_simple_show(struct seq_file *m, void *data)
62a85ead6dSMichal Wajdeczko {
63a85ead6dSMichal Wajdeczko 	struct drm_printer p = drm_seq_file_printer(m);
64a85ead6dSMichal Wajdeczko 	struct drm_info_node *node = m->private;
65a85ead6dSMichal Wajdeczko 	struct xe_tile *tile = node_to_tile(node);
66a85ead6dSMichal Wajdeczko 	int (*print)(struct xe_tile *, struct drm_printer *) = node->info_ent->data;
67a85ead6dSMichal Wajdeczko 
68a85ead6dSMichal Wajdeczko 	return print(tile, &p);
69a85ead6dSMichal Wajdeczko }
70a85ead6dSMichal Wajdeczko 
71a85ead6dSMichal Wajdeczko /**
728cd71c40SMichal Wajdeczko  * xe_tile_debugfs_show_with_rpm() - A show callback for struct drm_info_list
73a85ead6dSMichal Wajdeczko  * @m: the &seq_file
74a85ead6dSMichal Wajdeczko  * @data: data used by the drm debugfs helpers
75a85ead6dSMichal Wajdeczko  *
76a85ead6dSMichal Wajdeczko  * Similar to tile_debugfs_simple_show() but implicitly takes a RPM ref.
77a85ead6dSMichal Wajdeczko  *
78a85ead6dSMichal Wajdeczko  * Return: 0 on success or a negative error code on failure.
79a85ead6dSMichal Wajdeczko  */
808cd71c40SMichal Wajdeczko int xe_tile_debugfs_show_with_rpm(struct seq_file *m, void *data)
81a85ead6dSMichal Wajdeczko {
82a85ead6dSMichal Wajdeczko 	struct drm_info_node *node = m->private;
83a85ead6dSMichal Wajdeczko 	struct xe_tile *tile = node_to_tile(node);
84a85ead6dSMichal Wajdeczko 	struct xe_device *xe = tile_to_xe(tile);
85a85ead6dSMichal Wajdeczko 
86423fb66fSMatt Roper 	guard(xe_pm_runtime)(xe);
87423fb66fSMatt Roper 	return xe_tile_debugfs_simple_show(m, data);
88a85ead6dSMichal Wajdeczko }
89a85ead6dSMichal Wajdeczko 
90126d33f6SMichal Wajdeczko static int ggtt(struct xe_tile *tile, struct drm_printer *p)
91126d33f6SMichal Wajdeczko {
92126d33f6SMichal Wajdeczko 	return xe_ggtt_dump(tile->mem.ggtt, p);
93126d33f6SMichal Wajdeczko }
94126d33f6SMichal Wajdeczko 
95a85ead6dSMichal Wajdeczko static int sa_info(struct xe_tile *tile, struct drm_printer *p)
96a85ead6dSMichal Wajdeczko {
97a85ead6dSMichal Wajdeczko 	drm_suballoc_dump_debug_info(&tile->mem.kernel_bb_pool->base, p,
98a85ead6dSMichal Wajdeczko 				     xe_sa_manager_gpu_addr(tile->mem.kernel_bb_pool));
99a85ead6dSMichal Wajdeczko 
100a85ead6dSMichal Wajdeczko 	return 0;
101a85ead6dSMichal Wajdeczko }
102a85ead6dSMichal Wajdeczko 
103a85ead6dSMichal Wajdeczko /* only for debugfs files which can be safely used on the VF */
104a85ead6dSMichal Wajdeczko static const struct drm_info_list vf_safe_debugfs_list[] = {
1058cd71c40SMichal Wajdeczko 	{ "ggtt", .show = xe_tile_debugfs_show_with_rpm, .data = ggtt },
1068cd71c40SMichal Wajdeczko 	{ "sa_info", .show = xe_tile_debugfs_show_with_rpm, .data = sa_info },
107a85ead6dSMichal Wajdeczko };
108a85ead6dSMichal Wajdeczko 
109*8e2610d9SPiotr Piórkowski static void tile_debugfs_create_vram_mm(struct xe_tile *tile)
110*8e2610d9SPiotr Piórkowski {
111*8e2610d9SPiotr Piórkowski 	if (tile->mem.vram)
112*8e2610d9SPiotr Piórkowski 		ttm_resource_manager_create_debugfs(&tile->mem.vram->ttm.manager, tile->debugfs,
113*8e2610d9SPiotr Piórkowski 						    "vram_mm");
114*8e2610d9SPiotr Piórkowski }
115*8e2610d9SPiotr Piórkowski 
116a85ead6dSMichal Wajdeczko /**
117a85ead6dSMichal Wajdeczko  * xe_tile_debugfs_register - Register tile's debugfs attributes
118a85ead6dSMichal Wajdeczko  * @tile: the &xe_tile to register
119a85ead6dSMichal Wajdeczko  *
120a85ead6dSMichal Wajdeczko  * Create debugfs sub-directory with a name that includes a tile ID and
121a85ead6dSMichal Wajdeczko  * then creates set of debugfs files (attributes) specific to this tile.
122a85ead6dSMichal Wajdeczko  */
123a85ead6dSMichal Wajdeczko void xe_tile_debugfs_register(struct xe_tile *tile)
124a85ead6dSMichal Wajdeczko {
125a85ead6dSMichal Wajdeczko 	struct xe_device *xe = tile_to_xe(tile);
126a85ead6dSMichal Wajdeczko 	struct drm_minor *minor = xe->drm.primary;
127a85ead6dSMichal Wajdeczko 	struct dentry *root = minor->debugfs_root;
128a85ead6dSMichal Wajdeczko 	char name[8];
129a85ead6dSMichal Wajdeczko 
130a85ead6dSMichal Wajdeczko 	snprintf(name, sizeof(name), "tile%u", tile->id);
131a85ead6dSMichal Wajdeczko 	tile->debugfs = debugfs_create_dir(name, root);
132a85ead6dSMichal Wajdeczko 	if (IS_ERR(tile->debugfs))
133a85ead6dSMichal Wajdeczko 		return;
134a85ead6dSMichal Wajdeczko 
135a85ead6dSMichal Wajdeczko 	/*
136a85ead6dSMichal Wajdeczko 	 * Store the xe_tile pointer as private data of the tile/ directory
137a85ead6dSMichal Wajdeczko 	 * node so other tile specific attributes under that directory may
138a85ead6dSMichal Wajdeczko 	 * refer to it by looking at its parent node private data.
139a85ead6dSMichal Wajdeczko 	 */
140a85ead6dSMichal Wajdeczko 	tile->debugfs->d_inode->i_private = tile;
141a85ead6dSMichal Wajdeczko 
142a85ead6dSMichal Wajdeczko 	drm_debugfs_create_files(vf_safe_debugfs_list,
143a85ead6dSMichal Wajdeczko 				 ARRAY_SIZE(vf_safe_debugfs_list),
144a85ead6dSMichal Wajdeczko 				 tile->debugfs, minor);
145*8e2610d9SPiotr Piórkowski 
146*8e2610d9SPiotr Piórkowski 	tile_debugfs_create_vram_mm(tile);
147a85ead6dSMichal Wajdeczko }
148