aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelix Kuehling <Felix.Kuehling@amd.com>2018-01-04 17:17:45 -0500
committerOded Gabbay <oded.gabbay@gmail.com>2018-01-04 17:17:45 -0500
commitee04955af6b851a4f133d2472bc65c5d8b9aa692 (patch)
tree43a701fd638e5c01a25211149cbf66e41831d019
parent97672cbe3de809ef8c4ea66cce675f5da3d3df44 (diff)
drm/amdkfd: Add dGPU support to the MQD manager
On dGPUs don't set ATC addressing bits and use MTYPE_UC for coherent memory. Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com> Acked-by: Oded Gabbay <oded.gabbay@gmail.com> Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com>
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c7
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c35
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c21
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_priv.h4
4 files changed, 64 insertions, 3 deletions
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c
index dfd260ef81ff..ee7061e1c466 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c
@@ -29,8 +29,15 @@ struct mqd_manager *mqd_manager_init(enum KFD_MQD_TYPE type,
29 switch (dev->device_info->asic_family) { 29 switch (dev->device_info->asic_family) {
30 case CHIP_KAVERI: 30 case CHIP_KAVERI:
31 return mqd_manager_init_cik(type, dev); 31 return mqd_manager_init_cik(type, dev);
32 case CHIP_HAWAII:
33 return mqd_manager_init_cik_hawaii(type, dev);
32 case CHIP_CARRIZO: 34 case CHIP_CARRIZO:
33 return mqd_manager_init_vi(type, dev); 35 return mqd_manager_init_vi(type, dev);
36 case CHIP_TONGA:
37 case CHIP_FIJI:
38 case CHIP_POLARIS10:
39 case CHIP_POLARIS11:
40 return mqd_manager_init_vi_tonga(type, dev);
34 default: 41 default:
35 WARN(1, "Unexpected ASIC family %u", 42 WARN(1, "Unexpected ASIC family %u",
36 dev->device_info->asic_family); 43 dev->device_info->asic_family);
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c
index f8ef4a051e08..fbe3f83ba685 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c
@@ -170,14 +170,19 @@ static int load_mqd_sdma(struct mqd_manager *mm, void *mqd,
170 mms); 170 mms);
171} 171}
172 172
173static int update_mqd(struct mqd_manager *mm, void *mqd, 173static int __update_mqd(struct mqd_manager *mm, void *mqd,
174 struct queue_properties *q) 174 struct queue_properties *q, unsigned int atc_bit)
175{ 175{
176 struct cik_mqd *m; 176 struct cik_mqd *m;
177 177
178 m = get_mqd(mqd); 178 m = get_mqd(mqd);
179 m->cp_hqd_pq_control = DEFAULT_RPTR_BLOCK_SIZE | 179 m->cp_hqd_pq_control = DEFAULT_RPTR_BLOCK_SIZE |
180 DEFAULT_MIN_AVAIL_SIZE | PQ_ATC_EN; 180 DEFAULT_MIN_AVAIL_SIZE;
181 m->cp_hqd_ib_control = DEFAULT_MIN_IB_AVAIL_SIZE;
182 if (atc_bit) {
183 m->cp_hqd_pq_control |= PQ_ATC_EN;
184 m->cp_hqd_ib_control |= IB_ATC_EN;
185 }
181 186
182 /* 187 /*
183 * Calculating queue size which is log base 2 of actual queue size -1 188 * Calculating queue size which is log base 2 of actual queue size -1
@@ -202,6 +207,18 @@ static int update_mqd(struct mqd_manager *mm, void *mqd,
202 return 0; 207 return 0;
203} 208}
204 209
210static int update_mqd(struct mqd_manager *mm, void *mqd,
211 struct queue_properties *q)
212{
213 return __update_mqd(mm, mqd, q, 1);
214}
215
216static int update_mqd_hawaii(struct mqd_manager *mm, void *mqd,
217 struct queue_properties *q)
218{
219 return __update_mqd(mm, mqd, q, 0);
220}
221
205static int update_mqd_sdma(struct mqd_manager *mm, void *mqd, 222static int update_mqd_sdma(struct mqd_manager *mm, void *mqd,
206 struct queue_properties *q) 223 struct queue_properties *q)
207{ 224{
@@ -441,3 +458,15 @@ struct mqd_manager *mqd_manager_init_cik(enum KFD_MQD_TYPE type,
441 return mqd; 458 return mqd;
442} 459}
443 460
461struct mqd_manager *mqd_manager_init_cik_hawaii(enum KFD_MQD_TYPE type,
462 struct kfd_dev *dev)
463{
464 struct mqd_manager *mqd;
465
466 mqd = mqd_manager_init_cik(type, dev);
467 if (!mqd)
468 return NULL;
469 if ((type == KFD_MQD_TYPE_CP) || (type == KFD_MQD_TYPE_COMPUTE))
470 mqd->update_mqd = update_mqd_hawaii;
471 return mqd;
472}
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c
index 971aec0637dc..58221c1fc917 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c
@@ -151,6 +151,8 @@ static int __update_mqd(struct mqd_manager *mm, void *mqd,
151 151
152 m->cp_hqd_pq_rptr_report_addr_lo = lower_32_bits((uint64_t)q->read_ptr); 152 m->cp_hqd_pq_rptr_report_addr_lo = lower_32_bits((uint64_t)q->read_ptr);
153 m->cp_hqd_pq_rptr_report_addr_hi = upper_32_bits((uint64_t)q->read_ptr); 153 m->cp_hqd_pq_rptr_report_addr_hi = upper_32_bits((uint64_t)q->read_ptr);
154 m->cp_hqd_pq_wptr_poll_addr_lo = lower_32_bits((uint64_t)q->write_ptr);
155 m->cp_hqd_pq_wptr_poll_addr_hi = upper_32_bits((uint64_t)q->write_ptr);
154 156
155 m->cp_hqd_pq_doorbell_control = 157 m->cp_hqd_pq_doorbell_control =
156 q->doorbell_off << 158 q->doorbell_off <<
@@ -208,6 +210,12 @@ static int update_mqd(struct mqd_manager *mm, void *mqd,
208 return __update_mqd(mm, mqd, q, MTYPE_CC, 1); 210 return __update_mqd(mm, mqd, q, MTYPE_CC, 1);
209} 211}
210 212
213static int update_mqd_tonga(struct mqd_manager *mm, void *mqd,
214 struct queue_properties *q)
215{
216 return __update_mqd(mm, mqd, q, MTYPE_UC, 0);
217}
218
211static int destroy_mqd(struct mqd_manager *mm, void *mqd, 219static int destroy_mqd(struct mqd_manager *mm, void *mqd,
212 enum kfd_preempt_type type, 220 enum kfd_preempt_type type,
213 unsigned int timeout, uint32_t pipe_id, 221 unsigned int timeout, uint32_t pipe_id,
@@ -432,3 +440,16 @@ struct mqd_manager *mqd_manager_init_vi(enum KFD_MQD_TYPE type,
432 440
433 return mqd; 441 return mqd;
434} 442}
443
444struct mqd_manager *mqd_manager_init_vi_tonga(enum KFD_MQD_TYPE type,
445 struct kfd_dev *dev)
446{
447 struct mqd_manager *mqd;
448
449 mqd = mqd_manager_init_vi(type, dev);
450 if (!mqd)
451 return NULL;
452 if ((type == KFD_MQD_TYPE_CP) || (type == KFD_MQD_TYPE_COMPUTE))
453 mqd->update_mqd = update_mqd_tonga;
454 return mqd;
455}
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
index e5b16209f069..594f85355397 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
@@ -706,8 +706,12 @@ struct mqd_manager *mqd_manager_init(enum KFD_MQD_TYPE type,
706 struct kfd_dev *dev); 706 struct kfd_dev *dev);
707struct mqd_manager *mqd_manager_init_cik(enum KFD_MQD_TYPE type, 707struct mqd_manager *mqd_manager_init_cik(enum KFD_MQD_TYPE type,
708 struct kfd_dev *dev); 708 struct kfd_dev *dev);
709struct mqd_manager *mqd_manager_init_cik_hawaii(enum KFD_MQD_TYPE type,
710 struct kfd_dev *dev);
709struct mqd_manager *mqd_manager_init_vi(enum KFD_MQD_TYPE type, 711struct mqd_manager *mqd_manager_init_vi(enum KFD_MQD_TYPE type,
710 struct kfd_dev *dev); 712 struct kfd_dev *dev);
713struct mqd_manager *mqd_manager_init_vi_tonga(enum KFD_MQD_TYPE type,
714 struct kfd_dev *dev);
711struct device_queue_manager *device_queue_manager_init(struct kfd_dev *dev); 715struct device_queue_manager *device_queue_manager_init(struct kfd_dev *dev);
712void device_queue_manager_uninit(struct device_queue_manager *dqm); 716void device_queue_manager_uninit(struct device_queue_manager *dqm);
713struct kernel_queue *kernel_queue_init(struct kfd_dev *dev, 717struct kernel_queue *kernel_queue_init(struct kfd_dev *dev,