All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Maxime Ripard" <mripard@kernel.org>
Cc: dri-devel@lists.freedesktop.org
Subject: Re: [PATCH v7 28/34] drm/bridge_connector: Implement hw readout for connector
Date: Thu, 29 Oct 2026 08:04:57 +0000	[thread overview]
Message-ID: <sashiko-outbox-188941@kernel.org> (raw)
In-Reply-To: <20261029-drm-state-readout-v7-28-25e5163d75c3@kernel.org>

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] drm/bridge_connector: unconditional SRO hooks with no-op readout when unsupported
--

commit b75d5f60d55bc26fbc8505149b2ac1fa7543a9a1
Author: Maxime Ripard <mripard@kernel.org>

drm/bridge_connector: Implement hw readout for connector

This commit adds hardware state readout support to drm_bridge_connector by
introducing DRM_BRIDGE_OP_CONNECTOR_HW_READOUT and the
atomic_sro_connector_readout callback on drm_bridge_funcs.

> diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/drm/display/drm_bridge_connector.c
> index 81f3e26f6fdf5..45806ef077081 100644
> --- a/drivers/gpu/drm/display/drm_bridge_connector.c
> +++ b/drivers/gpu/drm/display/drm_bridge_connector.c

[ ... ]

> @@ -244,6 +253,26 @@ drm_bridge_connector_create_state(struct drm_connector *connector)
>  	return conn_state;
>  }
>  
> +static int
> +drm_bridge_connector_readout_state(struct drm_connector *connector,
> +				   struct drm_atomic_sro_state *state,
> +				   struct drm_connector_state *conn_state)
> +{
> +	struct drm_bridge_connector *bridge_connector =
> +		to_drm_bridge_connector(connector);
> +	struct drm_bridge *readout =
> +		bridge_connector->bridge_connector_hw_readout;
> +	int ret;
> +
> +	if (readout) {
> +		ret = readout->funcs->atomic_sro_connector_readout(readout, state, conn_state);
> +		if (ret)
> +			return ret;
> +	}
> +
> +	return 0;
> +}
> +
>  static enum drm_connector_color_format
>  drm_bridge_connector_color_format(const struct drm_connector_state *conn_state)
>  {
> @@ -270,6 +299,8 @@ drm_bridge_connector_color_format(const struct drm_connector_state *conn_state)
>  static const struct drm_connector_funcs drm_bridge_connector_funcs = {
>  	.fill_modes = drm_helper_probe_single_connector_modes,
>  	.atomic_create_state = drm_bridge_connector_create_state,
> +	.atomic_sro_readout_state = drm_bridge_connector_readout_state,
> +	.atomic_sro_compare_state = drm_atomic_helper_connector_compare_state,

[Severity: High]
Does unconditionally setting .atomic_sro_readout_state and
.atomic_sro_compare_state on drm_bridge_connector_funcs while returning 0 in
drm_bridge_connector_readout_state() when bridge_connector_hw_readout is NULL
cause a regression for bridge chains without DRM_BRIDGE_OP_CONNECTOR_HW_READOUT?

In drivers/gpu/drm/drm_atomic_state_readout.c, drm_atomic_sro_can_readout()
and drm_atomic_sro_can_compare() determine whether a connector supports state
readout by checking whether its callbacks are populated:

drivers/gpu/drm/drm_atomic_state_readout.c:drm_atomic_sro_can_readout() {
	...
	drm_connector_list_iter_begin(dev, &conn_iter);
	drm_for_each_connector_iter(connector, &conn_iter) {
		if (!connector->funcs->atomic_sro_readout_state) {
			drm_dbg_atomic(dev, "Connector %s missing readout callback",
				       connector->name);
			drm_connector_list_iter_end(&conn_iter);
			return false;
		}
	}
	drm_connector_list_iter_end(&conn_iter);
	...
}

Because drm_bridge_connector_funcs always defines both callbacks, every
drm_bridge_connector is treated as supporting hardware state readout even when
no bridge in the chain sets DRM_BRIDGE_OP_CONNECTOR_HW_READOUT (leaving
bridge_connector->bridge_connector_hw_readout NULL).

When state readout runs on a pipeline where bridge_connector_hw_readout is
NULL (for example, when bridges implement private state readout without any
bridge setting DRM_BRIDGE_OP_CONNECTOR_HW_READOUT, on a multi-connector device
where only one bridge chain supports connector readout, or when
drm.atomic_readout is set to DRM_ATOMIC_READOUT_SKIP_MISSING_READOUT),
drm_bridge_connector_readout_state() silently returns 0 and leaves
conn_state->crtc and conn_state->best_encoder set to NULL.

During initial readout in drm_mode_config_create_initial_state() ->
drm_atomic_helper_sro_readout_state() -> drm_atomic_helper_sro_build_state(),
this causes drm_bridge_atomic_readout_priv_state() in
drivers/gpu/drm/drm_bridge.c to skip reading out all bridges on that encoder's
chain because find_connector_state_for_encoder() matches encoder against
conn_state->best_encoder:

drivers/gpu/drm/drm_bridge.c:drm_bridge_atomic_readout_priv_state() {
	...
	conn_state = find_connector_state_for_encoder(state, encoder);
	if (!conn_state)
		return 0;

	if (!conn_state->crtc)
		return 0;
	...
}

It also installs an inconsistent atomic state via
drm_atomic_sro_install_state() with an active CRTC (crtc_state->active == true
and crtc_state->connector_mask == 0) and a disconnected connector state
instead of failing readout and falling back to hw_reset(). Furthermore, during
post-commit verification in commit_tail() ->
drm_atomic_sro_readout_and_compare(), every blocking commit enabling that
connector compares the committed active state against the unpopulated readout
state via drm_atomic_helper_connector_compare_state(),
drm_atomic_helper_crtc_compare_state(), and
drm_atomic_helper_bridge_compare_state(), triggering state mismatch errors.

Should drm_bridge_connector_init() only expose a drm_connector_funcs table
with .atomic_sro_readout_state and .atomic_sro_compare_state when
bridge_connector->bridge_connector_hw_readout is non-NULL (similar to how
drm_bridge_attach() selects between drm_bridge_priv_state_funcs and
drm_bridge_priv_state_funcs_with_sro)?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20261029-drm-state-readout-v7-0-25e5163d75c3@kernel.org?part=28

  reply	other threads:[~2026-10-29  8:05 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-29  7:33 [PATCH v7 00/34] drm: Implement state readout support Maxime Ripard
2026-10-29  7:33 ` [PATCH v7 01/34] drm/bridge-helper: Don't unlock the connection mutex after a backoff Maxime Ripard
2026-10-29  7:51   ` sashiko-bot
2026-10-29  7:33 ` [PATCH v7 02/34] drm/tests: hdmi-state-helper: Handle EDEADLK in the 420-only test Maxime Ripard
2026-10-29  7:33 ` [PATCH v7 03/34] drm/tests: hdmi-state-helper: Handle EDEADLK in the color format test Maxime Ripard
2026-10-29  7:33 ` [PATCH v7 04/34] drm/atomic: Fix private obj error handling Maxime Ripard
2026-10-29  7:57   ` sashiko-bot
2026-10-29  7:33 ` [PATCH v7 05/34] drm/atomic: Add drm_private_obj name Maxime Ripard
2026-10-29  7:56   ` sashiko-bot
2026-10-29  7:33 ` [PATCH v7 06/34] drm/bridge: Switch print_state to use bridge name Maxime Ripard
2026-10-29  7:33 ` [PATCH v7 07/34] drm/bridge: Add drm_private_obj_is_bridge() Maxime Ripard
2026-10-29  7:33 ` [PATCH v7 08/34] drm/fb-dma-helper: Handle framebuffers without a GEM object Maxime Ripard
2026-10-29  7:33 ` [PATCH v7 09/34] drm/atomic: Export drm_atomic_*_print_state Maxime Ripard
2026-10-29  7:34 ` [PATCH v7 10/34] drm/atomic_sro: Create drm_atomic_sro_state container Maxime Ripard
2026-10-29  7:50   ` sashiko-bot
2026-10-29  7:34 ` [PATCH v7 11/34] drm/atomic_sro: Create kernel parameter to force or disable readout Maxime Ripard
2026-10-29  7:46   ` sashiko-bot
2026-10-29  7:34 ` [PATCH v7 12/34] drm/atomic_sro: Add atomic state readout infrastructure Maxime Ripard
2026-10-29  7:34 ` [PATCH v7 13/34] drm/atomic_sro: Add function to install state into drm objects Maxime Ripard
2026-10-29  7:34 ` [PATCH v7 14/34] drm/atomic_sro: Create documentation Maxime Ripard
2026-10-29  7:34 ` [PATCH v7 15/34] drm/bridge: Handle bridges with hardware state readout Maxime Ripard
2026-10-29  7:59   ` sashiko-bot
2026-10-29  7:34 ` [PATCH v7 16/34] drm/mode-config: Read out hardware state in drm_mode_config_create_state Maxime Ripard
2026-10-29  7:34 ` [PATCH v7 17/34] drm/atomic_sro: Provide helpers to implement hardware state readout Maxime Ripard
2026-10-29  8:02   ` sashiko-bot
2026-10-29  7:34 ` [PATCH v7 18/34] drm/mode-config: Introduce hw_reset hook Maxime Ripard
2026-10-29  7:34 ` [PATCH v7 19/34] drm/modeset-helper: Add drm_mode_config_helper_hw_reset() Maxime Ripard
2026-10-29  7:34 ` [PATCH v7 20/34] drm/atomic_helper: Compare actual and readout states once the commit is done Maxime Ripard
2026-10-29  8:05   ` sashiko-bot
2026-10-29  7:34 ` [PATCH v7 21/34] drm/atomic-state-helper: Provide comparison macros Maxime Ripard
2026-10-29  7:34 ` [PATCH v7 22/34] drm/atomic-state-helper: Provide atomic_compare_state helpers Maxime Ripard
2026-10-29  8:07   ` sashiko-bot
2026-10-29  7:34 ` [PATCH v7 23/34] drm/atomic-helper: Document State Read-Out as a state initialization approach Maxime Ripard
2026-10-29  7:34 ` [PATCH v7 24/34] drm/tests: kunit: Add a drm_printer helper Maxime Ripard
2026-10-29  7:56   ` sashiko-bot
2026-10-29  7:34 ` [PATCH v7 25/34] drm/tests: Add tests for the atomic state readout Maxime Ripard
2026-10-29  8:03   ` sashiko-bot
2026-10-29  7:34 ` [PATCH v7 26/34] drm/encoder: Create atomic_sro_get_current_crtc hook Maxime Ripard
2026-10-29  7:34 ` [PATCH v7 27/34] drm/bridge: display-connector: Implement readout support Maxime Ripard
2026-10-29  7:34 ` [PATCH v7 28/34] drm/bridge_connector: Implement hw readout for connector Maxime Ripard
2026-10-29  8:04   ` sashiko-bot [this message]
2026-10-29  7:34 ` [PATCH v7 29/34] drm/tidss: crtc: Add atomic_print_state implementation Maxime Ripard
2026-10-29  7:34 ` [PATCH v7 30/34] drm/tidss: dispc: Improve mode checking logs Maxime Ripard
2026-10-29  7:34 ` [PATCH v7 31/34] drm/tidss: Implement hw_reset Maxime Ripard
2026-10-29  8:09   ` sashiko-bot
2026-10-29  7:34 ` [PATCH v7 32/34] drm/tidss: Implement readout support Maxime Ripard
2026-10-29  8:22   ` sashiko-bot
2026-10-29  7:34 ` [PATCH v7 33/34] drm/tidss: encoder: Implement atomic_sro_get_current_crtc Maxime Ripard
2026-10-29  7:34 ` [PATCH v7 34/34] drm/bridge: sii902x: Implement hw state readout Maxime Ripard
2026-10-29  8:12   ` sashiko-bot

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=sashiko-outbox-188941@kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=mripard@kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    /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.