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

drm/radeon: rework VCE FW size calculation

Previously we were completely over allocating, fix this
by actually implementing the size calculation.

Signed-off-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Christian König and committed by
Alex Deucher
fa0cf2f2 72b9076b

+15 -7
-2
drivers/gpu/drm/radeon/radeon.h
··· 1709 1709 * VCE 1710 1710 */ 1711 1711 #define RADEON_MAX_VCE_HANDLES 16 1712 - #define RADEON_VCE_STACK_SIZE (1024*1024) 1713 - #define RADEON_VCE_HEAP_SIZE (4*1024*1024) 1714 1712 1715 1713 struct radeon_vce { 1716 1714 struct radeon_bo *vcpu_bo;
+1
drivers/gpu/drm/radeon/radeon_asic.h
··· 974 974 int vce_v1_0_start(struct radeon_device *rdev); 975 975 976 976 /* vce v2.0 */ 977 + unsigned vce_v2_0_bo_size(struct radeon_device *rdev); 977 978 int vce_v2_0_resume(struct radeon_device *rdev); 978 979 979 980 #endif
+1 -2
drivers/gpu/drm/radeon/radeon_vce.c
··· 123 123 124 124 /* allocate firmware, stack and heap BO */ 125 125 126 - size = RADEON_GPU_PAGE_ALIGN(rdev->vce_fw->size) + 127 - RADEON_VCE_STACK_SIZE + RADEON_VCE_HEAP_SIZE; 126 + size = vce_v2_0_bo_size(rdev); 128 127 r = radeon_bo_create(rdev, size, PAGE_SIZE, true, 129 128 RADEON_GEM_DOMAIN_VRAM, 0, NULL, NULL, 130 129 &rdev->vce.vcpu_bo);
+13 -3
drivers/gpu/drm/radeon/vce_v2_0.c
··· 31 31 #include "radeon_asic.h" 32 32 #include "cikd.h" 33 33 34 + #define VCE_V2_0_FW_SIZE (256 * 1024) 35 + #define VCE_V2_0_STACK_SIZE (64 * 1024) 36 + #define VCE_V2_0_DATA_SIZE (23552 * RADEON_MAX_VCE_HANDLES) 37 + 34 38 static void vce_v2_0_set_sw_cg(struct radeon_device *rdev, bool gated) 35 39 { 36 40 u32 tmp; ··· 144 140 WREG32(VCE_CLOCK_GATING_B, tmp); 145 141 } 146 142 143 + unsigned vce_v2_0_bo_size(struct radeon_device *rdev) 144 + { 145 + WARN_ON(rdev->vce_fw->size > VCE_V2_0_FW_SIZE); 146 + return VCE_V2_0_FW_SIZE + VCE_V2_0_STACK_SIZE + VCE_V2_0_DATA_SIZE; 147 + } 148 + 147 149 int vce_v2_0_resume(struct radeon_device *rdev) 148 150 { 149 151 uint64_t addr = rdev->vce.gpu_addr; ··· 169 159 WREG32(VCE_LMI_VCPU_CACHE_40BIT_BAR, addr >> 8); 170 160 171 161 addr &= 0xff; 172 - size = RADEON_GPU_PAGE_ALIGN(rdev->vce_fw->size); 162 + size = VCE_V2_0_FW_SIZE; 173 163 WREG32(VCE_VCPU_CACHE_OFFSET0, addr & 0x7fffffff); 174 164 WREG32(VCE_VCPU_CACHE_SIZE0, size); 175 165 176 166 addr += size; 177 - size = RADEON_VCE_STACK_SIZE; 167 + size = VCE_V2_0_STACK_SIZE; 178 168 WREG32(VCE_VCPU_CACHE_OFFSET1, addr & 0x7fffffff); 179 169 WREG32(VCE_VCPU_CACHE_SIZE1, size); 180 170 181 171 addr += size; 182 - size = RADEON_VCE_HEAP_SIZE; 172 + size = VCE_V2_0_DATA_SIZE; 183 173 WREG32(VCE_VCPU_CACHE_OFFSET2, addr & 0x7fffffff); 184 174 WREG32(VCE_VCPU_CACHE_SIZE2, size); 185 175