]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
drm/encoder: register per-encoder debugfs dir
authorDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Sun, 3 Dec 2023 11:53:13 +0000 (14:53 +0300)
committerDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Mon, 4 Dec 2023 14:07:29 +0000 (16:07 +0200)
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
drivers/gpu/drm/drm_debugfs.c
drivers/gpu/drm/drm_encoder.c
drivers/gpu/drm/drm_internal.h
include/drm/drm_encoder.h

index f291fb4b359fdf0d918ddaff713861ffa2424e3b..00406b4f3235c9551bdf881f8e557d8a61b657c9 100644 (file)
@@ -589,4 +589,29 @@ void drm_debugfs_crtc_remove(struct drm_crtc *crtc)
        crtc->debugfs_entry = NULL;
 }
 
+void drm_debugfs_encoder_add(struct drm_encoder *encoder)
+{
+       struct drm_minor *minor = encoder->dev->primary;
+       struct dentry *root;
+       char *name;
+
+       name = kasprintf(GFP_KERNEL, "encoder-%d", encoder->index);
+       if (!name)
+               return;
+
+       root = debugfs_create_dir(name, minor->debugfs_root);
+       kfree(name);
+
+       encoder->debugfs_entry = root;
+
+       if (encoder->funcs->debugfs_init)
+               encoder->funcs->debugfs_init(encoder, root);
+}
+
+void drm_debugfs_encoder_remove(struct drm_encoder *encoder)
+{
+       debugfs_remove_recursive(encoder->debugfs_entry);
+       encoder->debugfs_entry = NULL;
+}
+
 #endif /* CONFIG_DEBUG_FS */
index 1143bc7f325227ee252f6d593ffea55d0daa9761..8f2bc6a28482229fd0b030a1958f87753ad7885f 100644 (file)
@@ -30,6 +30,7 @@
 #include <drm/drm_print.h>
 
 #include "drm_crtc_internal.h"
+#include "drm_internal.h"
 
 /**
  * DOC: overview
@@ -74,6 +75,8 @@ int drm_encoder_register_all(struct drm_device *dev)
        int ret = 0;
 
        drm_for_each_encoder(encoder, dev) {
+               drm_debugfs_encoder_add(encoder);
+
                if (encoder->funcs && encoder->funcs->late_register)
                        ret = encoder->funcs->late_register(encoder);
                if (ret)
@@ -90,6 +93,7 @@ void drm_encoder_unregister_all(struct drm_device *dev)
        drm_for_each_encoder(encoder, dev) {
                if (encoder->funcs && encoder->funcs->early_unregister)
                        encoder->funcs->early_unregister(encoder);
+               drm_debugfs_encoder_remove(encoder);
        }
 }
 
index b12c463bc46050608d4d47211a9f81644c9568c2..b7a311efa2b1829676101140872c23c5ee90a60b 100644 (file)
@@ -194,6 +194,8 @@ void drm_debugfs_connector_remove(struct drm_connector *connector);
 void drm_debugfs_crtc_add(struct drm_crtc *crtc);
 void drm_debugfs_crtc_remove(struct drm_crtc *crtc);
 void drm_debugfs_crtc_crc_add(struct drm_crtc *crtc);
+void drm_debugfs_encoder_add(struct drm_encoder *encoder);
+void drm_debugfs_encoder_remove(struct drm_encoder *encoder);
 #else
 static inline void drm_debugfs_dev_fini(struct drm_device *dev)
 {
@@ -231,6 +233,14 @@ static inline void drm_debugfs_crtc_crc_add(struct drm_crtc *crtc)
 {
 }
 
+static inline void drm_debugfs_encoder_add(struct drm_encoder *encoder)
+{
+}
+
+static inline void drm_debugfs_encoder_remove(struct drm_encoder *encoder)
+{
+}
+
 #endif
 
 drm_ioctl_t drm_version;
index 3a09682af685a36ba42565e926fe2e0ec6955a1d..977a9381c8ba943b4d3e021635ea14856df8a17d 100644 (file)
@@ -60,7 +60,7 @@ struct drm_encoder_funcs {
         * @late_register:
         *
         * This optional hook can be used to register additional userspace
-        * interfaces attached to the encoder like debugfs interfaces.
+        * interfaces attached to the encoder.
         * It is called late in the driver load sequence from drm_dev_register().
         * Everything added from this callback should be unregistered in
         * the early_unregister callback.
@@ -81,6 +81,13 @@ struct drm_encoder_funcs {
         * before data structures are torndown.
         */
        void (*early_unregister)(struct drm_encoder *encoder);
+
+       /**
+        * @debugfs_init:
+        *
+        * Allows encoders to create encoder-specific debugfs files.
+        */
+       void (*debugfs_init)(struct drm_encoder *encoder, struct dentry *root);
 };
 
 /**
@@ -184,6 +191,13 @@ struct drm_encoder {
 
        const struct drm_encoder_funcs *funcs;
        const struct drm_encoder_helper_funcs *helper_private;
+
+       /**
+        * @debugfs_entry:
+        *
+        * Debugfs directory for this CRTC.
+        */
+       struct dentry *debugfs_entry;
 };
 
 #define obj_to_encoder(x) container_of(x, struct drm_encoder, base)