[PATCH 08/12] drm/amdgpu: split gfx_v9_0_kiq_init_queue into two
Alex Deucher
alexdeucher at gmail.com
Tue May 2 14:35:13 UTC 2017
On Tue, May 2, 2017 at 4:34 AM, Liu, Monk <Monk.Liu at amd.com> wrote:
> Why only on GFX9?
>
> I think this logic should be equal to both GFX8/9
gfx8 is already split like this. This whole series is a port of the
gfx8 code to gfx9.
Alex
>
> -----Original Message-----
> From: amd-gfx [mailto:amd-gfx-bounces at lists.freedesktop.org] On Behalf Of Alex Deucher
> Sent: Tuesday, May 02, 2017 6:29 AM
> To: amd-gfx at lists.freedesktop.org
> Cc: Deucher, Alexander <Alexander.Deucher at amd.com>
> Subject: [PATCH 08/12] drm/amdgpu: split gfx_v9_0_kiq_init_queue into two
>
> One for KIQ and one for the KCQ. This simplifies the logic and allows for future optimizations.
>
> Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 63 +++++++++++++++++++++++------------
> 1 file changed, 42 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
> index ca30726..bc1a017 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
> @@ -2166,25 +2166,18 @@ static int gfx_v9_0_kiq_init_register(struct amdgpu_ring *ring) static int gfx_v9_0_kiq_init_queue(struct amdgpu_ring *ring) {
> struct amdgpu_device *adev = ring->adev;
> - struct amdgpu_kiq *kiq = &adev->gfx.kiq;
> struct v9_mqd *mqd = ring->mqd_ptr;
> - bool is_kiq = (ring->funcs->type == AMDGPU_RING_TYPE_KIQ);
> int mqd_idx = AMDGPU_MAX_COMPUTE_RINGS;
> int r;
>
> - if (is_kiq) {
> - gfx_v9_0_kiq_setting(&kiq->ring);
> - } else {
> - mqd_idx = ring - &adev->gfx.compute_ring[0];
> - }
> + gfx_v9_0_kiq_setting(ring);
>
> if (!adev->gfx.in_reset) {
> memset((void *)mqd, 0, sizeof(*mqd));
> mutex_lock(&adev->srbm_mutex);
> soc15_grbm_select(adev, ring->me, ring->pipe, ring->queue, 0);
> gfx_v9_0_mqd_init(ring);
> - if (is_kiq)
> - gfx_v9_0_kiq_init_register(ring);
> + gfx_v9_0_kiq_init_register(ring);
> soc15_grbm_select(adev, 0, 0, 0, 0);
> mutex_unlock(&adev->srbm_mutex);
>
> @@ -2199,19 +2192,47 @@ static int gfx_v9_0_kiq_init_queue(struct amdgpu_ring *ring)
> ring->wptr = 0;
> amdgpu_ring_clear_ring(ring);
>
> - if (is_kiq) {
> - mutex_lock(&adev->srbm_mutex);
> - soc15_grbm_select(adev, ring->me, ring->pipe, ring->queue, 0);
> - gfx_v9_0_kiq_init_register(ring);
> - soc15_grbm_select(adev, 0, 0, 0, 0);
> - mutex_unlock(&adev->srbm_mutex);
> - }
> + mutex_lock(&adev->srbm_mutex);
> + soc15_grbm_select(adev, ring->me, ring->pipe, ring->queue, 0);
> + gfx_v9_0_kiq_init_register(ring);
> + soc15_grbm_select(adev, 0, 0, 0, 0);
> + mutex_unlock(&adev->srbm_mutex);
> }
>
> - if (is_kiq)
> - r = gfx_v9_0_kiq_enable(ring);
> - else
> - r = gfx_v9_0_map_queue_enable(&kiq->ring, ring);
> + r = gfx_v9_0_kiq_enable(ring);
> +
> + return r;
> +}
> +
> +static int gfx_v9_0_kcq_init_queue(struct amdgpu_ring *ring) {
> + struct amdgpu_device *adev = ring->adev;
> + struct amdgpu_kiq *kiq = &adev->gfx.kiq;
> + struct v9_mqd *mqd = ring->mqd_ptr;
> + int mqd_idx = ring - &adev->gfx.compute_ring[0];
> + int r;
> +
> + if (!adev->gfx.in_reset) {
> + memset((void *)mqd, 0, sizeof(*mqd));
> + mutex_lock(&adev->srbm_mutex);
> + soc15_grbm_select(adev, ring->me, ring->pipe, ring->queue, 0);
> + gfx_v9_0_mqd_init(ring);
> + soc15_grbm_select(adev, 0, 0, 0, 0);
> + mutex_unlock(&adev->srbm_mutex);
> +
> + if (adev->gfx.mec.mqd_backup[mqd_idx])
> + memcpy(adev->gfx.mec.mqd_backup[mqd_idx], mqd, sizeof(*mqd));
> + } else { /* for GPU_RESET case */
> + /* reset MQD to a clean status */
> + if (adev->gfx.mec.mqd_backup[mqd_idx])
> + memcpy(mqd, adev->gfx.mec.mqd_backup[mqd_idx], sizeof(*mqd));
> +
> + /* reset ring buffer */
> + ring->wptr = 0;
> + amdgpu_ring_clear_ring(ring);
> + }
> +
> + r = gfx_v9_0_map_queue_enable(&kiq->ring, ring);
>
> return r;
> }
> @@ -2247,7 +2268,7 @@ static int gfx_v9_0_kiq_resume(struct amdgpu_device *adev)
> goto done;
> r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
> if (!r) {
> - r = gfx_v9_0_kiq_init_queue(ring);
> + r = gfx_v9_0_kcq_init_queue(ring);
> amdgpu_bo_kunmap(ring->mqd_obj);
> ring->mqd_ptr = NULL;
> }
> --
> 2.5.5
>
> _______________________________________________
> 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