diff --git a/devices/pc/default.nix b/devices/pc/default.nix index c4f1c204..f94efb94 100644 --- a/devices/pc/default.nix +++ b/devices/pc/default.nix @@ -49,7 +49,7 @@ inputs: kernel = { variant = "xanmod-latest"; - patches = [ "hibernate-progress" ]; + patches = [ "hibernate-progress" "amdgpu" ]; modules.modprobeConfig = [ "options iwlwifi power_save=0" "options iwlmvm power_scheme=1" "options iwlwifi uapsd_disable=1" ]; }; diff --git a/modules/system/kernel/0001-drm-amdgpu-sdma5.2-limit-wptr-workaround-to-sdma-5.2.patch b/modules/system/kernel/0001-drm-amdgpu-sdma5.2-limit-wptr-workaround-to-sdma-5.2.patch new file mode 100644 index 00000000..6643f029 --- /dev/null +++ b/modules/system/kernel/0001-drm-amdgpu-sdma5.2-limit-wptr-workaround-to-sdma-5.2.patch @@ -0,0 +1,47 @@ +From 123c4d46272b7e72d7db3fe8b4131a8cc99613fb Mon Sep 17 00:00:00 2001 +From: Alex Deucher +Date: Wed, 14 Aug 2024 10:28:24 -0400 +Subject: [PATCH] drm/amdgpu/sdma5.2: limit wptr workaround to sdma 5.2.1 + +The workaround seems to cause stability issues on other +SDMA 5.2.x IPs. + +Fixes: a03ebf116303 ("drm/amdgpu/sdma5.2: Update wptr registers as well as doorbell") +Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/3556 +Signed-off-by: Alex Deucher +--- + drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c | 18 ++++++++++-------- + 1 file changed, 10 insertions(+), 8 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c +index d740255edf5a..bc9b240a3488 100644 +--- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c ++++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c +@@ -225,14 +225,16 @@ static void sdma_v5_2_ring_set_wptr(struct amdgpu_ring *ring) + DRM_DEBUG("calling WDOORBELL64(0x%08x, 0x%016llx)\n", + ring->doorbell_index, ring->wptr << 2); + WDOORBELL64(ring->doorbell_index, ring->wptr << 2); +- /* SDMA seems to miss doorbells sometimes when powergating kicks in. +- * Updating the wptr directly will wake it. This is only safe because +- * we disallow gfxoff in begin_use() and then allow it again in end_use(). +- */ +- WREG32(sdma_v5_2_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR), +- lower_32_bits(ring->wptr << 2)); +- WREG32(sdma_v5_2_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR_HI), +- upper_32_bits(ring->wptr << 2)); ++ if (amdgpu_ip_version(adev, SDMA0_HWIP, 0) == IP_VERSION(5, 2, 1)) { ++ /* SDMA seems to miss doorbells sometimes when powergating kicks in. ++ * Updating the wptr directly will wake it. This is only safe because ++ * we disallow gfxoff in begin_use() and then allow it again in end_use(). ++ */ ++ WREG32(sdma_v5_2_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR), ++ lower_32_bits(ring->wptr << 2)); ++ WREG32(sdma_v5_2_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR_HI), ++ upper_32_bits(ring->wptr << 2)); ++ } + } else { + DRM_DEBUG("Not using doorbell -- " + "mmSDMA%i_GFX_RB_WPTR == 0x%08x " +-- +2.46.0 + diff --git a/modules/system/kernel/default.nix b/modules/system/kernel/default.nix index c91613d6..95e3acf8 100644 --- a/modules/system/kernel/default.nix +++ b/modules/system/kernel/default.nix @@ -136,6 +136,11 @@ inputs: let version = inputs.lib.versions.majorMinor inputs.config.boot.kernelPackages.kernel.version; in if version == "6.10" then ./btrfs.patch else null; }]; + amdgpu = + [{ + name = "amdgpu"; + patch = ./0001-drm-amdgpu-sdma5.2-limit-wptr-workaround-to-sdma-5.2.patch; + }]; }; in builtins.concatLists (builtins.map (name: patches.${name}) (kernel.patches ++ [ "btrfs" ])); };