drm/amdgpu: kiq pm4 function implementation for gfx_v9
Functions implemented from kiq_pm4_funcs struct members for gfx_v9 version. Signed-off-by: Alex Sierra <alex.sierra@amd.com> Acked-by: Christian König <christian.koenig@amd.com> Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
a269e44989
commit
f167ea6a14
@ -739,6 +739,120 @@ static int gfx_v9_0_query_ras_error_count(struct amdgpu_device *adev,
|
||||
static int gfx_v9_0_ras_error_inject(struct amdgpu_device *adev,
|
||||
void *inject_if);
|
||||
|
||||
static void gfx_v9_0_kiq_set_resources(struct amdgpu_ring *kiq_ring,
|
||||
uint64_t queue_mask)
|
||||
{
|
||||
amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_SET_RESOURCES, 6));
|
||||
amdgpu_ring_write(kiq_ring,
|
||||
PACKET3_SET_RESOURCES_VMID_MASK(0) |
|
||||
/* vmid_mask:0* queue_type:0 (KIQ) */
|
||||
PACKET3_SET_RESOURCES_QUEUE_TYPE(0));
|
||||
amdgpu_ring_write(kiq_ring,
|
||||
lower_32_bits(queue_mask)); /* queue mask lo */
|
||||
amdgpu_ring_write(kiq_ring,
|
||||
upper_32_bits(queue_mask)); /* queue mask hi */
|
||||
amdgpu_ring_write(kiq_ring, 0); /* gws mask lo */
|
||||
amdgpu_ring_write(kiq_ring, 0); /* gws mask hi */
|
||||
amdgpu_ring_write(kiq_ring, 0); /* oac mask */
|
||||
amdgpu_ring_write(kiq_ring, 0); /* gds heap base:0, gds heap size:0 */
|
||||
}
|
||||
|
||||
static void gfx_v9_0_kiq_map_queues(struct amdgpu_ring *kiq_ring,
|
||||
struct amdgpu_ring *ring)
|
||||
{
|
||||
struct amdgpu_device *adev = kiq_ring->adev;
|
||||
uint64_t mqd_addr = amdgpu_bo_gpu_offset(ring->mqd_obj);
|
||||
uint64_t wptr_addr = adev->wb.gpu_addr + (ring->wptr_offs * 4);
|
||||
uint32_t eng_sel = ring->funcs->type == AMDGPU_RING_TYPE_GFX ? 4 : 0;
|
||||
|
||||
amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_MAP_QUEUES, 5));
|
||||
/* Q_sel:0, vmid:0, vidmem: 1, engine:0, num_Q:1*/
|
||||
amdgpu_ring_write(kiq_ring, /* Q_sel: 0, vmid: 0, engine: 0, num_Q: 1 */
|
||||
PACKET3_MAP_QUEUES_QUEUE_SEL(0) | /* Queue_Sel */
|
||||
PACKET3_MAP_QUEUES_VMID(0) | /* VMID */
|
||||
PACKET3_MAP_QUEUES_QUEUE(ring->queue) |
|
||||
PACKET3_MAP_QUEUES_PIPE(ring->pipe) |
|
||||
PACKET3_MAP_QUEUES_ME((ring->me == 1 ? 0 : 1)) |
|
||||
/*queue_type: normal compute queue */
|
||||
PACKET3_MAP_QUEUES_QUEUE_TYPE(0) |
|
||||
/* alloc format: all_on_one_pipe */
|
||||
PACKET3_MAP_QUEUES_ALLOC_FORMAT(0) |
|
||||
PACKET3_MAP_QUEUES_ENGINE_SEL(eng_sel) |
|
||||
/* num_queues: must be 1 */
|
||||
PACKET3_MAP_QUEUES_NUM_QUEUES(1));
|
||||
amdgpu_ring_write(kiq_ring,
|
||||
PACKET3_MAP_QUEUES_DOORBELL_OFFSET(ring->doorbell_index));
|
||||
amdgpu_ring_write(kiq_ring, lower_32_bits(mqd_addr));
|
||||
amdgpu_ring_write(kiq_ring, upper_32_bits(mqd_addr));
|
||||
amdgpu_ring_write(kiq_ring, lower_32_bits(wptr_addr));
|
||||
amdgpu_ring_write(kiq_ring, upper_32_bits(wptr_addr));
|
||||
}
|
||||
|
||||
static void gfx_v9_0_kiq_unmap_queues(struct amdgpu_ring *kiq_ring,
|
||||
struct amdgpu_ring *ring,
|
||||
enum amdgpu_unmap_queues_action action,
|
||||
u64 gpu_addr, u64 seq)
|
||||
{
|
||||
uint32_t eng_sel = ring->funcs->type == AMDGPU_RING_TYPE_GFX ? 4 : 0;
|
||||
|
||||
amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_UNMAP_QUEUES, 4));
|
||||
amdgpu_ring_write(kiq_ring, /* Q_sel: 0, vmid: 0, engine: 0, num_Q: 1 */
|
||||
PACKET3_UNMAP_QUEUES_ACTION(action) |
|
||||
PACKET3_UNMAP_QUEUES_QUEUE_SEL(0) |
|
||||
PACKET3_UNMAP_QUEUES_ENGINE_SEL(eng_sel) |
|
||||
PACKET3_UNMAP_QUEUES_NUM_QUEUES(1));
|
||||
amdgpu_ring_write(kiq_ring,
|
||||
PACKET3_UNMAP_QUEUES_DOORBELL_OFFSET0(ring->doorbell_index));
|
||||
|
||||
if (action == PREEMPT_QUEUES_NO_UNMAP) {
|
||||
amdgpu_ring_write(kiq_ring, lower_32_bits(gpu_addr));
|
||||
amdgpu_ring_write(kiq_ring, upper_32_bits(gpu_addr));
|
||||
amdgpu_ring_write(kiq_ring, seq);
|
||||
} else {
|
||||
amdgpu_ring_write(kiq_ring, 0);
|
||||
amdgpu_ring_write(kiq_ring, 0);
|
||||
amdgpu_ring_write(kiq_ring, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static void gfx_v9_0_kiq_query_status(struct amdgpu_ring *kiq_ring,
|
||||
struct amdgpu_ring *ring,
|
||||
u64 addr,
|
||||
u64 seq)
|
||||
{
|
||||
uint32_t eng_sel = ring->funcs->type == AMDGPU_RING_TYPE_GFX ? 4 : 0;
|
||||
|
||||
amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_QUERY_STATUS, 5));
|
||||
amdgpu_ring_write(kiq_ring,
|
||||
PACKET3_QUERY_STATUS_CONTEXT_ID(0) |
|
||||
PACKET3_QUERY_STATUS_INTERRUPT_SEL(0) |
|
||||
PACKET3_QUERY_STATUS_COMMAND(2));
|
||||
/* Q_sel: 0, vmid: 0, engine: 0, num_Q: 1 */
|
||||
amdgpu_ring_write(kiq_ring,
|
||||
PACKET3_QUERY_STATUS_DOORBELL_OFFSET(ring->doorbell_index) |
|
||||
PACKET3_QUERY_STATUS_ENG_SEL(eng_sel));
|
||||
amdgpu_ring_write(kiq_ring, lower_32_bits(addr));
|
||||
amdgpu_ring_write(kiq_ring, upper_32_bits(addr));
|
||||
amdgpu_ring_write(kiq_ring, lower_32_bits(seq));
|
||||
amdgpu_ring_write(kiq_ring, upper_32_bits(seq));
|
||||
}
|
||||
|
||||
static const struct kiq_pm4_funcs gfx_v9_0_kiq_pm4_funcs = {
|
||||
.kiq_set_resources = gfx_v9_0_kiq_set_resources,
|
||||
.kiq_map_queues = gfx_v9_0_kiq_map_queues,
|
||||
.kiq_unmap_queues = gfx_v9_0_kiq_unmap_queues,
|
||||
.kiq_query_status = gfx_v9_0_kiq_query_status,
|
||||
.set_resources_size = 8,
|
||||
.map_queues_size = 7,
|
||||
.unmap_queues_size = 6,
|
||||
.query_status_size = 7,
|
||||
};
|
||||
|
||||
static void gfx_v9_0_set_kiq_pm4_funcs(struct amdgpu_device *adev)
|
||||
{
|
||||
adev->gfx.kiq.pmf = &gfx_v9_0_kiq_pm4_funcs;
|
||||
}
|
||||
|
||||
static void gfx_v9_0_init_golden_registers(struct amdgpu_device *adev)
|
||||
{
|
||||
switch (adev->asic_type) {
|
||||
@ -4260,6 +4374,7 @@ static int gfx_v9_0_early_init(void *handle)
|
||||
else
|
||||
adev->gfx.num_gfx_rings = GFX9_NUM_GFX_RINGS;
|
||||
adev->gfx.num_compute_rings = AMDGPU_MAX_COMPUTE_RINGS;
|
||||
gfx_v9_0_set_kiq_pm4_funcs(adev);
|
||||
gfx_v9_0_set_ring_funcs(adev);
|
||||
gfx_v9_0_set_irq_funcs(adev);
|
||||
gfx_v9_0_set_gds_init(adev);
|
||||
|
Loading…
x
Reference in New Issue
Block a user