drm/amdgpu: Add more checks to discovery fetch
authorLijo Lazar <lijo.lazar@amd.com>
Thu, 29 May 2025 10:27:44 +0000 (15:57 +0530)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 3 Jun 2025 19:02:58 +0000 (15:02 -0400)
Add more checks for valid vram size and log error, if any.

Signed-off-by: Lijo Lazar <lijo.lazar@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c

index 9e738fae2b74f1e7318a54c2cd7d9439ed03d291..a0e9bf9b27108c372623e10292dcdcabea69f1de 100644 (file)
@@ -270,9 +270,10 @@ static int amdgpu_discovery_read_binary_from_sysmem(struct amdgpu_device *adev,
 static int amdgpu_discovery_read_binary_from_mem(struct amdgpu_device *adev,
                                                 uint8_t *binary)
 {
+       bool sz_valid = true;
        uint64_t vram_size;
-       u32 msg;
        int i, ret = 0;
+       u32 msg;
 
        if (!amdgpu_sriov_vf(adev)) {
                /* It can take up to a second for IFWI init to complete on some dGPUs,
@@ -291,9 +292,13 @@ static int amdgpu_discovery_read_binary_from_mem(struct amdgpu_device *adev,
                }
        }
 
-       vram_size = (uint64_t)RREG32(mmRCC_CONFIG_MEMSIZE) << 20;
+       vram_size = RREG32(mmRCC_CONFIG_MEMSIZE);
+       if (!vram_size || vram_size == U32_MAX)
+               sz_valid = false;
+       else
+               vram_size <<= 20;
 
-       if (vram_size) {
+       if (sz_valid) {
                uint64_t pos = vram_size - DISCOVERY_TMR_OFFSET;
                amdgpu_device_vram_access(adev, pos, (uint32_t *)binary,
                                          adev->mman.discovery_tmr_size, false);
@@ -301,6 +306,11 @@ static int amdgpu_discovery_read_binary_from_mem(struct amdgpu_device *adev,
                ret = amdgpu_discovery_read_binary_from_sysmem(adev, binary);
        }
 
+       if (ret)
+               dev_err(adev->dev,
+                       "failed to read discovery info from memory, vram size read: %llx",
+                       vram_size);
+
        return ret;
 }