Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/vc4: Use common helpers for debugfs setup by the driver components.

The global list of all debugfs entries for the driver was painful: the
list couldn't see into the components' structs, so each component had
its own debugs show function to find the component, then find the
regset and dump it. The components also had to be careful to check
that they were actually registered in vc4 before dereferencing
themselves, in case they weren't probed on a particular platform.
They routinely failed at that.

Instead, we can have the components add their debugfs callbacks to a
little list in vc4 to be registered at drm_dev_register() time, which
gets vc4_debugfs.c out of the business of knowing the whole list of
components.

Thanks to this change, dsi0 (if it existed) would register its node.

v2: Rebase on hvs_underrun addition.
v3: whitespace fixup

Signed-off-by: Eric Anholt <eric@anholt.net>
Link: https://patchwork.freedesktop.org/patch/msgid/20190401183559.3823-1-eric@anholt.net
Reviewed-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>

+125 -165
+3 -3
drivers/gpu/drm/vc4/vc4_bo.c
··· 66 66 mutex_unlock(&vc4->purgeable.lock); 67 67 } 68 68 69 - #ifdef CONFIG_DEBUG_FS 70 - int vc4_bo_stats_debugfs(struct seq_file *m, void *unused) 69 + static int vc4_bo_stats_debugfs(struct seq_file *m, void *unused) 71 70 { 72 71 struct drm_info_node *node = (struct drm_info_node *)m->private; 73 72 struct drm_device *dev = node->minor->dev; ··· 77 78 78 79 return 0; 79 80 } 80 - #endif 81 81 82 82 /* Takes ownership of *name and returns the appropriate slot for it in 83 83 * the bo_labels[] array, extending it as necessary. ··· 1002 1004 vc4->bo_labels[i].name = bo_type_names[i]; 1003 1005 1004 1006 mutex_init(&vc4->bo_lock); 1007 + 1008 + vc4_debugfs_add_file(dev, "bo_stats", vc4_bo_stats_debugfs, NULL); 1005 1009 1006 1010 INIT_LIST_HEAD(&vc4->bo_cache.time_list); 1007 1011
+6 -27
drivers/gpu/drm/vc4/vc4_crtc.c
··· 84 84 VC4_REG32(PV_HACT_ACT), 85 85 }; 86 86 87 - #ifdef CONFIG_DEBUG_FS 88 - int vc4_crtc_debugfs_regs(struct seq_file *m, void *unused) 89 - { 90 - struct drm_info_node *node = (struct drm_info_node *)m->private; 91 - struct drm_device *dev = node->minor->dev; 92 - int crtc_index = (uintptr_t)node->info_ent->data; 93 - struct drm_printer p = drm_seq_file_printer(m); 94 - struct drm_crtc *crtc; 95 - struct vc4_crtc *vc4_crtc; 96 - int i; 97 - 98 - i = 0; 99 - list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { 100 - if (i == crtc_index) 101 - break; 102 - i++; 103 - } 104 - if (!crtc) 105 - return 0; 106 - vc4_crtc = to_vc4_crtc(crtc); 107 - 108 - drm_print_regset32(&p, &vc4_crtc->regset); 109 - 110 - return 0; 111 - } 112 - #endif 113 - 114 87 bool vc4_crtc_get_scanoutpos(struct drm_device *dev, unsigned int crtc_id, 115 88 bool in_vblank_irq, int *vpos, int *hpos, 116 89 ktime_t *stime, ktime_t *etime, ··· 1043 1070 1044 1071 static const struct vc4_crtc_data pv0_data = { 1045 1072 .hvs_channel = 0, 1073 + .debugfs_name = "crtc0_regs", 1046 1074 .encoder_types = { 1047 1075 [PV_CONTROL_CLK_SELECT_DSI] = VC4_ENCODER_TYPE_DSI0, 1048 1076 [PV_CONTROL_CLK_SELECT_DPI_SMI_HDMI] = VC4_ENCODER_TYPE_DPI, ··· 1052 1078 1053 1079 static const struct vc4_crtc_data pv1_data = { 1054 1080 .hvs_channel = 2, 1081 + .debugfs_name = "crtc1_regs", 1055 1082 .encoder_types = { 1056 1083 [PV_CONTROL_CLK_SELECT_DSI] = VC4_ENCODER_TYPE_DSI1, 1057 1084 [PV_CONTROL_CLK_SELECT_DPI_SMI_HDMI] = VC4_ENCODER_TYPE_SMI, ··· 1061 1086 1062 1087 static const struct vc4_crtc_data pv2_data = { 1063 1088 .hvs_channel = 1, 1089 + .debugfs_name = "crtc2_regs", 1064 1090 .encoder_types = { 1065 1091 [PV_CONTROL_CLK_SELECT_DPI_SMI_HDMI] = VC4_ENCODER_TYPE_HDMI, 1066 1092 [PV_CONTROL_CLK_SELECT_VEC] = VC4_ENCODER_TYPE_VEC, ··· 1222 1246 } 1223 1247 1224 1248 platform_set_drvdata(pdev, vc4_crtc); 1249 + 1250 + vc4_debugfs_add_regset32(drm, vc4_crtc->data->debugfs_name, 1251 + &vc4_crtc->regset); 1225 1252 1226 1253 return 0; 1227 1254
+64 -18
drivers/gpu/drm/vc4/vc4_debugfs.c
··· 15 15 #include "vc4_drv.h" 16 16 #include "vc4_regs.h" 17 17 18 - static const struct drm_info_list vc4_debugfs_list[] = { 19 - {"bo_stats", vc4_bo_stats_debugfs, 0}, 20 - {"dpi_regs", vc4_dpi_debugfs_regs, 0}, 21 - {"dsi1_regs", vc4_dsi_debugfs_regs, 0, (void *)(uintptr_t)1}, 22 - {"hdmi_regs", vc4_hdmi_debugfs_regs, 0}, 23 - {"vec_regs", vc4_vec_debugfs_regs, 0}, 24 - {"txp_regs", vc4_txp_debugfs_regs, 0}, 25 - {"hvs_regs", vc4_hvs_debugfs_regs, 0}, 26 - {"hvs_underrun", vc4_hvs_debugfs_underrun, 0}, 27 - {"crtc0_regs", vc4_crtc_debugfs_regs, 0, (void *)(uintptr_t)0}, 28 - {"crtc1_regs", vc4_crtc_debugfs_regs, 0, (void *)(uintptr_t)1}, 29 - {"crtc2_regs", vc4_crtc_debugfs_regs, 0, (void *)(uintptr_t)2}, 30 - {"v3d_ident", vc4_v3d_debugfs_ident, 0}, 31 - {"v3d_regs", vc4_v3d_debugfs_regs, 0}, 18 + struct vc4_debugfs_info_entry { 19 + struct list_head link; 20 + struct drm_info_list info; 32 21 }; 33 22 34 - #define VC4_DEBUGFS_ENTRIES ARRAY_SIZE(vc4_debugfs_list) 35 - 23 + /** 24 + * Called at drm_dev_register() time on each of the minors registered 25 + * by the DRM device, to attach the debugfs files. 26 + */ 36 27 int 37 28 vc4_debugfs_init(struct drm_minor *minor) 38 29 { 39 30 struct vc4_dev *vc4 = to_vc4_dev(minor->dev); 31 + struct vc4_debugfs_info_entry *entry; 40 32 struct dentry *dentry; 41 33 42 34 dentry = debugfs_create_bool("hvs_load_tracker", S_IRUGO | S_IWUSR, ··· 37 45 if (!dentry) 38 46 return -ENOMEM; 39 47 40 - return drm_debugfs_create_files(vc4_debugfs_list, VC4_DEBUGFS_ENTRIES, 41 - minor->debugfs_root, minor); 48 + list_for_each_entry(entry, &vc4->debugfs_list, link) { 49 + int ret = drm_debugfs_create_files(&entry->info, 1, 50 + minor->debugfs_root, minor); 51 + 52 + if (ret) 53 + return ret; 54 + } 55 + 56 + return 0; 57 + } 58 + 59 + int vc4_debugfs_regset32(struct seq_file *m, void *unused) 60 + { 61 + struct drm_info_node *node = (struct drm_info_node *)m->private; 62 + struct debugfs_regset32 *regset = node->info_ent->data; 63 + struct drm_printer p = drm_seq_file_printer(m); 64 + 65 + drm_print_regset32(&p, regset); 66 + 67 + return 0; 68 + } 69 + 70 + /** 71 + * Registers a debugfs file with a callback function for a vc4 component. 72 + * 73 + * This is like drm_debugfs_create_files(), but that can only be 74 + * called a given DRM minor, while the various VC4 components want to 75 + * register their debugfs files during the component bind process. We 76 + * track the request and delay it to be called on each minor during 77 + * vc4_debugfs_init(). 78 + */ 79 + void vc4_debugfs_add_file(struct drm_device *dev, 80 + const char *name, 81 + int (*show)(struct seq_file*, void*), 82 + void *data) 83 + { 84 + struct vc4_dev *vc4 = to_vc4_dev(dev); 85 + 86 + struct vc4_debugfs_info_entry *entry = 87 + devm_kzalloc(dev->dev, sizeof(*entry), GFP_KERNEL); 88 + 89 + if (!entry) 90 + return; 91 + 92 + entry->info.name = name; 93 + entry->info.show = show; 94 + entry->info.data = data; 95 + 96 + list_add(&entry->link, &vc4->debugfs_list); 97 + } 98 + 99 + void vc4_debugfs_add_regset32(struct drm_device *drm, 100 + const char *name, 101 + struct debugfs_regset32 *regset) 102 + { 103 + vc4_debugfs_add_file(drm, name, vc4_debugfs_regset32, regset); 42 104 }
+2 -18
drivers/gpu/drm/vc4/vc4_dpi.c
··· 125 125 VC4_REG32(DPI_ID), 126 126 }; 127 127 128 - #ifdef CONFIG_DEBUG_FS 129 - int vc4_dpi_debugfs_regs(struct seq_file *m, void *unused) 130 - { 131 - struct drm_info_node *node = (struct drm_info_node *)m->private; 132 - struct drm_device *dev = node->minor->dev; 133 - struct vc4_dev *vc4 = to_vc4_dev(dev); 134 - struct vc4_dpi *dpi = vc4->dpi; 135 - struct drm_printer p = drm_seq_file_printer(m); 136 - 137 - if (!dpi) 138 - return 0; 139 - 140 - drm_print_regset32(&p, &dpi->regset); 141 - 142 - return 0; 143 - } 144 - #endif 145 - 146 128 static const struct drm_encoder_funcs vc4_dpi_encoder_funcs = { 147 129 .destroy = drm_encoder_cleanup, 148 130 }; ··· 330 348 dev_set_drvdata(dev, dpi); 331 349 332 350 vc4->dpi = dpi; 351 + 352 + vc4_debugfs_add_regset32(drm, "dpi_regs", &dpi->regset); 333 353 334 354 return 0; 335 355
+1
drivers/gpu/drm/vc4/vc4_drv.c
··· 262 262 platform_set_drvdata(pdev, drm); 263 263 vc4->dev = drm; 264 264 drm->dev_private = vc4; 265 + INIT_LIST_HEAD(&vc4->debugfs_list); 265 266 266 267 ret = vc4_bo_cache_init(drm); 267 268 if (ret)
+28 -11
drivers/gpu/drm/vc4/vc4_drv.h
··· 211 211 struct drm_modeset_lock ctm_state_lock; 212 212 struct drm_private_obj ctm_manager; 213 213 struct drm_private_obj load_tracker; 214 + 215 + /* List of vc4_debugfs_info_entry for adding to debugfs once 216 + * the minor is available (after drm_dev_register()). 217 + */ 218 + struct list_head debugfs_list; 214 219 }; 215 220 216 221 static inline struct vc4_dev * ··· 434 429 int hvs_channel; 435 430 436 431 enum vc4_encoder_type encoder_types[4]; 432 + const char *debugfs_name; 437 433 }; 438 434 439 435 struct vc4_crtc { ··· 721 715 void *vc4_prime_vmap(struct drm_gem_object *obj); 722 716 int vc4_bo_cache_init(struct drm_device *dev); 723 717 void vc4_bo_cache_destroy(struct drm_device *dev); 724 - int vc4_bo_stats_debugfs(struct seq_file *m, void *arg); 725 718 int vc4_bo_inc_usecnt(struct vc4_bo *bo); 726 719 void vc4_bo_dec_usecnt(struct vc4_bo *bo); 727 720 void vc4_bo_add_to_purgeable_pool(struct vc4_bo *bo); ··· 728 723 729 724 /* vc4_crtc.c */ 730 725 extern struct platform_driver vc4_crtc_driver; 731 - int vc4_crtc_debugfs_regs(struct seq_file *m, void *arg); 732 726 bool vc4_crtc_get_scanoutpos(struct drm_device *dev, unsigned int crtc_id, 733 727 bool in_vblank_irq, int *vpos, int *hpos, 734 728 ktime_t *stime, ktime_t *etime, ··· 740 736 741 737 /* vc4_debugfs.c */ 742 738 int vc4_debugfs_init(struct drm_minor *minor); 739 + #ifdef CONFIG_DEBUG_FS 740 + void vc4_debugfs_add_file(struct drm_device *drm, 741 + const char *filename, 742 + int (*show)(struct seq_file*, void*), 743 + void *data); 744 + void vc4_debugfs_add_regset32(struct drm_device *drm, 745 + const char *filename, 746 + struct debugfs_regset32 *regset); 747 + #else 748 + static inline void vc4_debugfs_add_file(struct drm_device *drm, 749 + const char *filename, 750 + int (*show)(struct seq_file*, void*), 751 + void *data) 752 + { 753 + } 754 + 755 + static inline void vc4_debugfs_add_regset32(struct drm_device *drm, 756 + const char *filename, 757 + struct debugfs_regset32 *regset) 758 + { 759 + } 760 + #endif 743 761 744 762 /* vc4_drv.c */ 745 763 void __iomem *vc4_ioremap_regs(struct platform_device *dev, int index); 746 764 747 765 /* vc4_dpi.c */ 748 766 extern struct platform_driver vc4_dpi_driver; 749 - int vc4_dpi_debugfs_regs(struct seq_file *m, void *unused); 750 767 751 768 /* vc4_dsi.c */ 752 769 extern struct platform_driver vc4_dsi_driver; 753 - int vc4_dsi_debugfs_regs(struct seq_file *m, void *unused); 754 770 755 771 /* vc4_fence.c */ 756 772 extern const struct dma_fence_ops vc4_fence_ops; ··· 798 774 799 775 /* vc4_hdmi.c */ 800 776 extern struct platform_driver vc4_hdmi_driver; 801 - int vc4_hdmi_debugfs_regs(struct seq_file *m, void *unused); 802 777 803 778 /* vc4_vec.c */ 804 779 extern struct platform_driver vc4_vec_driver; 805 - int vc4_vec_debugfs_regs(struct seq_file *m, void *unused); 806 780 807 781 /* vc4_txp.c */ 808 782 extern struct platform_driver vc4_txp_driver; 809 - int vc4_txp_debugfs_regs(struct seq_file *m, void *unused); 810 783 811 784 /* vc4_irq.c */ 812 785 irqreturn_t vc4_irq(int irq, void *arg); ··· 815 794 /* vc4_hvs.c */ 816 795 extern struct platform_driver vc4_hvs_driver; 817 796 void vc4_hvs_dump_state(struct drm_device *dev); 818 - int vc4_hvs_debugfs_regs(struct seq_file *m, void *unused); 819 - int vc4_hvs_debugfs_underrun(struct seq_file *m, void *unused); 820 797 void vc4_hvs_unmask_underrun(struct drm_device *dev, int channel); 821 798 void vc4_hvs_mask_underrun(struct drm_device *dev, int channel); 822 799 ··· 831 812 832 813 /* vc4_v3d.c */ 833 814 extern struct platform_driver vc4_v3d_driver; 834 - int vc4_v3d_debugfs_ident(struct seq_file *m, void *unused); 835 - int vc4_v3d_debugfs_regs(struct seq_file *m, void *unused); 836 815 int vc4_v3d_get_bin_slot(struct vc4_dev *vc4); 837 816 int vc4_v3d_pm_get(struct vc4_dev *vc4); 838 817 void vc4_v3d_pm_put(struct vc4_dev *vc4);
+5 -19
drivers/gpu/drm/vc4/vc4_dsi.c
··· 657 657 VC4_REG32(DSI1_ID), 658 658 }; 659 659 660 - #ifdef CONFIG_DEBUG_FS 661 - int vc4_dsi_debugfs_regs(struct seq_file *m, void *unused) 662 - { 663 - struct drm_info_node *node = (struct drm_info_node *)m->private; 664 - struct drm_device *drm = node->minor->dev; 665 - struct vc4_dev *vc4 = to_vc4_dev(drm); 666 - int dsi_index = (uintptr_t)node->info_ent->data; 667 - struct vc4_dsi *dsi = (dsi_index == 1 ? vc4->dsi1 : NULL); 668 - struct drm_printer p = drm_seq_file_printer(m); 669 - 670 - if (!dsi) 671 - return 0; 672 - 673 - drm_print_regset32(&p, &dsi->regset); 674 - 675 - return 0; 676 - } 677 - #endif 678 - 679 660 static void vc4_dsi_encoder_destroy(struct drm_encoder *encoder) 680 661 { 681 662 drm_encoder_cleanup(encoder); ··· 1617 1636 * encoder's enable/disable paths. 1618 1637 */ 1619 1638 dsi->encoder->bridge = NULL; 1639 + 1640 + if (dsi->port == 0) 1641 + vc4_debugfs_add_regset32(drm, "dsi0_regs", &dsi->regset); 1642 + else 1643 + vc4_debugfs_add_regset32(drm, "dsi1_regs", &dsi->regset); 1620 1644 1621 1645 pm_runtime_enable(dev); 1622 1646
+3 -3
drivers/gpu/drm/vc4/vc4_hdmi.c
··· 187 187 VC4_REG32(VC4_HD_FRAME_COUNT), 188 188 }; 189 189 190 - #ifdef CONFIG_DEBUG_FS 191 - int vc4_hdmi_debugfs_regs(struct seq_file *m, void *unused) 190 + static int vc4_hdmi_debugfs_regs(struct seq_file *m, void *unused) 192 191 { 193 192 struct drm_info_node *node = (struct drm_info_node *)m->private; 194 193 struct drm_device *dev = node->minor->dev; ··· 200 201 201 202 return 0; 202 203 } 203 - #endif /* CONFIG_DEBUG_FS */ 204 204 205 205 static enum drm_connector_status 206 206 vc4_hdmi_connector_detect(struct drm_connector *connector, bool force) ··· 1429 1431 ret = vc4_hdmi_audio_init(hdmi); 1430 1432 if (ret) 1431 1433 goto err_destroy_encoder; 1434 + 1435 + vc4_debugfs_add_file(drm, "hdmi_regs", vc4_hdmi_debugfs_regs, hdmi); 1432 1436 1433 1437 return 0; 1434 1438
+5 -15
drivers/gpu/drm/vc4/vc4_hvs.c
··· 80 80 } 81 81 } 82 82 83 - #ifdef CONFIG_DEBUG_FS 84 - int vc4_hvs_debugfs_regs(struct seq_file *m, void *unused) 85 - { 86 - struct drm_info_node *node = (struct drm_info_node *)m->private; 87 - struct drm_device *dev = node->minor->dev; 88 - struct vc4_dev *vc4 = to_vc4_dev(dev); 89 - struct drm_printer p = drm_seq_file_printer(m); 90 - 91 - drm_print_regset32(&p, &vc4->hvs->regset); 92 - 93 - return 0; 94 - } 95 - 96 - int vc4_hvs_debugfs_underrun(struct seq_file *m, void *data) 83 + static int vc4_hvs_debugfs_underrun(struct seq_file *m, void *data) 97 84 { 98 85 struct drm_info_node *node = m->private; 99 86 struct drm_device *dev = node->minor->dev; ··· 91 104 92 105 return 0; 93 106 } 94 - #endif 95 107 96 108 /* The filter kernel is composed of dwords each containing 3 9-bit 97 109 * signed integers packed next to each other. ··· 301 315 vc4_hvs_irq_handler, 0, "vc4 hvs", drm); 302 316 if (ret) 303 317 return ret; 318 + 319 + vc4_debugfs_add_regset32(drm, "hvs_regs", &hvs->regset); 320 + vc4_debugfs_add_file(drm, "hvs_underrun", vc4_hvs_debugfs_underrun, 321 + NULL); 304 322 305 323 return 0; 306 324 }
+2 -18
drivers/gpu/drm/vc4/vc4_txp.c
··· 169 169 VC4_REG32(TXP_PROGRESS), 170 170 }; 171 171 172 - #ifdef CONFIG_DEBUG_FS 173 - int vc4_txp_debugfs_regs(struct seq_file *m, void *unused) 174 - { 175 - struct drm_info_node *node = (struct drm_info_node *)m->private; 176 - struct drm_device *dev = node->minor->dev; 177 - struct vc4_dev *vc4 = to_vc4_dev(dev); 178 - struct vc4_txp *txp = vc4->txp; 179 - struct drm_printer p = drm_seq_file_printer(m); 180 - 181 - if (!txp) 182 - return 0; 183 - 184 - drm_print_regset32(&p, &txp->regset); 185 - 186 - return 0; 187 - } 188 - #endif 189 - 190 172 static int vc4_txp_connector_get_modes(struct drm_connector *connector) 191 173 { 192 174 struct drm_device *dev = connector->dev; ··· 405 423 406 424 dev_set_drvdata(dev, txp); 407 425 vc4->txp = txp; 426 + 427 + vc4_debugfs_add_regset32(drm, "txp_regs", &txp->regset); 408 428 409 429 return 0; 410 430 }
+4 -15
drivers/gpu/drm/vc4/vc4_v3d.c
··· 22 22 #include "vc4_drv.h" 23 23 #include "vc4_regs.h" 24 24 25 - #ifdef CONFIG_DEBUG_FS 26 25 static const struct debugfs_reg32 v3d_regs[] = { 27 26 VC4_REG32(V3D_IDENT0), 28 27 VC4_REG32(V3D_IDENT1), ··· 103 104 VC4_REG32(V3D_ERRSTAT), 104 105 }; 105 106 106 - int vc4_v3d_debugfs_regs(struct seq_file *m, void *unused) 107 - { 108 - struct drm_info_node *node = (struct drm_info_node *)m->private; 109 - struct drm_device *dev = node->minor->dev; 110 - struct vc4_dev *vc4 = to_vc4_dev(dev); 111 - struct drm_printer p = drm_seq_file_printer(m); 112 - 113 - drm_print_regset32(&p, &vc4->v3d->regset); 114 - 115 - return 0; 116 - } 117 - 118 - int vc4_v3d_debugfs_ident(struct seq_file *m, void *unused) 107 + static int vc4_v3d_debugfs_ident(struct seq_file *m, void *unused) 119 108 { 120 109 struct drm_info_node *node = (struct drm_info_node *)m->private; 121 110 struct drm_device *dev = node->minor->dev; ··· 128 141 129 142 return 0; 130 143 } 131 - #endif /* CONFIG_DEBUG_FS */ 132 144 133 145 /** 134 146 * Wraps pm_runtime_get_sync() in a refcount, so that we can reliably ··· 427 441 pm_runtime_use_autosuspend(dev); 428 442 pm_runtime_set_autosuspend_delay(dev, 40); /* a little over 2 frames. */ 429 443 pm_runtime_enable(dev); 444 + 445 + vc4_debugfs_add_file(drm, "v3d_ident", vc4_v3d_debugfs_ident, NULL); 446 + vc4_debugfs_add_regset32(drm, "v3d_regs", &v3d->regset); 430 447 431 448 return 0; 432 449 }
+2 -18
drivers/gpu/drm/vc4/vc4_vec.c
··· 252 252 VC4_REG32(VEC_DAC_MISC), 253 253 }; 254 254 255 - #ifdef CONFIG_DEBUG_FS 256 - int vc4_vec_debugfs_regs(struct seq_file *m, void *unused) 257 - { 258 - struct drm_info_node *node = (struct drm_info_node *)m->private; 259 - struct drm_device *dev = node->minor->dev; 260 - struct vc4_dev *vc4 = to_vc4_dev(dev); 261 - struct vc4_vec *vec = vc4->vec; 262 - struct drm_printer p = drm_seq_file_printer(m); 263 - 264 - if (!vec) 265 - return 0; 266 - 267 - drm_print_regset32(&p, &vec->regset); 268 - 269 - return 0; 270 - } 271 - #endif 272 - 273 255 static void vc4_vec_ntsc_mode_set(struct vc4_vec *vec) 274 256 { 275 257 VEC_WRITE(VEC_CONFIG0, VEC_CONFIG0_NTSC_STD | VEC_CONFIG0_PDEN); ··· 590 608 dev_set_drvdata(dev, vec); 591 609 592 610 vc4->vec = vec; 611 + 612 + vc4_debugfs_add_regset32(drm, "vec_regs", &vec->regset); 593 613 594 614 return 0; 595 615