Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d7b8f73e authored by Ben Goz's avatar Ben Goz Committed by Oded Gabbay
Browse files

drm/amdkfd: Implement create_map_queues() for Carrizo



Signed-off-by: default avatarBen Goz <ben.goz@amd.com>
Signed-off-by: default avatarOded Gabbay <oded.gabbay@gmail.com>
parent e1940fa4
Loading
Loading
Loading
Loading
+87 −4
Original line number Diff line number Diff line
@@ -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;