return NULL;
 }
 
-static inline bool amdgpu_is_mec_queue_enabled(struct amdgpu_device *adev,
-                                               int mec, int pipe, int queue)
+static inline int amdgpu_queue_to_bit(struct amdgpu_device *adev,
+                                     int mec, int pipe, int queue)
 {
        int bit = 0;
 
        bit += pipe * adev->gfx.mec.num_queue_per_pipe;
        bit += queue;
 
-       return test_bit(bit, adev->gfx.mec.queue_bitmap);
+       return bit;
+}
+
+static inline void amdgpu_bit_to_queue(struct amdgpu_device *adev, int bit,
+                                      int *mec, int *pipe, int *queue)
+{
+       *queue = bit % adev->gfx.mec.num_queue_per_pipe;
+       *pipe = (bit / adev->gfx.mec.num_queue_per_pipe)
+               % adev->gfx.mec.num_pipe_per_mec;
+       *mec = (bit / adev->gfx.mec.num_queue_per_pipe)
+              / adev->gfx.mec.num_pipe_per_mec;
+
+}
+static inline bool amdgpu_is_mec_queue_enabled(struct amdgpu_device *adev,
+                                              int mec, int pipe, int queue)
+{
+       return test_bit(amdgpu_queue_to_bit(adev, mec, pipe, queue),
+                       adev->gfx.mec.queue_bitmap);
 }
 
 /*
 
                                  adev->gfx.mec.queue_bitmap,
                                  KGD_MAX_QUEUES);
 
+               /* remove the KIQ bit as well */
+               if (adev->gfx.kiq.ring.ready)
+                       clear_bit(amdgpu_queue_to_bit(adev,
+                                                     adev->gfx.kiq.ring.me - 1,
+                                                     adev->gfx.kiq.ring.pipe,
+                                                     adev->gfx.kiq.ring.queue),
+                                 gpu_resources.queue_bitmap);
+
                /* According to linux/bitmap.h we shouldn't use bitmap_clear if
                 * nbits is not compile time constant */
                last_valid_bit = adev->gfx.mec.num_mec
 
        }
 }
 
+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)
        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,
 
        return 0;
 }
 
+static int gfx_v9_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_v9_0_kiq_init_ring(struct amdgpu_device *adev,
                                  struct amdgpu_ring *ring,
                                  struct amdgpu_irq_src *irq)
        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;
-       }
+
+       r = gfx_v9_0_kiq_acquire(adev, ring);
+       if (r)
+               return r;
 
        ring->queue = 0;
        ring->eop_gpu_addr = kiq->eop_gpu_addr;