summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJustin M. Forbes <jforbes@fedoraproject.org>2019-08-19 09:20:54 -0500
committerJustin M. Forbes <jforbes@fedoraproject.org>2019-08-19 09:21:15 -0500
commitb8abfc8da1645c2ea71fec32dba849a51cd6c67f (patch)
tree48edf5e27ffc6e1dc7da33a85045462061038646
parent6712f443168a98a13b5df85231660da126487644 (diff)
downloadkernel-b8abfc8da1645c2ea71fec32dba849a51cd6c67f.tar.gz
kernel-b8abfc8da1645c2ea71fec32dba849a51cd6c67f.tar.xz
kernel-b8abfc8da1645c2ea71fec32dba849a51cd6c67f.zip
Fixes for nouveau
-rw-r--r--kernel.spec3
-rw-r--r--v2-drm-nouveau-Only-recalculate-PBN-VCPI-on-mode-connector-changes.patch101
2 files changed, 104 insertions, 0 deletions
diff --git a/kernel.spec b/kernel.spec
index f1e3aaa30..f06481565 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -598,6 +598,9 @@ Patch513: for-v5.2-iwlwifi-mvm-disable-TX-AMSDU-on-older-NICs.patch
# https://www.spinics.net/lists/linux-wireless/msg188751.html
Patch514: iwlwifi-Add-support-for-SAR-South-Korea-limitation.patch
+# Nouveau fixes headed upstream
+Patch515: v2-drm-nouveau-Only-recalculate-PBN-VCPI-on-mode-connector-changes.patch
+
# END OF PATCH DEFINITIONS
%endif
diff --git a/v2-drm-nouveau-Only-recalculate-PBN-VCPI-on-mode-connector-changes.patch b/v2-drm-nouveau-Only-recalculate-PBN-VCPI-on-mode-connector-changes.patch
new file mode 100644
index 000000000..72bf0495c
--- /dev/null
+++ b/v2-drm-nouveau-Only-recalculate-PBN-VCPI-on-mode-connector-changes.patch
@@ -0,0 +1,101 @@
+From patchwork Fri Aug 9 00:53:05 2019
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 8bit
+Subject: [v2] drm/nouveau: Only recalculate PBN/VCPI on mode/connector changes
+From: Lyude Paul <lyude@redhat.com>
+X-Patchwork-Id: 322786
+Message-Id: <20190809005307.18391-1-lyude@redhat.com>
+To: nouveau@lists.freedesktop.org
+Cc: Bohdan Milar <bmilar@redhat.com>, linux-kernel@vger.kernel.org,
+ David Airlie <airlied@linux.ie>, Daniel Vetter <daniel.vetter@ffwll.ch>,
+ dri-devel@lists.freedesktop.org, William Lewis <minutemaidpark@hotmail.com>,
+ stable@vger.kernel.org, Karol Herbst <karolherbst@gmail.com>,
+ Jerry Zuo <Jerry.Zuo@amd.com>, Ben Skeggs <bskeggs@redhat.com>,
+ David Airlie <airlied@redhat.com>, Juston Li <juston.li@intel.com>,
+ Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Date: Thu, 8 Aug 2019 20:53:05 -0400
+
+I -thought- I had fixed this entirely, but it looks like that I didn't
+test this thoroughly enough as we apparently still make one big mistake
+with nv50_msto_atomic_check() - we don't handle the following scenario:
+
+* CRTC #1 has n VCPI allocated to it, is attached to connector DP-4
+ which is attached to encoder #1. enabled=y active=n
+* CRTC #1 is changed from DP-4 to DP-5, causing:
+ * DP-4 crtc=#1→NULL (VCPI n→0)
+ * DP-5 crtc=NULL→#1
+ * CRTC #1 steals encoder #1 back from DP-4 and gives it to DP-5
+ * CRTC #1 maintains the same mode as before, just with a different
+ connector
+* mode_changed=n connectors_changed=y
+ (we _SHOULD_ do VCPI 0→n here, but don't)
+
+Once the above scenario is repeated once, we'll attempt freeing VCPI
+from the connector that we didn't allocate due to the connectors
+changing, but the mode staying the same. Sigh.
+
+Since nv50_msto_atomic_check() has broken a few times now, let's rethink
+things a bit to be more careful: limit both VCPI/PBN allocations to
+mode_changed || connectors_changed, since neither VCPI or PBN should
+ever need to change outside of routing and mode changes.
+
+Changes since v1:
+* Fix accidental reversal of clock and bpp arguments in
+ drm_dp_calc_pbn_mode() - William Lewis
+
+Signed-off-by: Lyude Paul <lyude@redhat.com>
+Reported-by: Bohdan Milar <bmilar@redhat.com>
+Tested-by: Bohdan Milar <bmilar@redhat.com>
+Fixes: 232c9eec417a ("drm/nouveau: Use atomic VCPI helpers for MST")
+References: 412e85b60531 ("drm/nouveau: Only release VCPI slots on mode changes")
+Cc: Lyude Paul <lyude@redhat.com>
+Cc: Ben Skeggs <bskeggs@redhat.com>
+Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
+Cc: David Airlie <airlied@redhat.com>
+Cc: Jerry Zuo <Jerry.Zuo@amd.com>
+Cc: Harry Wentland <harry.wentland@amd.com>
+Cc: Juston Li <juston.li@intel.com>
+Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Cc: Karol Herbst <karolherbst@gmail.com>
+Cc: Ilia Mirkin <imirkin@alum.mit.edu>
+Cc: <stable@vger.kernel.org> # v5.1+
+Acked-by: Ben Skeggs <bskeggs@redhat.com>
+---
+ drivers/gpu/drm/nouveau/dispnv50/disp.c | 22 +++++++++++++---------
+ 1 file changed, 13 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c
+index 126703816794..5c36c75232e6 100644
+--- a/drivers/gpu/drm/nouveau/dispnv50/disp.c
++++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c
+@@ -771,16 +771,20 @@ nv50_msto_atomic_check(struct drm_encoder *encoder,
+ struct nv50_head_atom *asyh = nv50_head_atom(crtc_state);
+ int slots;
+
+- /* When restoring duplicated states, we need to make sure that the
+- * bw remains the same and avoid recalculating it, as the connector's
+- * bpc may have changed after the state was duplicated
+- */
+- if (!state->duplicated)
+- asyh->dp.pbn =
+- drm_dp_calc_pbn_mode(crtc_state->adjusted_mode.clock,
+- connector->display_info.bpc * 3);
++ if (crtc_state->mode_changed || crtc_state->connectors_changed) {
++ /*
++ * When restoring duplicated states, we need to make sure that
++ * the bw remains the same and avoid recalculating it, as the
++ * connector's bpc may have changed after the state was
++ * duplicated
++ */
++ if (!state->duplicated) {
++ const int bpp = connector->display_info.bpc * 3;
++ const int clock = crtc_state->adjusted_mode.clock;
++
++ asyh->dp.pbn = drm_dp_calc_pbn_mode(clock, bpp);
++ }
+
+- if (crtc_state->mode_changed) {
+ slots = drm_dp_atomic_find_vcpi_slots(state, &mstm->mgr,
+ mstc->port,
+ asyh->dp.pbn);