|
@@ -100,6 +100,16 @@ static int vcn_v1_0_sw_init(void *handle)
|
|
|
if (r)
|
|
|
return r;
|
|
|
|
|
|
+ if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
|
|
|
+ const struct common_firmware_header *hdr;
|
|
|
+ hdr = (const struct common_firmware_header *)adev->vcn.fw->data;
|
|
|
+ adev->firmware.ucode[AMDGPU_UCODE_ID_VCN].ucode_id = AMDGPU_UCODE_ID_VCN;
|
|
|
+ adev->firmware.ucode[AMDGPU_UCODE_ID_VCN].fw = adev->vcn.fw;
|
|
|
+ adev->firmware.fw_size +=
|
|
|
+ ALIGN(le32_to_cpu(hdr->ucode_size_bytes), PAGE_SIZE);
|
|
|
+ DRM_INFO("PSP loading VCN firmware\n");
|
|
|
+ }
|
|
|
+
|
|
|
r = amdgpu_vcn_resume(adev);
|
|
|
if (r)
|
|
|
return r;
|
|
@@ -265,26 +275,38 @@ static int vcn_v1_0_resume(void *handle)
|
|
|
static void vcn_v1_0_mc_resume(struct amdgpu_device *adev)
|
|
|
{
|
|
|
uint32_t size = AMDGPU_GPU_PAGE_ALIGN(adev->vcn.fw->size + 4);
|
|
|
-
|
|
|
- WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW,
|
|
|
+ uint32_t offset;
|
|
|
+
|
|
|
+ if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
|
|
|
+ WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW,
|
|
|
+ (adev->firmware.ucode[AMDGPU_UCODE_ID_VCN].tmr_mc_addr_lo));
|
|
|
+ WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH,
|
|
|
+ (adev->firmware.ucode[AMDGPU_UCODE_ID_VCN].tmr_mc_addr_hi));
|
|
|
+ WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET0, 0);
|
|
|
+ offset = 0;
|
|
|
+ } else {
|
|
|
+ WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW,
|
|
|
lower_32_bits(adev->vcn.gpu_addr));
|
|
|
- WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH,
|
|
|
+ WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH,
|
|
|
upper_32_bits(adev->vcn.gpu_addr));
|
|
|
- WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET0,
|
|
|
- AMDGPU_UVD_FIRMWARE_OFFSET >> 3);
|
|
|
+ offset = size;
|
|
|
+ WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET0,
|
|
|
+ AMDGPU_UVD_FIRMWARE_OFFSET >> 3);
|
|
|
+ }
|
|
|
+
|
|
|
WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_SIZE0, size);
|
|
|
|
|
|
WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW,
|
|
|
- lower_32_bits(adev->vcn.gpu_addr + size));
|
|
|
+ lower_32_bits(adev->vcn.gpu_addr + offset));
|
|
|
WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH,
|
|
|
- upper_32_bits(adev->vcn.gpu_addr + size));
|
|
|
+ upper_32_bits(adev->vcn.gpu_addr + offset));
|
|
|
WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET1, 0);
|
|
|
WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_SIZE1, AMDGPU_VCN_HEAP_SIZE);
|
|
|
|
|
|
WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW,
|
|
|
- lower_32_bits(adev->vcn.gpu_addr + size + AMDGPU_VCN_HEAP_SIZE));
|
|
|
+ lower_32_bits(adev->vcn.gpu_addr + offset + AMDGPU_VCN_HEAP_SIZE));
|
|
|
WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH,
|
|
|
- upper_32_bits(adev->vcn.gpu_addr + size + AMDGPU_VCN_HEAP_SIZE));
|
|
|
+ upper_32_bits(adev->vcn.gpu_addr + offset + AMDGPU_VCN_HEAP_SIZE));
|
|
|
WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET2, 0);
|
|
|
WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_SIZE2,
|
|
|
AMDGPU_VCN_STACK_SIZE + (AMDGPU_VCN_SESSION_SIZE * 40));
|