RE: [PATCH V3] hwmon: scmi-hwmon: implement change_mode for thermal zones

From: Peng Fan
Date: Thu Jan 25 2024 - 02:06:41 EST


Hi Guenter,

> Subject: Re: [PATCH V3] hwmon: scmi-hwmon: implement change_mode for
> thermal zones
>
> On 1/24/24 22:44, Peng Fan (OSS) wrote:
> > From: Peng Fan <peng.fan@xxxxxxx>
> >
> > The thermal sensors maybe disabled before kernel boot, so add
> > change_mode for thermal zones to support configuring the thermal
> > sensor to enabled state. If reading the temperature when the sensor is
> > disabled, there will be error reported.
> >
> > The cost is an extra config_get all to SCMI firmware to get the status
> > of the thermal sensor. No function level impact.
> >
> > Reviewed-by: Cristian Marussi <cristian.marussi@xxxxxxx>
> > Signed-off-by: Peng Fan <peng.fan@xxxxxxx>
> > ---
> >
> > V3:
> > Update commit log to show it only applys to thermal
> > Add comments in code
> > Add R-b from Cristian
> >
>
> You didn't address my question regarding the behavior of hwmon attributes if
> a sensor is disabled.

Would you please share a bit more on what attributes?
You mean the files under /sys/class/hwmon/hwmon0?

If the sensor is disabled, when cat temp[x]_input, it will
report:
root@imx95-19x19-lpddr5-evk:/sys/class/hwmon/hwmon0# cat temp3_input
cat: temp3_input: Protocol error

For enabled, it will report value:
root@imx95-19x19-lpddr5-evk:/sys/class/hwmon/hwmon0# cat temp1_input
31900

>
> > Guenter, I Cced linux@xxxxxxxxxxxx when sending V1/V2
> > Let me Cc Guenter Roeck <groeck7@xxxxxxxxx> in V3, hope you not mind
> >
> This time I received it twice ;-).
>
> > V2:
> > Use SCMI_SENS_CFG_IS_ENABLED & clear BIT[31:9] before update
> > config(Thanks Cristian)
> >
> > drivers/hwmon/scmi-hwmon.c | 39
> ++++++++++++++++++++++++++++++++++++++
> > 1 file changed, 39 insertions(+)
> >
> > diff --git a/drivers/hwmon/scmi-hwmon.c b/drivers/hwmon/scmi-hwmon.c
> > index 364199b332c0..af2267fea5f0 100644
> > --- a/drivers/hwmon/scmi-hwmon.c
> > +++ b/drivers/hwmon/scmi-hwmon.c
> > @@ -151,7 +151,46 @@ static int scmi_hwmon_thermal_get_temp(struct
> thermal_zone_device *tz,
> > return ret;
> > }
> >
> > +static int scmi_hwmon_thermal_change_mode(struct
> thermal_zone_device *tz,
> > + enum thermal_device_mode
> new_mode) {
> > + int ret;
> > + u32 config;
> > + enum thermal_device_mode cur_mode =
> THERMAL_DEVICE_DISABLED;
> > + struct scmi_thermal_sensor *th_sensor =
> > +thermal_zone_device_priv(tz);
> > +
> > + ret = sensor_ops->config_get(th_sensor->ph, th_sensor->info->id,
> > + &config);
> > + if (ret)
> > + return ret;
> > +
> > + if (SCMI_SENS_CFG_IS_ENABLED(config))
> > + cur_mode = THERMAL_DEVICE_ENABLED;
> > +
> > + if (cur_mode == new_mode)
> > + return 0;
> > +
> > + /*
> > + * Per SENSOR_CONFIG_SET sensor_config description:
> > + * BIT[31:11] should be set to 0 if the sensor update interval does
> > + * not need to be updated, so clear them.
> > + * And SENSOR_CONFIG_GET does not return round up/down, so also
> clear
> > + * BIT[10:9] round up/down.
>
> What does "clear" mean ? Is it going to round up ? Round down ? And why
> would it be necessary to clear those bits if SENSOR_CONFIG_GET does not
> return the current setting in the first place ?

This is to follow Cristian's suggestion to clear [31:9], because we only need
to set the sensor to enabled state, no other attributes.
My understanding is with BIT[31:11] set to 0, BIT[10:9] will not take effect.
Cristian may help comment more since he suggested to clear them in V1/V2

You are right, currently config_get will return [10:2] as reserved,
so config_set bit[10:9] no need touch. But config_get bit[10:2]
may update to return the value in future SCMI spec?

Cristian or Sudeep may help comment here.

Thanks,
Peng.

>
> Thanks,
> Guenter
>
> > + */
> > + config &= ~(SCMI_SENS_CFG_UPDATE_SECS_MASK |
> > + SCMI_SENS_CFG_UPDATE_EXP_MASK |
> > + SCMI_SENS_CFG_ROUND_MASK);
> > + if (new_mode == THERMAL_DEVICE_ENABLED)
> > + config |= SCMI_SENS_CFG_SENSOR_ENABLED_MASK;
> > + else
> > + config &= ~SCMI_SENS_CFG_SENSOR_ENABLED_MASK;
> > +
> > + return sensor_ops->config_set(th_sensor->ph, th_sensor->info->id,
> > + config);
> > +}
> > +
> > static const struct thermal_zone_device_ops scmi_hwmon_thermal_ops =
> > {
> > + .change_mode = scmi_hwmon_thermal_change_mode,
> > .get_temp = scmi_hwmon_thermal_get_temp,
> > };
> >