Skip to content

Commit 1741281

Browse files
committed
drm/amdgpu/gfx10: add ring reset callbacks
Add ring reset callbacks for gfx and compute. v2: fix gfx handling v3: wait for KIQ to complete Acked-by: Vitaly Prosyak <vitaly.prosyak@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent a10c939 commit 1741281

File tree

1 file changed

+91
-0
lines changed

1 file changed

+91
-0
lines changed

drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9416,6 +9416,95 @@ static void gfx_v10_ring_insert_nop(struct amdgpu_ring *ring, uint32_t num_nop)
94169416
amdgpu_ring_write(ring, ring->funcs->nop);
94179417
}
94189418

9419+
static int gfx_v10_0_reset_kgq(struct amdgpu_ring *ring, unsigned int vmid)
9420+
{
9421+
struct amdgpu_device *adev = ring->adev;
9422+
struct amdgpu_kiq *kiq = &adev->gfx.kiq[0];
9423+
struct amdgpu_ring *kiq_ring = &kiq->ring;
9424+
unsigned long flags;
9425+
u32 tmp;
9426+
u64 addr;
9427+
int r;
9428+
9429+
if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues)
9430+
return -EINVAL;
9431+
9432+
spin_lock_irqsave(&kiq->ring_lock, flags);
9433+
9434+
if (amdgpu_ring_alloc(kiq_ring, 5 + 7 + 7 + kiq->pmf->map_queues_size)) {
9435+
spin_unlock_irqrestore(&kiq->ring_lock, flags);
9436+
return -ENOMEM;
9437+
}
9438+
9439+
addr = amdgpu_bo_gpu_offset(ring->mqd_obj) +
9440+
offsetof(struct v10_gfx_mqd, cp_gfx_hqd_active);
9441+
tmp = REG_SET_FIELD(0, CP_VMID_RESET, RESET_REQUEST, 1 << vmid);
9442+
if (ring->pipe == 0)
9443+
tmp = REG_SET_FIELD(tmp, CP_VMID_RESET, PIPE0_QUEUES, 1 << ring->queue);
9444+
else
9445+
tmp = REG_SET_FIELD(tmp, CP_VMID_RESET, PIPE1_QUEUES, 1 << ring->queue);
9446+
9447+
gfx_v10_0_ring_emit_wreg(kiq_ring,
9448+
SOC15_REG_OFFSET(GC, 0, mmCP_VMID_RESET), tmp);
9449+
gfx_v10_0_wait_reg_mem(kiq_ring, 0, 1, 0,
9450+
lower_32_bits(addr), upper_32_bits(addr),
9451+
0, 1, 0x20);
9452+
gfx_v10_0_ring_emit_reg_wait(kiq_ring,
9453+
SOC15_REG_OFFSET(GC, 0, mmCP_VMID_RESET), 0, 0xffffffff);
9454+
kiq->pmf->kiq_map_queues(kiq_ring, ring);
9455+
amdgpu_ring_commit(kiq_ring);
9456+
9457+
spin_unlock_irqrestore(&kiq->ring_lock, flags);
9458+
9459+
r = amdgpu_ring_test_ring(kiq_ring);
9460+
if (r)
9461+
return r;
9462+
9463+
/* reset the ring */
9464+
ring->wptr = 0;
9465+
*ring->wptr_cpu_addr = 0;
9466+
amdgpu_ring_clear_ring(ring);
9467+
9468+
return amdgpu_ring_test_ring(ring);
9469+
}
9470+
9471+
static int gfx_v10_0_reset_kcq(struct amdgpu_ring *ring,
9472+
unsigned int vmid)
9473+
{
9474+
struct amdgpu_device *adev = ring->adev;
9475+
struct amdgpu_kiq *kiq = &adev->gfx.kiq[0];
9476+
struct amdgpu_ring *kiq_ring = &kiq->ring;
9477+
unsigned long flags;
9478+
int r;
9479+
9480+
if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues)
9481+
return -EINVAL;
9482+
9483+
spin_lock_irqsave(&kiq->ring_lock, flags);
9484+
9485+
if (amdgpu_ring_alloc(kiq_ring, kiq->pmf->unmap_queues_size)) {
9486+
spin_unlock_irqrestore(&kiq->ring_lock, flags);
9487+
return -ENOMEM;
9488+
}
9489+
9490+
kiq->pmf->kiq_unmap_queues(kiq_ring, ring, RESET_QUEUES,
9491+
0, 0);
9492+
amdgpu_ring_commit(kiq_ring);
9493+
9494+
spin_unlock_irqrestore(&kiq->ring_lock, flags);
9495+
9496+
r = amdgpu_ring_test_ring(kiq_ring);
9497+
if (r)
9498+
return r;
9499+
9500+
/* reset the ring */
9501+
ring->wptr = 0;
9502+
*ring->wptr_cpu_addr = 0;
9503+
amdgpu_ring_clear_ring(ring);
9504+
9505+
return amdgpu_ring_test_ring(ring);
9506+
}
9507+
94199508
static void gfx_v10_ip_print(void *handle, struct drm_printer *p)
94209509
{
94219510
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
@@ -9619,6 +9708,7 @@ static const struct amdgpu_ring_funcs gfx_v10_0_ring_funcs_gfx = {
96199708
.emit_reg_write_reg_wait = gfx_v10_0_ring_emit_reg_write_reg_wait,
96209709
.soft_recovery = gfx_v10_0_ring_soft_recovery,
96219710
.emit_mem_sync = gfx_v10_0_emit_mem_sync,
9711+
.reset = gfx_v10_0_reset_kgq,
96229712
};
96239713

96249714
static const struct amdgpu_ring_funcs gfx_v10_0_ring_funcs_compute = {
@@ -9655,6 +9745,7 @@ static const struct amdgpu_ring_funcs gfx_v10_0_ring_funcs_compute = {
96559745
.emit_reg_write_reg_wait = gfx_v10_0_ring_emit_reg_write_reg_wait,
96569746
.soft_recovery = gfx_v10_0_ring_soft_recovery,
96579747
.emit_mem_sync = gfx_v10_0_emit_mem_sync,
9748+
.reset = gfx_v10_0_reset_kcq,
96589749
};
96599750

96609751
static const struct amdgpu_ring_funcs gfx_v10_0_ring_funcs_kiq = {

0 commit comments

Comments
 (0)