diff options
author | Likun Gao <Likun.Gao@amd.com> | 2018-08-09 12:31:42 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2018-08-13 18:19:46 -0400 |
commit | 4d77c0f676e910fb1f1870738aa4bd168f253621 (patch) | |
tree | 2b9c255e40439cfcf14dfe80f33c0b5ce7ac055b /drivers/gpu/drm/amd/amdgpu | |
parent | 235ac9de625a0a586093ad81b3de6f7d7ab913ed (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.c | 17 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 40 |
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) | |||
265 | static void vcn_v1_0_mc_resume(struct amdgpu_device *adev) | 275 | static 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)); |