Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: Reserve discovery TMR only if needed

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>

authored by

Lijo Lazar and committed by
Alex Deucher
071bba96 80e462c5

+19 -14
+9 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
··· 298 298 else 299 299 vram_size <<= 20; 300 300 301 + /* 302 + * If in VRAM, discovery TMR is marked for reservation. If it is in system mem, 303 + * then it is not required to be reserved. 304 + */ 301 305 if (sz_valid) { 302 306 uint64_t pos = vram_size - DISCOVERY_TMR_OFFSET; 303 307 amdgpu_device_vram_access(adev, pos, (uint32_t *)binary, 304 308 adev->discovery.size, false); 309 + adev->discovery.reserve_tmr = true; 305 310 } else { 306 311 ret = amdgpu_discovery_read_binary_from_sysmem(adev, binary); 307 312 } ··· 423 418 424 419 static const char *amdgpu_discovery_get_fw_name(struct amdgpu_device *adev) 425 420 { 426 - if (amdgpu_discovery == 2) 421 + if (amdgpu_discovery == 2) { 422 + /* Assume there is valid discovery TMR in VRAM even if binary is sideloaded */ 423 + adev->discovery.reserve_tmr = true; 427 424 return "amdgpu/ip_discovery.bin"; 425 + } 428 426 429 427 switch (adev->asic_type) { 430 428 case CHIP_VEGA10:
+1
drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h
··· 36 36 struct ip_discovery_top *ip_top; 37 37 uint32_t size; 38 38 uint8_t *bin; 39 + bool reserve_tmr; 39 40 }; 40 41 41 42 void amdgpu_discovery_fini(struct amdgpu_device *adev);
+9 -13
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
··· 1769 1769 ctx->init = PSP_MEM_TRAIN_RESERVE_SUCCESS; 1770 1770 } 1771 1771 1772 - if (!adev->gmc.is_app_apu) { 1773 - ret = amdgpu_bo_create_kernel_at( 1774 - adev, adev->gmc.real_vram_size - reserve_size, 1775 - reserve_size, &adev->mman.fw_reserved_memory, NULL); 1776 - if (ret) { 1777 - dev_err(adev->dev, "alloc tmr failed(%d)!\n", ret); 1778 - amdgpu_bo_free_kernel(&adev->mman.fw_reserved_memory, 1779 - NULL, NULL); 1780 - return ret; 1781 - } 1782 - } else { 1783 - DRM_DEBUG_DRIVER("backdoor fw loading path for PSP TMR, no reservation needed\n"); 1772 + ret = amdgpu_bo_create_kernel_at( 1773 + adev, adev->gmc.real_vram_size - reserve_size, reserve_size, 1774 + &adev->mman.fw_reserved_memory, NULL); 1775 + if (ret) { 1776 + dev_err(adev->dev, "alloc tmr failed(%d)!\n", ret); 1777 + amdgpu_bo_free_kernel(&adev->mman.fw_reserved_memory, NULL, 1778 + NULL); 1779 + return ret; 1784 1780 } 1785 1781 1786 1782 return 0; ··· 1953 1957 * If IP discovery enabled, a block of memory should be 1954 1958 * reserved for IP discovey. 1955 1959 */ 1956 - if (adev->discovery.bin) { 1960 + if (adev->discovery.reserve_tmr) { 1957 1961 r = amdgpu_ttm_reserve_tmr(adev); 1958 1962 if (r) 1959 1963 return r;