]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
6.2-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 10 Mar 2023 11:48:22 +0000 (12:48 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 10 Mar 2023 11:48:22 +0000 (12:48 +0100)
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

queue-6.2/drm-display-dp_mst-fix-down-message-handling-after-a-packet-reception-error.patch [new file with mode: 0644]
queue-6.2/drm-display-dp_mst-fix-down-up-message-handling-after-sink-disconnect.patch [new file with mode: 0644]
queue-6.2/drm-display-dp_mst-fix-payload-addition-on-a-disconnected-sink.patch [new file with mode: 0644]
queue-6.2/drm-display-dp_mst-handle-old-new-payload-states-in-drm_dp_remove_payload.patch [new file with mode: 0644]
queue-6.2/drm-i915-dp_mst-add-the-mst-topology-state-for-modesetted-crtcs.patch [new file with mode: 0644]
queue-6.2/drm-i915-dp_mst-fix-payload-removal-during-output-disabling.patch [new file with mode: 0644]
queue-6.2/drm-i915-fix-system-suspend-without-fbdev-being-initialized.patch [new file with mode: 0644]
queue-6.2/series

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 (file)
index 0000000..326e631
--- /dev/null
@@ -0,0 +1,38 @@
+From 1241aedb6b5c7a5a8ad73e5eb3a41cfe18a3e00e Mon Sep 17 00:00:00 2001
+From: Imre Deak <imre.deak@intel.com>
+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 <imre.deak@intel.com>
+
+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 <lyude@redhat.com>
+Cc: <stable@vger.kernel.org> # v3.17+
+Signed-off-by: Imre Deak <imre.deak@intel.com>
+Reviewed-by: Lyude Paul <lyude@redhat.com>
+Link: https://patchwork.freedesktop.org/patch/msgid/20221214184258.2869417-2-imre.deak@intel.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 (file)
index 0000000..fa5f9fa
--- /dev/null
@@ -0,0 +1,45 @@
+From 1d082618bbf3b6755b8cc68c0a8122af2842d593 Mon Sep 17 00:00:00 2001
+From: Imre Deak <imre.deak@intel.com>
+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 <imre.deak@intel.com>
+
+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 <lyude@redhat.com>
+Cc: <stable@vger.kernel.org> # v3.17+
+Signed-off-by: Imre Deak <imre.deak@intel.com>
+Reviewed-by: Lyude Paul <lyude@redhat.com>
+Link: https://patchwork.freedesktop.org/patch/msgid/20221214184258.2869417-1-imre.deak@intel.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 (file)
index 0000000..8e2f1ff
--- /dev/null
@@ -0,0 +1,47 @@
+From 33f960e23c29d113fe3193e0bdc19ac4f3776f20 Mon Sep 17 00:00:00 2001
+From: Imre Deak <imre.deak@intel.com>
+Date: Wed, 14 Dec 2022 20:42:58 +0200
+Subject: drm/display/dp_mst: Fix payload addition on a disconnected sink
+
+From: Imre Deak <imre.deak@intel.com>
+
+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 <lyude@redhat.com>
+Cc: <stable@vger.kernel.org> # v6.1+
+Signed-off-by: Imre Deak <imre.deak@intel.com>
+Reviewed-by: Lyude Paul <lyude@redhat.com>
+Link: https://patchwork.freedesktop.org/patch/msgid/20221214184258.2869417-3-imre.deak@intel.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 (file)
index 0000000..a74d42f
--- /dev/null
@@ -0,0 +1,169 @@
+From e761cc20946a0094df71cb31a565a6a0d03bd8be Mon Sep 17 00:00:00 2001
+From: Imre Deak <imre.deak@intel.com>
+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 <imre.deak@intel.com>
+
+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 <lyude@redhat.com>
+Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
+Cc: Ben Skeggs <bskeggs@redhat.com>
+Cc: Karol Herbst <kherbst@redhat.com>
+Cc: Harry Wentland <harry.wentland@amd.com>
+Cc: Alex Deucher <alexander.deucher@amd.com>
+Cc: Wayne Lin <Wayne.Lin@amd.com>
+Cc: stable@vger.kernel.org # 6.1
+Cc: dri-devel@lists.freedesktop.org
+Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
+Reviewed-by: Lyude Paul <lyude@redhat.com>
+Acked-by: Lyude Paul <lyude@redhat.com>
+Acked-by: Daniel Vetter <daniel@ffwll.ch>
+Acked-by: Wayne Lin <wayne.lin@amd.com>
+Acked-by: Jani Nikula <jani.nikula@intel.com>
+Signed-off-by: Imre Deak <imre.deak@intel.com>
+Link: https://patchwork.freedesktop.org/patch/msgid/20230206114856.2665066-2-imre.deak@intel.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 (file)
index 0000000..ea16304
--- /dev/null
@@ -0,0 +1,142 @@
+From 326b1e792ff08b4d8ecb9605aec98e4e5feef56e Mon Sep 17 00:00:00 2001
+From: Imre Deak <imre.deak@intel.com>
+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 <imre.deak@intel.com>
+
+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 <lyude@redhat.com>
+Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
+Cc: stable@vger.kernel.org # 6.1
+Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> # v2
+Reviewed-by: Lyude Paul <lyude@redhat.com>
+Acked-by: Lyude Paul <lyude@redhat.com>
+Acked-by: Daniel Vetter <daniel@ffwll.ch>
+Acked-by: Wayne Lin <wayne.lin@amd.com>
+Acked-by: Jani Nikula <jani.nikula@intel.com>
+Signed-off-by: Imre Deak <imre.deak@intel.com>
+Link: https://patchwork.freedesktop.org/patch/msgid/20230206114856.2665066-1-imre.deak@intel.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 <linux/types.h>
++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 (file)
index 0000000..b36061a
--- /dev/null
@@ -0,0 +1,83 @@
+From eb50912ec931913e70640cecf75cb993fd26995f Mon Sep 17 00:00:00 2001
+From: Imre Deak <imre.deak@intel.com>
+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 <imre.deak@intel.com>
+
+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 <lyude@redhat.com>
+Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
+Cc: stable@vger.kernel.org # 6.1
+Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
+Reviewed-by: Lyude Paul <lyude@redhat.com>
+Acked-by: Lyude Paul <lyude@redhat.com>
+Acked-by: Daniel Vetter <daniel@ffwll.ch>
+Acked-by: Wayne Lin <wayne.lin@amd.com>
+Acked-by: Jani Nikula <jani.nikula@intel.com>
+Signed-off-by: Imre Deak <imre.deak@intel.com>
+Link: https://patchwork.freedesktop.org/patch/msgid/20230206114856.2665066-4-imre.deak@intel.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 (file)
index 0000000..42d7fec
--- /dev/null
@@ -0,0 +1,102 @@
+From 8038510b1fe443ffbc0e356db5f47cbb8678a594 Mon Sep 17 00:00:00 2001
+From: Imre Deak <imre.deak@intel.com>
+Date: Wed, 8 Feb 2023 13:42:57 +0200
+Subject: drm/i915: Fix system suspend without fbdev being initialized
+
+From: Imre Deak <imre.deak@intel.com>
+
+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 <f0> 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]  <TASK>
+[   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 <iczero@hellomouse.net>
+Cc: Andrzej Hajda <andrzej.hajda@intel.com>
+Cc: iczero <iczero@hellomouse.net>
+Cc: <stable@vger.kernel.org> # v6.1+
+Reviewed-by: Jani Nikula <jani.nikula@intel.com>
+Signed-off-by: Imre Deak <imre.deak@intel.com>
+Link: https://patchwork.freedesktop.org/patch/msgid/20230208114300.3123934-2-imre.deak@intel.com
+(cherry picked from commit 9542d708409a41449e99c9a464deb5e062c4bee2)
+Signed-off-by: Jani Nikula <jani.nikula@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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;
index 48c9b74fbe29a07a6f8a1ff94d6224d4986ba544..45a9ea6f49ee8811442bf035101596949d592c08 100644 (file)
@@ -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