On Wed, 26 Feb 2025, Luca Ceresoli <luca.ceresoli@xxxxxxxxxxx> wrote: > The global bridges_list holding all the bridges between drm_bridge_add() > and drm_bridge_remove() cannot be inspected via debugfs. Add a file showing > it. > > To avoid code duplication, move the code printing a bridge info to a common > function. Going forward, please separate refactoring (extracting the function) from the functional changes (adding the new debugfs) to independent patches. It's just easier to review. Anyway, I reviewed this one, so no need to roll another version. And thanks for doing this; I believe the end result is better. Reviewed-by: Jani Nikula <jani.nikula@xxxxxxxxx> > > Signed-off-by: Luca Ceresoli <luca.ceresoli@xxxxxxxxxxx> > > --- > > Changed in v8: > - add the file in drm_bridge.c, which avois the added #if CONFIG_DEBUG_FS > - fix incorrect (but harmless) idx increment in > drm_bridge_debugfs_show_bridge() > > Changed in v7: > - move implementation to drm_bridge.c to avoid exporting bridge_list and > bridge_mutex > > This patch was added in v6. > --- > drivers/gpu/drm/drm_bridge.c | 72 ++++++++++++++++++++++++++++++-------------- > drivers/gpu/drm/drm_drv.c | 2 ++ > include/drm/drm_bridge.h | 1 + > 3 files changed, 53 insertions(+), 22 deletions(-) > > diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c > index a6bf1a565e3c3a8d24de60448972849f6d86ba72..9c6e35d41ed54a14d5745e684a341c907ed84d6b 100644 > --- a/drivers/gpu/drm/drm_bridge.c > +++ b/drivers/gpu/drm/drm_bridge.c > @@ -1336,6 +1336,49 @@ struct drm_bridge *of_drm_find_bridge(struct device_node *np) > EXPORT_SYMBOL(of_drm_find_bridge); > #endif > > +static void drm_bridge_debugfs_show_bridge(struct drm_printer *p, > + struct drm_bridge *bridge, > + unsigned int idx) > +{ > + drm_printf(p, "bridge[%u]: %ps\n", idx, bridge->funcs); > + drm_printf(p, "\ttype: [%d] %s\n", > + bridge->type, > + drm_get_connector_type_name(bridge->type)); > + > + if (bridge->of_node) > + drm_printf(p, "\tOF: %pOFfc\n", bridge->of_node); > + > + drm_printf(p, "\tops: [0x%x]", bridge->ops); > + if (bridge->ops & DRM_BRIDGE_OP_DETECT) > + drm_puts(p, " detect"); > + if (bridge->ops & DRM_BRIDGE_OP_EDID) > + drm_puts(p, " edid"); > + if (bridge->ops & DRM_BRIDGE_OP_HPD) > + drm_puts(p, " hpd"); > + if (bridge->ops & DRM_BRIDGE_OP_MODES) > + drm_puts(p, " modes"); > + if (bridge->ops & DRM_BRIDGE_OP_HDMI) > + drm_puts(p, " hdmi"); > + drm_puts(p, "\n"); > +} > + > +static int allbridges_show(struct seq_file *m, void *data) > +{ > + struct drm_printer p = drm_seq_file_printer(m); > + struct drm_bridge *bridge; > + unsigned int idx = 0; > + > + mutex_lock(&bridge_lock); > + > + list_for_each_entry(bridge, &bridge_list, list) > + drm_bridge_debugfs_show_bridge(&p, bridge, idx++); > + > + mutex_unlock(&bridge_lock); > + > + return 0; > +} > +DEFINE_SHOW_ATTRIBUTE(allbridges); > + > static int encoder_bridges_show(struct seq_file *m, void *data) > { > struct drm_encoder *encoder = m->private; > @@ -1343,33 +1386,18 @@ static int encoder_bridges_show(struct seq_file *m, void *data) > struct drm_bridge *bridge; > unsigned int idx = 0; > > - drm_for_each_bridge_in_chain(encoder, bridge) { > - drm_printf(&p, "bridge[%u]: %ps\n", idx++, bridge->funcs); > - drm_printf(&p, "\ttype: [%d] %s\n", > - bridge->type, > - drm_get_connector_type_name(bridge->type)); > - > - if (bridge->of_node) > - drm_printf(&p, "\tOF: %pOFfc\n", bridge->of_node); > - > - drm_printf(&p, "\tops: [0x%x]", bridge->ops); > - if (bridge->ops & DRM_BRIDGE_OP_DETECT) > - drm_puts(&p, " detect"); > - if (bridge->ops & DRM_BRIDGE_OP_EDID) > - drm_puts(&p, " edid"); > - if (bridge->ops & DRM_BRIDGE_OP_HPD) > - drm_puts(&p, " hpd"); > - if (bridge->ops & DRM_BRIDGE_OP_MODES) > - drm_puts(&p, " modes"); > - if (bridge->ops & DRM_BRIDGE_OP_HDMI) > - drm_puts(&p, " hdmi"); > - drm_puts(&p, "\n"); > - } > + drm_for_each_bridge_in_chain(encoder, bridge) > + drm_bridge_debugfs_show_bridge(&p, bridge, idx++); > > return 0; > } > DEFINE_SHOW_ATTRIBUTE(encoder_bridges); > > +void drm_bridge_debugfs_params(struct dentry *root) > +{ > + debugfs_create_file("bridges", 0444, root, NULL, &allbridges_fops); > +} > + > void drm_bridge_debugfs_encoder_params(struct dentry *root, > struct drm_encoder *encoder) > { > diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c > index 3cf440eee8a2ab3de134d925db8f1d2ce68062b7..22e8cd0a6a37a0ac25535e9d570da25571b0b2bc 100644 > --- a/drivers/gpu/drm/drm_drv.c > +++ b/drivers/gpu/drm/drm_drv.c > @@ -38,6 +38,7 @@ > #include <linux/xarray.h> > > #include <drm/drm_accel.h> > +#include <drm/drm_bridge.h> > #include <drm/drm_cache.h> > #include <drm/drm_client_event.h> > #include <drm/drm_color_mgmt.h> > @@ -1120,6 +1121,7 @@ static int __init drm_core_init(void) > } > > drm_debugfs_root = debugfs_create_dir("dri", NULL); > + drm_bridge_debugfs_params(drm_debugfs_root); > > ret = register_chrdev(DRM_MAJOR, "drm", &drm_stub_fops); > if (ret < 0) > diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h > index 0890acfe04b99b1ccbbff10b507cb8c2b2705e06..2a99d70865571f24db0ca75c758cfd09d3a5d459 100644 > --- a/include/drm/drm_bridge.h > +++ b/include/drm/drm_bridge.h > @@ -1108,6 +1108,7 @@ static inline struct drm_bridge *drmm_of_get_bridge(struct drm_device *drm, > } > #endif > > +void drm_bridge_debugfs_params(struct dentry *root); > void drm_bridge_debugfs_encoder_params(struct dentry *root, struct drm_encoder *encoder); > > #endif -- Jani Nikula, Intel