]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amdgpu: Reserve discovery TMR only if needed
authorLijo Lazar <lijo.lazar@amd.com>
Fri, 10 Oct 2025 11:53:33 +0000 (17:23 +0530)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 13 Oct 2025 18:14:36 +0000 (14:14 -0400)
For legacy SOCs, discovery binary is sideloaded. Instead of checking for
binary blob, use a flag to determine if discovery region needs to be
reserved.

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
drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c

index 13de62829f9c0cf5f6193c7f310a45e387c9b5f5..4e75334f3b3a09522668ceafa7fa2c4b79798c4b 100644 (file)
@@ -298,10 +298,15 @@ static int amdgpu_discovery_read_binary_from_mem(struct amdgpu_device *adev,
        else
                vram_size <<= 20;
 
+       /*
+        * If in VRAM, discovery TMR is marked for reservation. If it is in system mem,
+        * then it is not required to be reserved.
+        */
        if (sz_valid) {
                uint64_t pos = vram_size - DISCOVERY_TMR_OFFSET;
                amdgpu_device_vram_access(adev, pos, (uint32_t *)binary,
                                          adev->discovery.size, false);
+               adev->discovery.reserve_tmr = true;
        } else {
                ret = amdgpu_discovery_read_binary_from_sysmem(adev, binary);
        }
@@ -418,8 +423,11 @@ static int amdgpu_discovery_verify_npsinfo(struct amdgpu_device *adev,
 
 static const char *amdgpu_discovery_get_fw_name(struct amdgpu_device *adev)
 {
-       if (amdgpu_discovery == 2)
+       if (amdgpu_discovery == 2) {
+               /* Assume there is valid discovery TMR in VRAM even if binary is sideloaded */
+               adev->discovery.reserve_tmr = true;
                return "amdgpu/ip_discovery.bin";
+       }
 
        switch (adev->asic_type) {
        case CHIP_VEGA10:
index b1eec3af3c4a8763c09bb42fd16a466a1d51c845..4ce04486cc31945e2436db0b5810753d0560ce9c 100644 (file)
@@ -36,6 +36,7 @@ struct amdgpu_discovery_info {
        struct ip_discovery_top *ip_top;
        uint32_t size;
        uint8_t *bin;
+       bool reserve_tmr;
 };
 
 void amdgpu_discovery_fini(struct amdgpu_device *adev);
index a10b2982ca7a98e11d2a5404f90593d3ee95674d..0bd02234eca0037f138b0890bedc210f73437ba7 100644 (file)
@@ -1769,18 +1769,14 @@ static int amdgpu_ttm_reserve_tmr(struct amdgpu_device *adev)
                ctx->init = PSP_MEM_TRAIN_RESERVE_SUCCESS;
        }
 
-       if (!adev->gmc.is_app_apu) {
-               ret = amdgpu_bo_create_kernel_at(
-                       adev, adev->gmc.real_vram_size - reserve_size,
-                       reserve_size, &adev->mman.fw_reserved_memory, NULL);
-               if (ret) {
-                       dev_err(adev->dev, "alloc tmr failed(%d)!\n", ret);
-                       amdgpu_bo_free_kernel(&adev->mman.fw_reserved_memory,
-                                             NULL, NULL);
-                       return ret;
-               }
-       } else {
-               DRM_DEBUG_DRIVER("backdoor fw loading path for PSP TMR, no reservation needed\n");
+       ret = amdgpu_bo_create_kernel_at(
+               adev, adev->gmc.real_vram_size - reserve_size, reserve_size,
+               &adev->mman.fw_reserved_memory, NULL);
+       if (ret) {
+               dev_err(adev->dev, "alloc tmr failed(%d)!\n", ret);
+               amdgpu_bo_free_kernel(&adev->mman.fw_reserved_memory, NULL,
+                                     NULL);
+               return ret;
        }
 
        return 0;
@@ -1957,7 +1953,7 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
         * If IP discovery enabled, a block of memory should be
         * reserved for IP discovey.
         */
-       if (adev->discovery.bin) {
+       if (adev->discovery.reserve_tmr) {
                r = amdgpu_ttm_reserve_tmr(adev);
                if (r)
                        return r;