[Nouveau] [PATCH v2 2/5] nouveau_hwmon: Add nouveau_hwmon_ops structure with .is_visible/.read_string

Oscar Salvador osalvador.vilardaga at gmail.com
Thu Apr 20 07:32:39 UTC 2017


I got what you meant. I"ll fix it

El dia 20/04/2017 08:47, "Oscar Salvador" <osalvador.vilardaga at gmail.com>
va escriure:

> Hi Karol,
>
> I don't get what you mean with return due to fallthrough. I mean, I
> know what is it, but I don't see how I can do it there.
> Moving the check before the switch looks like that:
>
>         if (!iccsense)
>                 return 0;
>
>         switch (attr) {
>         case hwmon_power_input:
>                 if (iccsense->data_valid &&
>                         !list_empty(&iccsense->rails))
>                         return 0444;
>         case hwmon_power_max:
>                 if (iccsense->power_w_max)
>                         return 0444;
>         case hwmon_power_crit:
>                 if (iccsense->power_w_crit)
>                         return 0444;
>         default:
>                 return 0;
>         }
>
> Could you drop me a hint?
>
>
> On 18 April 2017 at 09:56, Karol Herbst <karolherbst at gmail.com> wrote:
> > 2017-04-17 9:47 GMT+02:00 Oscar Salvador <osalvador.vilardaga at gmail.com
> >:
> >> This patch introduces the nouveau_hwmon_ops structure, sets up
> >> .is_visible and .read_string operations and adds all the functions
> >> for these operations.
> >> This is also a preparation for the next patches, where most of the
> >> work is being done.
> >> This code doesn't interacture with the old one.
> >> It's just to make easier the review of all patches.
> >> ---
> >>  drivers/gpu/drm/nouveau/nouveau_hwmon.c | 166
> ++++++++++++++++++++++++++++++++
> >>  1 file changed, 166 insertions(+)
> >>
> >> diff --git a/drivers/gpu/drm/nouveau/nouveau_hwmon.c
> b/drivers/gpu/drm/nouveau/nouveau_hwmon.c
> >> index 24b40c5..9b6423c 100644
> >> --- a/drivers/gpu/drm/nouveau/nouveau_hwmon.c
> >> +++ b/drivers/gpu/drm/nouveau/nouveau_hwmon.c
> >> @@ -764,6 +764,172 @@ static const struct hwmon_channel_info
> *nouveau_info[] = {
> >>         &nouveau_power,
> >>         NULL
> >>  };
> >> +
> >> +static umode_t
> >> +nouveau_chip_is_visible(const void *data, u32 attr, int channel)
> >> +{
> >> +       switch (attr) {
> >> +       case hwmon_chip_update_interval:
> >> +               return 0444;
> >> +       default:
> >> +               return 0;
> >> +       }
> >> +}
> >> +
> >> +static umode_t
> >> +nouveau_power_is_visible(const void *data, u32 attr, int channel)
> >> +{
> >> +       struct nouveau_drm *drm = nouveau_drm((struct drm_device
> *)data);
> >> +       struct nvkm_iccsense *iccsense = nvxx_iccsense(&drm->client.
> device);
> >> +
> >> +       switch (attr) {
> >> +       case hwmon_power_input:
> >> +               if (iccsense &&
> >
> > move the pointer check before the switch, because you need to check it
> > in every case (or move it to every case, but doing it once is
> > simplier/cleaner)
> >
> >> +                       iccsense->data_valid &&
> >> +                       !list_empty(&iccsense->rails))
> >> +                       return 0444;
> >
> > add return due to fallthrough
> >
> >> +       case hwmon_power_max:
> >> +               if (iccsense->power_w_max)
> >> +                       return 0444;
> >
> > add return due to fallthrough
> >
> >> +       case hwmon_power_crit:
> >> +               if (iccsense->power_w_crit)
> >> +                       return 0444;
> >
> > add return due to fallthrough
> >
> >> +       default:
> >> +               return 0;
> >> +       }
> >> +}
> >> +
> >> +static umode_t
> >> +nouveau_temp_is_visible(const void *data, u32 attr, int channel)
> >> +{
> >> +       struct nouveau_drm *drm = nouveau_drm((struct drm_device
> *)data);
> >> +       struct nvkm_therm *therm = nvxx_therm(&drm->client.device);
> >> +
> >> +       if (therm &&
> >> +               therm->attr_get &&
> >> +               therm->attr_set &&
> >> +               nvkm_therm_temp_get(therm) < 0)
> >> +               return 0;
> >> +
> >> +       switch (attr) {
> >> +       case hwmon_temp_input:
> >> +       case hwmon_temp_max:
> >> +       case hwmon_temp_max_hyst:
> >> +       case hwmon_temp_crit:
> >> +       case hwmon_temp_crit_hyst:
> >> +       case hwmon_temp_emergency:
> >> +       case hwmon_temp_emergency_hyst:
> >> +               return 0444;
> >> +       default:
> >> +               return 0;
> >> +       }
> >> +}
> >> +
> >> +static umode_t
> >> +nouveau_pwm_is_visible(const void *data, u32 attr, int channel)
> >> +{
> >> +       struct nouveau_drm *drm = nouveau_drm((struct drm_device
> *)data);
> >> +       struct nvkm_therm *therm = nvxx_therm(&drm->client.device);
> >> +
> >> +       if (therm &&
> >> +               therm->attr_get &&
> >> +               therm->fan_get &&
> >> +               therm->fan_get(therm) < 0)
> >> +               return 0;
> >> +
> >> +       switch (attr) {
> >> +       case hwmon_pwm_enable:
> >> +       case hwmon_pwm_input:
> >> +               return 0644;
> >> +       default:
> >> +               return 0;
> >> +       }
> >> +}
> >> +
> >> +static umode_t
> >> +nouveau_input_is_visible(const void *data, u32 attr, int channel)
> >> +{
> >> +       struct nouveau_drm *drm = nouveau_drm((struct drm_device
> *)data);
> >> +       struct nvkm_volt *volt = nvxx_volt(&drm->client.device);
> >> +
> >> +       if (!volt || nvkm_volt_get(volt) < 0)
> >> +               return 0;
> >> +
> >> +       switch (attr) {
> >> +       case hwmon_in_input:
> >> +       case hwmon_in_label:
> >> +       case hwmon_in_min:
> >> +       case hwmon_in_max:
> >> +               return 0444;
> >> +       default:
> >> +               return 0;
> >> +       }
> >> +}
> >> +
> >> +static umode_t
> >> +nouveau_fan_is_visible(const void *data, u32 attr, int channel)
> >> +{
> >> +       struct nouveau_drm *drm = nouveau_drm((struct drm_device
> *)data);
> >> +       struct nvkm_therm *therm = nvxx_therm(&drm->client.device);
> >> +
> >> +       if (!therm || !therm->attr_get || nvkm_therm_fan_sense(therm) <
> 0)
> >> +               return 0;
> >> +
> >> +       switch (attr) {
> >> +       case hwmon_fan_input:
> >> +               return 0444;
> >> +       default:
> >> +               return 0;
> >> +       }
> >> +}
> >> +
> >> +static umode_t
> >> +nouveau_is_visible(const void *data, enum hwmon_sensor_types type, u32
> attr,
> >> +                                                               int
> channel)
> >> +{
> >> +       switch (type) {
> >> +       case hwmon_chip:
> >> +               return nouveau_chip_is_visible(data, attr, channel);
> >> +       case hwmon_temp:
> >> +               return nouveau_temp_is_visible(data, attr, channel);
> >> +       case hwmon_fan:
> >> +               return nouveau_fan_is_visible(data, attr, channel);
> >> +       case hwmon_in:
> >> +               return nouveau_input_is_visible(data, attr, channel);
> >> +       case hwmon_pwm:
> >> +               return nouveau_pwm_is_visible(data, attr, channel);
> >> +       case hwmon_power:
> >> +               return nouveau_power_is_visible(data, attr, channel);
> >> +       default:
> >> +               return 0;
> >> +       }
> >> +}
> >> +
> >> +static char *input_label = "GPU core";
> >> +
> >> +static int
> >> +nouveau_read_string(struct device *dev, enum hwmon_sensor_types type,
> u32 attr,
> >> +                                                       int channel,
> char **buf)
> >> +{
> >> +       if (type == hwmon_in && attr == hwmon_in_label) {
> >> +               *buf = input_label;
> >> +               return 0;
> >> +       }
> >> +
> >> +       return -EOPNOTSUPP;
> >> +}
> >> +
> >> +static const struct hwmon_ops nouveau_hwmon_ops = {
> >> +       .is_visible = nouveau_is_visible,
> >> +       .read = NULL,
> >> +       .read_string = nouveau_read_string,
> >> +       .write = NULL,
> >> +};
> >> +
> >> +static const struct hwmon_chip_info nouveau_chip_info = {
> >> +       .ops = &nouveau_hwmon_ops,
> >> +       .info = nouveau_info,
> >> +};
> >>  #endif
> >>
> >>  int
> >> --
> >> 2.1.4
> >>
> >> _______________________________________________
> >> Nouveau mailing list
> >> Nouveau at lists.freedesktop.org
> >> https://lists.freedesktop.org/mailman/listinfo/nouveau
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20170420/b7a6ff9c/attachment.html>


More information about the dri-devel mailing list