diff options
author | Lang Yu <Lang.Yu@amd.com> | 2023-06-27 09:44:41 +0800 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2023-08-31 16:34:22 -0400 |
commit | f9ecae9a4ec19c2a7b3ac132411af1ee9940a0f5 (patch) | |
tree | 7e85f309ddd1df24d53c12172d2cead251de6890 /drivers/gpu/drm/amd/amdgpu/amdgpu_vpe.c | |
parent | 5f6e9cdc83c146c6c20b36a2fb6dd607ed9e009a (diff) | |
download | linux-f9ecae9a4ec19c2a7b3ac132411af1ee9940a0f5.tar.gz linux-f9ecae9a4ec19c2a7b3ac132411af1ee9940a0f5.tar.bz2 linux-f9ecae9a4ec19c2a7b3ac132411af1ee9940a0f5.zip |
drm/amdgpu: fix VPE front door loading issue
Implement proper front door loading for vpe 6.1.
Signed-off-by: Lang Yu <Lang.Yu@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vpe.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vpe.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vpe.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vpe.c index a84e03a9b0fc..ae070072705a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vpe.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vpe.c @@ -37,6 +37,17 @@ static void vpe_set_ring_funcs(struct amdgpu_device *adev); +int amdgpu_vpe_psp_update_sram(struct amdgpu_device *adev) +{ + struct amdgpu_firmware_info ucode = { + .ucode_id = AMDGPU_UCODE_ID_VPE, + .mc_addr = adev->vpe.cmdbuf_gpu_addr, + .ucode_size = 8, + }; + + return psp_execute_ip_fw_load(&adev->psp, &ucode); +} + int amdgpu_vpe_init_microcode(struct amdgpu_vpe *vpe) { struct amdgpu_device *adev = vpe->ring.adev; @@ -126,12 +137,35 @@ static int vpe_early_init(void *handle) return 0; } + +static int vpe_common_init(struct amdgpu_vpe *vpe) +{ + struct amdgpu_device *adev = container_of(vpe, struct amdgpu_device, vpe); + int r; + + r = amdgpu_bo_create_kernel(adev, PAGE_SIZE, PAGE_SIZE, + AMDGPU_GEM_DOMAIN_GTT, + &adev->vpe.cmdbuf_obj, + &adev->vpe.cmdbuf_gpu_addr, + (void **)&adev->vpe.cmdbuf_cpu_addr); + if (r) { + dev_err(adev->dev, "VPE: failed to allocate cmdbuf bo %d\n", r); + return r; + } + + return 0; +} + static int vpe_sw_init(void *handle) { struct amdgpu_device *adev = (struct amdgpu_device *)handle; struct amdgpu_vpe *vpe = &adev->vpe; int ret; + ret = vpe_common_init(vpe); + if (ret) + goto out; + ret = vpe_irq_init(vpe); if (ret) goto out; @@ -157,6 +191,10 @@ static int vpe_sw_fini(void *handle) vpe_ring_fini(vpe); + amdgpu_bo_free_kernel(&adev->vpe.cmdbuf_obj, + &adev->vpe.cmdbuf_gpu_addr, + (void **)&adev->vpe.cmdbuf_cpu_addr); + return 0; } |