[PATCH] drm/amd/pm: Fix that RPM cannot be obtained for specific GPU

Christian König ckoenig.leichtzumerken at gmail.com
Wed Sep 29 09:51:57 UTC 2021


Am 28.09.21 um 23:50 schrieb Alex Deucher:
> On Tue, Sep 28, 2021 at 2:29 AM Christian König
> <ckoenig.leichtzumerken at gmail.com> wrote:
>> Am 28.09.21 um 02:49 schrieb huangyizhi:
>>> The current mechanism for obtaining RPM is to read tach_period from
>>> the register, and then calculate the RPM together with the frequency.
>>> But we found that on specific GPUs, such as RX 550 and RX 560D,
>>> tach_period always reads as 0 and smu7_fan_ctrl_get_fan_speed_rpm
>>> will returns -EINVAL.
>>>
>>> To solve this problem, when reading tach_period as 0, we try
>>> to estimate the current RPM using the percentage of current pwm, the
>>> maximum and minimum RPM.
>> Well that is most likely a bad idea.
>>
>> When the fan speed is not available faking some value is certainly not
>> the right solution, especially when you don't know the topology of the
>> DC conversion driven by the PWM.
>>
> I think there is a flag in the vbios to determine whether a specific
> board supports rpm based fan control.  This used to be an AIB specific
> option.  If the flag is not set, the driver should not expose the rpm
> interface for fan control, only the PWM interface.  I think at some
> point rpm fan control became mandatory, but maybe it was still an
> option on polaris and we are missing a check for that flag.

Yeah, that sounds totally sane to me as well.

Let's ask for a volunteer for the job on Thursday if not somebody from 
the community speaks up.

Christian.

>
> Alex
>
>
>> Christian.
>>
>>> Signed-off-by: huangyizhi <huangyizhi at hnu.edu.cn>
>>> ---
>>>    .../drm/amd/pm/powerplay/hwmgr/smu7_thermal.c | 28 ++++++++++++++++---
>>>    1 file changed, 24 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_thermal.c b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_thermal.c
>>> index a6c3610db23e..307dd87d6882 100644
>>> --- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_thermal.c
>>> +++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_thermal.c
>>> @@ -81,6 +81,11 @@ int smu7_fan_ctrl_get_fan_speed_rpm(struct pp_hwmgr *hwmgr, uint32_t *speed)
>>>    {
>>>        uint32_t tach_period;
>>>        uint32_t crystal_clock_freq;
>>> +     uint32_t duty100;
>>> +     uint32_t duty;
>>> +     uint32_t speed_percent;
>>> +     uint64_t tmp64;
>>> +
>>>
>>>        if (hwmgr->thermal_controller.fanInfo.bNoFan ||
>>>            !hwmgr->thermal_controller.fanInfo.ucTachometerPulsesPerRevolution)
>>> @@ -89,13 +94,28 @@ int smu7_fan_ctrl_get_fan_speed_rpm(struct pp_hwmgr *hwmgr, uint32_t *speed)
>>>        tach_period = PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
>>>                        CG_TACH_STATUS, TACH_PERIOD);
>>>
>>> -     if (tach_period == 0)
>>> -             return -EINVAL;
>>> +     if (tach_period == 0) {
>>>
>>> -     crystal_clock_freq = amdgpu_asic_get_xclk((struct amdgpu_device *)hwmgr->adev);
>>> +             duty100 = PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
>>> +                             CG_FDO_CTRL1, FMAX_DUTY100);
>>> +             duty = PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
>>> +                             CG_THERMAL_STATUS, FDO_PWM_DUTY);
>>>
>>> -     *speed = 60 * crystal_clock_freq * 10000 / tach_period;
>>> +             if (duty100 == 0)
>>> +                     return -EINVAL;
>>>
>>> +             tmp64 = (uint64_t)duty * 100;
>>> +             do_div(tmp64, duty100);
>>> +             speed_percent = MIN((uint32_t)tmp64, 100);
>>> +
>>> +             *speed = speed_percent * (hwmgr->thermal_controller.fanInfo.ulMaxRPM
>>> +                     - hwmgr->thermal_controller.fanInfo.ulMinRPM) / 100;
>>> +     } else {
>>> +
>>> +             crystal_clock_freq = amdgpu_asic_get_xclk((struct amdgpu_device *)hwmgr->adev);
>>> +
>>> +             *speed = 60 * crystal_clock_freq * 10000 / tach_period;
>>> +     }
>>>        return 0;
>>>    }
>>>



More information about the amd-gfx mailing list