1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Copyright © 2014 Broadcom 4 */ 5 6 #include <linux/seq_file.h> 7 #include <linux/circ_buf.h> 8 #include <linux/ctype.h> 9 #include <linux/debugfs.h> 10 11 #include "vc4_drv.h" 12 #include "vc4_regs.h" 13 14 struct vc4_debugfs_info_entry { 15 struct list_head link; 16 struct drm_info_list info; 17 }; 18 19 /* 20 * Called at drm_dev_register() time on each of the minors registered 21 * by the DRM device, to attach the debugfs files. 22 */ 23 void 24 vc4_debugfs_init(struct drm_minor *minor) 25 { 26 struct vc4_dev *vc4 = to_vc4_dev(minor->dev); 27 struct vc4_debugfs_info_entry *entry; 28 29 debugfs_create_bool("hvs_load_tracker", S_IRUGO | S_IWUSR, 30 minor->debugfs_root, &vc4->load_tracker_enabled); 31 32 list_for_each_entry(entry, &vc4->debugfs_list, link) { 33 drm_debugfs_create_files(&entry->info, 1, 34 minor->debugfs_root, minor); 35 } 36 } 37 38 static int vc4_debugfs_regset32(struct seq_file *m, void *unused) 39 { 40 struct drm_info_node *node = (struct drm_info_node *)m->private; 41 struct debugfs_regset32 *regset = node->info_ent->data; 42 struct drm_printer p = drm_seq_file_printer(m); 43 44 drm_print_regset32(&p, regset); 45 46 return 0; 47 } 48 49 /* 50 * Registers a debugfs file with a callback function for a vc4 component. 51 * 52 * This is like drm_debugfs_create_files(), but that can only be 53 * called a given DRM minor, while the various VC4 components want to 54 * register their debugfs files during the component bind process. We 55 * track the request and delay it to be called on each minor during 56 * vc4_debugfs_init(). 57 */ 58 void vc4_debugfs_add_file(struct drm_device *dev, 59 const char *name, 60 int (*show)(struct seq_file*, void*), 61 void *data) 62 { 63 struct vc4_dev *vc4 = to_vc4_dev(dev); 64 65 struct vc4_debugfs_info_entry *entry = 66 devm_kzalloc(dev->dev, sizeof(*entry), GFP_KERNEL); 67 68 if (!entry) 69 return; 70 71 entry->info.name = name; 72 entry->info.show = show; 73 entry->info.data = data; 74 75 list_add(&entry->link, &vc4->debugfs_list); 76 } 77 78 void vc4_debugfs_add_regset32(struct drm_device *drm, 79 const char *name, 80 struct debugfs_regset32 *regset) 81 { 82 vc4_debugfs_add_file(drm, name, vc4_debugfs_regset32, regset); 83 } 84