[PATCH 3/4] drm/amdgpu: add sdma v5_2 soft reset
Andrey Grodzovsky
andrey.grodzovsky at amd.com
Thu Mar 10 15:41:25 UTC 2022
On 2022-03-10 05:06, Christian König wrote:
> Am 10.03.22 um 07:11 schrieb Victor Zhao:
>> enable sdma v5_2 soft reset
>>
>> Signed-off-by: Victor Zhao <Victor.Zhao at amd.com>
>> ---
>> drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c | 79 +++++++++++++++++++++++++-
>> 1 file changed, 78 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
>> b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
>> index 4d4d1aa51b8a..f9f978d8fe8a 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
>> @@ -806,6 +806,80 @@ static int sdma_v5_2_load_microcode(struct
>> amdgpu_device *adev)
>> return 0;
>> }
>> +static bool sdma_v5_2_check_soft_reset(void *handle, struct
>> amdgpu_job *job)
>> +{
>> + struct amdgpu_device *adev = (struct amdgpu_device *)handle;
>> +
>> + if (job) {
>> + if (!strncmp(job->base.sched->name, "sdma", 4))
>
> That's a really big NAK, please no string comparison in the kernel if
> it isn't absolutely necessary.
>
> Regards,
> Christian.
And even if you would rely on this then at least you have to define a
MACRO for scheduler name and use it everywhere because
tomorrow someone will change from 'sdma' to something else in scheduler
initialization and this code will break instantly.
Andrey
>
>> + return true;
>> + else
>> + return false;
>> + } else {
>> + u32 tmp = RREG32_SOC15(GC, 0, mmGRBM_STATUS2);
>> +
>> + if (tmp == 0xffffffff)
>> + return false;
>> +
>> + if (tmp & GRBM_STATUS2__SDMA_BUSY_MASK)
>> + return true;
>> + else
>> + return false;
>> + }
>> +}
>> +
>> +static int sdma_v5_2_pre_soft_reset(void *handle)
>> +{
>> + struct amdgpu_device *adev = (struct amdgpu_device *)handle;
>> + int i, j;
>> + uint32_t tmp, f32_cntl;
>> +
>> + for (i = 0; i < adev->sdma.num_instances; i++)
>> + WREG32(sdma_v5_2_get_reg_offset(adev, i, mmSDMA0_FREEZE),
>> 0x10);
>> +
>> + for (i = 0; i < adev->sdma.num_instances; i++) {
>> + for (j = 0; j < 10; j++) {
>> + tmp = RREG32(sdma_v5_2_get_reg_offset(adev, i,
>> mmSDMA0_FREEZE));
>> + DRM_DEBUG("SDMA%d_FREEZE=0x%x", i, tmp);
>> + if (tmp & SDMA0_FREEZE__FROZEN_MASK) {
>> + WREG32(sdma_v5_2_get_reg_offset(adev, i,
>> mmSDMA0_FREEZE), 0);
>> + break;
>> + } else {
>> + udelay(10);
>> + }
>> + }
>> + if (j == 10) {
>> + DRM_ERROR("SDMA%d_FREEZE frozen not set", i);
>> + return -1;
>> + }
>> + }
>> + for (i = 0; i < adev->sdma.num_instances; i++) {
>> + f32_cntl = RREG32(sdma_v5_2_get_reg_offset(adev, i,
>> mmSDMA0_F32_CNTL));
>> + f32_cntl = REG_SET_FIELD(f32_cntl, SDMA0_F32_CNTL, HALT, 1);
>> + WREG32(sdma_v5_2_get_reg_offset(adev, i, mmSDMA0_F32_CNTL),
>> f32_cntl);
>> + }
>> +
>> + return 0;
>> +}
>> +
>> +static int sdma_v5_2_post_soft_reset(void *handle)
>> +{
>> + int i;
>> + uint32_t f32_cntl;
>> + struct amdgpu_device *adev = (struct amdgpu_device *)handle;
>> +
>> + for (i = 0; i < adev->sdma.num_instances; i++) {
>> + f32_cntl = RREG32(sdma_v5_2_get_reg_offset(adev, i,
>> mmSDMA0_F32_CNTL));
>> + f32_cntl = REG_SET_FIELD(f32_cntl, SDMA0_F32_CNTL, HALT, 0);
>> + WREG32(sdma_v5_2_get_reg_offset(adev, i, mmSDMA0_F32_CNTL),
>> f32_cntl);
>> + }
>> +
>> + sdma_v5_2_gfx_resume(adev);
>> + udelay(10);
>> +
>> + return 0;
>> +}
>> +
>> static int sdma_v5_2_soft_reset(void *handle)
>> {
>> struct amdgpu_device *adev = (struct amdgpu_device *)handle;
>> @@ -831,7 +905,7 @@ static int sdma_v5_2_soft_reset(void *handle)
>> WREG32_SOC15(GC, 0, mmGRBM_SOFT_RESET, tmp);
>> tmp = RREG32_SOC15(GC, 0, mmGRBM_SOFT_RESET);
>> - udelay(50);
>> + mdelay(2);
>> }
>> return 0;
>> @@ -1655,6 +1729,9 @@ const struct amd_ip_funcs sdma_v5_2_ip_funcs = {
>> .resume = sdma_v5_2_resume,
>> .is_idle = sdma_v5_2_is_idle,
>> .wait_for_idle = sdma_v5_2_wait_for_idle,
>> + .pre_soft_reset = sdma_v5_2_pre_soft_reset,
>> + .post_soft_reset = sdma_v5_2_post_soft_reset,
>> + .check_soft_reset = sdma_v5_2_check_soft_reset,
>> .soft_reset = sdma_v5_2_soft_reset,
>> .set_clockgating_state = sdma_v5_2_set_clockgating_state,
>> .set_powergating_state = sdma_v5_2_set_powergating_state,
>
More information about the amd-gfx
mailing list