]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 5.15
authorSasha Levin <sashal@kernel.org>
Sun, 25 Sep 2022 14:30:24 +0000 (10:30 -0400)
committerSasha Levin <sashal@kernel.org>
Sun, 25 Sep 2022 14:30:24 +0000 (10:30 -0400)
Signed-off-by: Sasha Levin <sashal@kernel.org>
queue-5.15/drivers-hv-never-allocate-anything-besides-framebuff.patch [new file with mode: 0644]
queue-5.15/drm-amd-display-limit-user-regamma-to-a-valid-value.patch [new file with mode: 0644]
queue-5.15/drm-amd-display-mark-dml30-s-useminimumdcfclk-as-noi.patch [new file with mode: 0644]
queue-5.15/drm-amd-display-reduce-number-of-arguments-of-dml31-.patch [new file with mode: 0644]
queue-5.15/drm-amd-display-reduce-number-of-arguments-of-dml31-.patch-4999 [new file with mode: 0644]
queue-5.15/drm-amd-pm-disable-baco-entry-exit-completely-on-sev.patch [new file with mode: 0644]
queue-5.15/drm-amdgpu-use-dirty-framebuffer-helper.patch [new file with mode: 0644]
queue-5.15/drm-gma500-fix-bug-sleeping-function-called-from-inv.patch [new file with mode: 0644]
queue-5.15/drm-rockchip-fix-return-type-of-cdn_dp_connector_mod.patch [new file with mode: 0644]
queue-5.15/gpio-ixp4xx-make-irqchip-immutable.patch [new file with mode: 0644]
queue-5.15/series

diff --git a/queue-5.15/drivers-hv-never-allocate-anything-besides-framebuff.patch b/queue-5.15/drivers-hv-never-allocate-anything-besides-framebuff.patch
new file mode 100644 (file)
index 0000000..558a489
--- /dev/null
@@ -0,0 +1,101 @@
+From 55ba7804d393c1e65a923f5ebe842589e7094a43 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 27 Aug 2022 15:03:45 +0200
+Subject: Drivers: hv: Never allocate anything besides framebuffer from
+ framebuffer memory region
+
+From: Vitaly Kuznetsov <vkuznets@redhat.com>
+
+[ Upstream commit f0880e2cb7e1f8039a048fdd01ce45ab77247221 ]
+
+Passed through PCI device sometimes misbehave on Gen1 VMs when Hyper-V
+DRM driver is also loaded. Looking at IOMEM assignment, we can see e.g.
+
+$ cat /proc/iomem
+...
+f8000000-fffbffff : PCI Bus 0000:00
+  f8000000-fbffffff : 0000:00:08.0
+    f8000000-f8001fff : bb8c4f33-2ba2-4808-9f7f-02f3b4da22fe
+...
+fe0000000-fffffffff : PCI Bus 0000:00
+  fe0000000-fe07fffff : bb8c4f33-2ba2-4808-9f7f-02f3b4da22fe
+    fe0000000-fe07fffff : 2ba2:00:02.0
+      fe0000000-fe07fffff : mlx4_core
+
+the interesting part is the 'f8000000' region as it is actually the
+VM's framebuffer:
+
+$ lspci -v
+...
+0000:00:08.0 VGA compatible controller: Microsoft Corporation Hyper-V virtual VGA (prog-if 00 [VGA controller])
+       Flags: bus master, fast devsel, latency 0, IRQ 11
+       Memory at f8000000 (32-bit, non-prefetchable) [size=64M]
+...
+
+ hv_vmbus: registering driver hyperv_drm
+ hyperv_drm 5620e0c7-8062-4dce-aeb7-520c7ef76171: [drm] Synthvid Version major 3, minor 5
+ hyperv_drm 0000:00:08.0: vgaarb: deactivate vga console
+ hyperv_drm 0000:00:08.0: BAR 0: can't reserve [mem 0xf8000000-0xfbffffff]
+ hyperv_drm 5620e0c7-8062-4dce-aeb7-520c7ef76171: [drm] Cannot request framebuffer, boot fb still active?
+
+Note: "Cannot request framebuffer" is not a fatal error in
+hyperv_setup_gen1() as the code assumes there's some other framebuffer
+device there but we actually have some other PCI device (mlx4 in this
+case) config space there!
+
+The problem appears to be that vmbus_allocate_mmio() can use dedicated
+framebuffer region to serve any MMIO request from any device. The
+semantics one might assume of a parameter named "fb_overlap_ok"
+aren't implemented because !fb_overlap_ok essentially has no effect.
+The existing semantics are really "prefer_fb_overlap". This patch
+implements the expected and needed semantics, which is to not allocate
+from the frame buffer space when !fb_overlap_ok.
+
+Note, Gen2 VMs are usually unaffected by the issue because
+framebuffer region is already taken by EFI fb (in case kernel supports
+it) but Gen1 VMs may have this region unclaimed by the time Hyper-V PCI
+pass-through driver tries allocating MMIO space if Hyper-V DRM/FB drivers
+load after it. Devices can be brought up in any sequence so let's
+resolve the issue by always ignoring 'fb_mmio' region for non-FB
+requests, even if the region is unclaimed.
+
+Reviewed-by: Michael Kelley <mikelley@microsoft.com>
+Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
+Link: https://lore.kernel.org/r/20220827130345.1320254-4-vkuznets@redhat.com
+Signed-off-by: Wei Liu <wei.liu@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hv/vmbus_drv.c | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
+index 50d9113f5402..ecfc299834e1 100644
+--- a/drivers/hv/vmbus_drv.c
++++ b/drivers/hv/vmbus_drv.c
+@@ -2340,7 +2340,7 @@ int vmbus_allocate_mmio(struct resource **new, struct hv_device *device_obj,
+                       bool fb_overlap_ok)
+ {
+       struct resource *iter, *shadow;
+-      resource_size_t range_min, range_max, start;
++      resource_size_t range_min, range_max, start, end;
+       const char *dev_n = dev_name(&device_obj->device);
+       int retval;
+@@ -2375,6 +2375,14 @@ int vmbus_allocate_mmio(struct resource **new, struct hv_device *device_obj,
+               range_max = iter->end;
+               start = (range_min + align - 1) & ~(align - 1);
+               for (; start + size - 1 <= range_max; start += align) {
++                      end = start + size - 1;
++
++                      /* Skip the whole fb_mmio region if not fb_overlap_ok */
++                      if (!fb_overlap_ok && fb_mmio &&
++                          (((start >= fb_mmio->start) && (start <= fb_mmio->end)) ||
++                           ((end >= fb_mmio->start) && (end <= fb_mmio->end))))
++                              continue;
++
+                       shadow = __request_region(iter, start, size, NULL,
+                                                 IORESOURCE_BUSY);
+                       if (!shadow)
+-- 
+2.35.1
+
diff --git a/queue-5.15/drm-amd-display-limit-user-regamma-to-a-valid-value.patch b/queue-5.15/drm-amd-display-limit-user-regamma-to-a-valid-value.patch
new file mode 100644 (file)
index 0000000..59bac87
--- /dev/null
@@ -0,0 +1,55 @@
+From 32c7f2925a507ec4babb4f50161823669145fce7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 22 Aug 2022 18:30:31 +0800
+Subject: drm/amd/display: Limit user regamma to a valid value
+
+From: Yao Wang1 <Yao.Wang1@amd.com>
+
+[ Upstream commit 3601d620f22e37740cf73f8278eabf9f2aa19eb7 ]
+
+[Why]
+For HDR mode, we get total 512 tf_point and after switching to SDR mode
+we actually get 400 tf_point and the rest of points(401~512) still use
+dirty value from HDR mode. We should limit the rest of the points to max
+value.
+
+[How]
+Limit the value when coordinates_x.x > 1, just like what we do in
+translate_from_linear_space for other re-gamma build paths.
+
+Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
+Reviewed-by: Krunoslav Kovac <Krunoslav.Kovac@amd.com>
+Reviewed-by: Aric Cyr <Aric.Cyr@amd.com>
+Acked-by: Pavle Kotarac <Pavle.Kotarac@amd.com>
+Signed-off-by: Yao Wang1 <Yao.Wang1@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/amd/display/modules/color/color_gamma.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c
+index ef742d95ef05..c707c9bfed43 100644
+--- a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c
++++ b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c
+@@ -1597,6 +1597,7 @@ static void interpolate_user_regamma(uint32_t hw_points_num,
+       struct fixed31_32 lut2;
+       struct fixed31_32 delta_lut;
+       struct fixed31_32 delta_index;
++      const struct fixed31_32 one = dc_fixpt_from_int(1);
+       i = 0;
+       /* fixed_pt library has problems handling too small values */
+@@ -1625,6 +1626,9 @@ static void interpolate_user_regamma(uint32_t hw_points_num,
+                       } else
+                               hw_x = coordinates_x[i].x;
++                      if (dc_fixpt_le(one, hw_x))
++                              hw_x = one;
++
+                       norm_x = dc_fixpt_mul(norm_factor, hw_x);
+                       index = dc_fixpt_floor(norm_x);
+                       if (index < 0 || index > 255)
+-- 
+2.35.1
+
diff --git a/queue-5.15/drm-amd-display-mark-dml30-s-useminimumdcfclk-as-noi.patch b/queue-5.15/drm-amd-display-mark-dml30-s-useminimumdcfclk-as-noi.patch
new file mode 100644 (file)
index 0000000..5c2da88
--- /dev/null
@@ -0,0 +1,62 @@
+From ed7687c1f548a318930cb0b4ebdf995b9d9505b7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 30 Aug 2022 13:34:09 -0700
+Subject: drm/amd/display: Mark dml30's UseMinimumDCFCLK() as noinline for
+ stack usage
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Nathan Chancellor <nathan@kernel.org>
+
+[ Upstream commit 41012d715d5d7b9751ae84b8fb255e404ac9c5d0 ]
+
+This function consumes a lot of stack space and it blows up the size of
+dml30_ModeSupportAndSystemConfigurationFull() with clang:
+
+  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn30/display_mode_vba_30.c:3542:6: error: stack frame size (2200) exceeds limit (2048) in 'dml30_ModeSupportAndSystemConfigurationFull' [-Werror,-Wframe-larger-than]
+  void dml30_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_lib)
+       ^
+  1 error generated.
+
+Commit a0f7e7f759cf ("drm/amd/display: fix i386 frame size warning")
+aimed to address this for i386 but it did not help x86_64.
+
+To reduce the amount of stack space that
+dml30_ModeSupportAndSystemConfigurationFull() uses, mark
+UseMinimumDCFCLK() as noinline, using the _for_stack variant for
+documentation. While this will increase the total amount of stack usage
+between the two functions (1632 and 1304 bytes respectively), it will
+make sure both stay below the limit of 2048 bytes for these files. The
+aforementioned change does help reduce UseMinimumDCFCLK()'s stack usage
+so it should not be reverted in favor of this change.
+
+Link: https://github.com/ClangBuiltLinux/linux/issues/1681
+Reported-by: "Sudip Mukherjee (Codethink)" <sudipm.mukherjee@gmail.com>
+Tested-by: Maíra Canal <mairacanal@riseup.net>
+Reviewed-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
+Signed-off-by: Nathan Chancellor <nathan@kernel.org>
+Signed-off-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/amd/display/dc/dml/dcn30/display_mode_vba_30.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn30/display_mode_vba_30.c b/drivers/gpu/drm/amd/display/dc/dml/dcn30/display_mode_vba_30.c
+index e3d9f1decdfc..518672a2450f 100644
+--- a/drivers/gpu/drm/amd/display/dc/dml/dcn30/display_mode_vba_30.c
++++ b/drivers/gpu/drm/amd/display/dc/dml/dcn30/display_mode_vba_30.c
+@@ -6658,8 +6658,7 @@ static double CalculateUrgentLatency(
+       return ret;
+ }
+-
+-static void UseMinimumDCFCLK(
++static noinline_for_stack void UseMinimumDCFCLK(
+               struct display_mode_lib *mode_lib,
+               int MaxInterDCNTileRepeaters,
+               int MaxPrefetchMode,
+-- 
+2.35.1
+
diff --git a/queue-5.15/drm-amd-display-reduce-number-of-arguments-of-dml31-.patch b/queue-5.15/drm-amd-display-reduce-number-of-arguments-of-dml31-.patch
new file mode 100644 (file)
index 0000000..c5359de
--- /dev/null
@@ -0,0 +1,512 @@
+From 48f75c49ebceeb59d6f55425e13d79af5efb4165 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 30 Aug 2022 13:34:07 -0700
+Subject: drm/amd/display: Reduce number of arguments of dml31's
+ CalculateWatermarksAndDRAMSpeedChangeSupport()
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Nathan Chancellor <nathan@kernel.org>
+
+[ Upstream commit 37934d4118e22bceb80141804391975078f31734 ]
+
+Most of the arguments are identical between the two call sites and they
+can be accessed through the 'struct vba_vars_st' pointer. This reduces
+the total amount of stack space that
+dml31_ModeSupportAndSystemConfigurationFull() uses by 240 bytes with
+LLVM 16 (2216 -> 1976), helping clear up the following clang warning:
+
+  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn31/display_mode_vba_31.c:3908:6: error: stack frame size (2216) exceeds limit (2048) in 'dml31_ModeSupportAndSystemConfigurationFull' [-Werror,-Wframe-larger-than]
+  void dml31_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_lib)
+      ^
+  1 error generated.
+
+Link: https://github.com/ClangBuiltLinux/linux/issues/1681
+Reported-by: "Sudip Mukherjee (Codethink)" <sudipm.mukherjee@gmail.com>
+Tested-by: Maíra Canal <mairacanal@riseup.net>
+Reviewed-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
+Signed-off-by: Nathan Chancellor <nathan@kernel.org>
+Signed-off-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../dc/dml/dcn31/display_mode_vba_31.c        | 248 ++++--------------
+ 1 file changed, 52 insertions(+), 196 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn31/display_mode_vba_31.c b/drivers/gpu/drm/amd/display/dc/dml/dcn31/display_mode_vba_31.c
+index d58925cff420..a6ce22d23b26 100644
+--- a/drivers/gpu/drm/amd/display/dc/dml/dcn31/display_mode_vba_31.c
++++ b/drivers/gpu/drm/amd/display/dc/dml/dcn31/display_mode_vba_31.c
+@@ -319,64 +319,28 @@ static void CalculateVupdateAndDynamicMetadataParameters(
+ static void CalculateWatermarksAndDRAMSpeedChangeSupport(
+               struct display_mode_lib *mode_lib,
+               unsigned int PrefetchMode,
+-              unsigned int NumberOfActivePlanes,
+-              unsigned int MaxLineBufferLines,
+-              unsigned int LineBufferSize,
+-              unsigned int WritebackInterfaceBufferSize,
+               double DCFCLK,
+               double ReturnBW,
+-              bool SynchronizedVBlank,
+-              unsigned int dpte_group_bytes[],
+-              unsigned int MetaChunkSize,
+               double UrgentLatency,
+               double ExtraLatency,
+-              double WritebackLatency,
+-              double WritebackChunkSize,
+               double SOCCLK,
+-              double DRAMClockChangeLatency,
+-              double SRExitTime,
+-              double SREnterPlusExitTime,
+-              double SRExitZ8Time,
+-              double SREnterPlusExitZ8Time,
+               double DCFCLKDeepSleep,
+               unsigned int DETBufferSizeY[],
+               unsigned int DETBufferSizeC[],
+               unsigned int SwathHeightY[],
+               unsigned int SwathHeightC[],
+-              unsigned int LBBitPerPixel[],
+               double SwathWidthY[],
+               double SwathWidthC[],
+-              double HRatio[],
+-              double HRatioChroma[],
+-              unsigned int vtaps[],
+-              unsigned int VTAPsChroma[],
+-              double VRatio[],
+-              double VRatioChroma[],
+-              unsigned int HTotal[],
+-              double PixelClock[],
+-              unsigned int BlendingAndTiming[],
+               unsigned int DPPPerPlane[],
+               double BytePerPixelDETY[],
+               double BytePerPixelDETC[],
+-              double DSTXAfterScaler[],
+-              double DSTYAfterScaler[],
+-              bool WritebackEnable[],
+-              enum source_format_class WritebackPixelFormat[],
+-              double WritebackDestinationWidth[],
+-              double WritebackDestinationHeight[],
+-              double WritebackSourceHeight[],
+               bool UnboundedRequestEnabled,
+               int unsigned CompressedBufferSizeInkByte,
+               enum clock_change_support *DRAMClockChangeSupport,
+-              double *UrgentWatermark,
+-              double *WritebackUrgentWatermark,
+-              double *DRAMClockChangeWatermark,
+-              double *WritebackDRAMClockChangeWatermark,
+               double *StutterExitWatermark,
+               double *StutterEnterPlusExitWatermark,
+               double *Z8StutterExitWatermark,
+-              double *Z8StutterEnterPlusExitWatermark,
+-              double *MinActiveDRAMClockChangeLatencySupported);
++              double *Z8StutterEnterPlusExitWatermark);
+ static void CalculateDCFCLKDeepSleep(
+               struct display_mode_lib *mode_lib,
+@@ -3072,64 +3036,28 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
+               CalculateWatermarksAndDRAMSpeedChangeSupport(
+                               mode_lib,
+                               PrefetchMode,
+-                              v->NumberOfActivePlanes,
+-                              v->MaxLineBufferLines,
+-                              v->LineBufferSize,
+-                              v->WritebackInterfaceBufferSize,
+                               v->DCFCLK,
+                               v->ReturnBW,
+-                              v->SynchronizedVBlank,
+-                              v->dpte_group_bytes,
+-                              v->MetaChunkSize,
+                               v->UrgentLatency,
+                               v->UrgentExtraLatency,
+-                              v->WritebackLatency,
+-                              v->WritebackChunkSize,
+                               v->SOCCLK,
+-                              v->DRAMClockChangeLatency,
+-                              v->SRExitTime,
+-                              v->SREnterPlusExitTime,
+-                              v->SRExitZ8Time,
+-                              v->SREnterPlusExitZ8Time,
+                               v->DCFCLKDeepSleep,
+                               v->DETBufferSizeY,
+                               v->DETBufferSizeC,
+                               v->SwathHeightY,
+                               v->SwathHeightC,
+-                              v->LBBitPerPixel,
+                               v->SwathWidthY,
+                               v->SwathWidthC,
+-                              v->HRatio,
+-                              v->HRatioChroma,
+-                              v->vtaps,
+-                              v->VTAPsChroma,
+-                              v->VRatio,
+-                              v->VRatioChroma,
+-                              v->HTotal,
+-                              v->PixelClock,
+-                              v->BlendingAndTiming,
+                               v->DPPPerPlane,
+                               v->BytePerPixelDETY,
+                               v->BytePerPixelDETC,
+-                              v->DSTXAfterScaler,
+-                              v->DSTYAfterScaler,
+-                              v->WritebackEnable,
+-                              v->WritebackPixelFormat,
+-                              v->WritebackDestinationWidth,
+-                              v->WritebackDestinationHeight,
+-                              v->WritebackSourceHeight,
+                               v->UnboundedRequestEnabled,
+                               v->CompressedBufferSizeInkByte,
+                               &DRAMClockChangeSupport,
+-                              &v->UrgentWatermark,
+-                              &v->WritebackUrgentWatermark,
+-                              &v->DRAMClockChangeWatermark,
+-                              &v->WritebackDRAMClockChangeWatermark,
+                               &v->StutterExitWatermark,
+                               &v->StutterEnterPlusExitWatermark,
+                               &v->Z8StutterExitWatermark,
+-                              &v->Z8StutterEnterPlusExitWatermark,
+-                              &v->MinActiveDRAMClockChangeLatencySupported);
++                              &v->Z8StutterEnterPlusExitWatermark);
+               for (k = 0; k < v->NumberOfActivePlanes; ++k) {
+                       if (v->WritebackEnable[k] == true) {
+@@ -5561,64 +5489,28 @@ void dml31_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
+                       CalculateWatermarksAndDRAMSpeedChangeSupport(
+                                       mode_lib,
+                                       v->PrefetchModePerState[i][j],
+-                                      v->NumberOfActivePlanes,
+-                                      v->MaxLineBufferLines,
+-                                      v->LineBufferSize,
+-                                      v->WritebackInterfaceBufferSize,
+                                       v->DCFCLKState[i][j],
+                                       v->ReturnBWPerState[i][j],
+-                                      v->SynchronizedVBlank,
+-                                      v->dpte_group_bytes,
+-                                      v->MetaChunkSize,
+                                       v->UrgLatency[i],
+                                       v->ExtraLatency,
+-                                      v->WritebackLatency,
+-                                      v->WritebackChunkSize,
+                                       v->SOCCLKPerState[i],
+-                                      v->DRAMClockChangeLatency,
+-                                      v->SRExitTime,
+-                                      v->SREnterPlusExitTime,
+-                                      v->SRExitZ8Time,
+-                                      v->SREnterPlusExitZ8Time,
+                                       v->ProjectedDCFCLKDeepSleep[i][j],
+                                       v->DETBufferSizeYThisState,
+                                       v->DETBufferSizeCThisState,
+                                       v->SwathHeightYThisState,
+                                       v->SwathHeightCThisState,
+-                                      v->LBBitPerPixel,
+                                       v->SwathWidthYThisState,
+                                       v->SwathWidthCThisState,
+-                                      v->HRatio,
+-                                      v->HRatioChroma,
+-                                      v->vtaps,
+-                                      v->VTAPsChroma,
+-                                      v->VRatio,
+-                                      v->VRatioChroma,
+-                                      v->HTotal,
+-                                      v->PixelClock,
+-                                      v->BlendingAndTiming,
+                                       v->NoOfDPPThisState,
+                                       v->BytePerPixelInDETY,
+                                       v->BytePerPixelInDETC,
+-                                      v->DSTXAfterScaler,
+-                                      v->DSTYAfterScaler,
+-                                      v->WritebackEnable,
+-                                      v->WritebackPixelFormat,
+-                                      v->WritebackDestinationWidth,
+-                                      v->WritebackDestinationHeight,
+-                                      v->WritebackSourceHeight,
+                                       UnboundedRequestEnabledThisState,
+                                       CompressedBufferSizeInkByteThisState,
+                                       &v->DRAMClockChangeSupport[i][j],
+-                                      &v->UrgentWatermark,
+-                                      &v->WritebackUrgentWatermark,
+-                                      &v->DRAMClockChangeWatermark,
+-                                      &v->WritebackDRAMClockChangeWatermark,
+-                                      &dummy,
+                                       &dummy,
+                                       &dummy,
+                                       &dummy,
+-                                      &v->MinActiveDRAMClockChangeLatencySupported);
++                                      &dummy);
+               }
+       }
+@@ -5743,64 +5635,28 @@ void dml31_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
+ static void CalculateWatermarksAndDRAMSpeedChangeSupport(
+               struct display_mode_lib *mode_lib,
+               unsigned int PrefetchMode,
+-              unsigned int NumberOfActivePlanes,
+-              unsigned int MaxLineBufferLines,
+-              unsigned int LineBufferSize,
+-              unsigned int WritebackInterfaceBufferSize,
+               double DCFCLK,
+               double ReturnBW,
+-              bool SynchronizedVBlank,
+-              unsigned int dpte_group_bytes[],
+-              unsigned int MetaChunkSize,
+               double UrgentLatency,
+               double ExtraLatency,
+-              double WritebackLatency,
+-              double WritebackChunkSize,
+               double SOCCLK,
+-              double DRAMClockChangeLatency,
+-              double SRExitTime,
+-              double SREnterPlusExitTime,
+-              double SRExitZ8Time,
+-              double SREnterPlusExitZ8Time,
+               double DCFCLKDeepSleep,
+               unsigned int DETBufferSizeY[],
+               unsigned int DETBufferSizeC[],
+               unsigned int SwathHeightY[],
+               unsigned int SwathHeightC[],
+-              unsigned int LBBitPerPixel[],
+               double SwathWidthY[],
+               double SwathWidthC[],
+-              double HRatio[],
+-              double HRatioChroma[],
+-              unsigned int vtaps[],
+-              unsigned int VTAPsChroma[],
+-              double VRatio[],
+-              double VRatioChroma[],
+-              unsigned int HTotal[],
+-              double PixelClock[],
+-              unsigned int BlendingAndTiming[],
+               unsigned int DPPPerPlane[],
+               double BytePerPixelDETY[],
+               double BytePerPixelDETC[],
+-              double DSTXAfterScaler[],
+-              double DSTYAfterScaler[],
+-              bool WritebackEnable[],
+-              enum source_format_class WritebackPixelFormat[],
+-              double WritebackDestinationWidth[],
+-              double WritebackDestinationHeight[],
+-              double WritebackSourceHeight[],
+               bool UnboundedRequestEnabled,
+               int unsigned CompressedBufferSizeInkByte,
+               enum clock_change_support *DRAMClockChangeSupport,
+-              double *UrgentWatermark,
+-              double *WritebackUrgentWatermark,
+-              double *DRAMClockChangeWatermark,
+-              double *WritebackDRAMClockChangeWatermark,
+               double *StutterExitWatermark,
+               double *StutterEnterPlusExitWatermark,
+               double *Z8StutterExitWatermark,
+-              double *Z8StutterEnterPlusExitWatermark,
+-              double *MinActiveDRAMClockChangeLatencySupported)
++              double *Z8StutterEnterPlusExitWatermark)
+ {
+       struct vba_vars_st *v = &mode_lib->vba;
+       double EffectiveLBLatencyHidingY;
+@@ -5820,103 +5676,103 @@ static void CalculateWatermarksAndDRAMSpeedChangeSupport(
+       double TotalPixelBW = 0.0;
+       int k, j;
+-      *UrgentWatermark = UrgentLatency + ExtraLatency;
++      v->UrgentWatermark = UrgentLatency + ExtraLatency;
+ #ifdef __DML_VBA_DEBUG__
+       dml_print("DML::%s: UrgentLatency = %f\n", __func__, UrgentLatency);
+       dml_print("DML::%s: ExtraLatency = %f\n", __func__, ExtraLatency);
+-      dml_print("DML::%s: UrgentWatermark = %f\n", __func__, *UrgentWatermark);
++      dml_print("DML::%s: UrgentWatermark = %f\n", __func__, v->UrgentWatermark);
+ #endif
+-      *DRAMClockChangeWatermark = DRAMClockChangeLatency + *UrgentWatermark;
++      v->DRAMClockChangeWatermark = v->DRAMClockChangeLatency + v->UrgentWatermark;
+ #ifdef __DML_VBA_DEBUG__
+-      dml_print("DML::%s: DRAMClockChangeLatency = %f\n", __func__, DRAMClockChangeLatency);
+-      dml_print("DML::%s: DRAMClockChangeWatermark = %f\n", __func__, *DRAMClockChangeWatermark);
++      dml_print("DML::%s: v->DRAMClockChangeLatency = %f\n", __func__, v->DRAMClockChangeLatency);
++      dml_print("DML::%s: DRAMClockChangeWatermark = %f\n", __func__, v->DRAMClockChangeWatermark);
+ #endif
+       v->TotalActiveWriteback = 0;
+-      for (k = 0; k < NumberOfActivePlanes; ++k) {
+-              if (WritebackEnable[k] == true) {
++      for (k = 0; k < v->NumberOfActivePlanes; ++k) {
++              if (v->WritebackEnable[k] == true) {
+                       v->TotalActiveWriteback = v->TotalActiveWriteback + 1;
+               }
+       }
+       if (v->TotalActiveWriteback <= 1) {
+-              *WritebackUrgentWatermark = WritebackLatency;
++              v->WritebackUrgentWatermark = v->WritebackLatency;
+       } else {
+-              *WritebackUrgentWatermark = WritebackLatency + WritebackChunkSize * 1024.0 / 32.0 / SOCCLK;
++              v->WritebackUrgentWatermark = v->WritebackLatency + v->WritebackChunkSize * 1024.0 / 32.0 / SOCCLK;
+       }
+       if (v->TotalActiveWriteback <= 1) {
+-              *WritebackDRAMClockChangeWatermark = DRAMClockChangeLatency + WritebackLatency;
++              v->WritebackDRAMClockChangeWatermark = v->DRAMClockChangeLatency + v->WritebackLatency;
+       } else {
+-              *WritebackDRAMClockChangeWatermark = DRAMClockChangeLatency + WritebackLatency + WritebackChunkSize * 1024.0 / 32.0 / SOCCLK;
++              v->WritebackDRAMClockChangeWatermark = v->DRAMClockChangeLatency + v->WritebackLatency + v->WritebackChunkSize * 1024.0 / 32.0 / SOCCLK;
+       }
+-      for (k = 0; k < NumberOfActivePlanes; ++k) {
++      for (k = 0; k < v->NumberOfActivePlanes; ++k) {
+               TotalPixelBW = TotalPixelBW
+-                              + DPPPerPlane[k] * (SwathWidthY[k] * BytePerPixelDETY[k] * VRatio[k] + SwathWidthC[k] * BytePerPixelDETC[k] * VRatioChroma[k])
+-                                              / (HTotal[k] / PixelClock[k]);
++                              + DPPPerPlane[k] * (SwathWidthY[k] * BytePerPixelDETY[k] * v->VRatio[k] + SwathWidthC[k] * BytePerPixelDETC[k] * v->VRatioChroma[k])
++                                              / (v->HTotal[k] / v->PixelClock[k]);
+       }
+-      for (k = 0; k < NumberOfActivePlanes; ++k) {
++      for (k = 0; k < v->NumberOfActivePlanes; ++k) {
+               double EffectiveDETBufferSizeY = DETBufferSizeY[k];
+               v->LBLatencyHidingSourceLinesY = dml_min(
+-                              (double) MaxLineBufferLines,
+-                              dml_floor(LineBufferSize / LBBitPerPixel[k] / (SwathWidthY[k] / dml_max(HRatio[k], 1.0)), 1)) - (vtaps[k] - 1);
++                              (double) v->MaxLineBufferLines,
++                              dml_floor(v->LineBufferSize / v->LBBitPerPixel[k] / (SwathWidthY[k] / dml_max(v->HRatio[k], 1.0)), 1)) - (v->vtaps[k] - 1);
+               v->LBLatencyHidingSourceLinesC = dml_min(
+-                              (double) MaxLineBufferLines,
+-                              dml_floor(LineBufferSize / LBBitPerPixel[k] / (SwathWidthC[k] / dml_max(HRatioChroma[k], 1.0)), 1)) - (VTAPsChroma[k] - 1);
++                              (double) v->MaxLineBufferLines,
++                              dml_floor(v->LineBufferSize / v->LBBitPerPixel[k] / (SwathWidthC[k] / dml_max(v->HRatioChroma[k], 1.0)), 1)) - (v->VTAPsChroma[k] - 1);
+-              EffectiveLBLatencyHidingY = v->LBLatencyHidingSourceLinesY / VRatio[k] * (HTotal[k] / PixelClock[k]);
++              EffectiveLBLatencyHidingY = v->LBLatencyHidingSourceLinesY / v->VRatio[k] * (v->HTotal[k] / v->PixelClock[k]);
+-              EffectiveLBLatencyHidingC = v->LBLatencyHidingSourceLinesC / VRatioChroma[k] * (HTotal[k] / PixelClock[k]);
++              EffectiveLBLatencyHidingC = v->LBLatencyHidingSourceLinesC / v->VRatioChroma[k] * (v->HTotal[k] / v->PixelClock[k]);
+               if (UnboundedRequestEnabled) {
+                       EffectiveDETBufferSizeY = EffectiveDETBufferSizeY
+-                                      + CompressedBufferSizeInkByte * 1024 * SwathWidthY[k] * BytePerPixelDETY[k] * VRatio[k] / (HTotal[k] / PixelClock[k]) / TotalPixelBW;
++                                      + CompressedBufferSizeInkByte * 1024 * SwathWidthY[k] * BytePerPixelDETY[k] * v->VRatio[k] / (v->HTotal[k] / v->PixelClock[k]) / TotalPixelBW;
+               }
+               LinesInDETY[k] = (double) EffectiveDETBufferSizeY / BytePerPixelDETY[k] / SwathWidthY[k];
+               LinesInDETYRoundedDownToSwath[k] = dml_floor(LinesInDETY[k], SwathHeightY[k]);
+-              FullDETBufferingTimeY = LinesInDETYRoundedDownToSwath[k] * (HTotal[k] / PixelClock[k]) / VRatio[k];
++              FullDETBufferingTimeY = LinesInDETYRoundedDownToSwath[k] * (v->HTotal[k] / v->PixelClock[k]) / v->VRatio[k];
+               if (BytePerPixelDETC[k] > 0) {
+                       LinesInDETC = v->DETBufferSizeC[k] / BytePerPixelDETC[k] / SwathWidthC[k];
+                       LinesInDETCRoundedDownToSwath = dml_floor(LinesInDETC, SwathHeightC[k]);
+-                      FullDETBufferingTimeC = LinesInDETCRoundedDownToSwath * (HTotal[k] / PixelClock[k]) / VRatioChroma[k];
++                      FullDETBufferingTimeC = LinesInDETCRoundedDownToSwath * (v->HTotal[k] / v->PixelClock[k]) / v->VRatioChroma[k];
+               } else {
+                       LinesInDETC = 0;
+                       FullDETBufferingTimeC = 999999;
+               }
+               ActiveDRAMClockChangeLatencyMarginY = EffectiveLBLatencyHidingY + FullDETBufferingTimeY
+-                              - ((double) DSTXAfterScaler[k] / HTotal[k] + DSTYAfterScaler[k]) * HTotal[k] / PixelClock[k] - *UrgentWatermark - *DRAMClockChangeWatermark;
++                              - ((double) v->DSTXAfterScaler[k] / v->HTotal[k] + v->DSTYAfterScaler[k]) * v->HTotal[k] / v->PixelClock[k] - v->UrgentWatermark - v->DRAMClockChangeWatermark;
+-              if (NumberOfActivePlanes > 1) {
++              if (v->NumberOfActivePlanes > 1) {
+                       ActiveDRAMClockChangeLatencyMarginY = ActiveDRAMClockChangeLatencyMarginY
+-                                      - (1 - 1.0 / NumberOfActivePlanes) * SwathHeightY[k] * HTotal[k] / PixelClock[k] / VRatio[k];
++                                      - (1 - 1.0 / v->NumberOfActivePlanes) * SwathHeightY[k] * v->HTotal[k] / v->PixelClock[k] / v->VRatio[k];
+               }
+               if (BytePerPixelDETC[k] > 0) {
+                       ActiveDRAMClockChangeLatencyMarginC = EffectiveLBLatencyHidingC + FullDETBufferingTimeC
+-                                      - ((double) DSTXAfterScaler[k] / HTotal[k] + DSTYAfterScaler[k]) * HTotal[k] / PixelClock[k] - *UrgentWatermark - *DRAMClockChangeWatermark;
++                                      - ((double) v->DSTXAfterScaler[k] / v->HTotal[k] + v->DSTYAfterScaler[k]) * v->HTotal[k] / v->PixelClock[k] - v->UrgentWatermark - v->DRAMClockChangeWatermark;
+-                      if (NumberOfActivePlanes > 1) {
++                      if (v->NumberOfActivePlanes > 1) {
+                               ActiveDRAMClockChangeLatencyMarginC = ActiveDRAMClockChangeLatencyMarginC
+-                                              - (1 - 1.0 / NumberOfActivePlanes) * SwathHeightC[k] * HTotal[k] / PixelClock[k] / VRatioChroma[k];
++                                              - (1 - 1.0 / v->NumberOfActivePlanes) * SwathHeightC[k] * v->HTotal[k] / v->PixelClock[k] / v->VRatioChroma[k];
+                       }
+                       v->ActiveDRAMClockChangeLatencyMargin[k] = dml_min(ActiveDRAMClockChangeLatencyMarginY, ActiveDRAMClockChangeLatencyMarginC);
+               } else {
+                       v->ActiveDRAMClockChangeLatencyMargin[k] = ActiveDRAMClockChangeLatencyMarginY;
+               }
+-              if (WritebackEnable[k] == true) {
+-                      WritebackDRAMClockChangeLatencyHiding = WritebackInterfaceBufferSize * 1024
+-                                      / (WritebackDestinationWidth[k] * WritebackDestinationHeight[k] / (WritebackSourceHeight[k] * HTotal[k] / PixelClock[k]) * 4);
+-                      if (WritebackPixelFormat[k] == dm_444_64) {
++              if (v->WritebackEnable[k] == true) {
++                      WritebackDRAMClockChangeLatencyHiding = v->WritebackInterfaceBufferSize * 1024
++                                      / (v->WritebackDestinationWidth[k] * v->WritebackDestinationHeight[k] / (v->WritebackSourceHeight[k] * v->HTotal[k] / v->PixelClock[k]) * 4);
++                      if (v->WritebackPixelFormat[k] == dm_444_64) {
+                               WritebackDRAMClockChangeLatencyHiding = WritebackDRAMClockChangeLatencyHiding / 2;
+                       }
+                       WritebackDRAMClockChangeLatencyMargin = WritebackDRAMClockChangeLatencyHiding - v->WritebackDRAMClockChangeWatermark;
+@@ -5926,14 +5782,14 @@ static void CalculateWatermarksAndDRAMSpeedChangeSupport(
+       v->MinActiveDRAMClockChangeMargin = 999999;
+       PlaneWithMinActiveDRAMClockChangeMargin = 0;
+-      for (k = 0; k < NumberOfActivePlanes; ++k) {
++      for (k = 0; k < v->NumberOfActivePlanes; ++k) {
+               if (v->ActiveDRAMClockChangeLatencyMargin[k] < v->MinActiveDRAMClockChangeMargin) {
+                       v->MinActiveDRAMClockChangeMargin = v->ActiveDRAMClockChangeLatencyMargin[k];
+-                      if (BlendingAndTiming[k] == k) {
++                      if (v->BlendingAndTiming[k] == k) {
+                               PlaneWithMinActiveDRAMClockChangeMargin = k;
+                       } else {
+-                              for (j = 0; j < NumberOfActivePlanes; ++j) {
+-                                      if (BlendingAndTiming[k] == j) {
++                              for (j = 0; j < v->NumberOfActivePlanes; ++j) {
++                                      if (v->BlendingAndTiming[k] == j) {
+                                               PlaneWithMinActiveDRAMClockChangeMargin = j;
+                                       }
+                               }
+@@ -5941,11 +5797,11 @@ static void CalculateWatermarksAndDRAMSpeedChangeSupport(
+               }
+       }
+-      *MinActiveDRAMClockChangeLatencySupported = v->MinActiveDRAMClockChangeMargin + DRAMClockChangeLatency;
++      v->MinActiveDRAMClockChangeLatencySupported = v->MinActiveDRAMClockChangeMargin + v->DRAMClockChangeLatency ;
+       SecondMinActiveDRAMClockChangeMarginOneDisplayInVBLank = 999999;
+-      for (k = 0; k < NumberOfActivePlanes; ++k) {
+-              if (!((k == PlaneWithMinActiveDRAMClockChangeMargin) && (BlendingAndTiming[k] == k)) && !(BlendingAndTiming[k] == PlaneWithMinActiveDRAMClockChangeMargin)
++      for (k = 0; k < v->NumberOfActivePlanes; ++k) {
++              if (!((k == PlaneWithMinActiveDRAMClockChangeMargin) && (v->BlendingAndTiming[k] == k)) && !(v->BlendingAndTiming[k] == PlaneWithMinActiveDRAMClockChangeMargin)
+                               && v->ActiveDRAMClockChangeLatencyMargin[k] < SecondMinActiveDRAMClockChangeMarginOneDisplayInVBLank) {
+                       SecondMinActiveDRAMClockChangeMarginOneDisplayInVBLank = v->ActiveDRAMClockChangeLatencyMargin[k];
+               }
+@@ -5953,25 +5809,25 @@ static void CalculateWatermarksAndDRAMSpeedChangeSupport(
+       v->TotalNumberOfActiveOTG = 0;
+-      for (k = 0; k < NumberOfActivePlanes; ++k) {
+-              if (BlendingAndTiming[k] == k) {
++      for (k = 0; k < v->NumberOfActivePlanes; ++k) {
++              if (v->BlendingAndTiming[k] == k) {
+                       v->TotalNumberOfActiveOTG = v->TotalNumberOfActiveOTG + 1;
+               }
+       }
+       if (v->MinActiveDRAMClockChangeMargin > 0 && PrefetchMode == 0) {
+               *DRAMClockChangeSupport = dm_dram_clock_change_vactive;
+-      } else if ((SynchronizedVBlank == true || v->TotalNumberOfActiveOTG == 1
++      } else if ((v->SynchronizedVBlank == true || v->TotalNumberOfActiveOTG == 1
+                       || SecondMinActiveDRAMClockChangeMarginOneDisplayInVBLank > 0) && PrefetchMode == 0) {
+               *DRAMClockChangeSupport = dm_dram_clock_change_vblank;
+       } else {
+               *DRAMClockChangeSupport = dm_dram_clock_change_unsupported;
+       }
+-      *StutterExitWatermark = SRExitTime + ExtraLatency + 10 / DCFCLKDeepSleep;
+-      *StutterEnterPlusExitWatermark = (SREnterPlusExitTime + ExtraLatency + 10 / DCFCLKDeepSleep);
+-      *Z8StutterExitWatermark = SRExitZ8Time + ExtraLatency + 10 / DCFCLKDeepSleep;
+-      *Z8StutterEnterPlusExitWatermark = SREnterPlusExitZ8Time + ExtraLatency + 10 / DCFCLKDeepSleep;
++      *StutterExitWatermark = v->SRExitTime + ExtraLatency + 10 / DCFCLKDeepSleep;
++      *StutterEnterPlusExitWatermark = (v->SREnterPlusExitTime + ExtraLatency + 10 / DCFCLKDeepSleep);
++      *Z8StutterExitWatermark = v->SRExitZ8Time + ExtraLatency + 10 / DCFCLKDeepSleep;
++      *Z8StutterEnterPlusExitWatermark = v->SREnterPlusExitZ8Time + ExtraLatency + 10 / DCFCLKDeepSleep;
+ #ifdef __DML_VBA_DEBUG__
+       dml_print("DML::%s: StutterExitWatermark = %f\n", __func__, *StutterExitWatermark);
+-- 
+2.35.1
+
diff --git a/queue-5.15/drm-amd-display-reduce-number-of-arguments-of-dml31-.patch-4999 b/queue-5.15/drm-amd-display-reduce-number-of-arguments-of-dml31-.patch-4999
new file mode 100644 (file)
index 0000000..dc2aea4
--- /dev/null
@@ -0,0 +1,309 @@
+From f14b86f8208db84cc77f686753d4c14b3eb85648 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 30 Aug 2022 13:34:08 -0700
+Subject: drm/amd/display: Reduce number of arguments of dml31's
+ CalculateFlipSchedule()
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Nathan Chancellor <nathan@kernel.org>
+
+[ Upstream commit 21485d3da659b66c37d99071623af83ee1c6733d ]
+
+Most of the arguments are identical between the two call sites and they
+can be accessed through the 'struct vba_vars_st' pointer. This reduces
+the total amount of stack space that
+dml31_ModeSupportAndSystemConfigurationFull() uses by 112 bytes with
+LLVM 16 (1976 -> 1864), helping clear up the following clang warning:
+
+  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn31/display_mode_vba_31.c:3908:6: error: stack frame size (2216) exceeds limit (2048) in 'dml31_ModeSupportAndSystemConfigurationFull' [-Werror,-Wframe-larger-than]
+  void dml31_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_lib)
+      ^
+  1 error generated.
+
+Link: https://github.com/ClangBuiltLinux/linux/issues/1681
+Reported-by: "Sudip Mukherjee (Codethink)" <sudipm.mukherjee@gmail.com>
+Tested-by: Maíra Canal <mairacanal@riseup.net>
+Reviewed-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
+Signed-off-by: Nathan Chancellor <nathan@kernel.org>
+Signed-off-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../dc/dml/dcn31/display_mode_vba_31.c        | 172 +++++-------------
+ 1 file changed, 47 insertions(+), 125 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn31/display_mode_vba_31.c b/drivers/gpu/drm/amd/display/dc/dml/dcn31/display_mode_vba_31.c
+index a6ce22d23b26..aa0507e01792 100644
+--- a/drivers/gpu/drm/amd/display/dc/dml/dcn31/display_mode_vba_31.c
++++ b/drivers/gpu/drm/amd/display/dc/dml/dcn31/display_mode_vba_31.c
+@@ -259,33 +259,13 @@ static void CalculateRowBandwidth(
+ static void CalculateFlipSchedule(
+               struct display_mode_lib *mode_lib,
++              unsigned int k,
+               double HostVMInefficiencyFactor,
+               double UrgentExtraLatency,
+               double UrgentLatency,
+-              unsigned int GPUVMMaxPageTableLevels,
+-              bool HostVMEnable,
+-              unsigned int HostVMMaxNonCachedPageTableLevels,
+-              bool GPUVMEnable,
+-              double HostVMMinPageSize,
+               double PDEAndMetaPTEBytesPerFrame,
+               double MetaRowBytes,
+-              double DPTEBytesPerRow,
+-              double BandwidthAvailableForImmediateFlip,
+-              unsigned int TotImmediateFlipBytes,
+-              enum source_format_class SourcePixelFormat,
+-              double LineTime,
+-              double VRatio,
+-              double VRatioChroma,
+-              double Tno_bw,
+-              bool DCCEnable,
+-              unsigned int dpte_row_height,
+-              unsigned int meta_row_height,
+-              unsigned int dpte_row_height_chroma,
+-              unsigned int meta_row_height_chroma,
+-              double *DestinationLinesToRequestVMInImmediateFlip,
+-              double *DestinationLinesToRequestRowInImmediateFlip,
+-              double *final_flip_bw,
+-              bool *ImmediateFlipSupportedForPipe);
++              double DPTEBytesPerRow);
+ static double CalculateWriteBackDelay(
+               enum source_format_class WritebackPixelFormat,
+               double WritebackHRatio,
+@@ -2923,33 +2903,13 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
+                       for (k = 0; k < v->NumberOfActivePlanes; ++k) {
+                               CalculateFlipSchedule(
+                                               mode_lib,
++                                              k,
+                                               HostVMInefficiencyFactor,
+                                               v->UrgentExtraLatency,
+                                               v->UrgentLatency,
+-                                              v->GPUVMMaxPageTableLevels,
+-                                              v->HostVMEnable,
+-                                              v->HostVMMaxNonCachedPageTableLevels,
+-                                              v->GPUVMEnable,
+-                                              v->HostVMMinPageSize,
+                                               v->PDEAndMetaPTEBytesFrame[k],
+                                               v->MetaRowByte[k],
+-                                              v->PixelPTEBytesPerRow[k],
+-                                              v->BandwidthAvailableForImmediateFlip,
+-                                              v->TotImmediateFlipBytes,
+-                                              v->SourcePixelFormat[k],
+-                                              v->HTotal[k] / v->PixelClock[k],
+-                                              v->VRatio[k],
+-                                              v->VRatioChroma[k],
+-                                              v->Tno_bw[k],
+-                                              v->DCCEnable[k],
+-                                              v->dpte_row_height[k],
+-                                              v->meta_row_height[k],
+-                                              v->dpte_row_height_chroma[k],
+-                                              v->meta_row_height_chroma[k],
+-                                              &v->DestinationLinesToRequestVMInImmediateFlip[k],
+-                                              &v->DestinationLinesToRequestRowInImmediateFlip[k],
+-                                              &v->final_flip_bw[k],
+-                                              &v->ImmediateFlipSupportedForPipe[k]);
++                                              v->PixelPTEBytesPerRow[k]);
+                       }
+                       v->total_dcn_read_bw_with_flip = 0.0;
+@@ -3669,61 +3629,43 @@ static void CalculateRowBandwidth(
+ static void CalculateFlipSchedule(
+               struct display_mode_lib *mode_lib,
++              unsigned int k,
+               double HostVMInefficiencyFactor,
+               double UrgentExtraLatency,
+               double UrgentLatency,
+-              unsigned int GPUVMMaxPageTableLevels,
+-              bool HostVMEnable,
+-              unsigned int HostVMMaxNonCachedPageTableLevels,
+-              bool GPUVMEnable,
+-              double HostVMMinPageSize,
+               double PDEAndMetaPTEBytesPerFrame,
+               double MetaRowBytes,
+-              double DPTEBytesPerRow,
+-              double BandwidthAvailableForImmediateFlip,
+-              unsigned int TotImmediateFlipBytes,
+-              enum source_format_class SourcePixelFormat,
+-              double LineTime,
+-              double VRatio,
+-              double VRatioChroma,
+-              double Tno_bw,
+-              bool DCCEnable,
+-              unsigned int dpte_row_height,
+-              unsigned int meta_row_height,
+-              unsigned int dpte_row_height_chroma,
+-              unsigned int meta_row_height_chroma,
+-              double *DestinationLinesToRequestVMInImmediateFlip,
+-              double *DestinationLinesToRequestRowInImmediateFlip,
+-              double *final_flip_bw,
+-              bool *ImmediateFlipSupportedForPipe)
++              double DPTEBytesPerRow)
+ {
++      struct vba_vars_st *v = &mode_lib->vba;
+       double min_row_time = 0.0;
+       unsigned int HostVMDynamicLevelsTrips;
+       double TimeForFetchingMetaPTEImmediateFlip;
+       double TimeForFetchingRowInVBlankImmediateFlip;
+       double ImmediateFlipBW;
++      double LineTime = v->HTotal[k] / v->PixelClock[k];
+-      if (GPUVMEnable == true && HostVMEnable == true) {
+-              HostVMDynamicLevelsTrips = HostVMMaxNonCachedPageTableLevels;
++      if (v->GPUVMEnable == true && v->HostVMEnable == true) {
++              HostVMDynamicLevelsTrips = v->HostVMMaxNonCachedPageTableLevels;
+       } else {
+               HostVMDynamicLevelsTrips = 0;
+       }
+-      if (GPUVMEnable == true || DCCEnable == true) {
+-              ImmediateFlipBW = (PDEAndMetaPTEBytesPerFrame + MetaRowBytes + DPTEBytesPerRow) * BandwidthAvailableForImmediateFlip / TotImmediateFlipBytes;
++      if (v->GPUVMEnable == true || v->DCCEnable[k] == true) {
++              ImmediateFlipBW = (PDEAndMetaPTEBytesPerFrame + MetaRowBytes + DPTEBytesPerRow) * v->BandwidthAvailableForImmediateFlip / v->TotImmediateFlipBytes;
+       }
+-      if (GPUVMEnable == true) {
++      if (v->GPUVMEnable == true) {
+               TimeForFetchingMetaPTEImmediateFlip = dml_max3(
+-                              Tno_bw + PDEAndMetaPTEBytesPerFrame * HostVMInefficiencyFactor / ImmediateFlipBW,
+-                              UrgentExtraLatency + UrgentLatency * (GPUVMMaxPageTableLevels * (HostVMDynamicLevelsTrips + 1) - 1),
++                              v->Tno_bw[k] + PDEAndMetaPTEBytesPerFrame * HostVMInefficiencyFactor / ImmediateFlipBW,
++                              UrgentExtraLatency + UrgentLatency * (v->GPUVMMaxPageTableLevels * (HostVMDynamicLevelsTrips + 1) - 1),
+                               LineTime / 4.0);
+       } else {
+               TimeForFetchingMetaPTEImmediateFlip = 0;
+       }
+-      *DestinationLinesToRequestVMInImmediateFlip = dml_ceil(4.0 * (TimeForFetchingMetaPTEImmediateFlip / LineTime), 1) / 4.0;
+-      if ((GPUVMEnable == true || DCCEnable == true)) {
++      v->DestinationLinesToRequestVMInImmediateFlip[k] = dml_ceil(4.0 * (TimeForFetchingMetaPTEImmediateFlip / LineTime), 1) / 4.0;
++      if ((v->GPUVMEnable == true || v->DCCEnable[k] == true)) {
+               TimeForFetchingRowInVBlankImmediateFlip = dml_max3(
+                               (MetaRowBytes + DPTEBytesPerRow * HostVMInefficiencyFactor) / ImmediateFlipBW,
+                               UrgentLatency * (HostVMDynamicLevelsTrips + 1),
+@@ -3732,54 +3674,54 @@ static void CalculateFlipSchedule(
+               TimeForFetchingRowInVBlankImmediateFlip = 0;
+       }
+-      *DestinationLinesToRequestRowInImmediateFlip = dml_ceil(4.0 * (TimeForFetchingRowInVBlankImmediateFlip / LineTime), 1) / 4.0;
++      v->DestinationLinesToRequestRowInImmediateFlip[k] = dml_ceil(4.0 * (TimeForFetchingRowInVBlankImmediateFlip / LineTime), 1) / 4.0;
+-      if (GPUVMEnable == true) {
+-              *final_flip_bw = dml_max(
+-                              PDEAndMetaPTEBytesPerFrame * HostVMInefficiencyFactor / (*DestinationLinesToRequestVMInImmediateFlip * LineTime),
+-                              (MetaRowBytes + DPTEBytesPerRow * HostVMInefficiencyFactor) / (*DestinationLinesToRequestRowInImmediateFlip * LineTime));
+-      } else if ((GPUVMEnable == true || DCCEnable == true)) {
+-              *final_flip_bw = (MetaRowBytes + DPTEBytesPerRow * HostVMInefficiencyFactor) / (*DestinationLinesToRequestRowInImmediateFlip * LineTime);
++      if (v->GPUVMEnable == true) {
++              v->final_flip_bw[k] = dml_max(
++                              PDEAndMetaPTEBytesPerFrame * HostVMInefficiencyFactor / (v->DestinationLinesToRequestVMInImmediateFlip[k] * LineTime),
++                              (MetaRowBytes + DPTEBytesPerRow * HostVMInefficiencyFactor) / (v->DestinationLinesToRequestRowInImmediateFlip[k] * LineTime));
++      } else if ((v->GPUVMEnable == true || v->DCCEnable[k] == true)) {
++              v->final_flip_bw[k] = (MetaRowBytes + DPTEBytesPerRow * HostVMInefficiencyFactor) / (v->DestinationLinesToRequestRowInImmediateFlip[k] * LineTime);
+       } else {
+-              *final_flip_bw = 0;
++              v->final_flip_bw[k] = 0;
+       }
+-      if (SourcePixelFormat == dm_420_8 || SourcePixelFormat == dm_420_10 || SourcePixelFormat == dm_rgbe_alpha) {
+-              if (GPUVMEnable == true && DCCEnable != true) {
+-                      min_row_time = dml_min(dpte_row_height * LineTime / VRatio, dpte_row_height_chroma * LineTime / VRatioChroma);
+-              } else if (GPUVMEnable != true && DCCEnable == true) {
+-                      min_row_time = dml_min(meta_row_height * LineTime / VRatio, meta_row_height_chroma * LineTime / VRatioChroma);
++      if (v->SourcePixelFormat[k] == dm_420_8 || v->SourcePixelFormat[k] == dm_420_10 || v->SourcePixelFormat[k] == dm_rgbe_alpha) {
++              if (v->GPUVMEnable == true && v->DCCEnable[k] != true) {
++                      min_row_time = dml_min(v->dpte_row_height[k] * LineTime / v->VRatio[k], v->dpte_row_height_chroma[k] * LineTime / v->VRatioChroma[k]);
++              } else if (v->GPUVMEnable != true && v->DCCEnable[k] == true) {
++                      min_row_time = dml_min(v->meta_row_height[k] * LineTime / v->VRatio[k], v->meta_row_height_chroma[k] * LineTime / v->VRatioChroma[k]);
+               } else {
+                       min_row_time = dml_min4(
+-                                      dpte_row_height * LineTime / VRatio,
+-                                      meta_row_height * LineTime / VRatio,
+-                                      dpte_row_height_chroma * LineTime / VRatioChroma,
+-                                      meta_row_height_chroma * LineTime / VRatioChroma);
++                                      v->dpte_row_height[k] * LineTime / v->VRatio[k],
++                                      v->meta_row_height[k] * LineTime / v->VRatio[k],
++                                      v->dpte_row_height_chroma[k] * LineTime / v->VRatioChroma[k],
++                                      v->meta_row_height_chroma[k] * LineTime / v->VRatioChroma[k]);
+               }
+       } else {
+-              if (GPUVMEnable == true && DCCEnable != true) {
+-                      min_row_time = dpte_row_height * LineTime / VRatio;
+-              } else if (GPUVMEnable != true && DCCEnable == true) {
+-                      min_row_time = meta_row_height * LineTime / VRatio;
++              if (v->GPUVMEnable == true && v->DCCEnable[k] != true) {
++                      min_row_time = v->dpte_row_height[k] * LineTime / v->VRatio[k];
++              } else if (v->GPUVMEnable != true && v->DCCEnable[k] == true) {
++                      min_row_time = v->meta_row_height[k] * LineTime / v->VRatio[k];
+               } else {
+-                      min_row_time = dml_min(dpte_row_height * LineTime / VRatio, meta_row_height * LineTime / VRatio);
++                      min_row_time = dml_min(v->dpte_row_height[k] * LineTime / v->VRatio[k], v->meta_row_height[k] * LineTime / v->VRatio[k]);
+               }
+       }
+-      if (*DestinationLinesToRequestVMInImmediateFlip >= 32 || *DestinationLinesToRequestRowInImmediateFlip >= 16
++      if (v->DestinationLinesToRequestVMInImmediateFlip[k] >= 32 || v->DestinationLinesToRequestRowInImmediateFlip[k] >= 16
+                       || TimeForFetchingMetaPTEImmediateFlip + 2 * TimeForFetchingRowInVBlankImmediateFlip > min_row_time) {
+-              *ImmediateFlipSupportedForPipe = false;
++              v->ImmediateFlipSupportedForPipe[k] = false;
+       } else {
+-              *ImmediateFlipSupportedForPipe = true;
++              v->ImmediateFlipSupportedForPipe[k] = true;
+       }
+ #ifdef __DML_VBA_DEBUG__
+-      dml_print("DML::%s: DestinationLinesToRequestVMInImmediateFlip = %f\n", __func__, *DestinationLinesToRequestVMInImmediateFlip);
+-      dml_print("DML::%s: DestinationLinesToRequestRowInImmediateFlip = %f\n", __func__, *DestinationLinesToRequestRowInImmediateFlip);
++      dml_print("DML::%s: DestinationLinesToRequestVMInImmediateFlip = %f\n", __func__, v->DestinationLinesToRequestVMInImmediateFlip[k]);
++      dml_print("DML::%s: DestinationLinesToRequestRowInImmediateFlip = %f\n", __func__, v->DestinationLinesToRequestRowInImmediateFlip[k]);
+       dml_print("DML::%s: TimeForFetchingMetaPTEImmediateFlip = %f\n", __func__, TimeForFetchingMetaPTEImmediateFlip);
+       dml_print("DML::%s: TimeForFetchingRowInVBlankImmediateFlip = %f\n", __func__, TimeForFetchingRowInVBlankImmediateFlip);
+       dml_print("DML::%s: min_row_time = %f\n", __func__, min_row_time);
+-      dml_print("DML::%s: ImmediateFlipSupportedForPipe = %d\n", __func__, *ImmediateFlipSupportedForPipe);
++      dml_print("DML::%s: ImmediateFlipSupportedForPipe = %d\n", __func__, v->ImmediateFlipSupportedForPipe[k]);
+ #endif
+ }
+@@ -5405,33 +5347,13 @@ void dml31_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
+                                       for (k = 0; k < v->NumberOfActivePlanes; k++) {
+                                               CalculateFlipSchedule(
+                                                               mode_lib,
++                                                              k,
+                                                               HostVMInefficiencyFactor,
+                                                               v->ExtraLatency,
+                                                               v->UrgLatency[i],
+-                                                              v->GPUVMMaxPageTableLevels,
+-                                                              v->HostVMEnable,
+-                                                              v->HostVMMaxNonCachedPageTableLevels,
+-                                                              v->GPUVMEnable,
+-                                                              v->HostVMMinPageSize,
+                                                               v->PDEAndMetaPTEBytesPerFrame[i][j][k],
+                                                               v->MetaRowBytes[i][j][k],
+-                                                              v->DPTEBytesPerRow[i][j][k],
+-                                                              v->BandwidthAvailableForImmediateFlip,
+-                                                              v->TotImmediateFlipBytes,
+-                                                              v->SourcePixelFormat[k],
+-                                                              v->HTotal[k] / v->PixelClock[k],
+-                                                              v->VRatio[k],
+-                                                              v->VRatioChroma[k],
+-                                                              v->Tno_bw[k],
+-                                                              v->DCCEnable[k],
+-                                                              v->dpte_row_height[k],
+-                                                              v->meta_row_height[k],
+-                                                              v->dpte_row_height_chroma[k],
+-                                                              v->meta_row_height_chroma[k],
+-                                                              &v->DestinationLinesToRequestVMInImmediateFlip[k],
+-                                                              &v->DestinationLinesToRequestRowInImmediateFlip[k],
+-                                                              &v->final_flip_bw[k],
+-                                                              &v->ImmediateFlipSupportedForPipe[k]);
++                                                              v->DPTEBytesPerRow[i][j][k]);
+                                       }
+                                       v->total_dcn_read_bw_with_flip = 0.0;
+                                       for (k = 0; k < v->NumberOfActivePlanes; k++) {
+-- 
+2.35.1
+
diff --git a/queue-5.15/drm-amd-pm-disable-baco-entry-exit-completely-on-sev.patch b/queue-5.15/drm-amd-pm-disable-baco-entry-exit-completely-on-sev.patch
new file mode 100644 (file)
index 0000000..25e28b4
--- /dev/null
@@ -0,0 +1,45 @@
+From 7eae22069fa6475c49c52a70d30f2ee140864614 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 7 Sep 2022 20:31:36 +0800
+Subject: drm/amd/pm: disable BACO entry/exit completely on several sienna
+ cichlid cards
+
+From: Guchun Chen <guchun.chen@amd.com>
+
+[ Upstream commit 7c6fb61a400bf3218c6504cb2d48858f98822c9d ]
+
+To avoid hardware intermittent failures.
+
+Signed-off-by: Guchun Chen <guchun.chen@amd.com>
+Reviewed-by: Lijo Lazar <lijo.lazar@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c   | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
+index 79976921dc46..c71d50e82168 100644
+--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
++++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
+@@ -358,6 +358,17 @@ static void sienna_cichlid_check_bxco_support(struct smu_context *smu)
+               smu_baco->platform_support =
+                       (val & RCC_BIF_STRAP0__STRAP_PX_CAPABLE_MASK) ? true :
+                                                                       false;
++
++              /*
++               * Disable BACO entry/exit completely on below SKUs to
++               * avoid hardware intermittent failures.
++               */
++              if (((adev->pdev->device == 0x73A1) &&
++                  (adev->pdev->revision == 0x00)) ||
++                  ((adev->pdev->device == 0x73BF) &&
++                  (adev->pdev->revision == 0xCF)))
++                      smu_baco->platform_support = false;
++
+       }
+ }
+-- 
+2.35.1
+
diff --git a/queue-5.15/drm-amdgpu-use-dirty-framebuffer-helper.patch b/queue-5.15/drm-amdgpu-use-dirty-framebuffer-helper.patch
new file mode 100644 (file)
index 0000000..9659cb9
--- /dev/null
@@ -0,0 +1,44 @@
+From b9c3a52f0ba9849282d150896c8f4757fc05174e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 6 Sep 2022 15:01:49 -0400
+Subject: drm/amdgpu: use dirty framebuffer helper
+
+From: Hamza Mahfooz <hamza.mahfooz@amd.com>
+
+[ Upstream commit 66f99628eb24409cb8feb5061f78283c8b65f820 ]
+
+Currently, we aren't handling DRM_IOCTL_MODE_DIRTYFB. So, use
+drm_atomic_helper_dirtyfb() as the dirty callback in the amdgpu_fb_funcs
+struct.
+
+Signed-off-by: Hamza Mahfooz <hamza.mahfooz@amd.com>
+Acked-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
+index 5c08047adb59..47fb722ab374 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
+@@ -35,6 +35,7 @@
+ #include <linux/pci.h>
+ #include <linux/pm_runtime.h>
+ #include <drm/drm_crtc_helper.h>
++#include <drm/drm_damage_helper.h>
+ #include <drm/drm_edid.h>
+ #include <drm/drm_gem_framebuffer_helper.h>
+ #include <drm/drm_fb_helper.h>
+@@ -490,6 +491,7 @@ bool amdgpu_display_ddc_probe(struct amdgpu_connector *amdgpu_connector,
+ static const struct drm_framebuffer_funcs amdgpu_fb_funcs = {
+       .destroy = drm_gem_fb_destroy,
+       .create_handle = drm_gem_fb_create_handle,
++      .dirty = drm_atomic_helper_dirtyfb,
+ };
+ uint32_t amdgpu_display_supported_domains(struct amdgpu_device *adev,
+-- 
+2.35.1
+
diff --git a/queue-5.15/drm-gma500-fix-bug-sleeping-function-called-from-inv.patch b/queue-5.15/drm-gma500-fix-bug-sleeping-function-called-from-inv.patch
new file mode 100644 (file)
index 0000000..775e7cb
--- /dev/null
@@ -0,0 +1,106 @@
+From 514480002f4de3e5775beb509ceef04270b58847 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 6 Sep 2022 22:38:50 +0200
+Subject: drm/gma500: Fix BUG: sleeping function called from invalid context
+ errors
+
+From: Hans de Goede <hdegoede@redhat.com>
+
+[ Upstream commit 63e37a79f7bd939314997e29c2f5a9f0ef184281 ]
+
+gma_crtc_page_flip() was holding the event_lock spinlock while calling
+crtc_funcs->mode_set_base() which takes ww_mutex.
+
+The only reason to hold event_lock is to clear gma_crtc->page_flip_event
+on mode_set_base() errors.
+
+Instead unlock it after setting gma_crtc->page_flip_event and on
+errors re-take the lock and clear gma_crtc->page_flip_event it
+it is still set.
+
+This fixes the following WARN/stacktrace:
+
+[  512.122953] BUG: sleeping function called from invalid context at kernel/locking/mutex.c:870
+[  512.123004] in_atomic(): 1, irqs_disabled(): 1, non_block: 0, pid: 1253, name: gnome-shell
+[  512.123031] preempt_count: 1, expected: 0
+[  512.123048] RCU nest depth: 0, expected: 0
+[  512.123066] INFO: lockdep is turned off.
+[  512.123080] irq event stamp: 0
+[  512.123094] hardirqs last  enabled at (0): [<0000000000000000>] 0x0
+[  512.123134] hardirqs last disabled at (0): [<ffffffff8d0ec28c>] copy_process+0x9fc/0x1de0
+[  512.123176] softirqs last  enabled at (0): [<ffffffff8d0ec28c>] copy_process+0x9fc/0x1de0
+[  512.123207] softirqs last disabled at (0): [<0000000000000000>] 0x0
+[  512.123233] Preemption disabled at:
+[  512.123241] [<0000000000000000>] 0x0
+[  512.123275] CPU: 3 PID: 1253 Comm: gnome-shell Tainted: G        W         5.19.0+ #1
+[  512.123304] Hardware name: Packard Bell dot s/SJE01_CT, BIOS V1.10 07/23/2013
+[  512.123323] Call Trace:
+[  512.123346]  <TASK>
+[  512.123370]  dump_stack_lvl+0x5b/0x77
+[  512.123412]  __might_resched.cold+0xff/0x13a
+[  512.123458]  ww_mutex_lock+0x1e/0xa0
+[  512.123495]  psb_gem_pin+0x2c/0x150 [gma500_gfx]
+[  512.123601]  gma_pipe_set_base+0x76/0x240 [gma500_gfx]
+[  512.123708]  gma_crtc_page_flip+0x95/0x130 [gma500_gfx]
+[  512.123808]  drm_mode_page_flip_ioctl+0x57d/0x5d0
+[  512.123897]  ? drm_mode_cursor2_ioctl+0x10/0x10
+[  512.123936]  drm_ioctl_kernel+0xa1/0x150
+[  512.123984]  drm_ioctl+0x21f/0x420
+[  512.124025]  ? drm_mode_cursor2_ioctl+0x10/0x10
+[  512.124070]  ? rcu_read_lock_bh_held+0xb/0x60
+[  512.124104]  ? lock_release+0x1ef/0x2d0
+[  512.124161]  __x64_sys_ioctl+0x8d/0xd0
+[  512.124203]  do_syscall_64+0x58/0x80
+[  512.124239]  ? do_syscall_64+0x67/0x80
+[  512.124267]  ? trace_hardirqs_on_prepare+0x55/0xe0
+[  512.124300]  ? do_syscall_64+0x67/0x80
+[  512.124340]  ? rcu_read_lock_sched_held+0x10/0x80
+[  512.124377]  entry_SYSCALL_64_after_hwframe+0x63/0xcd
+[  512.124411] RIP: 0033:0x7fcc4a70740f
+[  512.124442] Code: 00 48 89 44 24 18 31 c0 48 8d 44 24 60 c7 04 24 10 00 00 00 48 89 44 24 08 48 8d 44 24 20 48 89 44 24 10 b8 10 00 00 00 0f 05 <89> c2 3d 00 f0 ff ff 77 18 48 8b 44 24 18 64 48 2b 04 25 28 00 00
+[  512.124470] RSP: 002b:00007ffda73f5390 EFLAGS: 00000246 ORIG_RAX: 0000000000000010
+[  512.124503] RAX: ffffffffffffffda RBX: 000055cc9e474500 RCX: 00007fcc4a70740f
+[  512.124524] RDX: 00007ffda73f5420 RSI: 00000000c01864b0 RDI: 0000000000000009
+[  512.124544] RBP: 00007ffda73f5420 R08: 000055cc9c0b0cb0 R09: 0000000000000034
+[  512.124564] R10: 0000000000000000 R11: 0000000000000246 R12: 00000000c01864b0
+[  512.124584] R13: 0000000000000009 R14: 000055cc9df484d0 R15: 000055cc9af5d0c0
+[  512.124647]  </TASK>
+
+Signed-off-by: Hans de Goede <hdegoede@redhat.com>
+Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
+Link: https://patchwork.freedesktop.org/patch/msgid/20220906203852.527663-2-hdegoede@redhat.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/gma500/gma_display.c | 11 +++++++----
+ 1 file changed, 7 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/gpu/drm/gma500/gma_display.c b/drivers/gpu/drm/gma500/gma_display.c
+index b03f7b8241f2..7162f4c946af 100644
+--- a/drivers/gpu/drm/gma500/gma_display.c
++++ b/drivers/gpu/drm/gma500/gma_display.c
+@@ -529,15 +529,18 @@ int gma_crtc_page_flip(struct drm_crtc *crtc,
+               WARN_ON(drm_crtc_vblank_get(crtc) != 0);
+               gma_crtc->page_flip_event = event;
++              spin_unlock_irqrestore(&dev->event_lock, flags);
+               /* Call this locked if we want an event at vblank interrupt. */
+               ret = crtc_funcs->mode_set_base(crtc, crtc->x, crtc->y, old_fb);
+               if (ret) {
+-                      gma_crtc->page_flip_event = NULL;
+-                      drm_crtc_vblank_put(crtc);
++                      spin_lock_irqsave(&dev->event_lock, flags);
++                      if (gma_crtc->page_flip_event) {
++                              gma_crtc->page_flip_event = NULL;
++                              drm_crtc_vblank_put(crtc);
++                      }
++                      spin_unlock_irqrestore(&dev->event_lock, flags);
+               }
+-
+-              spin_unlock_irqrestore(&dev->event_lock, flags);
+       } else {
+               ret = crtc_funcs->mode_set_base(crtc, crtc->x, crtc->y, old_fb);
+       }
+-- 
+2.35.1
+
diff --git a/queue-5.15/drm-rockchip-fix-return-type-of-cdn_dp_connector_mod.patch b/queue-5.15/drm-rockchip-fix-return-type-of-cdn_dp_connector_mod.patch
new file mode 100644 (file)
index 0000000..d296cb3
--- /dev/null
@@ -0,0 +1,51 @@
+From 4e32be600195bf09907a3ed87b6f679d73945464 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 13 Sep 2022 13:55:55 -0700
+Subject: drm/rockchip: Fix return type of cdn_dp_connector_mode_valid
+
+From: Nathan Huckleberry <nhuck@google.com>
+
+[ Upstream commit b0b9408f132623dc88e78adb5282f74e4b64bb57 ]
+
+The mode_valid field in drm_connector_helper_funcs is expected to be of
+type:
+enum drm_mode_status (* mode_valid) (struct drm_connector *connector,
+                                    struct drm_display_mode *mode);
+
+The mismatched return type breaks forward edge kCFI since the underlying
+function definition does not match the function hook definition.
+
+The return type of cdn_dp_connector_mode_valid should be changed from
+int to enum drm_mode_status.
+
+Reported-by: Dan Carpenter <error27@gmail.com>
+Link: https://github.com/ClangBuiltLinux/linux/issues/1703
+Cc: llvm@lists.linux.dev
+Signed-off-by: Nathan Huckleberry <nhuck@google.com>
+Reviewed-by: Nathan Chancellor <nathan@kernel.org>
+Signed-off-by: Heiko Stuebner <heiko@sntech.de>
+Link: https://patchwork.freedesktop.org/patch/msgid/20220913205555.155149-1-nhuck@google.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/rockchip/cdn-dp-core.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.c b/drivers/gpu/drm/rockchip/cdn-dp-core.c
+index 13c6b857158f..6b5d0722afa6 100644
+--- a/drivers/gpu/drm/rockchip/cdn-dp-core.c
++++ b/drivers/gpu/drm/rockchip/cdn-dp-core.c
+@@ -277,8 +277,9 @@ static int cdn_dp_connector_get_modes(struct drm_connector *connector)
+       return ret;
+ }
+-static int cdn_dp_connector_mode_valid(struct drm_connector *connector,
+-                                     struct drm_display_mode *mode)
++static enum drm_mode_status
++cdn_dp_connector_mode_valid(struct drm_connector *connector,
++                          struct drm_display_mode *mode)
+ {
+       struct cdn_dp_device *dp = connector_to_dp(connector);
+       struct drm_display_info *display_info = &dp->connector.display_info;
+-- 
+2.35.1
+
diff --git a/queue-5.15/gpio-ixp4xx-make-irqchip-immutable.patch b/queue-5.15/gpio-ixp4xx-make-irqchip-immutable.patch
new file mode 100644 (file)
index 0000000..bb3ef4c
--- /dev/null
@@ -0,0 +1,82 @@
+From 1c91da22aa44c7fc0b4af49bdd76f55ee959b3d3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 11 Sep 2022 21:07:51 +0200
+Subject: gpio: ixp4xx: Make irqchip immutable
+
+From: Linus Walleij <linus.walleij@linaro.org>
+
+[ Upstream commit 94e9bc73d85aa6ecfe249e985ff57abe0ab35f34 ]
+
+This turns the IXP4xx GPIO irqchip into an immutable
+irqchip, a bit different from the standard template due
+to being hierarchical.
+
+Tested on the IXP4xx which uses drivers/ata/pata_ixp4xx_cf.c
+for a rootfs on compact flash with IRQs from this GPIO
+block to the CF ATA controller.
+
+Cc: Marc Zyngier <maz@kernel.org>
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+Acked-by: Marc Zyngier <maz@kernel.org>
+Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpio/gpio-ixp4xx.c | 17 ++++++++++++++---
+ 1 file changed, 14 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/gpio/gpio-ixp4xx.c b/drivers/gpio/gpio-ixp4xx.c
+index b3b050604e0b..6bd047e2ca46 100644
+--- a/drivers/gpio/gpio-ixp4xx.c
++++ b/drivers/gpio/gpio-ixp4xx.c
+@@ -67,6 +67,14 @@ static void ixp4xx_gpio_irq_ack(struct irq_data *d)
+       __raw_writel(BIT(d->hwirq), g->base + IXP4XX_REG_GPIS);
+ }
++static void ixp4xx_gpio_mask_irq(struct irq_data *d)
++{
++      struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
++
++      irq_chip_mask_parent(d);
++      gpiochip_disable_irq(gc, d->hwirq);
++}
++
+ static void ixp4xx_gpio_irq_unmask(struct irq_data *d)
+ {
+       struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+@@ -76,6 +84,7 @@ static void ixp4xx_gpio_irq_unmask(struct irq_data *d)
+       if (!(g->irq_edge & BIT(d->hwirq)))
+               ixp4xx_gpio_irq_ack(d);
++      gpiochip_enable_irq(gc, d->hwirq);
+       irq_chip_unmask_parent(d);
+ }
+@@ -153,12 +162,14 @@ static int ixp4xx_gpio_irq_set_type(struct irq_data *d, unsigned int type)
+       return irq_chip_set_type_parent(d, IRQ_TYPE_LEVEL_HIGH);
+ }
+-static struct irq_chip ixp4xx_gpio_irqchip = {
++static const struct irq_chip ixp4xx_gpio_irqchip = {
+       .name = "IXP4GPIO",
+       .irq_ack = ixp4xx_gpio_irq_ack,
+-      .irq_mask = irq_chip_mask_parent,
++      .irq_mask = ixp4xx_gpio_mask_irq,
+       .irq_unmask = ixp4xx_gpio_irq_unmask,
+       .irq_set_type = ixp4xx_gpio_irq_set_type,
++      .flags = IRQCHIP_IMMUTABLE,
++      GPIOCHIP_IRQ_RESOURCE_HELPERS,
+ };
+ static int ixp4xx_gpio_child_to_parent_hwirq(struct gpio_chip *gc,
+@@ -282,7 +293,7 @@ static int ixp4xx_gpio_probe(struct platform_device *pdev)
+       g->gc.owner = THIS_MODULE;
+       girq = &g->gc.irq;
+-      girq->chip = &ixp4xx_gpio_irqchip;
++      gpio_irq_chip_set_chip(girq, &ixp4xx_gpio_irqchip);
+       girq->fwnode = g->fwnode;
+       girq->parent_domain = parent;
+       girq->child_to_parent_hwirq = ixp4xx_gpio_child_to_parent_hwirq;
+-- 
+2.35.1
+
index 518f64db49ef54ed6185e5454b7ab04652de0868..406d2222463fc22dcfc1d126c69994f0828bec5b 100644 (file)
@@ -121,3 +121,13 @@ serial-tegra-use-uart_xmit_advance-fixes-icount.tx-accounting.patch
 serial-tegra-tcu-use-uart_xmit_advance-fixes-icount.tx-accounting.patch
 s390-dasd-fix-oops-in-dasd_alias_get_start_dev-due-to-missing-pavgroup.patch
 drm-amd-amdgpu-fixing-read-wrong-pf2vf-data-in-sriov.patch
+drivers-hv-never-allocate-anything-besides-framebuff.patch
+drm-gma500-fix-bug-sleeping-function-called-from-inv.patch
+gpio-ixp4xx-make-irqchip-immutable.patch
+drm-amd-pm-disable-baco-entry-exit-completely-on-sev.patch
+drm-amdgpu-use-dirty-framebuffer-helper.patch
+drm-amd-display-limit-user-regamma-to-a-valid-value.patch
+drm-amd-display-reduce-number-of-arguments-of-dml31-.patch
+drm-amd-display-reduce-number-of-arguments-of-dml31-.patch-4999
+drm-amd-display-mark-dml30-s-useminimumdcfclk-as-noi.patch
+drm-rockchip-fix-return-type-of-cdn_dp_connector_mod.patch