[PATCH 11/11] drm/amdgpu/uvd7: add UVD hw init sequences for sriov
Deucher, Alexander
Alexander.Deucher at amd.com
Mon Apr 24 15:59:26 UTC 2017
> -----Original Message-----
> From: amd-gfx [mailto:amd-gfx-bounces at lists.freedesktop.org] On Behalf
> Of Xiangliang Yu
> Sent: Monday, April 24, 2017 2:58 AM
> To: amd-gfx at lists.freedesktop.org
> Cc: Yu, Xiangliang; Min, Frank
> Subject: [PATCH 11/11] drm/amdgpu/uvd7: add UVD hw init sequences for
> sriov
>
> From: Frank Min <Frank.Min at amd.com>
>
> Add UVD hw init.
>
> Signed-off-by: Frank Min <Frank.Min at amd.com>
> Signed-off-by: Xiangliang Yu <Xiangliang.Yu at amd.com>
This needs to land before patch 6 as well. With that fixed:
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c | 92 ++++++++++++++++++++--
> -------------
> 1 file changed, 54 insertions(+), 38 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c
> b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c
> index a294f05..e0b7ded 100644
> --- a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c
> @@ -368,7 +368,10 @@ static int uvd_v7_0_early_init(void *handle)
> {
> struct amdgpu_device *adev = (struct amdgpu_device *)handle;
>
> - adev->uvd.num_enc_rings = 2;
> + if (amdgpu_sriov_vf(adev))
> + adev->uvd.num_enc_rings = 1;
> + else
> + adev->uvd.num_enc_rings = 2;
> uvd_v7_0_set_ring_funcs(adev);
> uvd_v7_0_set_enc_ring_funcs(adev);
> uvd_v7_0_set_irq_funcs(adev);
> @@ -421,12 +424,14 @@ static int uvd_v7_0_sw_init(void *handle)
> r = amdgpu_uvd_resume(adev);
> if (r)
> return r;
> + if (!amdgpu_sriov_vf(adev)) {
> + ring = &adev->uvd.ring;
> + sprintf(ring->name, "uvd");
> + r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.irq, 0);
> + if (r)
> + return r;
> + }
>
> - ring = &adev->uvd.ring;
> - sprintf(ring->name, "uvd");
> - r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.irq, 0);
> - if (r)
> - return r;
>
> for (i = 0; i < adev->uvd.num_enc_rings; ++i) {
> ring = &adev->uvd.ring_enc[i];
> @@ -445,6 +450,10 @@ static int uvd_v7_0_sw_init(void *handle)
> return r;
> }
>
> + r = amdgpu_virt_alloc_mm_table(adev);
> + if (r)
> + return r;
> +
> return r;
> }
>
> @@ -453,6 +462,8 @@ static int uvd_v7_0_sw_fini(void *handle)
> int i, r;
> struct amdgpu_device *adev = (struct amdgpu_device *)handle;
>
> + amdgpu_virt_free_mm_table(adev);
> +
> r = amdgpu_uvd_suspend(adev);
> if (r)
> return r;
> @@ -479,48 +490,53 @@ static int uvd_v7_0_hw_init(void *handle)
> uint32_t tmp;
> int i, r;
>
> - r = uvd_v7_0_start(adev);
> + if (amdgpu_sriov_vf(adev))
> + r = uvd_v7_0_sriov_start(adev);
> + else
> + r = uvd_v7_0_start(adev);
> if (r)
> goto done;
>
> - ring->ready = true;
> - r = amdgpu_ring_test_ring(ring);
> - if (r) {
> - ring->ready = false;
> - goto done;
> - }
> + if (!amdgpu_sriov_vf(adev)) {
> + ring->ready = true;
> + r = amdgpu_ring_test_ring(ring);
> + if (r) {
> + ring->ready = false;
> + goto done;
> + }
>
> - r = amdgpu_ring_alloc(ring, 10);
> - if (r) {
> - DRM_ERROR("amdgpu: ring failed to lock UVD ring (%d).\n",
> r);
> - goto done;
> - }
> + r = amdgpu_ring_alloc(ring, 10);
> + if (r) {
> + DRM_ERROR("amdgpu: ring failed to lock UVD ring
> (%d).\n", r);
> + goto done;
> + }
>
> - tmp = PACKET0(SOC15_REG_OFFSET(UVD, 0,
> - mmUVD_SEMA_WAIT_FAULT_TIMEOUT_CNTL), 0);
> - amdgpu_ring_write(ring, tmp);
> - amdgpu_ring_write(ring, 0xFFFFF);
> + tmp = PACKET0(SOC15_REG_OFFSET(UVD, 0,
> + mmUVD_SEMA_WAIT_FAULT_TIMEOUT_CNTL), 0);
> + amdgpu_ring_write(ring, tmp);
> + amdgpu_ring_write(ring, 0xFFFFF);
>
> - tmp = PACKET0(SOC15_REG_OFFSET(UVD, 0,
> - mmUVD_SEMA_WAIT_INCOMPLETE_TIMEOUT_CNTL), 0);
> - amdgpu_ring_write(ring, tmp);
> - amdgpu_ring_write(ring, 0xFFFFF);
> + tmp = PACKET0(SOC15_REG_OFFSET(UVD, 0,
> +
> mmUVD_SEMA_WAIT_INCOMPLETE_TIMEOUT_CNTL), 0);
> + amdgpu_ring_write(ring, tmp);
> + amdgpu_ring_write(ring, 0xFFFFF);
>
> - tmp = PACKET0(SOC15_REG_OFFSET(UVD, 0,
> - mmUVD_SEMA_SIGNAL_INCOMPLETE_TIMEOUT_CNTL), 0);
> - amdgpu_ring_write(ring, tmp);
> - amdgpu_ring_write(ring, 0xFFFFF);
> + tmp = PACKET0(SOC15_REG_OFFSET(UVD, 0,
> +
> mmUVD_SEMA_SIGNAL_INCOMPLETE_TIMEOUT_CNTL), 0);
> + amdgpu_ring_write(ring, tmp);
> + amdgpu_ring_write(ring, 0xFFFFF);
>
> - /* Clear timeout status bits */
> - amdgpu_ring_write(ring, PACKET0(SOC15_REG_OFFSET(UVD, 0,
> - mmUVD_SEMA_TIMEOUT_STATUS), 0));
> - amdgpu_ring_write(ring, 0x8);
> + /* Clear timeout status bits */
> + amdgpu_ring_write(ring,
> PACKET0(SOC15_REG_OFFSET(UVD, 0,
> + mmUVD_SEMA_TIMEOUT_STATUS), 0));
> + amdgpu_ring_write(ring, 0x8);
>
> - amdgpu_ring_write(ring, PACKET0(SOC15_REG_OFFSET(UVD, 0,
> - mmUVD_SEMA_CNTL), 0));
> - amdgpu_ring_write(ring, 3);
> + amdgpu_ring_write(ring,
> PACKET0(SOC15_REG_OFFSET(UVD, 0,
> + mmUVD_SEMA_CNTL), 0));
> + amdgpu_ring_write(ring, 3);
>
> - amdgpu_ring_commit(ring);
> + amdgpu_ring_commit(ring);
> + }
>
> for (i = 0; i < adev->uvd.num_enc_rings; ++i) {
> ring = &adev->uvd.ring_enc[i];
> --
> 2.7.4
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
More information about the amd-gfx
mailing list