diff options
author | Felix Kuehling <Felix.Kuehling@amd.com> | 2018-01-04 17:17:45 -0500 |
---|---|---|
committer | Oded Gabbay <oded.gabbay@gmail.com> | 2018-01-04 17:17:45 -0500 |
commit | ee04955af6b851a4f133d2472bc65c5d8b9aa692 (patch) | |
tree | 43a701fd638e5c01a25211149cbf66e41831d019 | |
parent | 97672cbe3de809ef8c4ea66cce675f5da3d3df44 (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.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c | 35 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c | 21 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 4 |
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 | ||
173 | static int update_mqd(struct mqd_manager *mm, void *mqd, | 173 | static 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 | ||
210 | static 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 | |||
216 | static 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 | |||
205 | static int update_mqd_sdma(struct mqd_manager *mm, void *mqd, | 222 | static 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 | ||
461 | struct 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 | ||
213 | static 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 | |||
211 | static int destroy_mqd(struct mqd_manager *mm, void *mqd, | 219 | static 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 | |||
444 | struct 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); |
707 | struct mqd_manager *mqd_manager_init_cik(enum KFD_MQD_TYPE type, | 707 | struct mqd_manager *mqd_manager_init_cik(enum KFD_MQD_TYPE type, |
708 | struct kfd_dev *dev); | 708 | struct kfd_dev *dev); |
709 | struct mqd_manager *mqd_manager_init_cik_hawaii(enum KFD_MQD_TYPE type, | ||
710 | struct kfd_dev *dev); | ||
709 | struct mqd_manager *mqd_manager_init_vi(enum KFD_MQD_TYPE type, | 711 | struct mqd_manager *mqd_manager_init_vi(enum KFD_MQD_TYPE type, |
710 | struct kfd_dev *dev); | 712 | struct kfd_dev *dev); |
713 | struct mqd_manager *mqd_manager_init_vi_tonga(enum KFD_MQD_TYPE type, | ||
714 | struct kfd_dev *dev); | ||
711 | struct device_queue_manager *device_queue_manager_init(struct kfd_dev *dev); | 715 | struct device_queue_manager *device_queue_manager_init(struct kfd_dev *dev); |
712 | void device_queue_manager_uninit(struct device_queue_manager *dqm); | 716 | void device_queue_manager_uninit(struct device_queue_manager *dqm); |
713 | struct kernel_queue *kernel_queue_init(struct kfd_dev *dev, | 717 | struct kernel_queue *kernel_queue_init(struct kfd_dev *dev, |