drm/amdgpu: Add fallback path for discovery info
authorLijo Lazar <lijo.lazar@amd.com>
Mon, 30 Jan 2023 04:18:39 +0000 (09:48 +0530)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 9 Jun 2023 13:55:45 +0000 (09:55 -0400)
If SOC doesn't expose dedicated vram, discovery region may be
available through system memory. Rename the existing interface to
generic read_binary_from_mem and add a fallback path to read from system
memory.

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

index 2460709..01b2198 100644 (file)
@@ -226,13 +226,21 @@ static int amdgpu_discovery_read_binary_from_sysmem(struct amdgpu_device *adev,
        return -ENOENT;
 }
 
-static void amdgpu_discovery_read_binary_from_vram(struct amdgpu_device *adev, uint8_t *binary)
+static int amdgpu_discovery_read_binary_from_mem(struct amdgpu_device *adev,
+                                                uint8_t *binary)
 {
        uint64_t vram_size = (uint64_t)RREG32(mmRCC_CONFIG_MEMSIZE) << 20;
-       uint64_t pos = vram_size - DISCOVERY_TMR_OFFSET;
+       int ret = 0;
 
-       amdgpu_device_vram_access(adev, pos, (uint32_t *)binary,
-                                 adev->mman.discovery_tmr_size, false);
+       if (vram_size) {
+               uint64_t pos = vram_size - DISCOVERY_TMR_OFFSET;
+               amdgpu_device_vram_access(adev, pos, (uint32_t *)binary,
+                                         adev->mman.discovery_tmr_size, false);
+       } else {
+               ret = amdgpu_discovery_read_binary_from_sysmem(adev, binary);
+       }
+
+       return ret;
 }
 
 static int amdgpu_discovery_read_binary_from_file(struct amdgpu_device *adev, uint8_t *binary)
@@ -338,7 +346,10 @@ static int amdgpu_discovery_init(struct amdgpu_device *adev)
                }
 
        } else {
-               amdgpu_discovery_read_binary_from_vram(adev, adev->mman.discovery_bin);
+               r = amdgpu_discovery_read_binary_from_mem(
+                       adev, adev->mman.discovery_bin);
+               if (r)
+                       goto out;
        }
 
        /* check the ip discovery binary signature */