From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Douglas Anderson <dianders@chromium.org>
Cc: Jernej Skrabec <jernej.skrabec@gmail.com>,
Andrzej Hajda <andrzej.hajda@intel.com>,
Jonas Karlman <jonas@kwiboo.se>, David Airlie <airlied@linux.ie>,
Thomas Zimmermann <tzimmermann@suse.de>,
Neil Armstrong <narmstrong@baylibre.com>,
Javier Martinez Canillas <javierm@redhat.com>,
robert.foss@linaro.org, linux-kernel@vger.kernel.org,
Thierry Reding <thierry.reding@gmail.com>,
dri-devel@lists.freedesktop.org, lschyi@chromium.org,
Sam Ravnborg <sam@ravnborg.org>,
jjsu@chromium.org
Subject: Re: [PATCH v2 2/3] drm: Plumb debugfs_init through to panels
Date: Tue, 8 Feb 2022 03:53:56 +0200 [thread overview]
Message-ID: <YgHNNBShfCh8CuCC@pendragon.ideasonboard.com> (raw)
In-Reply-To: <20220204161245.v2.2.Ib0bd5346135cbb0b63006b69b61d4c8af6484740@changeid>
Hi Douglas,
Thank you for the patch.
On Fri, Feb 04, 2022 at 04:13:41PM -0800, Douglas Anderson wrote:
> We'd like panels to be able to add things to debugfs underneath the
> connector's directory. Let's plumb it through. A panel will be able to
> put things in a "panel" directory under the connector's
> directory. Note that debugfs is not ABI and so it's always possible
> that the location that the panel gets for its debugfs could change in
> the future.
>
> NOTE: this currently only works if you're using a modern
> architecture. Specifically the plumbing relies on _both_
> drm_bridge_connector and drm_panel_bridge. If you're not using one or
> both of these things then things won't be plumbed through.
>
> As a side effect of this change, drm_bridges can also get callbacks to
> put stuff underneath the connector's debugfs directory. At the moment
> all bridges in the chain have their debugfs_init() called with the
> connector's root directory.
>
> Signed-off-by: Douglas Anderson <dianders@chromium.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---
>
> Changes in v2:
> - ("drm: Plumb debugfs_init through to panels") new for v2.
>
> drivers/gpu/drm/bridge/panel.c | 12 ++++++++++++
> drivers/gpu/drm/drm_bridge_connector.c | 15 +++++++++++++++
> drivers/gpu/drm/drm_debugfs.c | 3 +++
> include/drm/drm_bridge.h | 7 +++++++
> include/drm/drm_connector.h | 7 +++++++
> include/drm/drm_panel.h | 8 ++++++++
> 6 files changed, 52 insertions(+)
>
> diff --git a/drivers/gpu/drm/bridge/panel.c b/drivers/gpu/drm/bridge/panel.c
> index b32295abd9e7..5be057575183 100644
> --- a/drivers/gpu/drm/bridge/panel.c
> +++ b/drivers/gpu/drm/bridge/panel.c
> @@ -138,6 +138,17 @@ static int panel_bridge_get_modes(struct drm_bridge *bridge,
> return drm_panel_get_modes(panel_bridge->panel, connector);
> }
>
> +static void panel_bridge_debugfs_init(struct drm_bridge *bridge,
> + struct dentry *root)
> +{
> + struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge);
> + struct drm_panel *panel = panel_bridge->panel;
> +
> + root = debugfs_create_dir("panel", root);
> + if (panel->funcs->debugfs_init)
> + panel->funcs->debugfs_init(panel, root);
> +}
> +
> static const struct drm_bridge_funcs panel_bridge_bridge_funcs = {
> .attach = panel_bridge_attach,
> .detach = panel_bridge_detach,
> @@ -150,6 +161,7 @@ static const struct drm_bridge_funcs panel_bridge_bridge_funcs = {
> .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
> .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
> .atomic_get_input_bus_fmts = drm_atomic_helper_bridge_propagate_bus_fmt,
> + .debugfs_init = panel_bridge_debugfs_init,
> };
>
> /**
> diff --git a/drivers/gpu/drm/drm_bridge_connector.c b/drivers/gpu/drm/drm_bridge_connector.c
> index 791379816837..60923cdfe8e1 100644
> --- a/drivers/gpu/drm/drm_bridge_connector.c
> +++ b/drivers/gpu/drm/drm_bridge_connector.c
> @@ -216,6 +216,20 @@ static void drm_bridge_connector_destroy(struct drm_connector *connector)
> kfree(bridge_connector);
> }
>
> +static void drm_bridge_connector_debugfs_init(struct drm_connector *connector,
> + struct dentry *root)
> +{
> + struct drm_bridge_connector *bridge_connector =
> + to_drm_bridge_connector(connector);
> + struct drm_encoder *encoder = bridge_connector->encoder;
> + struct drm_bridge *bridge;
> +
> + list_for_each_entry(bridge, &encoder->bridge_chain, chain_node) {
> + if (bridge->funcs->debugfs_init)
> + bridge->funcs->debugfs_init(bridge, root);
> + }
> +}
> +
> static const struct drm_connector_funcs drm_bridge_connector_funcs = {
> .reset = drm_atomic_helper_connector_reset,
> .detect = drm_bridge_connector_detect,
> @@ -223,6 +237,7 @@ static const struct drm_connector_funcs drm_bridge_connector_funcs = {
> .destroy = drm_bridge_connector_destroy,
> .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
> .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
> + .debugfs_init = drm_bridge_connector_debugfs_init,
> };
>
> /* -----------------------------------------------------------------------------
> diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c
> index b0a826489488..7f1b82dbaebb 100644
> --- a/drivers/gpu/drm/drm_debugfs.c
> +++ b/drivers/gpu/drm/drm_debugfs.c
> @@ -436,6 +436,9 @@ void drm_debugfs_connector_add(struct drm_connector *connector)
> /* vrr range */
> debugfs_create_file("vrr_range", S_IRUGO, root, connector,
> &vrr_range_fops);
> +
> + if (connector->funcs->debugfs_init)
> + connector->funcs->debugfs_init(connector, root);
> }
>
> void drm_debugfs_connector_remove(struct drm_connector *connector)
> diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h
> index 061d87313fac..f27b4060faa2 100644
> --- a/include/drm/drm_bridge.h
> +++ b/include/drm/drm_bridge.h
> @@ -649,6 +649,13 @@ struct drm_bridge_funcs {
> * the DRM_BRIDGE_OP_HPD flag in their &drm_bridge->ops.
> */
> void (*hpd_disable)(struct drm_bridge *bridge);
> +
> + /**
> + * @debugfs_init:
> + *
> + * Allows bridges to create bridge-specific debugfs files.
> + */
> + void (*debugfs_init)(struct drm_bridge *bridge, struct dentry *root);
> };
>
> /**
> diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
> index 64cf5f88c05b..54429dde744a 100644
> --- a/include/drm/drm_connector.h
> +++ b/include/drm/drm_connector.h
> @@ -1142,6 +1142,13 @@ struct drm_connector_funcs {
> * has been received from a source outside the display driver / device.
> */
> void (*oob_hotplug_event)(struct drm_connector *connector);
> +
> + /**
> + * @debugfs_init:
> + *
> + * Allows connectors to create connector-specific debugfs files.
> + */
> + void (*debugfs_init)(struct drm_connector *connector, struct dentry *root);
> };
>
> /**
> diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h
> index 4602f833eb51..1ba2d424a53f 100644
> --- a/include/drm/drm_panel.h
> +++ b/include/drm/drm_panel.h
> @@ -29,6 +29,7 @@
> #include <linux/list.h>
>
> struct backlight_device;
> +struct dentry;
> struct device_node;
> struct drm_connector;
> struct drm_device;
> @@ -125,6 +126,13 @@ struct drm_panel_funcs {
> */
> int (*get_timings)(struct drm_panel *panel, unsigned int num_timings,
> struct display_timing *timings);
> +
> + /**
> + * @debugfs_init:
> + *
> + * Allows panels to create panels-specific debugfs files.
> + */
> + void (*debugfs_init)(struct drm_panel *panel, struct dentry *root);
> };
>
> /**
--
Regards,
Laurent Pinchart
WARNING: multiple messages have this Message-ID (diff)
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Douglas Anderson <dianders@chromium.org>
Cc: dri-devel@lists.freedesktop.org, Daniel Vetter <daniel@ffwll.ch>,
Javier Martinez Canillas <javierm@redhat.com>,
robert.foss@linaro.org, lschyi@chromium.org,
Sam Ravnborg <sam@ravnborg.org>,
jjsu@chromium.org, Andrzej Hajda <andrzej.hajda@intel.com>,
David Airlie <airlied@linux.ie>,
Jernej Skrabec <jernej.skrabec@gmail.com>,
Jonas Karlman <jonas@kwiboo.se>,
Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
Maxime Ripard <mripard@kernel.org>,
Neil Armstrong <narmstrong@baylibre.com>,
Thierry Reding <thierry.reding@gmail.com>,
Thomas Zimmermann <tzimmermann@suse.de>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 2/3] drm: Plumb debugfs_init through to panels
Date: Tue, 8 Feb 2022 03:53:56 +0200 [thread overview]
Message-ID: <YgHNNBShfCh8CuCC@pendragon.ideasonboard.com> (raw)
In-Reply-To: <20220204161245.v2.2.Ib0bd5346135cbb0b63006b69b61d4c8af6484740@changeid>
Hi Douglas,
Thank you for the patch.
On Fri, Feb 04, 2022 at 04:13:41PM -0800, Douglas Anderson wrote:
> We'd like panels to be able to add things to debugfs underneath the
> connector's directory. Let's plumb it through. A panel will be able to
> put things in a "panel" directory under the connector's
> directory. Note that debugfs is not ABI and so it's always possible
> that the location that the panel gets for its debugfs could change in
> the future.
>
> NOTE: this currently only works if you're using a modern
> architecture. Specifically the plumbing relies on _both_
> drm_bridge_connector and drm_panel_bridge. If you're not using one or
> both of these things then things won't be plumbed through.
>
> As a side effect of this change, drm_bridges can also get callbacks to
> put stuff underneath the connector's debugfs directory. At the moment
> all bridges in the chain have their debugfs_init() called with the
> connector's root directory.
>
> Signed-off-by: Douglas Anderson <dianders@chromium.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---
>
> Changes in v2:
> - ("drm: Plumb debugfs_init through to panels") new for v2.
>
> drivers/gpu/drm/bridge/panel.c | 12 ++++++++++++
> drivers/gpu/drm/drm_bridge_connector.c | 15 +++++++++++++++
> drivers/gpu/drm/drm_debugfs.c | 3 +++
> include/drm/drm_bridge.h | 7 +++++++
> include/drm/drm_connector.h | 7 +++++++
> include/drm/drm_panel.h | 8 ++++++++
> 6 files changed, 52 insertions(+)
>
> diff --git a/drivers/gpu/drm/bridge/panel.c b/drivers/gpu/drm/bridge/panel.c
> index b32295abd9e7..5be057575183 100644
> --- a/drivers/gpu/drm/bridge/panel.c
> +++ b/drivers/gpu/drm/bridge/panel.c
> @@ -138,6 +138,17 @@ static int panel_bridge_get_modes(struct drm_bridge *bridge,
> return drm_panel_get_modes(panel_bridge->panel, connector);
> }
>
> +static void panel_bridge_debugfs_init(struct drm_bridge *bridge,
> + struct dentry *root)
> +{
> + struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge);
> + struct drm_panel *panel = panel_bridge->panel;
> +
> + root = debugfs_create_dir("panel", root);
> + if (panel->funcs->debugfs_init)
> + panel->funcs->debugfs_init(panel, root);
> +}
> +
> static const struct drm_bridge_funcs panel_bridge_bridge_funcs = {
> .attach = panel_bridge_attach,
> .detach = panel_bridge_detach,
> @@ -150,6 +161,7 @@ static const struct drm_bridge_funcs panel_bridge_bridge_funcs = {
> .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
> .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
> .atomic_get_input_bus_fmts = drm_atomic_helper_bridge_propagate_bus_fmt,
> + .debugfs_init = panel_bridge_debugfs_init,
> };
>
> /**
> diff --git a/drivers/gpu/drm/drm_bridge_connector.c b/drivers/gpu/drm/drm_bridge_connector.c
> index 791379816837..60923cdfe8e1 100644
> --- a/drivers/gpu/drm/drm_bridge_connector.c
> +++ b/drivers/gpu/drm/drm_bridge_connector.c
> @@ -216,6 +216,20 @@ static void drm_bridge_connector_destroy(struct drm_connector *connector)
> kfree(bridge_connector);
> }
>
> +static void drm_bridge_connector_debugfs_init(struct drm_connector *connector,
> + struct dentry *root)
> +{
> + struct drm_bridge_connector *bridge_connector =
> + to_drm_bridge_connector(connector);
> + struct drm_encoder *encoder = bridge_connector->encoder;
> + struct drm_bridge *bridge;
> +
> + list_for_each_entry(bridge, &encoder->bridge_chain, chain_node) {
> + if (bridge->funcs->debugfs_init)
> + bridge->funcs->debugfs_init(bridge, root);
> + }
> +}
> +
> static const struct drm_connector_funcs drm_bridge_connector_funcs = {
> .reset = drm_atomic_helper_connector_reset,
> .detect = drm_bridge_connector_detect,
> @@ -223,6 +237,7 @@ static const struct drm_connector_funcs drm_bridge_connector_funcs = {
> .destroy = drm_bridge_connector_destroy,
> .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
> .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
> + .debugfs_init = drm_bridge_connector_debugfs_init,
> };
>
> /* -----------------------------------------------------------------------------
> diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c
> index b0a826489488..7f1b82dbaebb 100644
> --- a/drivers/gpu/drm/drm_debugfs.c
> +++ b/drivers/gpu/drm/drm_debugfs.c
> @@ -436,6 +436,9 @@ void drm_debugfs_connector_add(struct drm_connector *connector)
> /* vrr range */
> debugfs_create_file("vrr_range", S_IRUGO, root, connector,
> &vrr_range_fops);
> +
> + if (connector->funcs->debugfs_init)
> + connector->funcs->debugfs_init(connector, root);
> }
>
> void drm_debugfs_connector_remove(struct drm_connector *connector)
> diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h
> index 061d87313fac..f27b4060faa2 100644
> --- a/include/drm/drm_bridge.h
> +++ b/include/drm/drm_bridge.h
> @@ -649,6 +649,13 @@ struct drm_bridge_funcs {
> * the DRM_BRIDGE_OP_HPD flag in their &drm_bridge->ops.
> */
> void (*hpd_disable)(struct drm_bridge *bridge);
> +
> + /**
> + * @debugfs_init:
> + *
> + * Allows bridges to create bridge-specific debugfs files.
> + */
> + void (*debugfs_init)(struct drm_bridge *bridge, struct dentry *root);
> };
>
> /**
> diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
> index 64cf5f88c05b..54429dde744a 100644
> --- a/include/drm/drm_connector.h
> +++ b/include/drm/drm_connector.h
> @@ -1142,6 +1142,13 @@ struct drm_connector_funcs {
> * has been received from a source outside the display driver / device.
> */
> void (*oob_hotplug_event)(struct drm_connector *connector);
> +
> + /**
> + * @debugfs_init:
> + *
> + * Allows connectors to create connector-specific debugfs files.
> + */
> + void (*debugfs_init)(struct drm_connector *connector, struct dentry *root);
> };
>
> /**
> diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h
> index 4602f833eb51..1ba2d424a53f 100644
> --- a/include/drm/drm_panel.h
> +++ b/include/drm/drm_panel.h
> @@ -29,6 +29,7 @@
> #include <linux/list.h>
>
> struct backlight_device;
> +struct dentry;
> struct device_node;
> struct drm_connector;
> struct drm_device;
> @@ -125,6 +126,13 @@ struct drm_panel_funcs {
> */
> int (*get_timings)(struct drm_panel *panel, unsigned int num_timings,
> struct display_timing *timings);
> +
> + /**
> + * @debugfs_init:
> + *
> + * Allows panels to create panels-specific debugfs files.
> + */
> + void (*debugfs_init)(struct drm_panel *panel, struct dentry *root);
> };
>
> /**
--
Regards,
Laurent Pinchart
next prev parent reply other threads:[~2022-02-08 1:54 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-05 0:13 [PATCH v2 0/3] drm/panel-edp: Debugfs for panel-edp Douglas Anderson
2022-02-05 0:13 ` Douglas Anderson
2022-02-05 0:13 ` [PATCH v2 1/3] drm/bridge: ti-sn65dsi86: Use drm_bridge_connector Douglas Anderson
2022-02-05 0:13 ` Douglas Anderson
2022-02-08 1:50 ` Laurent Pinchart
2022-02-08 1:50 ` Laurent Pinchart
2022-02-05 0:13 ` [PATCH v2 2/3] drm: Plumb debugfs_init through to panels Douglas Anderson
2022-02-05 0:13 ` Douglas Anderson
2022-02-08 1:53 ` Laurent Pinchart [this message]
2022-02-08 1:53 ` Laurent Pinchart
2022-02-15 22:09 ` Javier Martinez Canillas
2022-02-15 22:09 ` Javier Martinez Canillas
2022-02-15 22:20 ` Andrzej Hajda
2022-02-15 22:20 ` Andrzej Hajda
2022-02-15 23:11 ` Doug Anderson
2022-02-15 23:11 ` Doug Anderson
2022-02-16 9:25 ` Jani Nikula
2022-02-16 9:25 ` Jani Nikula
2022-02-16 9:35 ` Javier Martinez Canillas
2022-02-16 9:35 ` Javier Martinez Canillas
2022-02-16 11:42 ` Andrzej Hajda
2022-02-16 11:42 ` Andrzej Hajda
2022-02-22 23:47 ` Doug Anderson
2022-02-22 23:47 ` Doug Anderson
2022-02-05 0:13 ` [PATCH v2 3/3] drm/panel-edp: Allow querying the detected panel via debugfs Douglas Anderson
2022-02-05 0:13 ` Douglas Anderson
2022-02-15 22:10 ` Javier Martinez Canillas
2022-02-15 22:10 ` Javier Martinez Canillas
2022-02-15 23:31 ` [PATCH v2 0/3] drm/panel-edp: Debugfs for panel-edp Doug Anderson
2022-02-15 23:31 ` Doug Anderson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YgHNNBShfCh8CuCC@pendragon.ideasonboard.com \
--to=laurent.pinchart@ideasonboard.com \
--cc=airlied@linux.ie \
--cc=andrzej.hajda@intel.com \
--cc=dianders@chromium.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=javierm@redhat.com \
--cc=jernej.skrabec@gmail.com \
--cc=jjsu@chromium.org \
--cc=jonas@kwiboo.se \
--cc=linux-kernel@vger.kernel.org \
--cc=lschyi@chromium.org \
--cc=narmstrong@baylibre.com \
--cc=robert.foss@linaro.org \
--cc=sam@ravnborg.org \
--cc=thierry.reding@gmail.com \
--cc=tzimmermann@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.