Load firmware and initialize uvd ring Signed-off-by: Piotr Redlewski <predlewski at gmail.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 14 ++++++++++++ drivers/gpu/drm/amd/amdgpu/uvd_v4_0.c | 40 +++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c index be607b2be4e9..59ae2f2012ad 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c @@ -52,6 +52,9 @@ #define FW_1_66_16 ((1 << 24) | (66 << 16) | (16 << 8)) /* Firmware Names */ +#ifdef CONFIG_DRM_AMDGPU_SI +#define FIRMWARE_TAHITI "radeon/tahiti_uvd.bin" +#endif #ifdef CONFIG_DRM_AMDGPU_CIK #define FIRMWARE_BONAIRE "radeon/bonaire_uvd.bin" #define FIRMWARE_KABINI "radeon/kabini_uvd.bin" @@ -94,6 +97,9 @@ struct amdgpu_uvd_cs_ctx { unsigned *buf_sizes; }; +#ifdef CONFIG_DRM_AMDGPU_SI +MODULE_FIRMWARE(FIRMWARE_TAHITI); +#endif #ifdef CONFIG_DRM_AMDGPU_CIK MODULE_FIRMWARE(FIRMWARE_BONAIRE); MODULE_FIRMWARE(FIRMWARE_KABINI); @@ -126,6 +132,14 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev) INIT_DELAYED_WORK(&adev->uvd.idle_work, amdgpu_uvd_idle_work_handler); switch (adev->asic_type) { +#ifdef CONFIG_DRM_AMDGPU_SI + case CHIP_TAHITI: + case CHIP_VERDE: + case CHIP_PITCAIRN: + case CHIP_OLAND: + fw_name = FIRMWARE_TAHITI; + break; +#endif #ifdef CONFIG_DRM_AMDGPU_CIK case CHIP_BONAIRE: fw_name = FIRMWARE_BONAIRE; diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v4_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v4_0.c index 127269a0a90c..cfa6959db43d 100644 --- a/drivers/gpu/drm/amd/amdgpu/uvd_v4_0.c +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v4_0.c @@ -91,6 +91,44 @@ static int uvd_v4_0_early_init(void *handle) return 0; } +static int uvd_v4_0_sw_init(void *handle) +{ + struct amdgpu_ring *ring; + struct amdgpu_device *adev = (struct amdgpu_device *)handle; + int r; + + /* UVD TRAP */ + r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 124, &adev->uvd.irq); + if (r) + return r; + + r = amdgpu_uvd_sw_init(adev); + if (r) + return r; + + r = amdgpu_uvd_resume(adev); + if (r) + return r; + + ring = &adev->uvd.ring; + sprintf(ring->name, "uvd"); + r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.irq, 0); + + return r; +} + +static int uvd_v4_0_sw_fini(void *handle) +{ + int r; + struct amdgpu_device *adev = (struct amdgpu_device *)handle; + + r = amdgpu_uvd_suspend(adev); + if (r) + return r; + + return amdgpu_uvd_sw_fini(adev); +} + /** * uvd_v4_0_ring_emit_fence - emit an fence & trap command * @@ -229,6 +267,8 @@ static const struct amd_ip_funcs uvd_v4_0_ip_funcs = { .name = "uvd_v4_0", .early_init = uvd_v4_0_early_init, .late_init = NULL, + .sw_init = uvd_v4_0_sw_init, + .sw_fini = uvd_v4_0_sw_fini, }; static const struct amdgpu_ring_funcs uvd_v4_0_ring_funcs = { -- 2.15.0