From: Jani Nikula <jani.nikula@linux.intel.com>
To: "Dmitry Baryshkov" <dmitry.baryshkov@linaro.org>,
"Andrzej Hajda" <andrzej.hajda@intel.com>,
"Neil Armstrong" <neil.armstrong@linaro.org>,
"Robert Foss" <rfoss@kernel.org>,
"Laurent Pinchart" <Laurent.pinchart@ideasonboard.com>,
"Jonas Karlman" <jonas@kwiboo.se>,
"Jernej Skrabec" <jernej.skrabec@gmail.com>,
"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
"Maxime Ripard" <mripard@kernel.org>,
"Thomas Zimmermann" <tzimmermann@suse.de>,
"David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"Jaroslav Kysela" <perex@perex.cz>,
"Takashi Iwai" <tiwai@suse.com>,
"Liam Girdwood" <lgirdwood@gmail.com>,
"Mark Brown" <broonie@kernel.org>, "Phong LE" <ple@baylibre.com>,
"Inki Dae" <inki.dae@samsung.com>,
"Seung-Woo Kim" <sw0312.kim@samsung.com>,
"Kyungmin Park" <kyungmin.park@samsung.com>,
"Krzysztof Kozlowski" <krzk@kernel.org>,
"Alim Akhtar" <alim.akhtar@samsung.com>,
"Russell King" <linux@armlinux.org.uk>,
"Chun-Kuang Hu" <chunkuang.hu@kernel.org>,
"Philipp Zabel" <p.zabel@pengutronix.de>,
"Matthias Brugger" <matthias.bgg@gmail.com>,
"AngeloGioacchino Del Regno"
<angelogioacchino.delregno@collabora.com>,
"Sandy Huang" <hjc@rock-chips.com>,
"Heiko Stübner" <heiko@sntech.de>,
"Andy Yan" <andy.yan@rock-chips.com>,
"Alain Volmat" <alain.volmat@foss.st.com>,
"Raphael Gallais-Pou" <rgallaispou@gmail.com>,
"Dave Stevenson" <dave.stevenson@raspberrypi.com>,
"Maíra Canal" <mcanal@igalia.com>,
"Raspberry Pi Kernel Maintenance" <kernel-list@raspberrypi.com>
Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
linux-sound@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
linux-samsung-soc@vger.kernel.org,
linux-mediatek@lists.infradead.org,
linux-rockchip@lists.infradead.org
Subject: Re: [PATCH v5 7/9] drm/bridge_connector: hook drm_atomic_helper_connector_hdmi_update_edid()
Date: Tue, 03 Dec 2024 16:25:58 +0200 [thread overview]
Message-ID: <87a5dc4zd5.fsf@intel.com> (raw)
In-Reply-To: <20241201-drm-bridge-hdmi-connector-v5-7-b5316e82f61a@linaro.org>
On Sun, 01 Dec 2024, Dmitry Baryshkov <dmitry.baryshkov@linaro.org> wrote:
> Extend drm_bridge_connector code to read the EDID and use it to update
> connector status if the bridge chain implements HDMI bridge. Performing
> it from the generic location minimizes individual bridge's code and
> enforces standard behaviour from all corresponding drivers.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> ---
> drivers/gpu/drm/display/drm_bridge_connector.c | 67 ++++++++++++++++++++------
> 1 file changed, 53 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/drm/display/drm_bridge_connector.c
> index 12ab9f14cc8a8672478ae2804c9a68d766d88ea5..71ae3b2c9049016d1cc0d39a787f6461633efd53 100644
> --- a/drivers/gpu/drm/display/drm_bridge_connector.c
> +++ b/drivers/gpu/drm/display/drm_bridge_connector.c
> @@ -17,6 +17,7 @@
> #include <drm/drm_edid.h>
> #include <drm/drm_managed.h>
> #include <drm/drm_modeset_helper_vtables.h>
> +#include <drm/drm_print.h>
> #include <drm/drm_probe_helper.h>
> #include <drm/display/drm_hdmi_state_helper.h>
>
> @@ -175,17 +176,55 @@ static void drm_bridge_connector_disable_hpd(struct drm_connector *connector)
> * Bridge Connector Functions
> */
>
> +static const struct drm_edid *
> +drm_bridge_connector_read_edid(struct drm_connector *connector,
> + enum drm_connector_status status)
> +{
> + struct drm_bridge_connector *bridge_connector =
> + to_drm_bridge_connector(connector);
> + const struct drm_edid *drm_edid;
> + struct drm_bridge *bridge;
> +
> + bridge = bridge_connector->bridge_edid;
> + if (!bridge)
> + return NULL;
> +
> + if (status != connector_status_connected)
> + return NULL;
> +
> + drm_edid = drm_bridge_edid_read(bridge, connector);
> + if (!drm_edid_valid(drm_edid)) {
What's the case this check is for?
My preference would be that bridge->funcs->edid_read() uses
drm_edid_read*() family of functions that do the checks and return the
EDID.
There are some cases that just allocate a blob and return it. Would be
nice if they could be converted, but in the mean time could use
drm_edid_valid() right there. Additional validity checks are redundant.
BR,
Jani.
> + drm_edid_free(drm_edid);
> + return NULL;
> + }
> +
> + return drm_edid;
> +}
> +
> static enum drm_connector_status
> drm_bridge_connector_detect(struct drm_connector *connector, bool force)
> {
> struct drm_bridge_connector *bridge_connector =
> to_drm_bridge_connector(connector);
> struct drm_bridge *detect = bridge_connector->bridge_detect;
> + struct drm_bridge *hdmi = bridge_connector->bridge_hdmi;
> enum drm_connector_status status;
>
> if (detect) {
> status = detect->funcs->detect(detect);
>
> + if (hdmi) {
> + const struct drm_edid *drm_edid;
> + int ret;
> +
> + drm_edid = drm_bridge_connector_read_edid(connector, status);
> + ret = drm_atomic_helper_connector_hdmi_update_edid(connector, drm_edid);
> + if (ret)
> + drm_warn(connector->dev, "updating EDID failed with %d\n", ret);
> +
> + drm_edid_free(drm_edid);
> + }
> +
> drm_bridge_connector_hpd_notify(connector, status);
> } else {
> switch (connector->connector_type) {
> @@ -246,29 +285,29 @@ static const struct drm_connector_funcs drm_bridge_connector_funcs = {
> static int drm_bridge_connector_get_modes_edid(struct drm_connector *connector,
> struct drm_bridge *bridge)
> {
> + struct drm_bridge_connector *bridge_connector =
> + to_drm_bridge_connector(connector);
> + struct drm_bridge *hdmi = bridge_connector->bridge_hdmi;
> enum drm_connector_status status;
> const struct drm_edid *drm_edid;
> - int n;
>
> status = drm_bridge_connector_detect(connector, false);
> if (status != connector_status_connected)
> - goto no_edid;
> + return 0;
>
> - drm_edid = drm_bridge_edid_read(bridge, connector);
> - if (!drm_edid_valid(drm_edid)) {
> + /* In HDMI setup the EDID has been read and handled as a part of .detect() */
> + if (!hdmi) {
> + drm_edid = drm_bridge_connector_read_edid(connector, status);
> + if (!drm_edid) {
> + drm_edid_connector_update(connector, NULL);
> + return 0;
> + }
> +
> + drm_edid_connector_update(connector, drm_edid);
> drm_edid_free(drm_edid);
> - goto no_edid;
> }
>
> - drm_edid_connector_update(connector, drm_edid);
> - n = drm_edid_connector_add_modes(connector);
> -
> - drm_edid_free(drm_edid);
> - return n;
> -
> -no_edid:
> - drm_edid_connector_update(connector, NULL);
> - return 0;
> + return drm_edid_connector_add_modes(connector);
> }
>
> static int drm_bridge_connector_get_modes(struct drm_connector *connector)
--
Jani Nikula, Intel
WARNING: multiple messages have this Message-ID (diff)
From: Jani Nikula <jani.nikula@linux.intel.com>
To: "Dmitry Baryshkov" <dmitry.baryshkov@linaro.org>,
"Andrzej Hajda" <andrzej.hajda@intel.com>,
"Neil Armstrong" <neil.armstrong@linaro.org>,
"Robert Foss" <rfoss@kernel.org>,
"Laurent Pinchart" <Laurent.pinchart@ideasonboard.com>,
"Jonas Karlman" <jonas@kwiboo.se>,
"Jernej Skrabec" <jernej.skrabec@gmail.com>,
"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
"Maxime Ripard" <mripard@kernel.org>,
"Thomas Zimmermann" <tzimmermann@suse.de>,
"David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"Jaroslav Kysela" <perex@perex.cz>,
"Takashi Iwai" <tiwai@suse.com>,
"Liam Girdwood" <lgirdwood@gmail.com>,
"Mark Brown" <broonie@kernel.org>, "Phong LE" <ple@baylibre.com>,
"Inki Dae" <inki.dae@samsung.com>,
"Seung-Woo Kim" <sw0312.kim@samsung.com>,
"Kyungmin Park" <kyungmin.park@samsung.com>,
"Krzysztof Kozlowski" <krzk@kernel.org>,
"Alim Akhtar" <alim.akhtar@samsung.com>,
"Russell King" <linux@armlinux.org.uk>,
"Chun-Kuang Hu" <chunkuang.hu@kernel.org>,
"Philipp Zabel" <p.zabel@pengutronix.de>,
"Matthias Brugger" <matthias.bgg@gmail.com>,
"AngeloGioacchino Del Regno"
<angelogioacchino.delregno@collabora.com>,
"Sandy Huang" <hjc@rock-chips.com>,
"Heiko Stübner" <heiko@sntech.de>,
"Andy Yan" <andy.yan@rock-chips.com>,
"Alain Volmat" <alain.volmat@foss.st.com>,
"Raphael Gallais-Pou" <rgallaispou@gmail.com>,
"Dave Stevenson" <dave.stevenson@raspberrypi.com>,
"Maíra Canal" <mcanal@igalia.com>,
"Raspberry Pi Kernel Maintenance" <kernel-list@raspberrypi.com>
Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
linux-sound@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
linux-samsung-soc@vger.kernel.org,
linux-mediatek@lists.infradead.org,
linux-rockchip@lists.infradead.org
Subject: Re: [PATCH v5 7/9] drm/bridge_connector: hook drm_atomic_helper_connector_hdmi_update_edid()
Date: Tue, 03 Dec 2024 16:25:58 +0200 [thread overview]
Message-ID: <87a5dc4zd5.fsf@intel.com> (raw)
In-Reply-To: <20241201-drm-bridge-hdmi-connector-v5-7-b5316e82f61a@linaro.org>
On Sun, 01 Dec 2024, Dmitry Baryshkov <dmitry.baryshkov@linaro.org> wrote:
> Extend drm_bridge_connector code to read the EDID and use it to update
> connector status if the bridge chain implements HDMI bridge. Performing
> it from the generic location minimizes individual bridge's code and
> enforces standard behaviour from all corresponding drivers.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> ---
> drivers/gpu/drm/display/drm_bridge_connector.c | 67 ++++++++++++++++++++------
> 1 file changed, 53 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/drm/display/drm_bridge_connector.c
> index 12ab9f14cc8a8672478ae2804c9a68d766d88ea5..71ae3b2c9049016d1cc0d39a787f6461633efd53 100644
> --- a/drivers/gpu/drm/display/drm_bridge_connector.c
> +++ b/drivers/gpu/drm/display/drm_bridge_connector.c
> @@ -17,6 +17,7 @@
> #include <drm/drm_edid.h>
> #include <drm/drm_managed.h>
> #include <drm/drm_modeset_helper_vtables.h>
> +#include <drm/drm_print.h>
> #include <drm/drm_probe_helper.h>
> #include <drm/display/drm_hdmi_state_helper.h>
>
> @@ -175,17 +176,55 @@ static void drm_bridge_connector_disable_hpd(struct drm_connector *connector)
> * Bridge Connector Functions
> */
>
> +static const struct drm_edid *
> +drm_bridge_connector_read_edid(struct drm_connector *connector,
> + enum drm_connector_status status)
> +{
> + struct drm_bridge_connector *bridge_connector =
> + to_drm_bridge_connector(connector);
> + const struct drm_edid *drm_edid;
> + struct drm_bridge *bridge;
> +
> + bridge = bridge_connector->bridge_edid;
> + if (!bridge)
> + return NULL;
> +
> + if (status != connector_status_connected)
> + return NULL;
> +
> + drm_edid = drm_bridge_edid_read(bridge, connector);
> + if (!drm_edid_valid(drm_edid)) {
What's the case this check is for?
My preference would be that bridge->funcs->edid_read() uses
drm_edid_read*() family of functions that do the checks and return the
EDID.
There are some cases that just allocate a blob and return it. Would be
nice if they could be converted, but in the mean time could use
drm_edid_valid() right there. Additional validity checks are redundant.
BR,
Jani.
> + drm_edid_free(drm_edid);
> + return NULL;
> + }
> +
> + return drm_edid;
> +}
> +
> static enum drm_connector_status
> drm_bridge_connector_detect(struct drm_connector *connector, bool force)
> {
> struct drm_bridge_connector *bridge_connector =
> to_drm_bridge_connector(connector);
> struct drm_bridge *detect = bridge_connector->bridge_detect;
> + struct drm_bridge *hdmi = bridge_connector->bridge_hdmi;
> enum drm_connector_status status;
>
> if (detect) {
> status = detect->funcs->detect(detect);
>
> + if (hdmi) {
> + const struct drm_edid *drm_edid;
> + int ret;
> +
> + drm_edid = drm_bridge_connector_read_edid(connector, status);
> + ret = drm_atomic_helper_connector_hdmi_update_edid(connector, drm_edid);
> + if (ret)
> + drm_warn(connector->dev, "updating EDID failed with %d\n", ret);
> +
> + drm_edid_free(drm_edid);
> + }
> +
> drm_bridge_connector_hpd_notify(connector, status);
> } else {
> switch (connector->connector_type) {
> @@ -246,29 +285,29 @@ static const struct drm_connector_funcs drm_bridge_connector_funcs = {
> static int drm_bridge_connector_get_modes_edid(struct drm_connector *connector,
> struct drm_bridge *bridge)
> {
> + struct drm_bridge_connector *bridge_connector =
> + to_drm_bridge_connector(connector);
> + struct drm_bridge *hdmi = bridge_connector->bridge_hdmi;
> enum drm_connector_status status;
> const struct drm_edid *drm_edid;
> - int n;
>
> status = drm_bridge_connector_detect(connector, false);
> if (status != connector_status_connected)
> - goto no_edid;
> + return 0;
>
> - drm_edid = drm_bridge_edid_read(bridge, connector);
> - if (!drm_edid_valid(drm_edid)) {
> + /* In HDMI setup the EDID has been read and handled as a part of .detect() */
> + if (!hdmi) {
> + drm_edid = drm_bridge_connector_read_edid(connector, status);
> + if (!drm_edid) {
> + drm_edid_connector_update(connector, NULL);
> + return 0;
> + }
> +
> + drm_edid_connector_update(connector, drm_edid);
> drm_edid_free(drm_edid);
> - goto no_edid;
> }
>
> - drm_edid_connector_update(connector, drm_edid);
> - n = drm_edid_connector_add_modes(connector);
> -
> - drm_edid_free(drm_edid);
> - return n;
> -
> -no_edid:
> - drm_edid_connector_update(connector, NULL);
> - return 0;
> + return drm_edid_connector_add_modes(connector);
> }
>
> static int drm_bridge_connector_get_modes(struct drm_connector *connector)
--
Jani Nikula, Intel
_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip
next prev parent reply other threads:[~2024-12-03 14:27 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-12-01 0:44 [PATCH v5 0/9] drm: add DRM HDMI Codec framework Dmitry Baryshkov
2024-12-01 0:44 ` Dmitry Baryshkov
2024-12-01 0:44 ` [PATCH v5 1/9] ASoC: hdmi-codec: pass data to get_dai_id too Dmitry Baryshkov
2024-12-01 0:44 ` Dmitry Baryshkov
2024-12-01 0:44 ` [PATCH v5 2/9] ASoC: hdmi-codec: move no_capture_mute to struct hdmi_codec_pdata Dmitry Baryshkov
2024-12-01 0:44 ` Dmitry Baryshkov
2024-12-02 12:06 ` Maxime Ripard
2024-12-02 12:06 ` Maxime Ripard
2024-12-02 12:59 ` Mark Brown
2024-12-02 12:59 ` Mark Brown
2024-12-02 13:29 ` Maxime Ripard
2024-12-02 13:29 ` Maxime Ripard
2024-12-02 13:39 ` Mark Brown
2024-12-02 13:39 ` Mark Brown
2024-12-02 14:59 ` Dmitry Baryshkov
2024-12-02 14:59 ` Dmitry Baryshkov
2024-12-01 0:44 ` [PATCH v5 3/9] drm/connector: implement generic HDMI codec helpers Dmitry Baryshkov
2024-12-01 0:44 ` Dmitry Baryshkov
2024-12-01 0:44 ` [PATCH v5 4/9] drm/bridge: connector: add support for HDMI codec framework Dmitry Baryshkov
2024-12-01 0:44 ` Dmitry Baryshkov
2024-12-01 0:44 ` [PATCH v5 5/9] drm/bridge: lt9611: switch to using the DRM " Dmitry Baryshkov
2024-12-01 0:44 ` Dmitry Baryshkov
2024-12-01 0:44 ` [PATCH v5 6/9] drm/display/hdmi: implement connector update functions Dmitry Baryshkov
2024-12-01 0:44 ` Dmitry Baryshkov
2024-12-01 0:44 ` [PATCH v5 7/9] drm/bridge_connector: hook drm_atomic_helper_connector_hdmi_update_edid() Dmitry Baryshkov
2024-12-01 0:44 ` Dmitry Baryshkov
2024-12-03 14:25 ` Jani Nikula [this message]
2024-12-03 14:25 ` Jani Nikula
2024-12-04 3:18 ` Dmitry Baryshkov
2024-12-04 3:18 ` Dmitry Baryshkov
2024-12-04 7:42 ` Jani Nikula
2024-12-04 7:42 ` Jani Nikula
2024-12-04 23:17 ` Dmitry Baryshkov
2024-12-04 23:17 ` Dmitry Baryshkov
2024-12-01 0:44 ` [PATCH v5 8/9] drm/vc4: hdmi: switch to using generic HDMI Codec infrastructure Dmitry Baryshkov
2024-12-01 0:44 ` Dmitry Baryshkov
2024-12-02 13:20 ` Maxime Ripard
2024-12-02 13:20 ` Maxime Ripard
2024-12-03 12:19 ` Dmitry Baryshkov
2024-12-03 12:19 ` Dmitry Baryshkov
2024-12-06 14:11 ` Maxime Ripard
2024-12-06 14:11 ` Maxime Ripard
2024-12-01 0:44 ` [PATCH v5 9/9] drm/vc4: hdmi: use drm_atomic_helper_connector_hdmi_update_edid() Dmitry Baryshkov
2024-12-01 0:44 ` Dmitry Baryshkov
2024-12-02 13:27 ` Maxime Ripard
2024-12-02 13:27 ` Maxime Ripard
2024-12-03 12:27 ` Dmitry Baryshkov
2024-12-03 12:27 ` Dmitry Baryshkov
2024-12-03 14:32 ` Jani Nikula
2024-12-03 14:32 ` Jani Nikula
2024-12-06 14:23 ` mripard
2024-12-06 14:23 ` mripard
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=87a5dc4zd5.fsf@intel.com \
--to=jani.nikula@linux.intel.com \
--cc=Laurent.pinchart@ideasonboard.com \
--cc=airlied@gmail.com \
--cc=alain.volmat@foss.st.com \
--cc=alim.akhtar@samsung.com \
--cc=andrzej.hajda@intel.com \
--cc=andy.yan@rock-chips.com \
--cc=angelogioacchino.delregno@collabora.com \
--cc=broonie@kernel.org \
--cc=chunkuang.hu@kernel.org \
--cc=dave.stevenson@raspberrypi.com \
--cc=dmitry.baryshkov@linaro.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=heiko@sntech.de \
--cc=hjc@rock-chips.com \
--cc=inki.dae@samsung.com \
--cc=jernej.skrabec@gmail.com \
--cc=jonas@kwiboo.se \
--cc=kernel-list@raspberrypi.com \
--cc=krzk@kernel.org \
--cc=kyungmin.park@samsung.com \
--cc=lgirdwood@gmail.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mediatek@lists.infradead.org \
--cc=linux-rockchip@lists.infradead.org \
--cc=linux-samsung-soc@vger.kernel.org \
--cc=linux-sound@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=maarten.lankhorst@linux.intel.com \
--cc=matthias.bgg@gmail.com \
--cc=mcanal@igalia.com \
--cc=mripard@kernel.org \
--cc=neil.armstrong@linaro.org \
--cc=p.zabel@pengutronix.de \
--cc=perex@perex.cz \
--cc=ple@baylibre.com \
--cc=rfoss@kernel.org \
--cc=rgallaispou@gmail.com \
--cc=simona@ffwll.ch \
--cc=sw0312.kim@samsung.com \
--cc=tiwai@suse.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.