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