drm/amdkfd: Implement create_map_queues() for Carrizo
authorBen Goz <ben.goz@amd.com>
Tue, 6 Jan 2015 09:35:50 +0000 (11:35 +0200)
committerOded Gabbay <oded.gabbay@gmail.com>
Mon, 20 Jul 2015 06:16:49 +0000 (09:16 +0300)
Signed-off-by: Ben Goz <ben.goz@amd.com>
Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com>
drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c

index e3230ccc46c7df6275e1e97869a0936fe044ac34..90f391434fa392b79d9fb2bc3bb41b6ea79bd746 100644 (file)
@@ -182,6 +182,71 @@ static int pm_create_map_process(struct packet_manager *pm, uint32_t *buffer,
        return 0;
 }
 
+static int pm_create_map_queue_vi(struct packet_manager *pm, uint32_t *buffer,
+               struct queue *q, bool is_static)
+{
+       struct pm4_mes_map_queues *packet;
+       bool use_static = is_static;
+
+       BUG_ON(!pm || !buffer || !q);
+
+       pr_debug("kfd: In func %s\n", __func__);
+
+       packet = (struct pm4_mes_map_queues *)buffer;
+       memset(buffer, 0, sizeof(struct pm4_map_queues));
+
+       packet->header.u32all = build_pm4_header(IT_MAP_QUEUES,
+                                               sizeof(struct pm4_map_queues));
+       packet->bitfields2.alloc_format =
+               alloc_format__mes_map_queues__one_per_pipe_vi;
+       packet->bitfields2.num_queues = 1;
+       packet->bitfields2.queue_sel =
+               queue_sel__mes_map_queues__map_to_hws_determined_queue_slots_vi;
+
+       packet->bitfields2.engine_sel =
+               engine_sel__mes_map_queues__compute_vi;
+       packet->bitfields2.queue_type =
+               queue_type__mes_map_queues__normal_compute_vi;
+
+       switch (q->properties.type) {
+       case KFD_QUEUE_TYPE_COMPUTE:
+               if (use_static)
+                       packet->bitfields2.queue_type =
+               queue_type__mes_map_queues__normal_latency_static_queue_vi;
+               break;
+       case KFD_QUEUE_TYPE_DIQ:
+               packet->bitfields2.queue_type =
+                       queue_type__mes_map_queues__debug_interface_queue_vi;
+               break;
+       case KFD_QUEUE_TYPE_SDMA:
+               packet->bitfields2.engine_sel =
+                               engine_sel__mes_map_queues__sdma0_vi;
+               use_static = false; /* no static queues under SDMA */
+               break;
+       default:
+               pr_err("kfd: in %s queue type %d\n", __func__,
+                               q->properties.type);
+               BUG();
+               break;
+       }
+       packet->bitfields3.doorbell_offset =
+                       q->properties.doorbell_off;
+
+       packet->mqd_addr_lo =
+                       lower_32_bits(q->gart_mqd_addr);
+
+       packet->mqd_addr_hi =
+                       upper_32_bits(q->gart_mqd_addr);
+
+       packet->wptr_addr_lo =
+                       lower_32_bits((uint64_t)q->properties.write_ptr);
+
+       packet->wptr_addr_hi =
+                       upper_32_bits((uint64_t)q->properties.write_ptr);
+
+       return 0;
+}
+
 static int pm_create_map_queue(struct packet_manager *pm, uint32_t *buffer,
                                struct queue *q, bool is_static)
 {
@@ -298,8 +363,17 @@ static int pm_create_runlist_ib(struct packet_manager *pm,
                        pr_debug("kfd: static_queue, mapping kernel q %d, is debug status %d\n",
                                kq->queue->queue, qpd->is_debug);
 
-                       retval = pm_create_map_queue(pm, &rl_buffer[rl_wptr],
-                                               kq->queue, qpd->is_debug);
+                       if (pm->dqm->dev->device_info->asic_family ==
+                                       CHIP_CARRIZO)
+                               retval = pm_create_map_queue_vi(pm,
+                                               &rl_buffer[rl_wptr],
+                                               kq->queue,
+                                               qpd->is_debug);
+                       else
+                               retval = pm_create_map_queue(pm,
+                                               &rl_buffer[rl_wptr],
+                                               kq->queue,
+                                               qpd->is_debug);
                        if (retval != 0)
                                return retval;
 
@@ -315,8 +389,17 @@ static int pm_create_runlist_ib(struct packet_manager *pm,
                        pr_debug("kfd: static_queue, mapping user queue %d, is debug status %d\n",
                                q->queue, qpd->is_debug);
 
-                       retval = pm_create_map_queue(pm, &rl_buffer[rl_wptr],
-                                               q,  qpd->is_debug);
+                       if (pm->dqm->dev->device_info->asic_family ==
+                                       CHIP_CARRIZO)
+                               retval = pm_create_map_queue_vi(pm,
+                                               &rl_buffer[rl_wptr],
+                                               q,
+                                               qpd->is_debug);
+                       else
+                               retval = pm_create_map_queue(pm,
+                                               &rl_buffer[rl_wptr],
+                                               q,
+                                               qpd->is_debug);
 
                        if (retval != 0)
                                return retval;