| From 542a56e8eb4467ae654eefab31ff194569db39cd Mon Sep 17 00:00:00 2001 |
| From: "Guilherme G. Piccoli" <gpiccoli@igalia.com> |
| Date: Sun, 12 Mar 2023 13:51:00 -0300 |
| Subject: drm/amdgpu/vcn: Disable indirect SRAM on Vangogh broken BIOSes |
| |
| From: Guilherme G. Piccoli <gpiccoli@igalia.com> |
| |
| commit 542a56e8eb4467ae654eefab31ff194569db39cd upstream. |
| |
| The VCN firmware loading path enables the indirect SRAM mode if it's |
| advertised as supported. We might have some cases of FW issues that |
| prevents this mode to working properly though, ending-up in a failed |
| probe. An example below, observed in the Steam Deck: |
| |
| [...] |
| [drm] failed to load ucode VCN0_RAM(0x3A) |
| [drm] psp gfx command LOAD_IP_FW(0x6) failed and response status is (0xFFFF0000) |
| amdgpu 0000:04:00.0: [drm:amdgpu_ring_test_helper [amdgpu]] *ERROR* ring vcn_dec_0 test failed (-110) |
| [drm:amdgpu_device_init.cold [amdgpu]] *ERROR* hw_init of IP block <vcn_v3_0> failed -110 |
| amdgpu 0000:04:00.0: amdgpu: amdgpu_device_ip_init failed |
| amdgpu 0000:04:00.0: amdgpu: Fatal error during GPU init |
| [...] |
| |
| Disabling the VCN block circumvents this, but it's a very invasive |
| workaround that turns off the entire feature. So, let's add a quirk |
| on VCN loading that checks for known problematic BIOSes on Vangogh, |
| so we can proactively disable the indirect SRAM mode and allow the |
| HW proper probe and VCN IP block to work fine. |
| |
| Bug: https://gitlab.freedesktop.org/drm/amd/-/issues/2385 |
| Fixes: 82132ecc5432 ("drm/amdgpu: enable Vangogh VCN indirect sram mode") |
| Cc: stable@vger.kernel.org |
| Cc: James Zhu <James.Zhu@amd.com> |
| Cc: Leo Liu <leo.liu@amd.com> |
| Signed-off-by: Guilherme G. Piccoli <gpiccoli@igalia.com> |
| Signed-off-by: Alex Deucher <alexander.deucher@amd.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c | 17 +++++++++++++++++ |
| 1 file changed, 17 insertions(+) |
| |
| --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c |
| +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c |
| @@ -26,6 +26,7 @@ |
| |
| #include <linux/firmware.h> |
| #include <linux/module.h> |
| +#include <linux/dmi.h> |
| #include <linux/pci.h> |
| #include <linux/debugfs.h> |
| #include <drm/drm_drv.h> |
| @@ -84,6 +85,7 @@ int amdgpu_vcn_sw_init(struct amdgpu_dev |
| { |
| unsigned long bo_size; |
| const char *fw_name; |
| + const char *bios_ver; |
| const struct common_firmware_header *hdr; |
| unsigned char fw_check; |
| unsigned int fw_shared_size, log_offset; |
| @@ -159,6 +161,21 @@ int amdgpu_vcn_sw_init(struct amdgpu_dev |
| if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) && |
| (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG)) |
| adev->vcn.indirect_sram = true; |
| + /* |
| + * Some Steam Deck's BIOS versions are incompatible with the |
| + * indirect SRAM mode, leading to amdgpu being unable to get |
| + * properly probed (and even potentially crashing the kernel). |
| + * Hence, check for these versions here - notice this is |
| + * restricted to Vangogh (Deck's APU). |
| + */ |
| + bios_ver = dmi_get_system_info(DMI_BIOS_VERSION); |
| + |
| + if (bios_ver && (!strncmp("F7A0113", bios_ver, 7) || |
| + !strncmp("F7A0114", bios_ver, 7))) { |
| + adev->vcn.indirect_sram = false; |
| + dev_info(adev->dev, |
| + "Steam Deck quirk: indirect SRAM disabled on BIOS %s\n", bios_ver); |
| + } |
| break; |
| case IP_VERSION(3, 0, 16): |
| fw_name = FIRMWARE_DIMGREY_CAVEFISH; |