diff options
| author | Dave Airlie <airlied@redhat.com> | 2015-03-20 03:32:01 -0400 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2015-03-20 03:32:01 -0400 |
| commit | f42e2c2429c0a76d99565e20d70d4fbf21c97498 (patch) | |
| tree | e4ca1261c5cc870b8dc229e0e36fcc3e86b7b344 | |
| parent | 4a87b990801a74874ace5b84e5f7563de202c013 (diff) | |
| parent | e405ca3a1bf166f741506c07c2a277b5d48af8f7 (diff) | |
Merge tag 'drm-amdkfd-fixes-2015-03-19' of git://people.freedesktop.org/~gabbayo/linux into drm-fixes
- Fixing SDMA initialization when in non-HWS mode (debug mode)
- Memory leak fix when destroying kernel queue
- Fix number of available compute pipelines according to new firmware
* tag 'drm-amdkfd-fixes-2015-03-19' of git://people.freedesktop.org/~gabbayo/linux:
drm/radeon: Changing number of compute pipe lines
drm/amdkfd: Fix SDMA queue init. in non-HWS mode
drm/amdkfd: destroy mqd when destroying kernel queue
| -rw-r--r-- | drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c | 22 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_kfd.c | 2 |
3 files changed, 23 insertions, 11 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 910ff8ab9c9c..d8135adb2238 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | |||
| @@ -645,6 +645,7 @@ static int create_sdma_queue_nocpsch(struct device_queue_manager *dqm, | |||
| 645 | pr_debug(" sdma queue id: %d\n", q->properties.sdma_queue_id); | 645 | pr_debug(" sdma queue id: %d\n", q->properties.sdma_queue_id); |
| 646 | pr_debug(" sdma engine id: %d\n", q->properties.sdma_engine_id); | 646 | pr_debug(" sdma engine id: %d\n", q->properties.sdma_engine_id); |
| 647 | 647 | ||
| 648 | init_sdma_vm(dqm, q, qpd); | ||
| 648 | retval = mqd->init_mqd(mqd, &q->mqd, &q->mqd_mem_obj, | 649 | retval = mqd->init_mqd(mqd, &q->mqd, &q->mqd_mem_obj, |
| 649 | &q->gart_mqd_addr, &q->properties); | 650 | &q->gart_mqd_addr, &q->properties); |
| 650 | if (retval != 0) { | 651 | if (retval != 0) { |
| @@ -652,7 +653,14 @@ static int create_sdma_queue_nocpsch(struct device_queue_manager *dqm, | |||
| 652 | return retval; | 653 | return retval; |
| 653 | } | 654 | } |
| 654 | 655 | ||
| 655 | init_sdma_vm(dqm, q, qpd); | 656 | retval = mqd->load_mqd(mqd, q->mqd, 0, |
| 657 | 0, NULL); | ||
| 658 | if (retval != 0) { | ||
| 659 | deallocate_sdma_queue(dqm, q->sdma_id); | ||
| 660 | mqd->uninit_mqd(mqd, q->mqd, q->mqd_mem_obj); | ||
| 661 | return retval; | ||
| 662 | } | ||
| 663 | |||
| 656 | return 0; | 664 | return 0; |
| 657 | } | 665 | } |
| 658 | 666 | ||
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c index e415a2a9207e..c7d298e62c96 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c | |||
| @@ -44,7 +44,7 @@ static bool initialize(struct kernel_queue *kq, struct kfd_dev *dev, | |||
| 44 | BUG_ON(!kq || !dev); | 44 | BUG_ON(!kq || !dev); |
| 45 | BUG_ON(type != KFD_QUEUE_TYPE_DIQ && type != KFD_QUEUE_TYPE_HIQ); | 45 | BUG_ON(type != KFD_QUEUE_TYPE_DIQ && type != KFD_QUEUE_TYPE_HIQ); |
| 46 | 46 | ||
| 47 | pr_debug("kfd: In func %s initializing queue type %d size %d\n", | 47 | pr_debug("amdkfd: In func %s initializing queue type %d size %d\n", |
| 48 | __func__, KFD_QUEUE_TYPE_HIQ, queue_size); | 48 | __func__, KFD_QUEUE_TYPE_HIQ, queue_size); |
| 49 | 49 | ||
| 50 | nop.opcode = IT_NOP; | 50 | nop.opcode = IT_NOP; |
| @@ -69,12 +69,16 @@ static bool initialize(struct kernel_queue *kq, struct kfd_dev *dev, | |||
| 69 | 69 | ||
| 70 | prop.doorbell_ptr = kfd_get_kernel_doorbell(dev, &prop.doorbell_off); | 70 | prop.doorbell_ptr = kfd_get_kernel_doorbell(dev, &prop.doorbell_off); |
| 71 | 71 | ||
| 72 | if (prop.doorbell_ptr == NULL) | 72 | if (prop.doorbell_ptr == NULL) { |
| 73 | pr_err("amdkfd: error init doorbell"); | ||
| 73 | goto err_get_kernel_doorbell; | 74 | goto err_get_kernel_doorbell; |
| 75 | } | ||
| 74 | 76 | ||
| 75 | retval = kfd_gtt_sa_allocate(dev, queue_size, &kq->pq); | 77 | retval = kfd_gtt_sa_allocate(dev, queue_size, &kq->pq); |
| 76 | if (retval != 0) | 78 | if (retval != 0) { |
| 79 | pr_err("amdkfd: error init pq queues size (%d)\n", queue_size); | ||
| 77 | goto err_pq_allocate_vidmem; | 80 | goto err_pq_allocate_vidmem; |
| 81 | } | ||
| 78 | 82 | ||
| 79 | kq->pq_kernel_addr = kq->pq->cpu_ptr; | 83 | kq->pq_kernel_addr = kq->pq->cpu_ptr; |
| 80 | kq->pq_gpu_addr = kq->pq->gpu_addr; | 84 | kq->pq_gpu_addr = kq->pq->gpu_addr; |
| @@ -165,10 +169,8 @@ err_rptr_allocate_vidmem: | |||
| 165 | err_eop_allocate_vidmem: | 169 | err_eop_allocate_vidmem: |
| 166 | kfd_gtt_sa_free(dev, kq->pq); | 170 | kfd_gtt_sa_free(dev, kq->pq); |
| 167 | err_pq_allocate_vidmem: | 171 | err_pq_allocate_vidmem: |
| 168 | pr_err("kfd: error init pq\n"); | ||
| 169 | kfd_release_kernel_doorbell(dev, prop.doorbell_ptr); | 172 | kfd_release_kernel_doorbell(dev, prop.doorbell_ptr); |
| 170 | err_get_kernel_doorbell: | 173 | err_get_kernel_doorbell: |
| 171 | pr_err("kfd: error init doorbell"); | ||
| 172 | return false; | 174 | return false; |
| 173 | 175 | ||
| 174 | } | 176 | } |
| @@ -187,6 +189,8 @@ static void uninitialize(struct kernel_queue *kq) | |||
| 187 | else if (kq->queue->properties.type == KFD_QUEUE_TYPE_DIQ) | 189 | else if (kq->queue->properties.type == KFD_QUEUE_TYPE_DIQ) |
| 188 | kfd_gtt_sa_free(kq->dev, kq->fence_mem_obj); | 190 | kfd_gtt_sa_free(kq->dev, kq->fence_mem_obj); |
| 189 | 191 | ||
| 192 | kq->mqd->uninit_mqd(kq->mqd, kq->queue->mqd, kq->queue->mqd_mem_obj); | ||
| 193 | |||
| 190 | kfd_gtt_sa_free(kq->dev, kq->rptr_mem); | 194 | kfd_gtt_sa_free(kq->dev, kq->rptr_mem); |
| 191 | kfd_gtt_sa_free(kq->dev, kq->wptr_mem); | 195 | kfd_gtt_sa_free(kq->dev, kq->wptr_mem); |
| 192 | kq->ops_asic_specific.uninitialize(kq); | 196 | kq->ops_asic_specific.uninitialize(kq); |
| @@ -211,7 +215,7 @@ static int acquire_packet_buffer(struct kernel_queue *kq, | |||
| 211 | queue_address = (unsigned int *)kq->pq_kernel_addr; | 215 | queue_address = (unsigned int *)kq->pq_kernel_addr; |
| 212 | queue_size_dwords = kq->queue->properties.queue_size / sizeof(uint32_t); | 216 | queue_size_dwords = kq->queue->properties.queue_size / sizeof(uint32_t); |
| 213 | 217 | ||
| 214 | pr_debug("kfd: In func %s\nrptr: %d\nwptr: %d\nqueue_address 0x%p\n", | 218 | pr_debug("amdkfd: In func %s\nrptr: %d\nwptr: %d\nqueue_address 0x%p\n", |
| 215 | __func__, rptr, wptr, queue_address); | 219 | __func__, rptr, wptr, queue_address); |
| 216 | 220 | ||
| 217 | available_size = (rptr - 1 - wptr + queue_size_dwords) % | 221 | available_size = (rptr - 1 - wptr + queue_size_dwords) % |
| @@ -296,7 +300,7 @@ struct kernel_queue *kernel_queue_init(struct kfd_dev *dev, | |||
| 296 | } | 300 | } |
| 297 | 301 | ||
| 298 | if (kq->ops.initialize(kq, dev, type, KFD_KERNEL_QUEUE_SIZE) == false) { | 302 | if (kq->ops.initialize(kq, dev, type, KFD_KERNEL_QUEUE_SIZE) == false) { |
| 299 | pr_err("kfd: failed to init kernel queue\n"); | 303 | pr_err("amdkfd: failed to init kernel queue\n"); |
| 300 | kfree(kq); | 304 | kfree(kq); |
| 301 | return NULL; | 305 | return NULL; |
| 302 | } | 306 | } |
| @@ -319,7 +323,7 @@ static __attribute__((unused)) void test_kq(struct kfd_dev *dev) | |||
| 319 | 323 | ||
| 320 | BUG_ON(!dev); | 324 | BUG_ON(!dev); |
| 321 | 325 | ||
| 322 | pr_err("kfd: starting kernel queue test\n"); | 326 | pr_err("amdkfd: starting kernel queue test\n"); |
| 323 | 327 | ||
| 324 | kq = kernel_queue_init(dev, KFD_QUEUE_TYPE_HIQ); | 328 | kq = kernel_queue_init(dev, KFD_QUEUE_TYPE_HIQ); |
| 325 | BUG_ON(!kq); | 329 | BUG_ON(!kq); |
| @@ -330,7 +334,7 @@ static __attribute__((unused)) void test_kq(struct kfd_dev *dev) | |||
| 330 | buffer[i] = kq->nop_packet; | 334 | buffer[i] = kq->nop_packet; |
| 331 | kq->ops.submit_packet(kq); | 335 | kq->ops.submit_packet(kq); |
| 332 | 336 | ||
| 333 | pr_err("kfd: ending kernel queue test\n"); | 337 | pr_err("amdkfd: ending kernel queue test\n"); |
| 334 | } | 338 | } |
| 335 | 339 | ||
| 336 | 340 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_kfd.c b/drivers/gpu/drm/radeon/radeon_kfd.c index 061eaa9c19c7..122eb5693ba1 100644 --- a/drivers/gpu/drm/radeon/radeon_kfd.c +++ b/drivers/gpu/drm/radeon/radeon_kfd.c | |||
| @@ -153,7 +153,7 @@ void radeon_kfd_device_init(struct radeon_device *rdev) | |||
| 153 | .compute_vmid_bitmap = 0xFF00, | 153 | .compute_vmid_bitmap = 0xFF00, |
| 154 | 154 | ||
| 155 | .first_compute_pipe = 1, | 155 | .first_compute_pipe = 1, |
| 156 | .compute_pipe_count = 8 - 1, | 156 | .compute_pipe_count = 4 - 1, |
| 157 | }; | 157 | }; |
| 158 | 158 | ||
| 159 | radeon_doorbell_get_kfd_info(rdev, | 159 | radeon_doorbell_get_kfd_info(rdev, |
