drm/amd: Update MEC HQD loading code for KFD
[linux-2.6-microblaze.git] / drivers / gpu / drm / amd / amdkfd / kfd_kernel_queue.c
index d135cd0..681b639 100644 (file)
@@ -41,11 +41,11 @@ static bool initialize(struct kernel_queue *kq, struct kfd_dev *dev,
        int retval;
        union PM4_MES_TYPE_3_HEADER nop;
 
-       BUG_ON(!kq || !dev);
-       BUG_ON(type != KFD_QUEUE_TYPE_DIQ && type != KFD_QUEUE_TYPE_HIQ);
+       if (WARN_ON(type != KFD_QUEUE_TYPE_DIQ && type != KFD_QUEUE_TYPE_HIQ))
+               return false;
 
-       pr_debug("amdkfd: In func %s initializing queue type %d size %d\n",
-                       __func__, KFD_QUEUE_TYPE_HIQ, queue_size);
+       pr_debug("Initializing queue type %d size %d\n", KFD_QUEUE_TYPE_HIQ,
+                       queue_size);
 
        memset(&prop, 0, sizeof(prop));
        memset(&nop, 0, sizeof(nop));
@@ -63,23 +63,23 @@ static bool initialize(struct kernel_queue *kq, struct kfd_dev *dev,
                                                KFD_MQD_TYPE_HIQ);
                break;
        default:
-               BUG();
-               break;
+               pr_err("Invalid queue type %d\n", type);
+               return false;
        }
 
-       if (kq->mqd == NULL)
+       if (!kq->mqd)
                return false;
 
        prop.doorbell_ptr = kfd_get_kernel_doorbell(dev, &prop.doorbell_off);
 
-       if (prop.doorbell_ptr == NULL) {
-               pr_err("amdkfd: error init doorbell");
+       if (!prop.doorbell_ptr) {
+               pr_err("Failed to initialize doorbell");
                goto err_get_kernel_doorbell;
        }
 
        retval = kfd_gtt_sa_allocate(dev, queue_size, &kq->pq);
        if (retval != 0) {
-               pr_err("amdkfd: error init pq queues size (%d)\n", queue_size);
+               pr_err("Failed to init pq queues size %d\n", queue_size);
                goto err_pq_allocate_vidmem;
        }
 
@@ -87,7 +87,7 @@ static bool initialize(struct kernel_queue *kq, struct kfd_dev *dev,
        kq->pq_gpu_addr = kq->pq->gpu_addr;
 
        retval = kq->ops_asic_specific.initialize(kq, dev, type, queue_size);
-       if (retval == false)
+       if (!retval)
                goto err_eop_allocate_vidmem;
 
        retval = kfd_gtt_sa_allocate(dev, sizeof(*kq->rptr_kernel),
@@ -139,11 +139,12 @@ static bool initialize(struct kernel_queue *kq, struct kfd_dev *dev,
 
        /* assign HIQ to HQD */
        if (type == KFD_QUEUE_TYPE_HIQ) {
-               pr_debug("assigning hiq to hqd\n");
+               pr_debug("Assigning hiq to hqd\n");
                kq->queue->pipe = KFD_CIK_HIQ_PIPE;
                kq->queue->queue = KFD_CIK_HIQ_QUEUE;
                kq->mqd->load_mqd(kq->mqd, kq->queue->mqd, kq->queue->pipe,
-                                       kq->queue->queue, NULL);
+                                 kq->queue->queue, &kq->queue->properties,
+                                 NULL);
        } else {
                /* allocate fence for DIQ */
 
@@ -180,8 +181,6 @@ err_get_kernel_doorbell:
 
 static void uninitialize(struct kernel_queue *kq)
 {
-       BUG_ON(!kq);
-
        if (kq->queue->properties.type == KFD_QUEUE_TYPE_HIQ)
                kq->mqd->destroy_mqd(kq->mqd,
                                        NULL,
@@ -211,8 +210,6 @@ static int acquire_packet_buffer(struct kernel_queue *kq,
        uint32_t wptr, rptr;
        unsigned int *queue_address;
 
-       BUG_ON(!kq || !buffer_ptr);
-
        rptr = *kq->rptr_kernel;
        wptr = *kq->wptr_kernel;
        queue_address = (unsigned int *)kq->pq_kernel_addr;
@@ -252,11 +249,7 @@ static void submit_packet(struct kernel_queue *kq)
 {
 #ifdef DEBUG
        int i;
-#endif
-
-       BUG_ON(!kq);
 
-#ifdef DEBUG
        for (i = *kq->wptr_kernel; i < kq->pending_wptr; i++) {
                pr_debug("0x%2X ", kq->pq_kernel_addr[i]);
                if (i % 15 == 0)
@@ -272,7 +265,6 @@ static void submit_packet(struct kernel_queue *kq)
 
 static void rollback_packet(struct kernel_queue *kq)
 {
-       BUG_ON(!kq);
        kq->pending_wptr = *kq->queue->properties.write_ptr;
 }
 
@@ -281,9 +273,7 @@ struct kernel_queue *kernel_queue_init(struct kfd_dev *dev,
 {
        struct kernel_queue *kq;
 
-       BUG_ON(!dev);
-
-       kq = kzalloc(sizeof(struct kernel_queue), GFP_KERNEL);
+       kq = kzalloc(sizeof(*kq), GFP_KERNEL);
        if (!kq)
                return NULL;
 
@@ -304,7 +294,7 @@ struct kernel_queue *kernel_queue_init(struct kfd_dev *dev,
        }
 
        if (!kq->ops.initialize(kq, dev, type, KFD_KERNEL_QUEUE_SIZE)) {
-               pr_err("amdkfd: failed to init kernel queue\n");
+               pr_err("Failed to init kernel queue\n");
                kfree(kq);
                return NULL;
        }
@@ -313,32 +303,37 @@ struct kernel_queue *kernel_queue_init(struct kfd_dev *dev,
 
 void kernel_queue_uninit(struct kernel_queue *kq)
 {
-       BUG_ON(!kq);
-
        kq->ops.uninitialize(kq);
        kfree(kq);
 }
 
+/* FIXME: Can this test be removed? */
 static __attribute__((unused)) void test_kq(struct kfd_dev *dev)
 {
        struct kernel_queue *kq;
        uint32_t *buffer, i;
        int retval;
 
-       BUG_ON(!dev);
-
-       pr_err("amdkfd: starting kernel queue test\n");
+       pr_err("Starting kernel queue test\n");
 
        kq = kernel_queue_init(dev, KFD_QUEUE_TYPE_HIQ);
-       BUG_ON(!kq);
+       if (unlikely(!kq)) {
+               pr_err("  Failed to initialize HIQ\n");
+               pr_err("Kernel queue test failed\n");
+               return;
+       }
 
        retval = kq->ops.acquire_packet_buffer(kq, 5, &buffer);
-       BUG_ON(retval != 0);
+       if (unlikely(retval != 0)) {
+               pr_err("  Failed to acquire packet buffer\n");
+               pr_err("Kernel queue test failed\n");
+               return;
+       }
        for (i = 0; i < 5; i++)
                buffer[i] = kq->nop_packet;
        kq->ops.submit_packet(kq);
 
-       pr_err("amdkfd: ending kernel queue test\n");
+       pr_err("Ending kernel queue test\n");
 }