|
@@ -1378,6 +1378,37 @@ static void gfx_v8_0_mec_fini(struct amdgpu_device *adev)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static int gfx_v8_0_kiq_acquire(struct amdgpu_device *adev,
|
|
|
+ struct amdgpu_ring *ring)
|
|
|
+{
|
|
|
+ int queue_bit;
|
|
|
+ int mec, pipe, queue;
|
|
|
+
|
|
|
+ queue_bit = adev->gfx.mec.num_mec
|
|
|
+ * adev->gfx.mec.num_pipe_per_mec
|
|
|
+ * adev->gfx.mec.num_queue_per_pipe;
|
|
|
+
|
|
|
+ while (queue_bit-- >= 0) {
|
|
|
+ if (test_bit(queue_bit, adev->gfx.mec.queue_bitmap))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ amdgpu_bit_to_queue(adev, queue_bit, &mec, &pipe, &queue);
|
|
|
+
|
|
|
+ /* Using pipes 2/3 from MEC 2 seems cause problems */
|
|
|
+ if (mec == 1 && pipe > 1)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ ring->me = mec + 1;
|
|
|
+ ring->pipe = pipe;
|
|
|
+ ring->queue = queue;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ dev_err(adev->dev, "Failed to find a queue for KIQ\n");
|
|
|
+ return -EINVAL;
|
|
|
+}
|
|
|
+
|
|
|
static int gfx_v8_0_kiq_init_ring(struct amdgpu_device *adev,
|
|
|
struct amdgpu_ring *ring,
|
|
|
struct amdgpu_irq_src *irq)
|
|
@@ -1395,15 +1426,11 @@ static int gfx_v8_0_kiq_init_ring(struct amdgpu_device *adev,
|
|
|
ring->ring_obj = NULL;
|
|
|
ring->use_doorbell = true;
|
|
|
ring->doorbell_index = AMDGPU_DOORBELL_KIQ;
|
|
|
- if (adev->gfx.mec2_fw) {
|
|
|
- ring->me = 2;
|
|
|
- ring->pipe = 0;
|
|
|
- } else {
|
|
|
- ring->me = 1;
|
|
|
- ring->pipe = 1;
|
|
|
- }
|
|
|
|
|
|
- ring->queue = 0;
|
|
|
+ r = gfx_v8_0_kiq_acquire(adev, ring);
|
|
|
+ if (r)
|
|
|
+ return r;
|
|
|
+
|
|
|
ring->eop_gpu_addr = kiq->eop_gpu_addr;
|
|
|
sprintf(ring->name, "kiq %d.%d.%d", ring->me, ring->pipe, ring->queue);
|
|
|
r = amdgpu_ring_init(adev, ring, 1024,
|