From nobody Fri Dec 19 07:47:59 2025 Received: from out-189.mta1.migadu.com (out-189.mta1.migadu.com [95.215.58.189]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DAFDF149C7B for ; Thu, 5 Jun 2025 17:15:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.189 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749143752; cv=none; b=gz/iXj8tEOnPZHSyAtLx1EIeFgOFkUTuBB9MiCVlmSoXRbxFycNkYbeW2qxs88N6fG6aamZ/jJD5sM8akq4oscFWQVCiCab9Kb2Nip2PqUaiiixwhuA7s4xDMTCaDTziPA6FAEj7CMzfKI/nunuu1ZPTbLZ3GYFhItglRko5S98= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749143752; c=relaxed/simple; bh=q0+2m760AEDdzhpiq5ZzK16VK3dhnc51lKmJc09PnTA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=f+7v3kZUELxlqeJi7+8iUEF18OWohCHnNJQP32v9pqzO4Y80QAsR/MFGeMpnIqCS3CYED+2X5OqBY1IF/oPonaK/3+OYNUjKRH35reO7LoZlc++V4LkRNnnct1liTp4stLV43ycDtExoIYdO0on+HVmFYG8VtGHb+HFDTRvWTw8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=X45UZ0Bm; arc=none smtp.client-ip=95.215.58.189 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="X45UZ0Bm" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1749143748; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=j7rgZ0BS12OWD8vbtUruCamyU9orBoA03q/2SPzJLhM=; b=X45UZ0BmRe7VZbDlv3WIVRoxC7jQFc/PN5tV2juaAGWkElrCOnEOsejSB+xSxKa8jM8sZ6 3X71iIXRJ0ftUTrGskcDLYjNPzx5td2yHmTLv+F6X2J6hzLKi+8Z6FSI1hu+lYh53CVlZG UkxrV+tAufPHG/kyM2TuxHiv0xGZPAo= From: Aradhya Bhatia To: Tomi Valkeinen , Dmitry Baryshkov , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter Cc: DRI Development List , Linux Kernel List , Nishanth Menon , Vignesh Raghavendra , Devarsh Thakkar , Jayesh Choudhary , Aradhya Bhatia , Alexander Sverdlin Subject: [PATCH v13 2/4] drm/atomic-helper: Separate out bridge pre_enable/post_disable from enable/disable Date: Thu, 5 Jun 2025 22:45:22 +0530 Message-Id: <20250605171524.27222-3-aradhya.bhatia@linux.dev> In-Reply-To: <20250605171524.27222-1-aradhya.bhatia@linux.dev> References: <20250605171524.27222-1-aradhya.bhatia@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" The encoder-bridge ops occur by looping over the new connector states of the display pipelines. The enable sequence runs as follows - - pre_enable(bridge), - enable(encoder), - enable(bridge), while the disable sequnce runs as follows - - disable(bridge), - disable(encoder), - post_disable(bridge). Separate out the pre_enable(bridge), and the post_disable(bridge) operations into separate functions each. This patch keeps the sequence same for any singular disaplay pipe, but changes the sequence across multiple display pipelines. This patch is meant to be an interim patch, to cleanly pave the way for the sequence re-ordering patch, and maintain bisectability in the process. Reviewed-by: Dmitry Baryshkov Reviewed-by: Jayesh Choudhary Reviewed-by: Tomi Valkeinen Reviewed-by: Thomas Zimmermann Tested-by: Tomi Valkeinen Tested-by: Alexander Sverdlin Signed-off-by: Aradhya Bhatia --- drivers/gpu/drm/drm_atomic_helper.c | 91 ++++++++++++++++++++++++++++- 1 file changed, 88 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atom= ic_helper.c index d185486071c5..539b7f072c72 100644 --- a/drivers/gpu/drm/drm_atomic_helper.c +++ b/drivers/gpu/drm/drm_atomic_helper.c @@ -1223,8 +1223,6 @@ encoder_bridge_disable(struct drm_device *dev, struct= drm_atomic_state *state) else if (funcs->dpms) funcs->dpms(encoder, DRM_MODE_DPMS_OFF); } - - drm_atomic_bridge_chain_post_disable(bridge, state); } } =20 @@ -1281,11 +1279,65 @@ crtc_disable(struct drm_device *dev, struct drm_ato= mic_state *state) } } =20 +static void +encoder_bridge_post_disable(struct drm_device *dev, struct drm_atomic_stat= e *state) +{ + struct drm_connector *connector; + struct drm_connector_state *old_conn_state, *new_conn_state; + struct drm_crtc_state *old_crtc_state, *new_crtc_state; + int i; + + for_each_oldnew_connector_in_state(state, connector, old_conn_state, new_= conn_state, i) { + struct drm_encoder *encoder; + struct drm_bridge *bridge; + + /* + * Shut down everything that's in the changeset and currently + * still on. So need to check the old, saved state. + */ + if (!old_conn_state->crtc) + continue; + + old_crtc_state =3D drm_atomic_get_old_crtc_state(state, old_conn_state->= crtc); + + if (new_conn_state->crtc) + new_crtc_state =3D drm_atomic_get_new_crtc_state(state, + new_conn_state->crtc); + else + new_crtc_state =3D NULL; + + if (!crtc_needs_disable(old_crtc_state, new_crtc_state) || + !drm_atomic_crtc_needs_modeset(old_conn_state->crtc->state)) + continue; + + encoder =3D old_conn_state->best_encoder; + + /* + * We shouldn't get this far if we didn't previously have + * an encoder.. but WARN_ON() rather than explode. + */ + if (WARN_ON(!encoder)) + continue; + + drm_dbg_atomic(dev, "post-disabling bridges [ENCODER:%d:%s]\n", + encoder->base.id, encoder->name); + + /* + * Each encoder has at most one connector (since we always steal + * it away), so we won't call disable hooks twice. + */ + bridge =3D drm_bridge_chain_get_first_bridge(encoder); + drm_atomic_bridge_chain_post_disable(bridge, state); + } +} + static void disable_outputs(struct drm_device *dev, struct drm_atomic_state *state) { encoder_bridge_disable(dev, state); =20 + encoder_bridge_post_disable(dev, state); + crtc_disable(dev, state); } =20 @@ -1498,6 +1550,38 @@ static void drm_atomic_helper_commit_writebacks(stru= ct drm_device *dev, } } =20 +static void +encoder_bridge_pre_enable(struct drm_device *dev, struct drm_atomic_state = *state) +{ + struct drm_connector *connector; + struct drm_connector_state *new_conn_state; + int i; + + for_each_new_connector_in_state(state, connector, new_conn_state, i) { + struct drm_encoder *encoder; + struct drm_bridge *bridge; + + if (!new_conn_state->best_encoder) + continue; + + if (!new_conn_state->crtc->state->active || + !drm_atomic_crtc_needs_modeset(new_conn_state->crtc->state)) + continue; + + encoder =3D new_conn_state->best_encoder; + + drm_dbg_atomic(dev, "pre-enabling bridges [ENCODER:%d:%s]\n", + encoder->base.id, encoder->name); + + /* + * Each encoder has at most one connector (since we always steal + * it away), so we won't call enable hooks twice. + */ + bridge =3D drm_bridge_chain_get_first_bridge(encoder); + drm_atomic_bridge_chain_pre_enable(bridge, state); + } +} + static void crtc_enable(struct drm_device *dev, struct drm_atomic_state *state) { @@ -1559,7 +1643,6 @@ encoder_bridge_enable(struct drm_device *dev, struct = drm_atomic_state *state) * it away), so we won't call enable hooks twice. */ bridge =3D drm_bridge_chain_get_first_bridge(encoder); - drm_atomic_bridge_chain_pre_enable(bridge, state); =20 if (funcs) { if (funcs->atomic_enable) @@ -1593,6 +1676,8 @@ void drm_atomic_helper_commit_modeset_enables(struct = drm_device *dev, { crtc_enable(dev, state); =20 + encoder_bridge_pre_enable(dev, state); + encoder_bridge_enable(dev, state); =20 drm_atomic_helper_commit_writebacks(dev, state); --=20 2.34.1