mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-27 22:53:55 +08:00
drm/amdkfd: Implement create_map_queues() for Carrizo
Signed-off-by: Ben Goz <ben.goz@amd.com> Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com>
This commit is contained in:
parent
e1940fa4bf
commit
d7b8f73ea0
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user