OSDN Git Service

drm/amdgpu: acquire available gfx queues
authorHawking Zhang <Hawking.Zhang@amd.com>
Wed, 8 Aug 2018 07:16:43 +0000 (15:16 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 21 Jun 2019 02:20:17 +0000 (21:20 -0500)
currently, amdgpu will owns the first gfx queue of each pipe
they are:
me:0 pipe:0 queue:0
me:0 pipe:1 queue:0

Signed-off-by: Hawking Zhang <Hawking.Zhang@amd.com>
Reviewed-by: Jack Xiao <jack.xiao@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Acked-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h

index 997932e..855eff8 100644 (file)
@@ -199,6 +199,30 @@ void amdgpu_gfx_compute_queue_acquire(struct amdgpu_device *adev)
                adev->gfx.num_compute_rings = AMDGPU_MAX_COMPUTE_RINGS;
 }
 
+void amdgpu_gfx_graphics_queue_acquire(struct amdgpu_device *adev)
+{
+       int i, queue, pipe, me;
+
+       for (i = 0; i < AMDGPU_MAX_GFX_QUEUES; ++i) {
+               queue = i % adev->gfx.me.num_queue_per_pipe;
+               pipe = (i / adev->gfx.me.num_queue_per_pipe)
+                       % adev->gfx.me.num_pipe_per_me;
+               me = (i / adev->gfx.me.num_queue_per_pipe)
+                     / adev->gfx.me.num_pipe_per_me;
+
+               if (me >= adev->gfx.me.num_me)
+                       break;
+               /* policy: amdgpu owns the first queue per pipe at this stage
+                * will extend to mulitple queues per pipe later */
+               if (me == 0 && queue < 1)
+                       set_bit(i, adev->gfx.me.queue_bitmap);
+       }
+
+       /* update the number of active graphics rings */
+       adev->gfx.num_gfx_rings =
+               bitmap_weight(adev->gfx.me.queue_bitmap, AMDGPU_MAX_GFX_QUEUES);
+}
+
 static int amdgpu_gfx_kiq_acquire(struct amdgpu_device *adev,
                                  struct amdgpu_ring *ring)
 {
index 68f7d3c..1c5d12e 100644 (file)
@@ -335,6 +335,8 @@ int amdgpu_gfx_compute_mqd_sw_init(struct amdgpu_device *adev,
 void amdgpu_gfx_compute_mqd_sw_fini(struct amdgpu_device *adev);
 
 void amdgpu_gfx_compute_queue_acquire(struct amdgpu_device *adev);
+void amdgpu_gfx_graphics_queue_acquire(struct amdgpu_device *adev);
+
 int amdgpu_gfx_queue_to_bit(struct amdgpu_device *adev, int mec,
                            int pipe, int queue);
 void amdgpu_gfx_bit_to_queue(struct amdgpu_device *adev, int bit,