Loading drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c +87 −4 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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; Loading @@ -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; Loading Loading
drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c +87 −4 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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; Loading @@ -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; Loading