From d11d89cfdcd26e9b41e80c035550b7a0d70f32fe Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 10 Mar 2023 12:48:22 +0100 Subject: [PATCH] 6.2-stable patches added patches: drm-display-dp_mst-fix-down-message-handling-after-a-packet-reception-error.patch drm-display-dp_mst-fix-down-up-message-handling-after-sink-disconnect.patch drm-display-dp_mst-fix-payload-addition-on-a-disconnected-sink.patch drm-display-dp_mst-handle-old-new-payload-states-in-drm_dp_remove_payload.patch drm-i915-dp_mst-add-the-mst-topology-state-for-modesetted-crtcs.patch drm-i915-dp_mst-fix-payload-removal-during-output-disabling.patch drm-i915-fix-system-suspend-without-fbdev-being-initialized.patch --- ...dling-after-a-packet-reception-error.patch | 38 ++++ ...ssage-handling-after-sink-disconnect.patch | 45 +++++ ...load-addition-on-a-disconnected-sink.patch | 47 +++++ ...load-states-in-drm_dp_remove_payload.patch | 169 ++++++++++++++++++ ...-topology-state-for-modesetted-crtcs.patch | 142 +++++++++++++++ ...load-removal-during-output-disabling.patch | 83 +++++++++ ...pend-without-fbdev-being-initialized.patch | 102 +++++++++++ queue-6.2/series | 7 + 8 files changed, 633 insertions(+) create mode 100644 queue-6.2/drm-display-dp_mst-fix-down-message-handling-after-a-packet-reception-error.patch create mode 100644 queue-6.2/drm-display-dp_mst-fix-down-up-message-handling-after-sink-disconnect.patch create mode 100644 queue-6.2/drm-display-dp_mst-fix-payload-addition-on-a-disconnected-sink.patch create mode 100644 queue-6.2/drm-display-dp_mst-handle-old-new-payload-states-in-drm_dp_remove_payload.patch create mode 100644 queue-6.2/drm-i915-dp_mst-add-the-mst-topology-state-for-modesetted-crtcs.patch create mode 100644 queue-6.2/drm-i915-dp_mst-fix-payload-removal-during-output-disabling.patch create mode 100644 queue-6.2/drm-i915-fix-system-suspend-without-fbdev-being-initialized.patch diff --git a/queue-6.2/drm-display-dp_mst-fix-down-message-handling-after-a-packet-reception-error.patch b/queue-6.2/drm-display-dp_mst-fix-down-message-handling-after-a-packet-reception-error.patch new file mode 100644 index 00000000000..326e631580b --- /dev/null +++ b/queue-6.2/drm-display-dp_mst-fix-down-message-handling-after-a-packet-reception-error.patch @@ -0,0 +1,38 @@ +From 1241aedb6b5c7a5a8ad73e5eb3a41cfe18a3e00e Mon Sep 17 00:00:00 2001 +From: Imre Deak +Date: Wed, 14 Dec 2022 20:42:57 +0200 +Subject: drm/display/dp_mst: Fix down message handling after a packet reception error + +From: Imre Deak + +commit 1241aedb6b5c7a5a8ad73e5eb3a41cfe18a3e00e upstream. + +After an error during receiving a packet for a multi-packet DP MST +sideband message, the state tracking which packets have been received +already is not reset. This prevents the reception of subsequent down +messages (due to the pending message not yet completed with an +end-of-message-transfer packet). + +Fix the above by resetting the reception state after a packet error. + +Cc: Lyude Paul +Cc: # v3.17+ +Signed-off-by: Imre Deak +Reviewed-by: Lyude Paul +Link: https://patchwork.freedesktop.org/patch/msgid/20221214184258.2869417-2-imre.deak@intel.com +Signed-off-by: Greg Kroah-Hartman +--- + drivers/gpu/drm/display/drm_dp_mst_topology.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/gpu/drm/display/drm_dp_mst_topology.c ++++ b/drivers/gpu/drm/display/drm_dp_mst_topology.c +@@ -3859,7 +3859,7 @@ static int drm_dp_mst_handle_down_rep(st + struct drm_dp_sideband_msg_rx *msg = &mgr->down_rep_recv; + + if (!drm_dp_get_one_sb_msg(mgr, false, &mstb)) +- goto out; ++ goto out_clear_reply; + + /* Multi-packet message transmission, don't clear the reply */ + if (!msg->have_eomt) diff --git a/queue-6.2/drm-display-dp_mst-fix-down-up-message-handling-after-sink-disconnect.patch b/queue-6.2/drm-display-dp_mst-fix-down-up-message-handling-after-sink-disconnect.patch new file mode 100644 index 00000000000..fa5f9fab2cd --- /dev/null +++ b/queue-6.2/drm-display-dp_mst-fix-down-up-message-handling-after-sink-disconnect.patch @@ -0,0 +1,45 @@ +From 1d082618bbf3b6755b8cc68c0a8122af2842d593 Mon Sep 17 00:00:00 2001 +From: Imre Deak +Date: Wed, 14 Dec 2022 20:42:56 +0200 +Subject: drm/display/dp_mst: Fix down/up message handling after sink disconnect + +From: Imre Deak + +commit 1d082618bbf3b6755b8cc68c0a8122af2842d593 upstream. + +If the sink gets disconnected during receiving a multi-packet DP MST AUX +down-reply/up-request sideband message, the state keeping track of which +packets have been received already is not reset. This results in a failed +sanity check for the subsequent message packet received after a sink is +reconnected (due to the pending message not yet completed with an +end-of-message-transfer packet), indicated by the + +"sideband msg set header failed" + +error. + +Fix the above by resetting the up/down message reception state after a +disconnect event. + +Cc: Lyude Paul +Cc: # v3.17+ +Signed-off-by: Imre Deak +Reviewed-by: Lyude Paul +Link: https://patchwork.freedesktop.org/patch/msgid/20221214184258.2869417-1-imre.deak@intel.com +Signed-off-by: Greg Kroah-Hartman +--- + drivers/gpu/drm/display/drm_dp_mst_topology.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/gpu/drm/display/drm_dp_mst_topology.c ++++ b/drivers/gpu/drm/display/drm_dp_mst_topology.c +@@ -3644,6 +3644,9 @@ int drm_dp_mst_topology_mgr_set_mst(stru + drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL, 0); + ret = 0; + mgr->payload_id_table_cleared = false; ++ ++ memset(&mgr->down_rep_recv, 0, sizeof(mgr->down_rep_recv)); ++ memset(&mgr->up_req_recv, 0, sizeof(mgr->up_req_recv)); + } + + out_unlock: diff --git a/queue-6.2/drm-display-dp_mst-fix-payload-addition-on-a-disconnected-sink.patch b/queue-6.2/drm-display-dp_mst-fix-payload-addition-on-a-disconnected-sink.patch new file mode 100644 index 00000000000..8e2f1ffe13a --- /dev/null +++ b/queue-6.2/drm-display-dp_mst-fix-payload-addition-on-a-disconnected-sink.patch @@ -0,0 +1,47 @@ +From 33f960e23c29d113fe3193e0bdc19ac4f3776f20 Mon Sep 17 00:00:00 2001 +From: Imre Deak +Date: Wed, 14 Dec 2022 20:42:58 +0200 +Subject: drm/display/dp_mst: Fix payload addition on a disconnected sink + +From: Imre Deak + +commit 33f960e23c29d113fe3193e0bdc19ac4f3776f20 upstream. + +If an MST stream is enabled on a disconnected sink, the payload for the +stream is not created and the MST manager's payload count/next start VC +slot is not updated. Since the payload's start VC slot may still contain +a valid value (!= -1) the subsequent disabling of such a stream could +cause an incorrect decrease of the payload count/next start VC slot in +drm_dp_remove_payload() and hence later payload additions will fail. + +Fix the above by marking the payload as invalid in the above case, so +that it's skipped during payload removal. While at it add a debug print +for this case. + +Cc: Lyude Paul +Cc: # v6.1+ +Signed-off-by: Imre Deak +Reviewed-by: Lyude Paul +Link: https://patchwork.freedesktop.org/patch/msgid/20221214184258.2869417-3-imre.deak@intel.com +Signed-off-by: Greg Kroah-Hartman +--- + drivers/gpu/drm/display/drm_dp_mst_topology.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +--- a/drivers/gpu/drm/display/drm_dp_mst_topology.c ++++ b/drivers/gpu/drm/display/drm_dp_mst_topology.c +@@ -3309,8 +3309,13 @@ int drm_dp_add_payload_part1(struct drm_ + int ret; + + port = drm_dp_mst_topology_get_port_validated(mgr, payload->port); +- if (!port) ++ if (!port) { ++ drm_dbg_kms(mgr->dev, ++ "VCPI %d for port %p not in topology, not creating a payload\n", ++ payload->vcpi, payload->port); ++ payload->vc_start_slot = -1; + return 0; ++ } + + if (mgr->payload_count == 0) + mgr->next_start_slot = mst_state->start_slot; diff --git a/queue-6.2/drm-display-dp_mst-handle-old-new-payload-states-in-drm_dp_remove_payload.patch b/queue-6.2/drm-display-dp_mst-handle-old-new-payload-states-in-drm_dp_remove_payload.patch new file mode 100644 index 00000000000..a74d42fc5f5 --- /dev/null +++ b/queue-6.2/drm-display-dp_mst-handle-old-new-payload-states-in-drm_dp_remove_payload.patch @@ -0,0 +1,169 @@ +From e761cc20946a0094df71cb31a565a6a0d03bd8be Mon Sep 17 00:00:00 2001 +From: Imre Deak +Date: Mon, 6 Feb 2023 13:48:54 +0200 +Subject: drm/display/dp_mst: Handle old/new payload states in drm_dp_remove_payload() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Imre Deak + +commit e761cc20946a0094df71cb31a565a6a0d03bd8be upstream. + +Atm, drm_dp_remove_payload() uses the same payload state to both get the +vc_start_slot required for the payload removal DPCD message and to +deduct time_slots from vc_start_slot of all payloads after the one being +removed. + +The above isn't always correct, as vc_start_slot must be the up-to-date +version contained in the new payload state, but time_slots must be the +one used when the payload was previously added, contained in the old +payload state. The new payload's time_slots can change vs. the old one +if the current atomic commit changes the corresponding mode. + +This patch let's drivers pass the old and new payload states to +drm_dp_remove_payload(), but keeps these the same for now in all drivers +not to change the behavior. A follow-up i915 patch will pass in that +driver the correct old and new states to the function. + +Cc: Lyude Paul +Cc: Ville Syrjälä +Cc: Ben Skeggs +Cc: Karol Herbst +Cc: Harry Wentland +Cc: Alex Deucher +Cc: Wayne Lin +Cc: stable@vger.kernel.org # 6.1 +Cc: dri-devel@lists.freedesktop.org +Reviewed-by: Ville Syrjälä +Reviewed-by: Lyude Paul +Acked-by: Lyude Paul +Acked-by: Daniel Vetter +Acked-by: Wayne Lin +Acked-by: Jani Nikula +Signed-off-by: Imre Deak +Link: https://patchwork.freedesktop.org/patch/msgid/20230206114856.2665066-2-imre.deak@intel.com +Signed-off-by: Greg Kroah-Hartman +--- + drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 2 - + drivers/gpu/drm/display/drm_dp_mst_topology.c | 26 +++++++------- + drivers/gpu/drm/i915/display/intel_dp_mst.c | 4 +- + drivers/gpu/drm/nouveau/dispnv50/disp.c | 2 - + include/drm/display/drm_dp_mst_helper.h | 3 + + 5 files changed, 21 insertions(+), 16 deletions(-) + +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c +@@ -206,7 +206,7 @@ bool dm_helpers_dp_mst_write_payload_all + if (enable) + drm_dp_add_payload_part1(mst_mgr, mst_state, payload); + else +- drm_dp_remove_payload(mst_mgr, mst_state, payload); ++ drm_dp_remove_payload(mst_mgr, mst_state, payload, payload); + + /* mst_mgr->->payloads are VC payload notify MST branch using DPCD or + * AUX message. The sequence is slot 1-63 allocated sequence for each +--- a/drivers/gpu/drm/display/drm_dp_mst_topology.c ++++ b/drivers/gpu/drm/display/drm_dp_mst_topology.c +@@ -3342,7 +3342,8 @@ EXPORT_SYMBOL(drm_dp_add_payload_part1); + * drm_dp_remove_payload() - Remove an MST payload + * @mgr: Manager to use. + * @mst_state: The MST atomic state +- * @payload: The payload to write ++ * @old_payload: The payload with its old state ++ * @new_payload: The payload to write + * + * Removes a payload from an MST topology if it was successfully assigned a start slot. Also updates + * the starting time slots of all other payloads which would have been shifted towards the start of +@@ -3350,36 +3351,37 @@ EXPORT_SYMBOL(drm_dp_add_payload_part1); + */ + void drm_dp_remove_payload(struct drm_dp_mst_topology_mgr *mgr, + struct drm_dp_mst_topology_state *mst_state, +- struct drm_dp_mst_atomic_payload *payload) ++ const struct drm_dp_mst_atomic_payload *old_payload, ++ struct drm_dp_mst_atomic_payload *new_payload) + { + struct drm_dp_mst_atomic_payload *pos; + bool send_remove = false; + + /* We failed to make the payload, so nothing to do */ +- if (payload->vc_start_slot == -1) ++ if (new_payload->vc_start_slot == -1) + return; + + mutex_lock(&mgr->lock); +- send_remove = drm_dp_mst_port_downstream_of_branch(payload->port, mgr->mst_primary); ++ send_remove = drm_dp_mst_port_downstream_of_branch(new_payload->port, mgr->mst_primary); + mutex_unlock(&mgr->lock); + + if (send_remove) +- drm_dp_destroy_payload_step1(mgr, mst_state, payload); ++ drm_dp_destroy_payload_step1(mgr, mst_state, new_payload); + else + drm_dbg_kms(mgr->dev, "Payload for VCPI %d not in topology, not sending remove\n", +- payload->vcpi); ++ new_payload->vcpi); + + list_for_each_entry(pos, &mst_state->payloads, next) { +- if (pos != payload && pos->vc_start_slot > payload->vc_start_slot) +- pos->vc_start_slot -= payload->time_slots; ++ if (pos != new_payload && pos->vc_start_slot > new_payload->vc_start_slot) ++ pos->vc_start_slot -= old_payload->time_slots; + } +- payload->vc_start_slot = -1; ++ new_payload->vc_start_slot = -1; + + mgr->payload_count--; +- mgr->next_start_slot -= payload->time_slots; ++ mgr->next_start_slot -= old_payload->time_slots; + +- if (payload->delete) +- drm_dp_mst_put_port_malloc(payload->port); ++ if (new_payload->delete) ++ drm_dp_mst_put_port_malloc(new_payload->port); + } + EXPORT_SYMBOL(drm_dp_remove_payload); + +--- a/drivers/gpu/drm/i915/display/intel_dp_mst.c ++++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c +@@ -367,6 +367,8 @@ static void intel_mst_disable_dp(struct + to_intel_connector(old_conn_state->connector); + struct drm_dp_mst_topology_state *mst_state = + drm_atomic_get_mst_topology_state(&state->base, &intel_dp->mst_mgr); ++ struct drm_dp_mst_atomic_payload *payload = ++ drm_atomic_get_mst_payload_state(mst_state, connector->port); + struct drm_i915_private *i915 = to_i915(connector->base.dev); + + drm_dbg_kms(&i915->drm, "active links %d\n", +@@ -375,7 +377,7 @@ static void intel_mst_disable_dp(struct + intel_hdcp_disable(intel_mst->connector); + + drm_dp_remove_payload(&intel_dp->mst_mgr, mst_state, +- drm_atomic_get_mst_payload_state(mst_state, connector->port)); ++ payload, payload); + + intel_audio_codec_disable(encoder, old_crtc_state, old_conn_state); + } +--- a/drivers/gpu/drm/nouveau/dispnv50/disp.c ++++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c +@@ -885,7 +885,7 @@ nv50_msto_prepare(struct drm_atomic_stat + + // TODO: Figure out if we want to do a better job of handling VCPI allocation failures here? + if (msto->disabled) { +- drm_dp_remove_payload(mgr, mst_state, payload); ++ drm_dp_remove_payload(mgr, mst_state, payload, payload); + + nvif_outp_dp_mst_vcpi(&mstm->outp->outp, msto->head->base.index, 0, 0, 0, 0); + } else { +--- a/include/drm/display/drm_dp_mst_helper.h ++++ b/include/drm/display/drm_dp_mst_helper.h +@@ -841,7 +841,8 @@ int drm_dp_add_payload_part2(struct drm_ + struct drm_dp_mst_atomic_payload *payload); + void drm_dp_remove_payload(struct drm_dp_mst_topology_mgr *mgr, + struct drm_dp_mst_topology_state *mst_state, +- struct drm_dp_mst_atomic_payload *payload); ++ const struct drm_dp_mst_atomic_payload *old_payload, ++ struct drm_dp_mst_atomic_payload *new_payload); + + int drm_dp_check_act_status(struct drm_dp_mst_topology_mgr *mgr); + diff --git a/queue-6.2/drm-i915-dp_mst-add-the-mst-topology-state-for-modesetted-crtcs.patch b/queue-6.2/drm-i915-dp_mst-add-the-mst-topology-state-for-modesetted-crtcs.patch new file mode 100644 index 00000000000..ea16304e9ad --- /dev/null +++ b/queue-6.2/drm-i915-dp_mst-add-the-mst-topology-state-for-modesetted-crtcs.patch @@ -0,0 +1,142 @@ +From 326b1e792ff08b4d8ecb9605aec98e4e5feef56e Mon Sep 17 00:00:00 2001 +From: Imre Deak +Date: Mon, 6 Feb 2023 13:48:53 +0200 +Subject: drm/i915/dp_mst: Add the MST topology state for modesetted CRTCs +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Imre Deak + +commit 326b1e792ff08b4d8ecb9605aec98e4e5feef56e upstream. + +Add the MST topology for a CRTC to the atomic state if the driver +needs to force a modeset on the CRTC after the encoder compute config +functions are called. + +Later the MST encoder's disable hook also adds the state, but that isn't +guaranteed to work (since in that hook getting the state may fail, which +can't be handled there). This should fix that, while a later patch fixes +the use of the MST state in the disable hook. + +v2: Add missing forward struct declartions, caught by hdrtest. +v3: Factor out intel_dp_mst_add_topology_state_for_connector() used + later in the patchset. + +Cc: Lyude Paul +Cc: Ville Syrjälä +Cc: stable@vger.kernel.org # 6.1 +Reviewed-by: Ville Syrjälä # v2 +Reviewed-by: Lyude Paul +Acked-by: Lyude Paul +Acked-by: Daniel Vetter +Acked-by: Wayne Lin +Acked-by: Jani Nikula +Signed-off-by: Imre Deak +Link: https://patchwork.freedesktop.org/patch/msgid/20230206114856.2665066-1-imre.deak@intel.com +Signed-off-by: Greg Kroah-Hartman +--- + drivers/gpu/drm/i915/display/intel_display.c | 4 + + drivers/gpu/drm/i915/display/intel_dp_mst.c | 61 +++++++++++++++++++++++++++ + drivers/gpu/drm/i915/display/intel_dp_mst.h | 4 + + 3 files changed, 69 insertions(+) + +--- a/drivers/gpu/drm/i915/display/intel_display.c ++++ b/drivers/gpu/drm/i915/display/intel_display.c +@@ -5950,6 +5950,10 @@ int intel_modeset_all_pipes(struct intel + if (ret) + return ret; + ++ ret = intel_dp_mst_add_topology_state_for_crtc(state, crtc); ++ if (ret) ++ return ret; ++ + ret = intel_atomic_add_affected_planes(state, crtc); + if (ret) + return ret; +--- a/drivers/gpu/drm/i915/display/intel_dp_mst.c ++++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c +@@ -1018,3 +1018,64 @@ bool intel_dp_mst_is_slave_trans(const s + return crtc_state->mst_master_transcoder != INVALID_TRANSCODER && + crtc_state->mst_master_transcoder != crtc_state->cpu_transcoder; + } ++ ++/** ++ * intel_dp_mst_add_topology_state_for_connector - add MST topology state for a connector ++ * @state: atomic state ++ * @connector: connector to add the state for ++ * @crtc: the CRTC @connector is attached to ++ * ++ * Add the MST topology state for @connector to @state. ++ * ++ * Returns 0 on success, negative error code on failure. ++ */ ++static int ++intel_dp_mst_add_topology_state_for_connector(struct intel_atomic_state *state, ++ struct intel_connector *connector, ++ struct intel_crtc *crtc) ++{ ++ struct drm_dp_mst_topology_state *mst_state; ++ ++ if (!connector->mst_port) ++ return 0; ++ ++ mst_state = drm_atomic_get_mst_topology_state(&state->base, ++ &connector->mst_port->mst_mgr); ++ if (IS_ERR(mst_state)) ++ return PTR_ERR(mst_state); ++ ++ mst_state->pending_crtc_mask |= drm_crtc_mask(&crtc->base); ++ ++ return 0; ++} ++ ++/** ++ * intel_dp_mst_add_topology_state_for_crtc - add MST topology state for a CRTC ++ * @state: atomic state ++ * @crtc: CRTC to add the state for ++ * ++ * Add the MST topology state for @crtc to @state. ++ * ++ * Returns 0 on success, negative error code on failure. ++ */ ++int intel_dp_mst_add_topology_state_for_crtc(struct intel_atomic_state *state, ++ struct intel_crtc *crtc) ++{ ++ struct drm_connector *_connector; ++ struct drm_connector_state *conn_state; ++ int i; ++ ++ for_each_new_connector_in_state(&state->base, _connector, conn_state, i) { ++ struct intel_connector *connector = to_intel_connector(_connector); ++ int ret; ++ ++ if (conn_state->crtc != &crtc->base) ++ continue; ++ ++ ret = intel_dp_mst_add_topology_state_for_connector(state, connector, crtc); ++ if (ret) ++ return ret; ++ } ++ ++ return 0; ++} +--- a/drivers/gpu/drm/i915/display/intel_dp_mst.h ++++ b/drivers/gpu/drm/i915/display/intel_dp_mst.h +@@ -8,6 +8,8 @@ + + #include + ++struct intel_atomic_state; ++struct intel_crtc; + struct intel_crtc_state; + struct intel_digital_port; + struct intel_dp; +@@ -18,5 +20,7 @@ int intel_dp_mst_encoder_active_links(st + bool intel_dp_mst_is_master_trans(const struct intel_crtc_state *crtc_state); + bool intel_dp_mst_is_slave_trans(const struct intel_crtc_state *crtc_state); + bool intel_dp_mst_source_support(struct intel_dp *intel_dp); ++int intel_dp_mst_add_topology_state_for_crtc(struct intel_atomic_state *state, ++ struct intel_crtc *crtc); + + #endif /* __INTEL_DP_MST_H__ */ diff --git a/queue-6.2/drm-i915-dp_mst-fix-payload-removal-during-output-disabling.patch b/queue-6.2/drm-i915-dp_mst-fix-payload-removal-during-output-disabling.patch new file mode 100644 index 00000000000..b36061ac655 --- /dev/null +++ b/queue-6.2/drm-i915-dp_mst-fix-payload-removal-during-output-disabling.patch @@ -0,0 +1,83 @@ +From eb50912ec931913e70640cecf75cb993fd26995f Mon Sep 17 00:00:00 2001 +From: Imre Deak +Date: Mon, 6 Feb 2023 13:48:56 +0200 +Subject: drm/i915/dp_mst: Fix payload removal during output disabling +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Imre Deak + +commit eb50912ec931913e70640cecf75cb993fd26995f upstream. + +Use the correct old/new topology and payload states in +intel_mst_disable_dp(). So far drm_atomic_get_mst_topology_state() it +used returned either the old state, in case the state was added already +earlier during the atomic check phase or otherwise the new state (but +the latter could fail, which can't be handled in the enable/disable +hooks). After the first patch in the patchset, the state should always +get added already during the check phase, so here we can get the +old/new states without a failure. + +drm_dp_remove_payload() should use time_slots from the old payload state +and vc_start_slot in the new one. It should update the new payload +states to reflect the sink's current payload table after the payload is +removed. Pass the new topology state and the old and new payload states +accordingly. + +This also fixes a problem where the payload allocations for multiple MST +streams on the same link got inconsistent after a few commits, as +during payload removal the old instead of the new payload state got +updated, so the subsequent enabling sequence and commits used a stale +payload state. + +v2: Constify the old payload state pointer. (Ville) + +Cc: Lyude Paul +Cc: Ville Syrjälä +Cc: stable@vger.kernel.org # 6.1 +Reviewed-by: Ville Syrjälä +Reviewed-by: Lyude Paul +Acked-by: Lyude Paul +Acked-by: Daniel Vetter +Acked-by: Wayne Lin +Acked-by: Jani Nikula +Signed-off-by: Imre Deak +Link: https://patchwork.freedesktop.org/patch/msgid/20230206114856.2665066-4-imre.deak@intel.com +Signed-off-by: Greg Kroah-Hartman +--- + drivers/gpu/drm/i915/display/intel_dp_mst.c | 16 ++++++++++------ + 1 file changed, 10 insertions(+), 6 deletions(-) + +--- a/drivers/gpu/drm/i915/display/intel_dp_mst.c ++++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c +@@ -365,10 +365,14 @@ static void intel_mst_disable_dp(struct + struct intel_dp *intel_dp = &dig_port->dp; + struct intel_connector *connector = + to_intel_connector(old_conn_state->connector); +- struct drm_dp_mst_topology_state *mst_state = +- drm_atomic_get_mst_topology_state(&state->base, &intel_dp->mst_mgr); +- struct drm_dp_mst_atomic_payload *payload = +- drm_atomic_get_mst_payload_state(mst_state, connector->port); ++ struct drm_dp_mst_topology_state *old_mst_state = ++ drm_atomic_get_old_mst_topology_state(&state->base, &intel_dp->mst_mgr); ++ struct drm_dp_mst_topology_state *new_mst_state = ++ drm_atomic_get_new_mst_topology_state(&state->base, &intel_dp->mst_mgr); ++ const struct drm_dp_mst_atomic_payload *old_payload = ++ drm_atomic_get_mst_payload_state(old_mst_state, connector->port); ++ struct drm_dp_mst_atomic_payload *new_payload = ++ drm_atomic_get_mst_payload_state(new_mst_state, connector->port); + struct drm_i915_private *i915 = to_i915(connector->base.dev); + + drm_dbg_kms(&i915->drm, "active links %d\n", +@@ -376,8 +380,8 @@ static void intel_mst_disable_dp(struct + + intel_hdcp_disable(intel_mst->connector); + +- drm_dp_remove_payload(&intel_dp->mst_mgr, mst_state, +- payload, payload); ++ drm_dp_remove_payload(&intel_dp->mst_mgr, new_mst_state, ++ old_payload, new_payload); + + intel_audio_codec_disable(encoder, old_crtc_state, old_conn_state); + } diff --git a/queue-6.2/drm-i915-fix-system-suspend-without-fbdev-being-initialized.patch b/queue-6.2/drm-i915-fix-system-suspend-without-fbdev-being-initialized.patch new file mode 100644 index 00000000000..42d7fec0082 --- /dev/null +++ b/queue-6.2/drm-i915-fix-system-suspend-without-fbdev-being-initialized.patch @@ -0,0 +1,102 @@ +From 8038510b1fe443ffbc0e356db5f47cbb8678a594 Mon Sep 17 00:00:00 2001 +From: Imre Deak +Date: Wed, 8 Feb 2023 13:42:57 +0200 +Subject: drm/i915: Fix system suspend without fbdev being initialized + +From: Imre Deak + +commit 8038510b1fe443ffbc0e356db5f47cbb8678a594 upstream. + +If fbdev is not initialized for some reason - in practice on platforms +without display - suspending fbdev should be skipped during system +suspend, fix this up. While at it add an assert that suspending fbdev +only happens with the display present. + +This fixes the following: + +[ 91.227923] PM: suspend entry (s2idle) +[ 91.254598] Filesystems sync: 0.025 seconds +[ 91.270518] Freezing user space processes +[ 91.272266] Freezing user space processes completed (elapsed 0.001 seconds) +[ 91.272686] OOM killer disabled. +[ 91.272872] Freezing remaining freezable tasks +[ 91.274295] Freezing remaining freezable tasks completed (elapsed 0.001 seconds) +[ 91.659622] BUG: kernel NULL pointer dereference, address: 00000000000001c8 +[ 91.659981] #PF: supervisor write access in kernel mode +[ 91.660252] #PF: error_code(0x0002) - not-present page +[ 91.660511] PGD 0 P4D 0 +[ 91.660647] Oops: 0002 [#1] PREEMPT SMP NOPTI +[ 91.660875] CPU: 4 PID: 917 Comm: bash Not tainted 6.2.0-rc7+ #54 +[ 91.661185] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS edk2-20221117gitfff6d81270b5-9.fc37 unknown +[ 91.661680] RIP: 0010:mutex_lock+0x19/0x30 +[ 91.661914] Code: 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 0f 1f 44 00 00 53 48 89 fb e8 62 d3 ff ff 31 c0 65 48 8b 14 25 00 15 03 00 48 0f b1 13 75 06 5b c3 cc cc cc cc 48 89 df 5b eb b4 0f 1f 40 +[ 91.662840] RSP: 0018:ffffa1e8011ffc08 EFLAGS: 00010246 +[ 91.663087] RAX: 0000000000000000 RBX: 00000000000001c8 RCX: 0000000000000000 +[ 91.663440] RDX: ffff8be455eb0000 RSI: 0000000000000001 RDI: 00000000000001c8 +[ 91.663802] RBP: ffff8be459440000 R08: ffff8be459441f08 R09: ffffffff8e1432c0 +[ 91.664167] R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000001 +[ 91.664532] R13: 00000000000001c8 R14: 0000000000000000 R15: ffff8be442f4fb20 +[ 91.664905] FS: 00007f28ffc16740(0000) GS:ffff8be4bb900000(0000) knlGS:0000000000000000 +[ 91.665334] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 +[ 91.665626] CR2: 00000000000001c8 CR3: 0000000114926006 CR4: 0000000000770ee0 +[ 91.665988] PKRU: 55555554 +[ 91.666131] Call Trace: +[ 91.666265] +[ 91.666381] intel_fbdev_set_suspend+0x97/0x1b0 [i915] +[ 91.666738] i915_drm_suspend+0xb9/0x100 [i915] +[ 91.667029] pci_pm_suspend+0x78/0x170 +[ 91.667234] ? __pfx_pci_pm_suspend+0x10/0x10 +[ 91.667461] dpm_run_callback+0x47/0x150 +[ 91.667673] __device_suspend+0x10a/0x4e0 +[ 91.667880] dpm_suspend+0x134/0x270 +[ 91.668069] dpm_suspend_start+0x79/0x80 +[ 91.668272] suspend_devices_and_enter+0x11b/0x890 +[ 91.668526] pm_suspend.cold+0x270/0x2fc +[ 91.668737] state_store+0x46/0x90 +[ 91.668916] kernfs_fop_write_iter+0x11b/0x200 +[ 91.669153] vfs_write+0x1e1/0x3a0 +[ 91.669336] ksys_write+0x53/0xd0 +[ 91.669510] do_syscall_64+0x58/0xc0 +[ 91.669699] ? syscall_exit_to_user_mode_prepare+0x18e/0x1c0 +[ 91.669980] ? syscall_exit_to_user_mode_prepare+0x18e/0x1c0 +[ 91.670278] ? syscall_exit_to_user_mode+0x17/0x40 +[ 91.670524] ? do_syscall_64+0x67/0xc0 +[ 91.670717] ? __irq_exit_rcu+0x3d/0x140 +[ 91.670931] entry_SYSCALL_64_after_hwframe+0x72/0xdc +[ 91.671202] RIP: 0033:0x7f28ffd14284 + +v2: CC stable. (Jani) + +Fixes: f8cc091e0530 ("drm/i915/fbdev: suspend HPD before fbdev unregistration") +References: https://gitlab.freedesktop.org/drm/intel/-/issues/8015 +Reported-and-tested-by: iczero +Cc: Andrzej Hajda +Cc: iczero +Cc: # v6.1+ +Reviewed-by: Jani Nikula +Signed-off-by: Imre Deak +Link: https://patchwork.freedesktop.org/patch/msgid/20230208114300.3123934-2-imre.deak@intel.com +(cherry picked from commit 9542d708409a41449e99c9a464deb5e062c4bee2) +Signed-off-by: Jani Nikula +Signed-off-by: Greg Kroah-Hartman +--- + drivers/gpu/drm/i915/display/intel_fbdev.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +--- a/drivers/gpu/drm/i915/display/intel_fbdev.c ++++ b/drivers/gpu/drm/i915/display/intel_fbdev.c +@@ -638,7 +638,13 @@ void intel_fbdev_set_suspend(struct drm_ + struct intel_fbdev *ifbdev = dev_priv->display.fbdev.fbdev; + struct fb_info *info; + +- if (!ifbdev || !ifbdev->vma) ++ if (!ifbdev) ++ return; ++ ++ if (drm_WARN_ON(&dev_priv->drm, !HAS_DISPLAY(dev_priv))) ++ return; ++ ++ if (!ifbdev->vma) + goto set_suspend; + + info = ifbdev->helper.info; diff --git a/queue-6.2/series b/queue-6.2/series index 48c9b74fbe2..45a9ea6f49e 100644 --- a/queue-6.2/series +++ b/queue-6.2/series @@ -199,3 +199,10 @@ vdpa-ifcvf-ifcvf_request_irq-works-on-ifcvf_hw.patch vdpa-ifcvf-manage-ifcvf_hw-in-the-mgmt_dev.patch vdpa-ifcvf-allocate-the-adapter-in-dev_add.patch drm-display-dp_mst-add-drm_atomic_get_old_mst_topology_state.patch +drm-display-dp_mst-fix-down-up-message-handling-after-sink-disconnect.patch +drm-display-dp_mst-fix-down-message-handling-after-a-packet-reception-error.patch +drm-display-dp_mst-fix-payload-addition-on-a-disconnected-sink.patch +drm-i915-dp_mst-add-the-mst-topology-state-for-modesetted-crtcs.patch +drm-display-dp_mst-handle-old-new-payload-states-in-drm_dp_remove_payload.patch +drm-i915-dp_mst-fix-payload-removal-during-output-disabling.patch +drm-i915-fix-system-suspend-without-fbdev-being-initialized.patch -- 2.47.3