Re: [PATCH v3 1/2] hwmon: (pmbus) Add Delta AHE-50DC fan control module driver

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Dec 07, 2021 at 01:53:44PM PST, Zev Weiss wrote:
On Tue, Dec 07, 2021 at 11:44:01AM PST, Guenter Roeck wrote:
On 12/7/21 11:22 AM, Zev Weiss wrote:
On Tue, Dec 07, 2021 at 09:50:15AM PST, Guenter Roeck wrote:
On Mon, Dec 06, 2021 at 11:15:20PM -0800, Zev Weiss wrote:
This device is an integrated module of the Delta AHE-50DC Open19 power
shelf.  For lack of proper documentation, this driver has been developed
referencing an existing (GPL) driver that was included in a code release
from LinkedIn [1].  It provides four fan speeds, four temperatures, and
one voltage reading, as well as a handful of warning and fault
indicators.

[1] https://github.com/linkedin/o19-bmc-firmware/blob/master/meta-openbmc/meta-linkedin/meta-deltapower/recipes-kernel/fancontrol-mod/files/fancontrol.c


Hmm, that reference isn't really accurate anymore. I think it would be
better to just say that the device was found to be PMBus compliant.

Sure, will do.


Makes me wonder: How do you know that the referenced driver is for Delta AHE-50DC ?

We'd been waiting for the source code for the software it ships with for a while, and were finally provided with that repo; everything I've observed from the factory software is consistent with the code in that driver. A sampling:

   # no modinfo command available, but...
   root@bmc-oob:~# strings -n8 /lib/modules/4.1.51-deltapower/extra/fancontrol.ko | head
   fancontrol
   license=GPL
   description=FANCTRL Driver
   author=Ping Mao <pmao@xxxxxxxxxxxx>
   alias=i2c:fancontrol
   depends=i2c_dev_sysfs
   vermagic=4.1.51-deltapower mod_unload ARMv5 p2v8
   fancontrol
   status_word
   bit 2:  Temparature Warning
   root@bmc-oob:~# cd /sys/bus/i2c/drivers/fancontrol/8-0030
   root@bmc-oob:/sys/bus/i2c/drivers/fancontrol/8-0030# grep . fan* temp* vin
   fan1_2_status:0
   fan1_speed:7860
   fan2_speed:7860
   fan3_4_status:0
   fan3_speed:7680
   fan4_speed:7560
   temperature1:292
   temperature2:278
   temperature3:286
   temperature4:302
   vin:12251



Signed-off-by: Zev Weiss <zev@xxxxxxxxxxxxxxxxx>
---
 MAINTAINERS                             |  6 ++
 drivers/hwmon/pmbus/Kconfig             | 12 ++++
 drivers/hwmon/pmbus/Makefile            |  1 +
 drivers/hwmon/pmbus/delta-ahe50dc-fan.c | 84 +++++++++++++++++++++++++
 4 files changed, 103 insertions(+)
 create mode 100644 drivers/hwmon/pmbus/delta-ahe50dc-fan.c

diff --git a/MAINTAINERS b/MAINTAINERS
index 0ac052200ecb..8bb7ba52d2f5 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -5425,6 +5425,12 @@ W:    https://linuxtv.org
 T:    git git://linuxtv.org/media_tree.git
 F:    drivers/media/platform/sti/delta

+DELTA AHE-50DC FAN CONTROL MODULE DRIVER
+M:    Zev Weiss <zev@xxxxxxxxxxxxxxxxx>
+L:    linux-hwmon@xxxxxxxxxxxxxxx
+S:    Maintained
+F:    drivers/hwmon/pmbus/delta-ahe50dc-fan.c
+
 DELTA DPS920AB PSU DRIVER
 M:    Robert Marko <robert.marko@xxxxxxxxxx>
 L:    linux-hwmon@xxxxxxxxxxxxxxx
diff --git a/drivers/hwmon/pmbus/Kconfig b/drivers/hwmon/pmbus/Kconfig
index ffb609cee3a4..937e1c2c11e7 100644
--- a/drivers/hwmon/pmbus/Kconfig
+++ b/drivers/hwmon/pmbus/Kconfig
@@ -66,6 +66,18 @@ config SENSORS_BPA_RS600
       This driver can also be built as a module. If so, the module will
       be called bpa-rs600.

+config SENSORS_DELTA_AHE50DC_FAN
+    tristate "Delta AHE-50DC fan control module"
+    depends on I2C
+    select REGMAP_I2C

And I realize I neglected to drop the depends & select lines here when moving this bit into the pmbus directory...

+    help
+      If you say yes here you get hardware monitoring support for
+      the integrated fan control module of the Delta AHE-50DC
+      Open19 power shelf.
+
+      This driver can also be built as a module. If so, the module
+      will be called delta-ahe50dc-fan.
+
 config SENSORS_FSP_3Y
     tristate "FSP/3Y-Power power supplies"
     help
diff --git a/drivers/hwmon/pmbus/Makefile b/drivers/hwmon/pmbus/Makefile
index 0ed4d596a948..a56b2897288d 100644
--- a/drivers/hwmon/pmbus/Makefile
+++ b/drivers/hwmon/pmbus/Makefile
@@ -9,6 +9,7 @@ obj-$(CONFIG_SENSORS_ADM1266)    += adm1266.o
 obj-$(CONFIG_SENSORS_ADM1275)    += adm1275.o
 obj-$(CONFIG_SENSORS_BEL_PFE)    += bel-pfe.o
 obj-$(CONFIG_SENSORS_BPA_RS600)    += bpa-rs600.o
+obj-$(CONFIG_SENSORS_DELTA_AHE50DC_FAN) += delta-ahe50dc-fan.o
 obj-$(CONFIG_SENSORS_FSP_3Y)    += fsp-3y.o
 obj-$(CONFIG_SENSORS_IBM_CFFPS)    += ibm-cffps.o
 obj-$(CONFIG_SENSORS_DPS920AB)    += dps920ab.o
diff --git a/drivers/hwmon/pmbus/delta-ahe50dc-fan.c b/drivers/hwmon/pmbus/delta-ahe50dc-fan.c
new file mode 100644
index 000000000000..07b1e7c5f5f5
--- /dev/null
+++ b/drivers/hwmon/pmbus/delta-ahe50dc-fan.c
@@ -0,0 +1,84 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Delta AHE-50DC power shelf fan control module driver
+ *
+ * Copyright 2021 Zev Weiss <zev@xxxxxxxxxxxxxxxxx>
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/i2c.h>
+#include <linux/pmbus.h>

Alphabetic include file order please.

Ack, will fix.


+
+#include "pmbus.h"
+
+#define AHE50DC_PMBUS_READ_TEMP4 0xd0
+
+static int ahe50dc_fan_read_word_data(struct i2c_client *client, int page, int phase, int reg)
+{
+    /* temp1 in (virtual) page 1 is remapped to mfr-specific temp4 */
+    if (page == 1) {
+        if (reg == PMBUS_READ_TEMPERATURE_1)
+            return i2c_smbus_read_word_data(client, AHE50DC_PMBUS_READ_TEMP4);
+        return -EOPNOTSUPP;
+    }
+    return -ENODATA;
+}
+
+static struct pmbus_driver_info ahe50dc_fan_info = {
+    .pages = 2,
+    .format[PSC_FAN] = direct,
+    .format[PSC_TEMPERATURE] = direct,
+    .format[PSC_VOLTAGE_IN] = direct,
+    .m[PSC_FAN] = 1,
+    .b[PSC_FAN] = 0,
+    .R[PSC_FAN] = 0,
+    .m[PSC_TEMPERATURE] = 1,
+    .b[PSC_TEMPERATURE] = 0,
+    .R[PSC_TEMPERATURE] = 1,
+    .m[PSC_VOLTAGE_IN] = 1,
+    .b[PSC_VOLTAGE_IN] = 0,
+    .R[PSC_VOLTAGE_IN] = 3,

How did you determine the exponents ? The referenced driver
doesn't seem to make a difference between voltage and temperature
exponents (nor fan speed, which is a bit odd).

Lacking documentation, the honest answer here is that I just sort of eyeballed it.  However, after doing so, I dug through the code dump a bit more and found some userspace unit-conversion bits that appear to confirm what I arrived at:

https://github.com/linkedin/o19-bmc-firmware/blob/master/meta-openbmc/meta-linkedin/meta-deltapower/recipes-deltapower/platform-lib/files/powershelf/powershelf_fan.c

(Lines 107, and 153/161/169/177.)


Brr. Well, why use a standard API/ABI if one can invent a non-standard one.


It's...not the only bit of gratuitous wheel-reinvention we've come
across in this particular system.

Can you check this with real hardware, by any chance ?


If you mean running that code on it, yes -- here's the userspace utility that invokes that library routine:

   root@bmc-oob:~# fan-util.sh
   fan1 speed: 7860 RPM
   fan2 speed: 7860 RPM
   fan3 speed: 7620 RPM
   fan4 speed: 7560 RPM
   temperature1: 29.20 C
   temperature2: 27.80 C
   temperature3: 28.50 C
   temperature4: 30.20 C
   vin_undervolt_fault: no
   overtemperature_warning: no
   fan_fault: no
   fan_warning: no
   fan_status: ok

That fan-util.sh script being this:

https://github.com/linkedin/o19-bmc-firmware/blob/master/meta-openbmc/meta-linkedin/meta-deltapower/recipes-deltapower/liutils/files/fan-util.sh

which invokes this:

https://github.com/linkedin/o19-bmc-firmware/blob/master/meta-openbmc/meta-linkedin/meta-deltapower/recipes-deltapower/liutils/files/fan-ctrl/fan-util.c

(which calls into the routine in powershelf_fan.c linked above).


...though I think I accidentally glossed over some additional steps in beteween there; looks like there's actually another daemon involved that does the read from the sysfs files and the unit normalization and then drops the resulting data into a file that fan-util.c then reads:

https://github.com/linkedin/o19-bmc-firmware/blob/master/meta-openbmc/meta-linkedin/meta-deltapower/recipes-core/health-mon/files/healthmon.c

Anyway, the upshot is that I'm fairly confident that the code there is in fact what's running on the device as shipped from the factory, and I think the coefficients I determined for the pmbus driver should handle it appropriately. (It produces readings that align with what the factory software gives and are generally sane-looking.)


Zev




[Index of Archives]     [LM Sensors]     [Linux Sound]     [ALSA Users]     [ALSA Devel]     [Linux Audio Users]     [Linux Media]     [Kernel]     [Gimp]     [Yosemite News]     [Linux Media]

  Powered by Linux