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

drm/encoder: register per-encoder debugfs dir

Each of connectors and CRTCs used by the DRM device provides debugfs
directory, which is used by several standard debugfs files and can
further be extended by the driver. Add such generic debugfs directories
for encoder.

Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Acked-by: Maxime Ripard <mripard@kernel.org>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20231203115315.1306124-2-dmitry.baryshkov@linaro.org

+54 -1
+25
drivers/gpu/drm/drm_debugfs.c
··· 589 589 crtc->debugfs_entry = NULL; 590 590 } 591 591 592 + void drm_debugfs_encoder_add(struct drm_encoder *encoder) 593 + { 594 + struct drm_minor *minor = encoder->dev->primary; 595 + struct dentry *root; 596 + char *name; 597 + 598 + name = kasprintf(GFP_KERNEL, "encoder-%d", encoder->index); 599 + if (!name) 600 + return; 601 + 602 + root = debugfs_create_dir(name, minor->debugfs_root); 603 + kfree(name); 604 + 605 + encoder->debugfs_entry = root; 606 + 607 + if (encoder->funcs->debugfs_init) 608 + encoder->funcs->debugfs_init(encoder, root); 609 + } 610 + 611 + void drm_debugfs_encoder_remove(struct drm_encoder *encoder) 612 + { 613 + debugfs_remove_recursive(encoder->debugfs_entry); 614 + encoder->debugfs_entry = NULL; 615 + } 616 + 592 617 #endif /* CONFIG_DEBUG_FS */
+4
drivers/gpu/drm/drm_encoder.c
··· 30 30 #include <drm/drm_print.h> 31 31 32 32 #include "drm_crtc_internal.h" 33 + #include "drm_internal.h" 33 34 34 35 /** 35 36 * DOC: overview ··· 75 74 int ret = 0; 76 75 77 76 drm_for_each_encoder(encoder, dev) { 77 + drm_debugfs_encoder_add(encoder); 78 + 78 79 if (encoder->funcs && encoder->funcs->late_register) 79 80 ret = encoder->funcs->late_register(encoder); 80 81 if (ret) ··· 93 90 drm_for_each_encoder(encoder, dev) { 94 91 if (encoder->funcs && encoder->funcs->early_unregister) 95 92 encoder->funcs->early_unregister(encoder); 93 + drm_debugfs_encoder_remove(encoder); 96 94 } 97 95 } 98 96
+10
drivers/gpu/drm/drm_internal.h
··· 194 194 void drm_debugfs_crtc_add(struct drm_crtc *crtc); 195 195 void drm_debugfs_crtc_remove(struct drm_crtc *crtc); 196 196 void drm_debugfs_crtc_crc_add(struct drm_crtc *crtc); 197 + void drm_debugfs_encoder_add(struct drm_encoder *encoder); 198 + void drm_debugfs_encoder_remove(struct drm_encoder *encoder); 197 199 #else 198 200 static inline void drm_debugfs_dev_fini(struct drm_device *dev) 199 201 { ··· 230 228 } 231 229 232 230 static inline void drm_debugfs_crtc_crc_add(struct drm_crtc *crtc) 231 + { 232 + } 233 + 234 + static inline void drm_debugfs_encoder_add(struct drm_encoder *encoder) 235 + { 236 + } 237 + 238 + static inline void drm_debugfs_encoder_remove(struct drm_encoder *encoder) 233 239 { 234 240 } 235 241
+15 -1
include/drm/drm_encoder.h
··· 60 60 * @late_register: 61 61 * 62 62 * This optional hook can be used to register additional userspace 63 - * interfaces attached to the encoder like debugfs interfaces. 63 + * interfaces attached to the encoder. 64 64 * It is called late in the driver load sequence from drm_dev_register(). 65 65 * Everything added from this callback should be unregistered in 66 66 * the early_unregister callback. ··· 81 81 * before data structures are torndown. 82 82 */ 83 83 void (*early_unregister)(struct drm_encoder *encoder); 84 + 85 + /** 86 + * @debugfs_init: 87 + * 88 + * Allows encoders to create encoder-specific debugfs files. 89 + */ 90 + void (*debugfs_init)(struct drm_encoder *encoder, struct dentry *root); 84 91 }; 85 92 86 93 /** ··· 191 184 192 185 const struct drm_encoder_funcs *funcs; 193 186 const struct drm_encoder_helper_funcs *helper_private; 187 + 188 + /** 189 + * @debugfs_entry: 190 + * 191 + * Debugfs directory for this CRTC. 192 + */ 193 + struct dentry *debugfs_entry; 194 194 }; 195 195 196 196 #define obj_to_encoder(x) container_of(x, struct drm_encoder, base)