Skip to content

Commit c4c3808

Browse files
pldrcalexdeucher
authored andcommitted
drm/amdgpu: Add ring reset callback for JPEG4_0_3
Add ring reset function callback for JPEG4_0_3 to recover from job timeouts without a full gpu reset. V2: - sched->ready flag shouldn't be modified by HW backend (Christian) V3: - Dont modifying sched/job-submission state from HW backend (Christian) - Implement per-core reset sequence V4: - Dont create reset_mask sysfs and return -EOPNOTSUPP on VFs (Lijo) Signed-off-by: Sathishkumar S <sathishkumar.sundararaju@amd.com> Acked-by: Christian König <christian.koenig@amd.com> Reviewed-by: Leo Liu <leo.liu@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent 58702e1 commit c4c3808

File tree

1 file changed

+49
-7
lines changed

1 file changed

+49
-7
lines changed

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

Lines changed: 49 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -204,12 +204,12 @@ static int jpeg_v4_0_3_sw_init(struct amdgpu_ip_block *ip_block)
204204
if (r)
205205
return r;
206206

207-
/* TODO: Add queue reset mask when FW fully supports it */
208-
adev->jpeg.supported_reset =
209-
amdgpu_get_soft_full_reset_mask(&adev->jpeg.inst[0].ring_dec[0]);
210-
r = amdgpu_jpeg_sysfs_reset_mask_init(adev);
211-
if (r)
212-
return r;
207+
if (!amdgpu_sriov_vf(adev)) {
208+
adev->jpeg.supported_reset = AMDGPU_RESET_TYPE_PER_QUEUE;
209+
r = amdgpu_jpeg_sysfs_reset_mask_init(adev);
210+
if (r)
211+
return r;
212+
}
213213

214214
return 0;
215215
}
@@ -230,7 +230,9 @@ static int jpeg_v4_0_3_sw_fini(struct amdgpu_ip_block *ip_block)
230230
if (r)
231231
return r;
232232

233-
amdgpu_jpeg_sysfs_reset_mask_fini(adev);
233+
if (!amdgpu_sriov_vf(adev))
234+
amdgpu_jpeg_sysfs_reset_mask_fini(adev);
235+
234236
r = amdgpu_jpeg_sw_fini(adev);
235237

236238
return r;
@@ -1099,6 +1101,45 @@ static int jpeg_v4_0_3_process_interrupt(struct amdgpu_device *adev,
10991101
return 0;
11001102
}
11011103

1104+
static void jpeg_v4_0_3_core_stall_reset(struct amdgpu_ring *ring)
1105+
{
1106+
struct amdgpu_device *adev = ring->adev;
1107+
int jpeg_inst = GET_INST(JPEG, ring->me);
1108+
int reg_offset = jpeg_v4_0_3_core_reg_offset(ring->pipe);
1109+
1110+
WREG32_SOC15_OFFSET(JPEG, jpeg_inst,
1111+
regUVD_JMI0_UVD_JMI_CLIENT_STALL,
1112+
reg_offset, 0x1F);
1113+
SOC15_WAIT_ON_RREG(JPEG, jpeg_inst,
1114+
regUVD_JMI0_UVD_JMI_CLIENT_CLEAN_STATUS,
1115+
0x1F, 0x1F);
1116+
WREG32_SOC15_OFFSET(JPEG, jpeg_inst,
1117+
regUVD_JMI0_JPEG_LMI_DROP,
1118+
reg_offset, 0x1F);
1119+
WREG32_SOC15_OFFSET(JPEG, jpeg_inst,
1120+
regJPEG_CORE_RST_CTRL,
1121+
reg_offset, 1 << ring->pipe);
1122+
WREG32_SOC15_OFFSET(JPEG, jpeg_inst,
1123+
regUVD_JMI0_UVD_JMI_CLIENT_STALL,
1124+
reg_offset, 0x00);
1125+
WREG32_SOC15_OFFSET(JPEG, jpeg_inst,
1126+
regUVD_JMI0_JPEG_LMI_DROP,
1127+
reg_offset, 0x00);
1128+
WREG32_SOC15_OFFSET(JPEG, jpeg_inst,
1129+
regJPEG_CORE_RST_CTRL,
1130+
reg_offset, 0x00);
1131+
}
1132+
1133+
static int jpeg_v4_0_3_ring_reset(struct amdgpu_ring *ring, unsigned int vmid)
1134+
{
1135+
if (amdgpu_sriov_vf(ring->adev))
1136+
return -EOPNOTSUPP;
1137+
1138+
jpeg_v4_0_3_core_stall_reset(ring);
1139+
jpeg_v4_0_3_start_jrbc(ring);
1140+
return amdgpu_ring_test_helper(ring);
1141+
}
1142+
11021143
static const struct amd_ip_funcs jpeg_v4_0_3_ip_funcs = {
11031144
.name = "jpeg_v4_0_3",
11041145
.early_init = jpeg_v4_0_3_early_init,
@@ -1145,6 +1186,7 @@ static const struct amdgpu_ring_funcs jpeg_v4_0_3_dec_ring_vm_funcs = {
11451186
.emit_wreg = jpeg_v4_0_3_dec_ring_emit_wreg,
11461187
.emit_reg_wait = jpeg_v4_0_3_dec_ring_emit_reg_wait,
11471188
.emit_reg_write_reg_wait = amdgpu_ring_emit_reg_write_reg_wait_helper,
1189+
.reset = jpeg_v4_0_3_ring_reset,
11481190
};
11491191

11501192
static void jpeg_v4_0_3_set_dec_ring_funcs(struct amdgpu_device *adev)

0 commit comments

Comments
 (0)