[PATCH 3/4] drm/amdgpu: add sdma v5_2 soft reset

Lazar, Lijo lijo.lazar at amd.com
Thu Mar 10 15:53:53 UTC 2022



On 3/10/2022 9:11 PM, Andrey Grodzovsky wrote:
> 
> 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

Maybe, check if any of the sdma rings is associated to the job scheduler?

Thanks,
Lijo

> 
> 
>>
>>> +            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