[PATCH 2/4] drm/amdkfd: Use asic specifc function to set CP wait time

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Currently, grace period (SCH_WAVE) is set only for gfx943 APU. This
could change as other wait times also needs to be set. Move ASIC
specific settings to ASIC specific function.

Signed-off-by: Harish Kasiviswanathan <Harish.Kasiviswanathan@xxxxxxx>
---
 .../drm/amd/amdkfd/kfd_device_queue_manager.c | 28 ++++---------------
 .../drm/amd/amdkfd/kfd_device_queue_manager.h |  9 ++++++
 .../gpu/drm/amd/amdkfd/kfd_packet_manager.c   |  8 ++++++
 .../drm/amd/amdkfd/kfd_packet_manager_v9.c    | 10 +++++++
 4 files changed, 32 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
index b88a95b5ae0d..3eaa44d0410d 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
@@ -1760,10 +1760,7 @@ static int initialize_cpsch(struct device_queue_manager *dqm)
 
 	init_sdma_bitmaps(dqm);
 
-	if (dqm->dev->kfd2kgd->get_iq_wait_times)
-		dqm->dev->kfd2kgd->get_iq_wait_times(dqm->dev->adev,
-					&dqm->wait_times,
-					ffs(dqm->dev->xcc_mask) - 1);
+	update_dqm_wait_times(dqm);
 	return 0;
 }
 
@@ -1859,27 +1856,12 @@ static int start_cpsch(struct device_queue_manager *dqm)
 	/* clear hang status when driver try to start the hw scheduler */
 	dqm->sched_running = true;
 
-	if (!dqm->dev->kfd->shared_resources.enable_mes)
+	if (!dqm->dev->kfd->shared_resources.enable_mes) {
+		if(pm_set_compute_queue_wait_counts(&dqm->packet_mgr,
+					    KFD_INIT_CP_QUEUE_WAIT_TIMES))
+			dev_err(dev, "Failed to configure CP wait times\n");
 		execute_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0, KFD_SET_DEFAULT_CP_QUEUE_WAIT_TIMES);
-
-	/* Set CWSR grace period to 1x1000 cycle for GFX9.4.3 APU */
-	if (amdgpu_emu_mode == 0 && dqm->dev->adev->gmc.is_app_apu &&
-	    (KFD_GC_VERSION(dqm->dev) == IP_VERSION(9, 4, 3))) {
-		uint32_t reg_offset = 0;
-		uint32_t grace_period = 1;
-
-		retval = pm_set_compute_queue_wait_counts(&dqm->packet_mgr,
-						grace_period);
-		if (retval)
-			dev_err(dev, "Setting grace timeout failed\n");
-		else if (dqm->dev->kfd2kgd->build_grace_period_packet_info)
-			/* Update dqm->wait_times maintained in software */
-			dqm->dev->kfd2kgd->build_grace_period_packet_info(
-					dqm->dev->adev,	dqm->wait_times,
-					grace_period, &reg_offset,
-					&dqm->wait_times);
 	}
-
 	/* setup per-queue reset detection buffer  */
 	num_hw_queue_slots =  dqm->dev->kfd->shared_resources.num_queue_per_pipe *
 			      dqm->dev->kfd->shared_resources.num_pipe_per_mec *
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h
index 273c04a95568..8a7d9b2a135c 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h
@@ -38,6 +38,7 @@
 #define KFD_MES_PROCESS_QUANTUM		100000
 #define KFD_MES_GANG_QUANTUM		10000
 #define KFD_SET_DEFAULT_CP_QUEUE_WAIT_TIMES 0xffffffff
+#define KFD_INIT_CP_QUEUE_WAIT_TIMES	    0xfffffffe
 
 struct device_process_node {
 	struct qcm_process_device *qpd;
@@ -359,4 +360,12 @@ static inline int read_sdma_queue_counter(uint64_t __user *q_rptr, uint64_t *val
 	/* SDMA activity counter is stored at queue's RPTR + 0x8 location. */
 	return get_user(*val, q_rptr + 1);
 }
+
+static inline void update_dqm_wait_times(struct device_queue_manager *dqm)
+{
+	if (dqm->dev->kfd2kgd->get_iq_wait_times)
+		dqm->dev->kfd2kgd->get_iq_wait_times(dqm->dev->adev,
+					&dqm->wait_times,
+					ffs(dqm->dev->xcc_mask) - 1);
+}
 #endif /* KFD_DEVICE_QUEUE_MANAGER_H_ */
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c
index 8d2f63a38724..e94ed478bf5e 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c
@@ -402,6 +402,8 @@ int pm_send_query_status(struct packet_manager *pm, uint64_t fence_address,
  *  @wait_counts_config: Parameter overridden. Could be flag or grace_period
  *   Possible flag values:
  *     KFD_SET_DEFAULT_CP_QUEUE_WAIT_TIMES then reset to default value
+ *     KFD_INIT_CP_QUEUE_WAIT_TIMES Initialize compute queue wait times with
+ *      best values for each ASIC.
  *
  *   If not an above flag, Wait Count for Scheduling Wave Message (SCH_WAVE)
  *      is set to wait_counts_config value.
@@ -415,6 +417,10 @@ int pm_set_compute_queue_wait_counts(struct packet_manager *pm, uint32_t wait_co
 	int retval = 0;
 	uint32_t *buffer, size;
 
+	if (!pm->pmf->set_compute_queue_wait_counts ||
+	    !pm->pmf->set_compute_queue_wait_counts_size)
+		return 0;
+
 	size = pm->pmf->set_compute_queue_wait_counts_size;
 
 	mutex_lock(&pm->lock);
@@ -440,6 +446,8 @@ int pm_set_compute_queue_wait_counts(struct packet_manager *pm, uint32_t wait_co
 
 out:
 	mutex_unlock(&pm->lock);
+	/* Update dqm->wait_times maintained in software */
+	update_dqm_wait_times(pm->dqm);
 	return retval;
 }
 
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager_v9.c b/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager_v9.c
index 8b693a9446e8..6a5ddadec936 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager_v9.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager_v9.c
@@ -302,9 +302,19 @@ static int pm_set_compute_queue_wait_counts_v9(struct packet_manager *pm,
 		uint32_t wait_counts_config)
 {
 	struct pm4_mec_write_data_mmio *packet;
+	struct device_queue_manager *dqm = pm->dqm;
 	uint32_t reg_offset = 0;
 	uint32_t reg_data = 0;
 
+	if (wait_counts_config == KFD_INIT_CP_QUEUE_WAIT_TIMES) {
+                /* Set CWSR grace period to 1x1000 cycle for GFX9.4.3 APU */
+                if (amdgpu_emu_mode == 0 && dqm->dev->adev->gmc.is_app_apu &&
+                    KFD_GC_VERSION(dqm->dev) == IP_VERSION(9, 4, 3))
+                        wait_counts_config = 1;
+                else
+                        return 0;
+        }
+
 	pm->dqm->dev->kfd2kgd->build_grace_period_packet_info(
 			pm->dqm->dev->adev,
 			pm->dqm->wait_times,
-- 
2.34.1




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux