2022-08-11 09:47:10

by Wilken Gottwalt

[permalink] [raw]
Subject: [PATCH v3] hwmon: corsair-psu: add reporting of rail mode via debugfs

Add reporting if the PSU is running in single or multi rail mode via
ocpmode debugfs entry. Also update the documentation and driver comments
accordingly.

Signed-off-by: Wilken Gottwalt <[email protected]>
---
Changes in v3:
- added more explanations in the driver

Changes in v2:
- fixed spelling issues in commit message
---
Documentation/hwmon/corsair-psu.rst | 5 +++--
drivers/hwmon/corsair-psu.c | 29 ++++++++++++++++++++++++++++-
2 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/Documentation/hwmon/corsair-psu.rst b/Documentation/hwmon/corsair-psu.rst
index e8378e7a1d8c..c3a76305c587 100644
--- a/Documentation/hwmon/corsair-psu.rst
+++ b/Documentation/hwmon/corsair-psu.rst
@@ -86,8 +86,9 @@ Debugfs entries
---------------

======================= ========================================================
-uptime Current uptime of the psu
+ocpmode Single or multi rail mode of the PCIe power connectors
+product Product name of the psu
+uptime Session uptime of the psu
uptime_total Total uptime of the psu
vendor Vendor name of the psu
-product Product name of the psu
======================= ========================================================
diff --git a/drivers/hwmon/corsair-psu.c b/drivers/hwmon/corsair-psu.c
index 14389fd7afb8..c99e4c6afc2d 100644
--- a/drivers/hwmon/corsair-psu.c
+++ b/drivers/hwmon/corsair-psu.c
@@ -55,6 +55,7 @@
#define SECONDS_PER_DAY (SECONDS_PER_HOUR * 24)
#define RAIL_COUNT 3 /* 3v3 + 5v + 12v */
#define TEMP_COUNT 2
+#define OCP_MULTI_RAIL 0x02

#define PSU_CMD_SELECT_RAIL 0x00 /* expects length 2 */
#define PSU_CMD_RAIL_VOLTS_HCRIT 0x40 /* the rest of the commands expect length 3 */
@@ -71,9 +72,10 @@
#define PSU_CMD_RAIL_WATTS 0x96
#define PSU_CMD_VEND_STR 0x99
#define PSU_CMD_PROD_STR 0x9A
-#define PSU_CMD_TOTAL_WATTS 0xEE
#define PSU_CMD_TOTAL_UPTIME 0xD1
#define PSU_CMD_UPTIME 0xD2
+#define PSU_CMD_OCPMODE 0xD8
+#define PSU_CMD_TOTAL_WATTS 0xEE
#define PSU_CMD_INIT 0xFE

#define L_IN_VOLTS "v_in"
@@ -268,6 +270,7 @@ static int corsairpsu_get_value(struct corsairpsu_data *priv, u8 cmd, u8 rail, l
break;
case PSU_CMD_TOTAL_UPTIME:
case PSU_CMD_UPTIME:
+ case PSU_CMD_OCPMODE:
*val = tmp;
break;
default:
@@ -660,6 +663,29 @@ static int product_show(struct seq_file *seqf, void *unused)
}
DEFINE_SHOW_ATTRIBUTE(product);

+static int ocpmode_show(struct seq_file *seqf, void *unused)
+{
+ struct corsairpsu_data *priv = seqf->private;
+ long val;
+ int ret;
+
+ /*
+ * The rail mode is switchable on the fly. The RAW interface can be used for this. But it
+ * will not be included here, because I consider it somewhat dangerous for the health of the
+ * PSU. The returned value can be a bogus one, if the PSU is in the process of switching and
+ * getting of the value itself can also fail during this. Because of this every other value
+ * than OCP_MULTI_RAIL can be considered as "single rail".
+ */
+ ret = corsairpsu_get_value(priv, PSU_CMD_OCPMODE, 0, &val);
+ if (ret < 0)
+ seq_puts(seqf, "N/A\n");
+ else
+ seq_printf(seqf, "%s\n", (val == OCP_MULTI_RAIL) ? "multi rail" : "single rail");
+
+ return 0;
+}
+DEFINE_SHOW_ATTRIBUTE(ocpmode);
+
static void corsairpsu_debugfs_init(struct corsairpsu_data *priv)
{
char name[32];
@@ -671,6 +697,7 @@ static void corsairpsu_debugfs_init(struct corsairpsu_data *priv)
debugfs_create_file("uptime_total", 0444, priv->debugfs, priv, &uptime_total_fops);
debugfs_create_file("vendor", 0444, priv->debugfs, priv, &vendor_fops);
debugfs_create_file("product", 0444, priv->debugfs, priv, &product_fops);
+ debugfs_create_file("ocpmode", 0444, priv->debugfs, priv, &ocpmode_fops);
}

#else
--
2.37.1


2022-08-17 16:40:29

by Guenter Roeck

[permalink] [raw]
Subject: Re: [PATCH v3] hwmon: corsair-psu: add reporting of rail mode via debugfs

On Thu, Aug 11, 2022 at 08:26:37AM +0000, Wilken Gottwalt wrote:
> Add reporting if the PSU is running in single or multi rail mode via
> ocpmode debugfs entry. Also update the documentation and driver comments
> accordingly.
>
> Signed-off-by: Wilken Gottwalt <[email protected]>

Applied to hwmon-next.

Thanks,
Guenter

> ---
> Changes in v3:
> - added more explanations in the driver
>
> Changes in v2:
> - fixed spelling issues in commit message
> ---
> Documentation/hwmon/corsair-psu.rst | 5 +++--
> drivers/hwmon/corsair-psu.c | 29 ++++++++++++++++++++++++++++-
> 2 files changed, 31 insertions(+), 3 deletions(-)
>
> diff --git a/Documentation/hwmon/corsair-psu.rst b/Documentation/hwmon/corsair-psu.rst
> index e8378e7a1d8c..c3a76305c587 100644
> --- a/Documentation/hwmon/corsair-psu.rst
> +++ b/Documentation/hwmon/corsair-psu.rst
> @@ -86,8 +86,9 @@ Debugfs entries
> ---------------
>
> ======================= ========================================================
> -uptime Current uptime of the psu
> +ocpmode Single or multi rail mode of the PCIe power connectors
> +product Product name of the psu
> +uptime Session uptime of the psu
> uptime_total Total uptime of the psu
> vendor Vendor name of the psu
> -product Product name of the psu
> ======================= ========================================================
> diff --git a/drivers/hwmon/corsair-psu.c b/drivers/hwmon/corsair-psu.c
> index 14389fd7afb8..c99e4c6afc2d 100644
> --- a/drivers/hwmon/corsair-psu.c
> +++ b/drivers/hwmon/corsair-psu.c
> @@ -55,6 +55,7 @@
> #define SECONDS_PER_DAY (SECONDS_PER_HOUR * 24)
> #define RAIL_COUNT 3 /* 3v3 + 5v + 12v */
> #define TEMP_COUNT 2
> +#define OCP_MULTI_RAIL 0x02
>
> #define PSU_CMD_SELECT_RAIL 0x00 /* expects length 2 */
> #define PSU_CMD_RAIL_VOLTS_HCRIT 0x40 /* the rest of the commands expect length 3 */
> @@ -71,9 +72,10 @@
> #define PSU_CMD_RAIL_WATTS 0x96
> #define PSU_CMD_VEND_STR 0x99
> #define PSU_CMD_PROD_STR 0x9A
> -#define PSU_CMD_TOTAL_WATTS 0xEE
> #define PSU_CMD_TOTAL_UPTIME 0xD1
> #define PSU_CMD_UPTIME 0xD2
> +#define PSU_CMD_OCPMODE 0xD8
> +#define PSU_CMD_TOTAL_WATTS 0xEE
> #define PSU_CMD_INIT 0xFE
>
> #define L_IN_VOLTS "v_in"
> @@ -268,6 +270,7 @@ static int corsairpsu_get_value(struct corsairpsu_data *priv, u8 cmd, u8 rail, l
> break;
> case PSU_CMD_TOTAL_UPTIME:
> case PSU_CMD_UPTIME:
> + case PSU_CMD_OCPMODE:
> *val = tmp;
> break;
> default:
> @@ -660,6 +663,29 @@ static int product_show(struct seq_file *seqf, void *unused)
> }
> DEFINE_SHOW_ATTRIBUTE(product);
>
> +static int ocpmode_show(struct seq_file *seqf, void *unused)
> +{
> + struct corsairpsu_data *priv = seqf->private;
> + long val;
> + int ret;
> +
> + /*
> + * The rail mode is switchable on the fly. The RAW interface can be used for this. But it
> + * will not be included here, because I consider it somewhat dangerous for the health of the
> + * PSU. The returned value can be a bogus one, if the PSU is in the process of switching and
> + * getting of the value itself can also fail during this. Because of this every other value
> + * than OCP_MULTI_RAIL can be considered as "single rail".
> + */
> + ret = corsairpsu_get_value(priv, PSU_CMD_OCPMODE, 0, &val);
> + if (ret < 0)
> + seq_puts(seqf, "N/A\n");
> + else
> + seq_printf(seqf, "%s\n", (val == OCP_MULTI_RAIL) ? "multi rail" : "single rail");
> +
> + return 0;
> +}
> +DEFINE_SHOW_ATTRIBUTE(ocpmode);
> +
> static void corsairpsu_debugfs_init(struct corsairpsu_data *priv)
> {
> char name[32];
> @@ -671,6 +697,7 @@ static void corsairpsu_debugfs_init(struct corsairpsu_data *priv)
> debugfs_create_file("uptime_total", 0444, priv->debugfs, priv, &uptime_total_fops);
> debugfs_create_file("vendor", 0444, priv->debugfs, priv, &vendor_fops);
> debugfs_create_file("product", 0444, priv->debugfs, priv, &product_fops);
> + debugfs_create_file("ocpmode", 0444, priv->debugfs, priv, &ocpmode_fops);
> }
>
> #else