All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andres Rodriguez <andresx7-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org
Cc: andresx7-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org
Subject: [PATCH 15/26] drm/amdgpu: avoid KIQ clashing with compute or KFD queues
Date: Thu,  6 Apr 2017 02:21:28 -0400	[thread overview]
Message-ID: <20170406062139.3335-16-andresx7@gmail.com> (raw)
In-Reply-To: <20170406062139.3335-1-andresx7-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>

Instead of picking an arbitrary queue for KIQ, search for one according
to policy. The queue must be unused.

Also report the KIQ as an unavailable resource to KFD.

In testing I ran into KCQ initialization issues when using pipes 2/3 of
MEC2 for the KIQ. Therefore the policy disallows grabbing one of these.

Signed-off-by: Andres Rodriguez <andresx7@gmail.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu.h        | 23 +++++++++++++---
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c |  8 ++++++
 drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c      | 43 ++++++++++++++++++++++++------
 drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c      | 42 ++++++++++++++++++++++++-----
 4 files changed, 98 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 22c775d..6fc0e70 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -1778,31 +1778,48 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)
 	for (i = 0; i < adev->sdma.num_instances; i++)
 		if (&adev->sdma.instance[i].ring == ring)
 			break;
 
 	if (i < AMDGPU_MAX_SDMA_INSTANCES)
 		return &adev->sdma.instance[i];
 	else
 		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 += mec * adev->gfx.mec.num_pipe_per_mec
 		* adev->gfx.mec.num_queue_per_pipe;
 	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);
 }
 
 /*
  * ASICs macro.
  */
 #define amdgpu_asic_set_vga_state(adev, state) (adev)->asic_funcs->set_vga_state((adev), (state))
 #define amdgpu_asic_reset(adev) (adev)->asic_funcs->reset((adev))
 #define amdgpu_asic_get_xclk(adev) (adev)->asic_funcs->get_xclk((adev))
 #define amdgpu_asic_set_uvd_clocks(adev, v, d) (adev)->asic_funcs->set_uvd_clocks((adev), (v), (d))
 #define amdgpu_asic_set_vce_clocks(adev, ev, ec) (adev)->asic_funcs->set_vce_clocks((adev), (ev), (ec))
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
index 8fc5aa3..fe214b5 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
@@ -104,20 +104,28 @@ void amdgpu_amdkfd_device_init(struct amdgpu_device *adev)
 			.num_pipe_per_mec = adev->gfx.mec.num_pipe_per_mec,
 			.num_queue_per_pipe = adev->gfx.mec.num_queue_per_pipe
 		};
 
 		/* this is going to have a few of the MSBs set that we need to
 		 * clear */
 		bitmap_complement(gpu_resources.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
 				* adev->gfx.mec.num_pipe_per_mec
 				* adev->gfx.mec.num_queue_per_pipe;
 		for (i = last_valid_bit; i < KGD_MAX_QUEUES; ++i)
 			clear_bit(i, gpu_resources.queue_bitmap);
 
 		amdgpu_doorbell_get_kfd_info(adev,
 				&gpu_resources.doorbell_physical_address,
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
index 8fd1068..70119c5 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
@@ -1367,44 +1367,71 @@ static void gfx_v8_0_mec_fini(struct amdgpu_device *adev)
 		r = amdgpu_bo_reserve(adev->gfx.mec.hpd_eop_obj, false);
 		if (unlikely(r != 0))
 			dev_warn(adev->dev, "(%d) reserve HPD EOP bo failed\n", r);
 		amdgpu_bo_unpin(adev->gfx.mec.hpd_eop_obj);
 		amdgpu_bo_unreserve(adev->gfx.mec.hpd_eop_obj);
 		amdgpu_bo_unref(&adev->gfx.mec.hpd_eop_obj);
 		adev->gfx.mec.hpd_eop_obj = NULL;
 	}
 }
 
+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)
 {
 	struct amdgpu_kiq *kiq = &adev->gfx.kiq;
 	int r = 0;
 
 	r = amdgpu_wb_get(adev, &adev->virt.reg_val_offs);
 	if (r)
 		return r;
 
 	ring->adev = NULL;
 	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,
 			     irq, AMDGPU_CP_KIQ_IRQ_DRIVER0);
 	if (r)
 		dev_warn(adev->dev, "(%d) failed to init kiq ring\n", r);
 
 	return r;
 }
 static void gfx_v8_0_kiq_free_ring(struct amdgpu_ring *ring,
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
index 772311c..388a6bb 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
@@ -642,42 +642,70 @@ static int gfx_v9_0_kiq_init(struct amdgpu_device *adev)
 
 	r = amdgpu_bo_reserve(kiq->eop_obj, false);
 	if (unlikely(r != 0))
 		dev_warn(adev->dev, "(%d) reserve kiq eop bo failed\n", r);
 	amdgpu_bo_kunmap(kiq->eop_obj);
 	amdgpu_bo_unreserve(kiq->eop_obj);
 
 	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)
 {
 	struct amdgpu_kiq *kiq = &adev->gfx.kiq;
 	int r = 0;
 
 	r = amdgpu_wb_get(adev, &adev->virt.reg_val_offs);
 	if (r)
 		return r;
 
 	ring->adev = NULL;
 	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;
 
 	irq->data = ring;
 	ring->queue = 0;
 	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,
 			     irq, AMDGPU_CP_KIQ_IRQ_DRIVER0);
 	if (r)
 		dev_warn(adev->dev, "(%d) failed to init kiq ring\n", r);
 
-- 
2.9.3

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

  parent reply	other threads:[~2017-04-06  6:21 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-06  6:21 [PATCH] Add support for high priority scheduling in amdgpu v8 Andres Rodriguez
     [not found] ` <20170406062139.3335-1-andresx7-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-04-06  6:21   ` [PATCH 01/26] drm/amdgpu: refactor MQD/HQD initialization v2 Andres Rodriguez
     [not found]     ` <20170406062139.3335-2-andresx7-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-04-11 22:08       ` Alex Deucher
     [not found]         ` <CADnq5_PAth5UD1zq2dYvmFXgqE4s_OKY_VtHuKj467JDuyCHhA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2017-04-12 21:06           ` Andres Rodriguez
2017-04-11 22:18       ` Alex Deucher
     [not found]         ` <CADnq5_OdNy8hW8=WZouJBTtGjd261E9Boz6zL2L1o-GYegqP8Q-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2017-04-12 19:35           ` Andres Rodriguez
2017-04-12 21:17           ` Andres Rodriguez
2017-04-06  6:21   ` [PATCH 02/26] drm/amdgpu: doorbell registers need only be set once v2 Andres Rodriguez
     [not found]     ` <20170406062139.3335-3-andresx7-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-04-11 21:46       ` Alex Deucher
2017-04-06  6:21   ` [PATCH 03/26] drm/amdgpu: detect timeout error when deactivating hqd Andres Rodriguez
2017-04-06  6:21   ` [PATCH 04/26] drm/amdgpu: remove duplicate definition of cik_mqd Andres Rodriguez
2017-04-06  6:21   ` [PATCH 05/26] drm/amdgpu: unify MQD programming sequence for kfd and amdgpu Andres Rodriguez
     [not found]     ` <20170406062139.3335-6-andresx7-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-04-11 20:35       ` Felix Kuehling
2017-04-06  6:21   ` [PATCH 06/26] drm/amdgpu: rename rdev to adev Andres Rodriguez
2017-04-06  6:21   ` [PATCH 07/26] drm/amdgpu: take ownership of per-pipe configuration v2 Andres Rodriguez
2017-04-06  6:21   ` [PATCH 08/26] drm/radeon: take ownership of pipe initialization Andres Rodriguez
2017-04-06  6:21   ` [PATCH 09/26] drm/amdgpu: allow split of queues with kfd at queue granularity v3 Andres Rodriguez
     [not found]     ` <20170406062139.3335-10-andresx7-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-04-11 21:36       ` Felix Kuehling
2017-04-06  6:21   ` [PATCH 10/26] drm/amdgpu: teach amdgpu how to enable interrupts for any pipe v3 Andres Rodriguez
2017-04-06  6:21   ` [PATCH 11/26] drm/amdkfd: allow split HQD on per-queue granularity v4 Andres Rodriguez
2017-04-06  6:21   ` [PATCH 12/26] drm/amdgpu: remove duplicate magic constants from amdgpu_amdkfd_gfx*.c Andres Rodriguez
2017-04-06  6:21   ` [PATCH 13/26] drm/amdgpu: allocate queues horizontally across pipes Andres Rodriguez
2017-04-06  6:21   ` [PATCH 14/26] drm/amdgpu: remove hardcoded queue_mask in PACKET3_SET_RESOURCES v2 Andres Rodriguez
2017-04-06  6:21   ` Andres Rodriguez [this message]
     [not found]     ` <20170406062139.3335-16-andresx7-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-04-11 22:24       ` [PATCH 15/26] drm/amdgpu: avoid KIQ clashing with compute or KFD queues Felix Kuehling
2017-04-06  6:21   ` [PATCH 16/26] drm/amdgpu: new queue policy, take first 2 queues of each pipe Andres Rodriguez
     [not found]     ` <20170406062139.3335-17-andresx7-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-04-11 22:30       ` Felix Kuehling
     [not found]         ` <de2e972f-df8c-f3d2-1bc0-7336be3e67a8-5C7GfCeVMHo@public.gmane.org>
2017-04-12 19:06           ` Andres Rodriguez
2017-04-06  6:21   ` [PATCH 17/26] drm/amdgpu: untie user ring ids from kernel ring ids v5 Andres Rodriguez
2017-04-06  6:21   ` [PATCH 18/26] drm/amdgpu: implement lru amdgpu_queue_mgr policy for compute v4 Andres Rodriguez
2017-04-06  6:21   ` [PATCH 19/26] drm/amdgpu: add parameter to allocate high priority contexts v7 Andres Rodriguez
2017-04-06  6:21   ` [PATCH 20/26] drm/amdgpu: add framework for HW specific priority settings v6 Andres Rodriguez
2017-04-06  6:21   ` [PATCH 21/26] drm/amdgpu: convert srbm lock to a spinlock v2 Andres Rodriguez
     [not found]     ` <20170406062139.3335-22-andresx7-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-04-11 22:19       ` Alex Deucher
     [not found]         ` <CADnq5_OLYK+NzN9CZC4SDMnTKDxQpqH9MnT6jvNih3hVbOFBQw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2017-04-12  8:15           ` Christian König
2017-04-06  6:21   ` [PATCH 22/26] drm/amdgpu: implement ring set_priority for gfx_v8 compute v5 Andres Rodriguez
     [not found]     ` <20170406062139.3335-23-andresx7-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-04-11 22:35       ` Alex Deucher
2017-04-06  6:21   ` [PATCH 23/26] drm/amdgpu: condense mqd programming sequence Andres Rodriguez
2017-04-06  6:21   ` [PATCH 24/26] drm/amdgpu: workaround tonga HW bug in HQD " Andres Rodriguez
2017-04-06  6:21   ` [PATCH 25/26] drm/amdgpu: guarantee bijective mapping of ring ids for LRU v3 Andres Rodriguez
     [not found]     ` <20170406062139.3335-26-andresx7-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-04-12 17:59       ` Felix Kuehling
2017-04-06  6:21   ` [PATCH 26/26] drm/amdgpu: use LRU mapping policy for SDMA engines Andres Rodriguez
2017-04-11 22:31   ` [PATCH] Add support for high priority scheduling in amdgpu v8 Felix Kuehling
     [not found]     ` <65647f25-dfd4-a831-6808-cfb25f40d1c8-5C7GfCeVMHo@public.gmane.org>
2017-04-12 18:29       ` Andres Rodriguez

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170406062139.3335-16-andresx7@gmail.com \
    --to=andresx7-re5jqeeqqe8avxtiumwx3w@public.gmane.org \
    --cc=amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.