From b8abfc8da1645c2ea71fec32dba849a51cd6c67f Mon Sep 17 00:00:00 2001 From: Justin M. Forbes Date: Aug 19 2019 14:21:15 +0000 Subject: Fixes for nouveau --- diff --git a/kernel.spec b/kernel.spec index f1e3aaa..f064815 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 0000000..72bf049 --- /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 +X-Patchwork-Id: 322786 +Message-Id: <20190809005307.18391-1-lyude@redhat.com> +To: nouveau@lists.freedesktop.org +Cc: Bohdan Milar , linux-kernel@vger.kernel.org, + David Airlie , Daniel Vetter , + dri-devel@lists.freedesktop.org, William Lewis , + stable@vger.kernel.org, Karol Herbst , + Jerry Zuo , Ben Skeggs , + David Airlie , Juston Li , + Laurent Pinchart +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 +Reported-by: Bohdan Milar +Tested-by: Bohdan Milar +Fixes: 232c9eec417a ("drm/nouveau: Use atomic VCPI helpers for MST") +References: 412e85b60531 ("drm/nouveau: Only release VCPI slots on mode changes") +Cc: Lyude Paul +Cc: Ben Skeggs +Cc: Daniel Vetter +Cc: David Airlie +Cc: Jerry Zuo +Cc: Harry Wentland +Cc: Juston Li +Cc: Laurent Pinchart +Cc: Karol Herbst +Cc: Ilia Mirkin +Cc: # v5.1+ +Acked-by: Ben Skeggs +--- + 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);