aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu
diff options
context:
space:
mode:
authorLikun Gao <Likun.Gao@amd.com>2018-08-09 12:31:42 -0400
committerAlex Deucher <alexander.deucher@amd.com>2018-08-13 18:19:46 -0400
commit4d77c0f676e910fb1f1870738aa4bd168f253621 (patch)
tree2b9c255e40439cfcf14dfe80f33c0b5ce7ac055b /drivers/gpu/drm/amd/amdgpu
parent235ac9de625a0a586093ad81b3de6f7d7ab913ed (diff)
drm/amdgpu:add VCN booting with firmware loaded by PSP
Setup psp firmware loading for VCN, and make VCN block booting from tmr mac address. Signed-off-by: James Zhu <James.Zhu@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Acked-by: Huang Rui <ray.huang@amd.com> Reviewed-by: Likun Gao <Likun.Gao@amd.com> Signed-off-by: Likun Gao <Likun.Gao@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Cc: stable@vger.kernel.org
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c17
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c40
2 files changed, 41 insertions, 16 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
index 798648a19710..290d5583135b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
@@ -111,9 +111,10 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)
111 version_major, version_minor, family_id); 111 version_major, version_minor, family_id);
112 } 112 }
113 113
114 bo_size = AMDGPU_GPU_PAGE_ALIGN(le32_to_cpu(hdr->ucode_size_bytes) + 8) 114 bo_size = AMDGPU_VCN_STACK_SIZE + AMDGPU_VCN_HEAP_SIZE
115 + AMDGPU_VCN_STACK_SIZE + AMDGPU_VCN_HEAP_SIZE
116 + AMDGPU_VCN_SESSION_SIZE * 40; 115 + AMDGPU_VCN_SESSION_SIZE * 40;
116 if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP)
117 bo_size += AMDGPU_GPU_PAGE_ALIGN(le32_to_cpu(hdr->ucode_size_bytes) + 8);
117 r = amdgpu_bo_create_kernel(adev, bo_size, PAGE_SIZE, 118 r = amdgpu_bo_create_kernel(adev, bo_size, PAGE_SIZE,
118 AMDGPU_GEM_DOMAIN_VRAM, &adev->vcn.vcpu_bo, 119 AMDGPU_GEM_DOMAIN_VRAM, &adev->vcn.vcpu_bo,
119 &adev->vcn.gpu_addr, &adev->vcn.cpu_addr); 120 &adev->vcn.gpu_addr, &adev->vcn.cpu_addr);
@@ -189,11 +190,13 @@ int amdgpu_vcn_resume(struct amdgpu_device *adev)
189 unsigned offset; 190 unsigned offset;
190 191
191 hdr = (const struct common_firmware_header *)adev->vcn.fw->data; 192 hdr = (const struct common_firmware_header *)adev->vcn.fw->data;
192 offset = le32_to_cpu(hdr->ucode_array_offset_bytes); 193 if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) {
193 memcpy_toio(adev->vcn.cpu_addr, adev->vcn.fw->data + offset, 194 offset = le32_to_cpu(hdr->ucode_array_offset_bytes);
194 le32_to_cpu(hdr->ucode_size_bytes)); 195 memcpy_toio(adev->vcn.cpu_addr, adev->vcn.fw->data + offset,
195 size -= le32_to_cpu(hdr->ucode_size_bytes); 196 le32_to_cpu(hdr->ucode_size_bytes));
196 ptr += le32_to_cpu(hdr->ucode_size_bytes); 197 size -= le32_to_cpu(hdr->ucode_size_bytes);
198 ptr += le32_to_cpu(hdr->ucode_size_bytes);
199 }
197 memset_io(ptr, 0, size); 200 memset_io(ptr, 0, size);
198 } 201 }
199 202
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
index 2ce91a748c40..072371ef5975 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
@@ -100,6 +100,16 @@ static int vcn_v1_0_sw_init(void *handle)
100 if (r) 100 if (r)
101 return r; 101 return r;
102 102
103 if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
104 const struct common_firmware_header *hdr;
105 hdr = (const struct common_firmware_header *)adev->vcn.fw->data;
106 adev->firmware.ucode[AMDGPU_UCODE_ID_VCN].ucode_id = AMDGPU_UCODE_ID_VCN;
107 adev->firmware.ucode[AMDGPU_UCODE_ID_VCN].fw = adev->vcn.fw;
108 adev->firmware.fw_size +=
109 ALIGN(le32_to_cpu(hdr->ucode_size_bytes), PAGE_SIZE);
110 DRM_INFO("PSP loading VCN firmware\n");
111 }
112
103 r = amdgpu_vcn_resume(adev); 113 r = amdgpu_vcn_resume(adev);
104 if (r) 114 if (r)
105 return r; 115 return r;
@@ -265,26 +275,38 @@ static int vcn_v1_0_resume(void *handle)
265static void vcn_v1_0_mc_resume(struct amdgpu_device *adev) 275static void vcn_v1_0_mc_resume(struct amdgpu_device *adev)
266{ 276{
267 uint32_t size = AMDGPU_GPU_PAGE_ALIGN(adev->vcn.fw->size + 4); 277 uint32_t size = AMDGPU_GPU_PAGE_ALIGN(adev->vcn.fw->size + 4);
268 278 uint32_t offset;
269 WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW, 279
280 if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
281 WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW,
282 (adev->firmware.ucode[AMDGPU_UCODE_ID_VCN].tmr_mc_addr_lo));
283 WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH,
284 (adev->firmware.ucode[AMDGPU_UCODE_ID_VCN].tmr_mc_addr_hi));
285 WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET0, 0);
286 offset = 0;
287 } else {
288 WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW,
270 lower_32_bits(adev->vcn.gpu_addr)); 289 lower_32_bits(adev->vcn.gpu_addr));
271 WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH, 290 WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH,
272 upper_32_bits(adev->vcn.gpu_addr)); 291 upper_32_bits(adev->vcn.gpu_addr));
273 WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET0, 292 offset = size;
274 AMDGPU_UVD_FIRMWARE_OFFSET >> 3); 293 WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET0,
294 AMDGPU_UVD_FIRMWARE_OFFSET >> 3);
295 }
296
275 WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_SIZE0, size); 297 WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_SIZE0, size);
276 298
277 WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW, 299 WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW,
278 lower_32_bits(adev->vcn.gpu_addr + size)); 300 lower_32_bits(adev->vcn.gpu_addr + offset));
279 WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH, 301 WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH,
280 upper_32_bits(adev->vcn.gpu_addr + size)); 302 upper_32_bits(adev->vcn.gpu_addr + offset));
281 WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET1, 0); 303 WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET1, 0);
282 WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_SIZE1, AMDGPU_VCN_HEAP_SIZE); 304 WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_SIZE1, AMDGPU_VCN_HEAP_SIZE);
283 305
284 WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW, 306 WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW,
285 lower_32_bits(adev->vcn.gpu_addr + size + AMDGPU_VCN_HEAP_SIZE)); 307 lower_32_bits(adev->vcn.gpu_addr + offset + AMDGPU_VCN_HEAP_SIZE));
286 WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH, 308 WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH,
287 upper_32_bits(adev->vcn.gpu_addr + size + AMDGPU_VCN_HEAP_SIZE)); 309 upper_32_bits(adev->vcn.gpu_addr + offset + AMDGPU_VCN_HEAP_SIZE));
288 WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET2, 0); 310 WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET2, 0);
289 WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_SIZE2, 311 WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_SIZE2,
290 AMDGPU_VCN_STACK_SIZE + (AMDGPU_VCN_SESSION_SIZE * 40)); 312 AMDGPU_VCN_STACK_SIZE + (AMDGPU_VCN_SESSION_SIZE * 40));