[PATCH 3/4] drm/amdgpu: move UVD IB test into common code

Alex Deucher alexdeucher at gmail.com
Wed Jul 13 20:28:35 UTC 2016


On Wed, Jul 13, 2016 at 3:08 PM, Christian König
<deathsimple at vodafone.de> wrote:
> From: Christian König <christian.koenig at amd.com>
>
> Since we now raise the clocks from emit_fence() we don't need
> a separate function for each hw generation any more.
>
> Signed-off-by: Christian König <christian.koenig at amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 37 +++++++++++++++++++++++++++
>  drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h |  1 +
>  drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c   | 45 +--------------------------------
>  drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c   | 45 +--------------------------------
>  drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c   | 37 +--------------------------
>  5 files changed, 41 insertions(+), 124 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
> index 078a7e4..69a8400 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
> @@ -1127,3 +1127,40 @@ void amdgpu_uvd_note_usage(struct amdgpu_device *adev)
>                 }
>         }
>  }
> +
> +/**
> + * amdgpu_uvd_ring_test_ib - test ib execution
> + *
> + * @ring: amdgpu_ring pointer
> + *
> + * Test if we can successfully execute an IB
> + */
> +int amdgpu_uvd_ring_test_ib(struct amdgpu_ring *ring)
> +{
> +       struct amdgpu_device *adev = ring->adev;
> +       struct fence *fence = NULL;
> +       int r;
> +
> +       r = amdgpu_uvd_get_create_msg(ring, 1, NULL);
> +       if (r) {
> +               DRM_ERROR("amdgpu: failed to get create msg (%d).\n", r);
> +               goto error;
> +       }
> +
> +       r = amdgpu_uvd_get_destroy_msg(ring, 1, true, &fence);
> +       if (r) {
> +               DRM_ERROR("amdgpu: failed to get destroy ib (%d).\n", r);
> +               goto error;
> +       }
> +
> +       r = fence_wait(fence, false);
> +       if (r) {
> +               DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
> +               goto error;
> +       }
> +       DRM_INFO("ib test on ring %d succeeded\n",  ring->idx);
> +error:
> +       fence_put(fence);
> +       amdgpu_asic_set_uvd_clocks(adev, 0, 0);

note_usage either sets the clocks or ungate/enables uvd dpm/etc.
depending on what the asic supports.  It would probably be better to
call amdgpu_uvd_idle_work_handler() or something similar here rather
than manually setting the clocks.

Alex


> +       return r;
> +}
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
> index 1375b21..03088fe 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
> @@ -36,5 +36,6 @@ void amdgpu_uvd_free_handles(struct amdgpu_device *adev,
>                              struct drm_file *filp);
>  int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser *parser, uint32_t ib_idx);
>  void amdgpu_uvd_note_usage(struct amdgpu_device *adev);
> +int amdgpu_uvd_ring_test_ib(struct amdgpu_ring *ring);
>
>  #endif
> diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c b/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c
> index a762158..d9bdd39 100644
> --- a/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c
> +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c
> @@ -529,49 +529,6 @@ static void uvd_v4_2_ring_emit_ib(struct amdgpu_ring *ring,
>  }
>
>  /**
> - * uvd_v4_2_ring_test_ib - test ib execution
> - *
> - * @ring: amdgpu_ring pointer
> - *
> - * Test if we can successfully execute an IB
> - */
> -static int uvd_v4_2_ring_test_ib(struct amdgpu_ring *ring)
> -{
> -       struct amdgpu_device *adev = ring->adev;
> -       struct fence *fence = NULL;
> -       int r;
> -
> -       r = amdgpu_asic_set_uvd_clocks(adev, 53300, 40000);
> -       if (r) {
> -               DRM_ERROR("amdgpu: failed to raise UVD clocks (%d).\n", r);
> -               return r;
> -       }
> -
> -       r = amdgpu_uvd_get_create_msg(ring, 1, NULL);
> -       if (r) {
> -               DRM_ERROR("amdgpu: failed to get create msg (%d).\n", r);
> -               goto error;
> -       }
> -
> -       r = amdgpu_uvd_get_destroy_msg(ring, 1, true, &fence);
> -       if (r) {
> -               DRM_ERROR("amdgpu: failed to get destroy ib (%d).\n", r);
> -               goto error;
> -       }
> -
> -       r = fence_wait(fence, false);
> -       if (r) {
> -               DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
> -               goto error;
> -       }
> -       DRM_INFO("ib test on ring %d succeeded\n",  ring->idx);
> -error:
> -       fence_put(fence);
> -       amdgpu_asic_set_uvd_clocks(adev, 0, 0);
> -       return r;
> -}
> -
> -/**
>   * uvd_v4_2_mc_resume - memory controller programming
>   *
>   * @adev: amdgpu_device pointer
> @@ -796,7 +753,7 @@ static const struct amdgpu_ring_funcs uvd_v4_2_ring_funcs = {
>         .emit_hdp_flush = uvd_v4_2_ring_emit_hdp_flush,
>         .emit_hdp_invalidate = uvd_v4_2_ring_emit_hdp_invalidate,
>         .test_ring = uvd_v4_2_ring_test_ring,
> -       .test_ib = uvd_v4_2_ring_test_ib,
> +       .test_ib = amdgpu_ring_test_ib,
>         .insert_nop = amdgpu_ring_insert_nop,
>         .pad_ib = amdgpu_ring_generic_pad_ib,
>  };
> diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c
> index b45fea9..d3909a7 100644
> --- a/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c
> @@ -579,49 +579,6 @@ static void uvd_v5_0_ring_emit_ib(struct amdgpu_ring *ring,
>         amdgpu_ring_write(ring, ib->length_dw);
>  }
>
> -/**
> - * uvd_v5_0_ring_test_ib - test ib execution
> - *
> - * @ring: amdgpu_ring pointer
> - *
> - * Test if we can successfully execute an IB
> - */
> -static int uvd_v5_0_ring_test_ib(struct amdgpu_ring *ring)
> -{
> -       struct amdgpu_device *adev = ring->adev;
> -       struct fence *fence = NULL;
> -       int r;
> -
> -       r = amdgpu_asic_set_uvd_clocks(adev, 53300, 40000);
> -       if (r) {
> -               DRM_ERROR("amdgpu: failed to raise UVD clocks (%d).\n", r);
> -               return r;
> -       }
> -
> -       r = amdgpu_uvd_get_create_msg(ring, 1, NULL);
> -       if (r) {
> -               DRM_ERROR("amdgpu: failed to get create msg (%d).\n", r);
> -               goto error;
> -       }
> -
> -       r = amdgpu_uvd_get_destroy_msg(ring, 1, true, &fence);
> -       if (r) {
> -               DRM_ERROR("amdgpu: failed to get destroy ib (%d).\n", r);
> -               goto error;
> -       }
> -
> -       r = fence_wait(fence, false);
> -       if (r) {
> -               DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
> -               goto error;
> -       }
> -       DRM_INFO("ib test on ring %d succeeded\n",  ring->idx);
> -error:
> -       fence_put(fence);
> -       amdgpu_asic_set_uvd_clocks(adev, 0, 0);
> -       return r;
> -}
> -
>  static bool uvd_v5_0_is_idle(void *handle)
>  {
>         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
> @@ -847,7 +804,7 @@ static const struct amdgpu_ring_funcs uvd_v5_0_ring_funcs = {
>         .emit_hdp_flush = uvd_v5_0_ring_emit_hdp_flush,
>         .emit_hdp_invalidate = uvd_v5_0_ring_emit_hdp_invalidate,
>         .test_ring = uvd_v5_0_ring_test_ring,
> -       .test_ib = uvd_v5_0_ring_test_ib,
> +       .test_ib = amdgpu_uvd_ring_test_ib,
>         .insert_nop = amdgpu_ring_insert_nop,
>         .pad_ib = amdgpu_ring_generic_pad_ib,
>  };
> diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
> index f643fec2..69439ab 100644
> --- a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
> @@ -682,41 +682,6 @@ static void uvd_v6_0_ring_emit_ib(struct amdgpu_ring *ring,
>         amdgpu_ring_write(ring, ib->length_dw);
>  }
>
> -/**
> - * uvd_v6_0_ring_test_ib - test ib execution
> - *
> - * @ring: amdgpu_ring pointer
> - *
> - * Test if we can successfully execute an IB
> - */
> -static int uvd_v6_0_ring_test_ib(struct amdgpu_ring *ring)
> -{
> -       struct fence *fence = NULL;
> -       int r;
> -
> -       r = amdgpu_uvd_get_create_msg(ring, 1, NULL);
> -       if (r) {
> -               DRM_ERROR("amdgpu: failed to get create msg (%d).\n", r);
> -               goto error;
> -       }
> -
> -       r = amdgpu_uvd_get_destroy_msg(ring, 1, true, &fence);
> -       if (r) {
> -               DRM_ERROR("amdgpu: failed to get destroy ib (%d).\n", r);
> -               goto error;
> -       }
> -
> -       r = fence_wait(fence, false);
> -       if (r) {
> -               DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
> -               goto error;
> -       }
> -       DRM_INFO("ib test on ring %d succeeded\n",  ring->idx);
> -error:
> -       fence_put(fence);
> -       return r;
> -}
> -
>  static bool uvd_v6_0_is_idle(void *handle)
>  {
>         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
> @@ -963,7 +928,7 @@ static const struct amdgpu_ring_funcs uvd_v6_0_ring_funcs = {
>         .emit_hdp_flush = uvd_v6_0_ring_emit_hdp_flush,
>         .emit_hdp_invalidate = uvd_v6_0_ring_emit_hdp_invalidate,
>         .test_ring = uvd_v6_0_ring_test_ring,
> -       .test_ib = uvd_v6_0_ring_test_ib,
> +       .test_ib = amdgpu_uvd_ring_test_ib,
>         .insert_nop = amdgpu_ring_insert_nop,
>         .pad_ib = amdgpu_ring_generic_pad_ib,
>  };
> --
> 2.5.0
>
> _______________________________________________
> 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