From: Suraj Kandpal Date: Mon, 4 May 2026 10:11:17 +0000 (+0530) Subject: drm/i915/hdcp: Use new MST topology state in intel_conn_to_vcpi() X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6692ee0deae3b5a130053c94eadc888ccd83e088;p=thirdparty%2Fkernel%2Flinux.git drm/i915/hdcp: Use new MST topology state in intel_conn_to_vcpi() intel_conn_to_vcpi() runs from the HDCP enable path in commit_tail and looks up the VCPI via mgr->base.state. When an ALLOCATE_PAYLOAD is being driven on the mgr just before HDCP enable, that payload list is being mutated in place, so the lookup can miss the port and trip drm_WARN_ON(!payload), causing HDCP to be programmed with VCPI 0. Use drm_atomic_get_new_mst_topology_state() to read the topology state attached to this atomic commit (stable, decided in atomic_check), and bail out cleanly when no topology state or payload is present for this port instead of WARNing. Signed-off-by: Suraj Kandpal Tested-by: Santhosh Reddy Guddati Reviewed-by: Santhosh Reddy Guddati Link: https://patch.msgid.link/20260504101117.3619984-2-suraj.kandpal@intel.com --- diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c b/drivers/gpu/drm/i915/display/intel_hdcp.c index 9b4ff3b80b055..02ac981ca1eaa 100644 --- a/drivers/gpu/drm/i915/display/intel_hdcp.c +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c @@ -72,6 +72,7 @@ intel_hdcp_adjust_hdcp_line_rekeying(struct intel_encoder *encoder, static int intel_conn_to_vcpi(struct intel_atomic_state *state, struct intel_connector *connector) { + struct intel_display *display = to_intel_display(state); struct drm_dp_mst_topology_mgr *mgr; struct drm_dp_mst_atomic_payload *payload; struct drm_dp_mst_topology_state *mst_state; @@ -82,10 +83,17 @@ static int intel_conn_to_vcpi(struct intel_atomic_state *state, mgr = connector->mst.port->mgr; drm_modeset_lock(&mgr->base.lock, state->base.acquire_ctx); - mst_state = to_drm_dp_mst_topology_state(mgr->base.state); + mst_state = drm_atomic_get_new_mst_topology_state(&state->base, mgr); + if (!mst_state) { + drm_dbg_kms(display->drm, "MST topology still not created\n"); + return 0; + } + payload = drm_atomic_get_mst_payload_state(mst_state, connector->mst.port); - if (drm_WARN_ON(mgr->dev, !payload)) + if (!payload) { + drm_dbg_kms(display->drm, "MST Payload not present\n"); return 0; + } return payload->vcpi; }