Skip to contentSkip to conversation

Conversion of w83627ehf to hwmon_device_register_with_info ?

DISCUSSION Peter Hüwe 3 participants 11 messages Mar 3, 2017 – Mar 23, 2017 Hardware monitoring

lore
Share & tools
lore
#0 lore raw

Hi,

is anybody else working on the conversion of the w83627ehf to the new hwmon_device_register_with_info interface?

Otherwise I will probably update the driver to this interface within the next days - but since it's a lot of work I wanted to check for duplication first.

Do you think it makes sense to introduce a hwmon_sensor_types for "intrusion" as well? - there are currently 8 drivers who offer that interface.

Thanks,
Peter

maintainer
#1 lore raw

Hi Peter,

Quoted 5 lines · Peter Hüwe

Hi,

is anybody else working on the conversion of the w83627ehf to the new hwmon_device_register_with_info interface?

I don't think so.

Quoted 3 lines

Otherwise I will probably update the driver to this interface within the next days - but since it's a lot of work I wanted to check for duplication first.

Go ahead. I would suggest to drop nct6775/nct6776 support to simplify the code when you do that. Maybe as separate commit, though.

Quoted 3 lines

Do you think it makes sense to introduce a hwmon_sensor_types for "intrusion" as well? - there are currently 8 drivers who offer that interface.

I don't really like the idea of introducing another type for just one attribute, but it might be the easiest and most consistent approach. Feel free to submit a patch to add it.

Guenter

#2 lore raw

Hi

Quoted 8 lines · On Friday 03 March 2017 03:56:01 Guenter Roeck wrote:

Hi Peter,

Quoted 4 lines · Peter Hüwe

Hi,

is anybody else working on the conversion of the w83627ehf to the new hwmon_device_register_with_info interface?

Quoted 7 lines

I don't think so.

Quoted 3 lines

Otherwise I will probably update the driver to this interface within the next days - but since it's a lot of work I wanted to check for duplication first.

Go ahead.

So I'm close to have to conversion done,
the current diff stat is about
647 insertions(+), 787 deletions(-)
for the whole conversion.

Should I try to break it down into smaller chunks for easier review?

Although this would mean to convert stuff from A to B and then from B to C - otherwise the intermediate steps would be not fully functional. (since the sysfs nodes partially would exist under hwmon1/ and partially under hwmon1/device/ (as they currently are)).

or just submit it?

It saves about 20k in compiled size, so the savings from reduced boilerplate are huge. (and I think it's more readable)

Quoted 2 lines

I would suggest to drop nct6775/nct6776 support to simplify the code when you do that. Maybe as separate commit, though.

Hehe - I'm testing on a nct6776 :)
I'll look into it once the first conversion has been accepted.

Thanks,
Peter

maintainer
#3 lore raw
Quoted 24 lines · Peter Hüwe

Hi

Quoted 8 lines · On Friday 03 March 2017 03:56:01 Guenter Roeck wrote:

Hi Peter,

Quoted 4 lines · Peter Hüwe

Hi,

is anybody else working on the conversion of the w83627ehf to the new hwmon_device_register_with_info interface?

Quoted 7 lines

I don't think so.

Quoted 3 lines

Otherwise I will probably update the driver to this interface within the next days - but since it's a lot of work I wanted to check for duplication first.

Go ahead.

So I'm close to have to conversion done,
the current diff stat is about
647 insertions(+), 787 deletions(-)
for the whole conversion.

Quoted 9 lines

Should I try to break it down into smaller chunks for easier review?

Although this would mean to convert stuff from A to B and then from B to C - otherwise the intermediate steps would be not fully functional. (since the sysfs nodes partially would exist under hwmon1/ and partially under hwmon1/device/ (as they currently are)).

or just submit it?

Just submit it. I don't really think a conversion like this can be split up cleanly.

Quoted 8 lines

It saves about 20k in compiled size, so the savings from reduced boilerplate are huge. (and I think it's more readable)

Quoted 2 lines

I would suggest to drop nct6775/nct6776 support to simplify the code when you do that. Maybe as separate commit, though.

Hehe - I'm testing on a nct6776 :)
I'll look into it once the first conversion has been accepted.

Wondering - why don't you use the nct6775 driver ?

Thanks,
Guenter

#4 lore raw
Quoted 10 lines
Quoted 8 lines

It saves about 20k in compiled size, so the savings from reduced boilerplate are huge. (and I think it's more readable)

Quoted 2 lines

I would suggest to drop nct6775/nct6776 support to simplify the code when you do that. Maybe as separate commit, though.

Hehe - I'm testing on a nct6776 :)
I'll look into it once the first conversion has been accepted.

Wondering - why don't you use the nct6775 driver ?

Probably because it got matched by sensors-detect before the nct6775 driver (?) or because I hadn't had it turned on in my kernel config.

Both drivers work, but interestingly, they show different values for intrusion1 (and fan alarm).

nct6776.c:

nct6776-isa-0290

Adapter: ISA adapter
Vcore:          +1.16 V  (min =  +0.00 V, max =  +1.74 V)
in1:            +1.85 V  (min =  +0.00 V, max =  +0.00 V)  ALARM
AVCC:           +3.36 V  (min =  +2.98 V, max =  +3.63 V)
+3.3V:          +3.36 V  (min =  +2.98 V, max =  +3.63 V)
in4:            +0.26 V  (min =  +0.00 V, max =  +0.00 V)  ALARM
in5:            +1.67 V  (min =  +0.00 V, max =  +0.00 V)  ALARM
in6:            +0.79 V  (min =  +0.00 V, max =  +0.00 V)  ALARM
3VSB:           +3.44 V  (min =  +2.98 V, max =  +3.63 V)
Vbat:           +3.26 V  (min =  +2.70 V, max =  +3.63 V)
fan1:             0 RPM  (min =    0 RPM)
fan2:          2106 RPM  (min =    0 RPM)
fan3:             0 RPM  (min =    0 RPM)
fan4:             0 RPM  (min =    0 RPM)
fan5:             0 RPM  (min =    0 RPM)
SYSTIN:         +35.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = 
thermistor
CPUTIN:         +44.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor
AUXTIN:         +43.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor
PECI Agent 0:   +59.0°C  (high = +80.0°C, hyst = +75.0°C)
                         (crit = +105.0°C)
PCH_CHIP_TEMP:   +0.0°C  
PCH_CPU_TEMP:    +0.0°C  
PCH_MCH_TEMP:    +0.0°C  
intrusion0:    ALARM
intrusion1:    OK
beep_enable:   disabled

w83627ehf.c:
nct6776-isa-0290

Adapter: ISA adapter
Vcore:         +1.14 V  (min =  +0.00 V, max =  +1.74 V)
in1:           +1.85 V  (min =  +0.00 V, max =  +0.00 V)  ALARM
AVCC:          +3.36 V  (min =  +2.98 V, max =  +3.63 V)
+3.3V:         +3.36 V  (min =  +2.98 V, max =  +3.63 V)
in4:           +0.24 V  (min =  +0.00 V, max =  +0.00 V)  ALARM
in5:           +1.68 V  (min =  +0.00 V, max =  +0.00 V)  ALARM
3VSB:          +3.44 V  (min =  +2.98 V, max =  +3.63 V)
Vbat:          +3.26 V  (min =  +2.70 V, max =  +3.63 V)
fan1:            0 RPM  (min =    0 RPM)  ALARM
fan2:         2142 RPM  (min =    0 RPM)  ALARM
fan3:            0 RPM  (min =    0 RPM)  ALARM
fan4:            0 RPM  (min =    0 RPM)  ALARM
fan5:            0 RPM  (min =    0 RPM)  ALARM
SYSTIN:        +35.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = 
thermistor
CPUTIN:        +46.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor
AUXTIN:        +44.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor
PECI Agent 0:  +64.0°C  
cpu0_vid:     +0.000 V
intrusion0:   ALARM
intrusion1:   ALARM

Once the other patches have been accepted I'll work on that conversion/removal of the nct6775 code from the w83627ehf.

Peter

#5 lore raw
In reply to Peter Hüwe

Hi Peter,

Quoted 2 lines · Peter Hüwe

is anybody else working on the conversion of the w83627ehf to the new hwmon_device_register_with_info interface?

Not me.

Signature · 2 lines
Jean Delvare
SUSE L3 Support
#6 lore raw

Question about hwmon_attr_show_string

In reply to Peter Hüwe

Hi Guenter,

I was wondering whether there was a particular reason why hwmon_attr_show_string passes only an "empty" pointer(pointer) to the ops-

Quoted 1 line

read_string function rather than the buffer itself?

Wouldn't this mean that in ops->read_string I'd have to reserve some space for the value on the heap (and taking care to free it somewhere, since returning an address on the stack is bad idea), instead of calling sprintf(buf, "%s\n",
s) directly?

With the current implementation I have to sprintf it into my local buffer and you sprintf it again into the final buffer.

Unfortunately there are no other callers, where you show the intended usage.

Thanks,
Peter

maintainer
#7 lore raw

Re: Question about hwmon_attr_show_string

Quoted 6 lines · Peter Hüwe

Hi Guenter,

I was wondering whether there was a particular reason why hwmon_attr_show_string passes only an "empty" pointer(pointer) to the ops-

Quoted 1 line

read_string function rather than the buffer itself?

Quoted 8 lines

Wouldn't this mean that in ops->read_string I'd have to reserve some space for the value on the heap (and taking care to free it somewhere, since returning an address on the stack is bad idea), instead of calling sprintf(buf, "%s\n",
s) directly?

With the current implementation I have to sprintf it into my local buffer and you sprintf it again into the final buffer.

The idea was that the called code would return a pointer to a constant string, ie one that isn't changing from call to call.

What attribute do you see that would require a dynamic (changing) string ?

Thanks,
Guenter

#8 lore raw

Re: Question about hwmon_attr_show_string

Hi Guenter,

Quoted 12 lines · Guenter Roeck
Quoted 11 lines · Peter Hüwe

Hi Guenter,

I was wondering whether there was a particular reason why hwmon_attr_show_string passes only an "empty" pointer(pointer) to the ops-

Quoted 1 line

read_string function rather than the buffer itself?

Wouldn't this mean that in ops->read_string I'd have to reserve some space for the value on the heap (and taking care to free it somewhere, since returning an address on the stack is bad idea), instead of calling sprintf(buf, "%s\n",
s) directly?

Quoted 5 lines
Quoted 2 lines

With the current implementation I have to sprintf it into my local buffer and you sprintf it again into the final buffer.

The idea was that the called code would return a pointer to a constant string, ie one that isn't changing from call to call.

In that case, what about the following change?

Subject: hwmon: Constify str parameter of hwmon_ops->read_string

The read_string callback is supposed to retrieve a pointer to a constant string.

---
 drivers/hwmon/hwmon.c |    2 +-
 include/linux/hwmon.h |    2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/hwmon/hwmon.c +1 -1
@@ -186,7 +186,7 @@ static ssize_t hwmon_attr_show_string(st
 				      char *buf)
 {
 	struct hwmon_device_attribute *hattr = to_hwmon_attr(devattr);
-	char *s;
+	const char *s;
 	int ret;
 
 	ret = hattr->ops->read_string(dev, hattr->type, hattr->attr,
include/linux/hwmon.h +1 -1
@@ -336,7 +336,7 @@ struct hwmon_ops {
 	int (*read)(struct device *dev, enum hwmon_sensor_types type,
 		    u32 attr, int channel, long *val);
 	int (*read_string)(struct device *dev, enum hwmon_sensor_types type,
-		    u32 attr, int channel, char **str);
+		    u32 attr, int channel, const char **str);
 	int (*write)(struct device *dev, enum hwmon_sensor_types type,
 		     u32 attr, int channel, long val);
 };
Signature · 2 lines
Jean Delvare
SUSE L3 Support
author Reviewed-by
#9 lore raw

Re: Question about hwmon_attr_show_string

Am 7. März 2017 10:08:46 MEZ schrieb Jean Delvare <[email protected]>:

Quoted 25 lines

Hi Guenter,

Quoted 5 lines · Guenter Roeck
Quoted 4 lines · Peter Hüwe

Hi Guenter,

I was wondering whether there was a particular reason why hwmon_attr_show_string passes only an "empty" pointer(pointer) to

the ops-

Quoted 3 lines
Quoted 3 lines
Quoted 1 line

read_string function rather than the buffer itself?

Wouldn't this mean that in ops->read_string I'd have to reserve

some space for

Quoted 1 line
Quoted 1 line

the value on the heap (and taking care to free it somewhere, since

returning

Quoted 1 line
Quoted 1 line

an address on the stack is bad idea), instead of calling

sprintf(buf, "%s\n",

Quoted 3 lines
Quoted 3 lines

s) directly?

With the current implementation I have to sprintf it into my local

buffer and

Quoted 3 lines
Quoted 1 line

you sprintf it again into the final buffer.

The idea was that the called code would return a pointer to a

constant string,

Quoted 8 lines
Quoted 1 line

ie one that isn't changing from call to call.

In that case, what about the following change?

Subject: hwmon: Constify str parameter of hwmon_ops->read_string

The read_string callback is supposed to retrieve a pointer to a constant string.

I would think that clarifies the situation and also gets rid warnings about dropping const qualifier at the point of assignment.

Quoted 33 lines

---

drivers/hwmon/hwmon.c |    2 +-
include/linux/hwmon.h |    2 +-
2 files changed, 2 insertions(+), 2 deletions(-)

--- linux-4.10.orig/drivers/hwmon/hwmon.c 2017-02-19 23:34:00.000000000
+0100
+++ linux-4.10/drivers/hwmon/hwmon.c 2017-03-07 08:22:27.784527968
+0100

drivers/hwmon/hwmon.c +5 -3
@@ -186,7 +186,7 @@ static ssize_t hwmon_attr_show_string(st
 				      char *buf)
 {
 	struct hwmon_device_attribute *hattr = to_hwmon_attr(devattr);
-	char *s;
+	const char *s;
 	int ret;
 
 	ret = hattr->ops->read_string(dev, hattr->type, hattr->attr,
--- linux-4.10.orig/include/linux/hwmon.h	2017-02-19 23:34:00.000000000
+0100
+++ linux-4.10/include/linux/hwmon.h	2017-03-07 08:21:28.247998585
+0100
@@ -336,7 +336,7 @@ struct hwmon_ops {
 	int (*read)(struct device *dev, enum hwmon_sensor_types type,
 		    u32 attr, int channel, long *val);
 	int (*read_string)(struct device *dev, enum hwmon_sensor_types type,
-		    u32 attr, int channel, char **str);
+		    u32 attr, int channel, const char **str);
 	int (*write)(struct device *dev, enum hwmon_sensor_types type,
 		     u32 attr, int channel, long val);
 };
Signature · 1 line
Sent from my mobile
maintainer
#10 lore raw

Re: Question about hwmon_attr_show_string

In reply to Jean Delvare
Quoted 21 lines · Jean Delvare

Hi Guenter,

Quoted 12 lines · Guenter Roeck
Quoted 11 lines · Peter Hüwe

Hi Guenter,

I was wondering whether there was a particular reason why hwmon_attr_show_string passes only an "empty" pointer(pointer) to the ops-

Quoted 1 line

read_string function rather than the buffer itself?

Wouldn't this mean that in ops->read_string I'd have to reserve some space for the value on the heap (and taking care to free it somewhere, since returning an address on the stack is bad idea), instead of calling sprintf(buf, "%s\n",
s) directly?

Quoted 5 lines
Quoted 2 lines

With the current implementation I have to sprintf it into my local buffer and you sprintf it again into the final buffer.

The idea was that the called code would return a pointer to a constant string, ie one that isn't changing from call to call.

Quoted 8 lines

In that case, what about the following change?

Subject: hwmon: Constify str parameter of hwmon_ops->read_string

The read_string callback is supposed to retrieve a pointer to a constant string.

Makes sense. I'll add it to -next.

Thanks,
Guenter

Quoted 29 lines
---
 drivers/hwmon/hwmon.c |    2 +-
 include/linux/hwmon.h |    2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/hwmon/hwmon.c +1 -1
@@ -186,7 +186,7 @@ static ssize_t hwmon_attr_show_string(st
 				      char *buf)
 {
 	struct hwmon_device_attribute *hattr = to_hwmon_attr(devattr);
-	char *s;
+	const char *s;
 	int ret;
 
 	ret = hattr->ops->read_string(dev, hattr->type, hattr->attr,
include/linux/hwmon.h +1 -1
@@ -336,7 +336,7 @@ struct hwmon_ops {
 	int (*read)(struct device *dev, enum hwmon_sensor_types type,
 		    u32 attr, int channel, long *val);
 	int (*read_string)(struct device *dev, enum hwmon_sensor_types type,
-		    u32 attr, int channel, char **str);
+		    u32 attr, int channel, const char **str);
 	int (*write)(struct device *dev, enum hwmon_sensor_types type,
 		     u32 attr, int channel, long val);
 };