* [PATCH v4] powerpc/powernv: hwmon driver for power, fan rpm, voltage and temperature
@ 2014-07-04 11:14 ` Neelesh Gupta
0 siblings, 0 replies; 11+ messages in thread
From: Neelesh Gupta @ 2014-07-04 11:02 UTC (permalink / raw)
To: linuxppc-dev, linux, jdelvare, lm-sensors; +Cc: sbhat
This patch adds basic kernel support for reading power values, fan
speed rpm, voltage and temperature data on powernv platforms which will
be exported to user space through sysfs interface.
Test results:
-------------
[root@tul163p1 ~]# sensors
ibmpowernv-isa-0000
Adapter: ISA adapter
fan1: 5567 RPM (min = 0 RPM)
fan2: 5232 RPM (min = 0 RPM)
fan3: 5532 RPM (min = 0 RPM)
fan4: 4945 RPM (min = 0 RPM)
fan5: 0 RPM (min = 0 RPM)
fan6: 0 RPM (min = 0 RPM)
fan7: 7392 RPM (min = 0 RPM)
fan8: 7936 RPM (min = 0 RPM)
temp1: +39.0°C (high = +0.0°C)
power1: 191.00 W
[root@tul163p1 ~]# ls /sys/devices/platform/
alarmtimer ibmpowernv.0 power rtc-generic serial8250 uevent
[root@tul163p1 ~]# ls /sys/devices/platform/ibmpowernv.0/hwmon/hwmon0/
device fan2_min fan4_min fan6_min fan8_min power
fan1_fault fan3_fault fan5_fault fan7_fault in1_fault power1_input
fan1_input fan3_input fan5_input fan7_input in2_fault subsystem
fan1_min fan3_min fan5_min fan7_min in3_fault temp1_input
fan2_fault fan4_fault fan6_fault fan8_fault in4_fault temp1_max
fan2_input fan4_input fan6_input fan8_input name uevent
[root@tul163p1 ~]#
[root@tul163p1 ~]# ls /sys/class/hwmon/hwmon0/
device fan2_min fan4_min fan6_min fan8_min power
fan1_fault fan3_fault fan5_fault fan7_fault in1_fault power1_input
fan1_input fan3_input fan5_input fan7_input in2_fault subsystem
fan1_min fan3_min fan5_min fan7_min in3_fault temp1_input
fan2_fault fan4_fault fan6_fault fan8_fault in4_fault temp1_max
fan2_input fan4_input fan6_input fan8_input name uevent
[root@tul163p1 ~]#
Signed-off-by: Neelesh Gupta <neelegup@linux.vnet.ibm.com>
---
Changes in v4
=============
- Replaced pr_err() with dev_err() for loggin print messages.
- Using kstrtou32() function for converting string to u32 instead of sscanf().
Changes in v3
=============
- Fixed an endianness bug leading the driver to break on LE.
- Fixed a bug that when one of the 'attribute_group' not populated, following
groups attributes were dropped.
- Rewrite the get_sensor_index_attr() function to handle all the error scenarios
like 'sscanf' etc.
- Fixed all the errors/warnings related to coding style/whitespace.
- Added 'Documentation' files.
- Addressed remaining review comments on V2.
Changes in v2
=============
- Generic use of devm_* functions in hwmon like using devm_kzalloc() for dynamic
memory request, avoiding the need to explicit free of memory.
Adding 'struct attribute_group' as member of platform data structure to be
populated and then passed to devm_hwmon_device_register_with_groups().
Note: Having an array of pointers of 'attribute_group' and each group
corresponds to 'enum sensors' type. Not completely sure, if it's ideal or
could have just one group populated with attributes of sensor types?
- 'ibmpowernv' is not hot-pluggable device so moving 'platform_driver' callback
function (probe) as part of __init code.
- Fixed issues related to coding style.
- Other general comments in v1.
.../devicetree/bindings/hwmon/ibmpowernv.txt | 27 +
Documentation/hwmon/ibmpowernv | 41 ++
drivers/hwmon/Kconfig | 11 +
drivers/hwmon/Makefile | 1
drivers/hwmon/ibmpowernv.c | 362 ++++++++++++++++++++
5 files changed, 442 insertions(+)
create mode 100644 Documentation/devicetree/bindings/hwmon/ibmpowernv.txt
create mode 100644 Documentation/hwmon/ibmpowernv
create mode 100644 drivers/hwmon/ibmpowernv.c
diff --git a/Documentation/devicetree/bindings/hwmon/ibmpowernv.txt b/Documentation/devicetree/bindings/hwmon/ibmpowernv.txt
new file mode 100644
index 0000000..e3bd1eb
--- /dev/null
+++ b/Documentation/devicetree/bindings/hwmon/ibmpowernv.txt
@@ -0,0 +1,27 @@
+IBM POWERNV platform sensors
+----------------------------
+
+Required node properties:
+- compatible: must be one of
+ "ibm,opal-sensor-cooling-fan"
+ "ibm,opal-sensor-amb-temp"
+ "ibm,opal-sensor-power-supply"
+ "ibm,opal-sensor-power"
+- sensor-id: an opaque id provided by the firmware to the kernel, identifies a
+ given sensor and its attribute data
+
+Example sensors node:
+
+cooling-fan#8-data {
+ sensor-id = <0x7052107>;
+ phandle = <0x10000028>;
+ linux,phandle = <0x10000028>;
+ compatible = "ibm,opal-sensor-cooling-fan";
+};
+
+amb-temp#1-thrs {
+ sensor-id = <0x5096000>;
+ phandle = <0x10000017>;
+ linux,phandle = <0x10000017>;
+ compatible = "ibm,opal-sensor-amb-temp";
+};
diff --git a/Documentation/hwmon/ibmpowernv b/Documentation/hwmon/ibmpowernv
new file mode 100644
index 0000000..644245a
--- /dev/null
+++ b/Documentation/hwmon/ibmpowernv
@@ -0,0 +1,41 @@
+Kernel Driver IBMPOWENV
+=======================
+
+Supported systems:
+ * Any recent IBM P servers based on POWERNV platform
+
+Author: Neelesh Gupta
+
+Description
+-----------
+
+This driver implements reading the platform sensors data like temperature/fan/
+voltage/power for 'POWERNV' platform.
+
+The driver uses the platform device infrastructure. It probes the device tree
+for sensor devices during the __init phase and registers them with the 'hwmon'.
+'hwmon' populates the 'sysfs' tree having attribute files, each for a given
+sensor type and its attribute data.
+
+All the nodes in the DT appear under "/ibm,opal/sensors" and each valid node in
+the DT maps to an attribute file in 'sysfs'. The node exports unique 'sensor-id'
+which the driver uses to make an OPAL call to the firmware.
+
+Usage notes
+-----------
+The driver is built statically with the kernel by enabling the config
+CONFIG_SENSORS_IBMPOWERNV. It can also be built as module 'ibmpowernv'.
+
+Sysfs attributes
+----------------
+
+fanX_input Measured RPM value.
+fanX_min Threshold RPM for alert generation.
+fanX_fault 0: No fail condition
+ 1: Failing fan
+tempX_input Measured ambient temperature.
+tempX_max Threshold ambient temperature for alert generation.
+inX_input Measured power supply voltage
+inX_fault 0: No fail condition.
+ 1: Failing power supply.
+power1_input System power consumption (microWatt)
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
index 02d3d85..29c3fcb 100644
--- a/drivers/hwmon/Kconfig
+++ b/drivers/hwmon/Kconfig
@@ -554,6 +554,17 @@ config SENSORS_IBMPEX
This driver can also be built as a module. If so, the module
will be called ibmpex.
+config SENSORS_IBMPOWERNV
+ tristate "IBM POWERNV platform sensors"
+ depends on PPC_POWERNV
+ default y
+ help
+ If you say yes here you get support for the temperature/fan/power
+ sensors on your PowerNV platform.
+
+ This driver can also be built as a module. If so, the module
+ will be called ibmpowernv.
+
config SENSORS_IIO_HWMON
tristate "Hwmon driver that uses channels specified via iio maps"
depends on IIO
diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
index 3dc0f02..fc4ed26 100644
--- a/drivers/hwmon/Makefile
+++ b/drivers/hwmon/Makefile
@@ -71,6 +71,7 @@ obj-$(CONFIG_SENSORS_ULTRA45) += ultra45_env.o
obj-$(CONFIG_SENSORS_I5K_AMB) += i5k_amb.o
obj-$(CONFIG_SENSORS_IBMAEM) += ibmaem.o
obj-$(CONFIG_SENSORS_IBMPEX) += ibmpex.o
+obj-$(CONFIG_SENSORS_IBMPOWERNV)+= ibmpowernv.o
obj-$(CONFIG_SENSORS_IIO_HWMON) += iio_hwmon.o
obj-$(CONFIG_SENSORS_INA209) += ina209.o
obj-$(CONFIG_SENSORS_INA2XX) += ina2xx.o
diff --git a/drivers/hwmon/ibmpowernv.c b/drivers/hwmon/ibmpowernv.c
new file mode 100644
index 0000000..44dcd99
--- /dev/null
+++ b/drivers/hwmon/ibmpowernv.c
@@ -0,0 +1,362 @@
+/*
+ * IBM PowerNV platform sensors for temperature/fan/voltage/power
+ * Copyright (C) 2014 IBM
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.
+ */
+
+#define DRVNAME "ibmpowernv"
+#define pr_fmt(fmt) DRVNAME ": " fmt
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/hwmon.h>
+#include <linux/hwmon-sysfs.h>
+#include <linux/of.h>
+#include <linux/slab.h>
+
+#include <linux/platform_device.h>
+#include <asm/opal.h>
+#include <linux/err.h>
+
+#define MAX_ATTR_LEN 32
+
+/* Sensor suffix name from DT */
+#define DT_FAULT_ATTR_SUFFIX "faulted"
+#define DT_DATA_ATTR_SUFFIX "data"
+#define DT_THRESHOLD_ATTR_SUFFIX "thrs"
+
+/*
+ * Enumerates all the types of sensors in the POWERNV platform and does index
+ * into 'struct sensor_group'
+ */
+enum sensors {
+ FAN,
+ AMBIENT_TEMP,
+ POWER_SUPPLY,
+ POWER_INPUT,
+ MAX_SENSOR_TYPE,
+};
+
+static struct sensor_group {
+ const char *name;
+ const char *compatible;
+ struct attribute_group group;
+ u32 attr_count;
+} sensor_groups[] = {
+ {"fan", "ibm,opal-sensor-cooling-fan"},
+ {"temp", "ibm,opal-sensor-amb-temp"},
+ {"in", "ibm,opal-sensor-power-supply"},
+ {"power", "ibm,opal-sensor-power"}
+};
+
+struct sensor_data {
+ u32 id; /* An opaque id of the firmware for each sensor */
+ enum sensors type;
+ char name[MAX_ATTR_LEN];
+ struct device_attribute dev_attr;
+};
+
+struct platform_data {
+ const struct attribute_group *attr_groups[MAX_SENSOR_TYPE + 1];
+ u32 sensors_count; /* Total count of sensors from each group */
+};
+
+/* Platform device representing all the ibmpowernv sensors */
+static struct platform_device *pdevice;
+
+static ssize_t show_sensor(struct device *dev, struct device_attribute *devattr,
+ char *buf)
+{
+ struct sensor_data *sdata = container_of(devattr, struct sensor_data,
+ dev_attr);
+ ssize_t ret;
+ u32 x;
+
+ ret = opal_get_sensor_data(sdata->id, &x);
+ if (ret)
+ return ret;
+
+ /* Convert temperature to milli-degrees */
+ if (sdata->type == AMBIENT_TEMP)
+ x *= 1000;
+ /* Convert power to micro-watts */
+ else if (sdata->type == POWER_INPUT)
+ x *= 1000000;
+
+ return sprintf(buf, "%u\n", x);
+}
+
+static int __init get_sensor_index_attr(const char *name, u32 *index,
+ char *attr)
+{
+ char *hash_pos = strchr(name, '#');
+ char buf[8] = { 0 };
+ char *dash_pos;
+ u32 copy_len;
+
+ if (!hash_pos)
+ return -EINVAL;
+
+ dash_pos = strchr(hash_pos, '-');
+ if (!dash_pos)
+ return -EINVAL;
+
+ copy_len = dash_pos - hash_pos - 1;
+ if (copy_len >= sizeof(buf))
+ return -EINVAL;
+
+ strncpy(buf, hash_pos + 1, copy_len);
+
+ if (kstrtou32(buf, 10, index))
+ return -EINVAL;
+
+ strncpy(attr, dash_pos + 1, MAX_ATTR_LEN);
+
+ return 0;
+}
+
+/*
+ * This function translates the DT node name into the 'hwmon' attribute name.
+ * IBMPOWERNV device node appear like cooling-fan#2-data, amb-temp#1-thrs etc.
+ * which need to be mapped as fan2_input, temp1_max respectively before
+ * populating them inside hwmon device class.
+ */
+static int __init create_hwmon_attr_name(struct device *dev, enum sensors type,
+ const char *node_name,
+ char *hwmon_attr_name)
+{
+ char attr_suffix[MAX_ATTR_LEN];
+ char *attr_name;
+ u32 index;
+ int err;
+
+ err = get_sensor_index_attr(node_name, &index, attr_suffix);
+ if (err) {
+ dev_err(dev, "Sensor device node name '%s' is invalid\n",
+ node_name);
+ return err;
+ }
+
+ if (!strcmp(attr_suffix, DT_FAULT_ATTR_SUFFIX)) {
+ attr_name = "fault";
+ } else if (!strcmp(attr_suffix, DT_DATA_ATTR_SUFFIX)) {
+ attr_name = "input";
+ } else if (!strcmp(attr_suffix, DT_THRESHOLD_ATTR_SUFFIX)) {
+ if (type == AMBIENT_TEMP)
+ attr_name = "max";
+ else if (type == FAN)
+ attr_name = "min";
+ else
+ return -ENOENT;
+ } else {
+ return -ENOENT;
+ }
+
+ snprintf(hwmon_attr_name, MAX_ATTR_LEN, "%s%d_%s",
+ sensor_groups[type].name, index, attr_name);
+ return 0;
+}
+
+static int __init populate_attr_groups(struct platform_device *pdev)
+{
+ struct platform_data *pdata = platform_get_drvdata(pdev);
+ const struct attribute_group **pgroups = pdata->attr_groups;
+ struct device_node *opal, *np;
+ enum sensors type;
+
+ opal = of_find_node_by_path("/ibm,opal/sensors");
+ if (!opal) {
+ dev_err(&pdev->dev, "Opal node 'sensors' not found\n");
+ return -ENODEV;
+ }
+
+ for_each_child_of_node(opal, np) {
+ if (np->name == NULL)
+ continue;
+
+ for (type = 0; type < MAX_SENSOR_TYPE; type++)
+ if (of_device_is_compatible(np,
+ sensor_groups[type].compatible)) {
+ sensor_groups[type].attr_count++;
+ break;
+ }
+ }
+
+ of_node_put(opal);
+
+ for (type = 0; type < MAX_SENSOR_TYPE; type++) {
+ sensor_groups[type].group.attrs = devm_kzalloc(&pdev->dev,
+ sizeof(struct attribute *) *
+ (sensor_groups[type].attr_count + 1),
+ GFP_KERNEL);
+ if (!sensor_groups[type].group.attrs)
+ return -ENOMEM;
+
+ pgroups[type] = &sensor_groups[type].group;
+ pdata->sensors_count += sensor_groups[type].attr_count;
+ sensor_groups[type].attr_count = 0;
+ }
+
+ return 0;
+}
+
+/*
+ * Iterate through the device tree for each child of 'sensors' node, create
+ * a sysfs attribute file, the file is named by translating the DT node name
+ * to the name required by the higher 'hwmon' driver like fan1_input, temp1_max
+ * etc..
+ */
+static int __init create_device_attrs(struct platform_device *pdev)
+{
+ struct platform_data *pdata = platform_get_drvdata(pdev);
+ const struct attribute_group **pgroups = pdata->attr_groups;
+ struct device_node *opal, *np;
+ struct sensor_data *sdata;
+ const __be32 *sensor_id;
+ enum sensors type;
+ u32 count = 0;
+ int err = 0;
+
+ opal = of_find_node_by_path("/ibm,opal/sensors");
+ sdata = devm_kzalloc(&pdev->dev, pdata->sensors_count * sizeof(*sdata),
+ GFP_KERNEL);
+ if (!sdata) {
+ err = -ENOMEM;
+ goto exit_put_node;
+ }
+
+ for_each_child_of_node(opal, np) {
+ if (np->name == NULL)
+ continue;
+
+ for (type = 0; type < MAX_SENSOR_TYPE; type++)
+ if (of_device_is_compatible(np,
+ sensor_groups[type].compatible))
+ break;
+
+ if (type == MAX_SENSOR_TYPE)
+ continue;
+
+ sensor_id = of_get_property(np, "sensor-id", NULL);
+ if (!sensor_id) {
+ dev_info(&pdev->dev,
+ "'sensor-id' missing in the node '%s'\n",
+ np->name);
+ continue;
+ }
+
+ sdata[count].id = be32_to_cpup(sensor_id);
+ sdata[count].type = type;
+ err = create_hwmon_attr_name(&pdev->dev, type, np->name,
+ sdata[count].name);
+ if (err)
+ goto exit_put_node;
+
+ sysfs_attr_init(&sdata[count].dev_attr.attr);
+ sdata[count].dev_attr.attr.name = sdata[count].name;
+ sdata[count].dev_attr.attr.mode = S_IRUGO;
+ sdata[count].dev_attr.show = show_sensor;
+
+ pgroups[type]->attrs[sensor_groups[type].attr_count++] =
+ &sdata[count++].dev_attr.attr;
+ }
+
+exit_put_node:
+ of_node_put(opal);
+ return err;
+}
+
+static int __init ibmpowernv_probe(struct platform_device *pdev)
+{
+ struct platform_data *pdata;
+ struct device *hwmon_dev;
+ int err;
+
+ pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
+ if (!pdata)
+ return -ENOMEM;
+
+ platform_set_drvdata(pdev, pdata);
+ pdata->sensors_count = 0;
+ err = populate_attr_groups(pdev);
+ if (err)
+ return err;
+
+ /* Create sysfs attribute data for each sensor found in the DT */
+ err = create_device_attrs(pdev);
+ if (err)
+ return err;
+
+ /* Finally, register with hwmon */
+ hwmon_dev = devm_hwmon_device_register_with_groups(&pdev->dev, DRVNAME,
+ pdata,
+ pdata->attr_groups);
+
+ return PTR_ERR_OR_ZERO(hwmon_dev);
+}
+
+static struct platform_driver ibmpowernv_driver = {
+ .driver = {
+ .owner = THIS_MODULE,
+ .name = DRVNAME,
+ },
+};
+
+static int __init ibmpowernv_init(void)
+{
+ int err;
+
+ pdevice = platform_device_alloc(DRVNAME, 0);
+ if (!pdevice) {
+ pr_err("Device allocation failed\n");
+ err = -ENOMEM;
+ goto exit;
+ }
+
+ err = platform_device_add(pdevice);
+ if (err) {
+ pr_err("Device addition failed (%d)\n", err);
+ goto exit_device_put;
+ }
+
+ err = platform_driver_probe(&ibmpowernv_driver, ibmpowernv_probe);
+ if (err) {
+ pr_err("Platfrom driver probe failed\n");
+ goto exit_device_del;
+ }
+
+ return 0;
+
+exit_device_del:
+ platform_device_del(pdevice);
+exit_device_put:
+ platform_device_put(pdevice);
+exit:
+ return err;
+}
+
+static void __exit ibmpowernv_exit(void)
+{
+ platform_driver_unregister(&ibmpowernv_driver);
+ platform_device_unregister(pdevice);
+}
+
+MODULE_AUTHOR("Neelesh Gupta <neelegup@linux.vnet.ibm.com>");
+MODULE_DESCRIPTION("IBM POWERNV platform sensors");
+MODULE_LICENSE("GPL");
+
+module_init(ibmpowernv_init);
+module_exit(ibmpowernv_exit);
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [lm-sensors] [PATCH v4] powerpc/powernv: hwmon driver for power, fan rpm, voltage and temperature
@ 2014-07-04 11:14 ` Neelesh Gupta
0 siblings, 0 replies; 11+ messages in thread
From: Neelesh Gupta @ 2014-07-04 11:14 UTC (permalink / raw)
To: linuxppc-dev, linux, jdelvare, lm-sensors; +Cc: sbhat
VGhpcyBwYXRjaCBhZGRzIGJhc2ljIGtlcm5lbCBzdXBwb3J0IGZvciByZWFkaW5nIHBvd2VyIHZh
bHVlcywgZmFuCnNwZWVkIHJwbSwgdm9sdGFnZSBhbmQgdGVtcGVyYXR1cmUgZGF0YSBvbiBwb3dl
cm52IHBsYXRmb3JtcyB3aGljaCB3aWxsCmJlIGV4cG9ydGVkIHRvIHVzZXIgc3BhY2UgdGhyb3Vn
aCBzeXNmcyBpbnRlcmZhY2UuCgpUZXN0IHJlc3VsdHM6Ci0tLS0tLS0tLS0tLS0KW3Jvb3RAdHVs
MTYzcDEgfl0jIHNlbnNvcnMKaWJtcG93ZXJudi1pc2EtMDAwMApBZGFwdGVyOiBJU0EgYWRhcHRl
cgpmYW4xOiAgICAgICAgNTU2NyBSUE0gIChtaW4gPSAgICAwIFJQTSkKZmFuMjogICAgICAgIDUy
MzIgUlBNICAobWluID0gICAgMCBSUE0pCmZhbjM6ICAgICAgICA1NTMyIFJQTSAgKG1pbiA9ICAg
IDAgUlBNKQpmYW40OiAgICAgICAgNDk0NSBSUE0gIChtaW4gPSAgICAwIFJQTSkKZmFuNTogICAg
ICAgICAgIDAgUlBNICAobWluID0gICAgMCBSUE0pCmZhbjY6ICAgICAgICAgICAwIFJQTSAgKG1p
biA9ICAgIDAgUlBNKQpmYW43OiAgICAgICAgNzM5MiBSUE0gIChtaW4gPSAgICAwIFJQTSkKZmFu
ODogICAgICAgIDc5MzYgUlBNICAobWluID0gICAgMCBSUE0pCnRlbXAxOiAgICAgICAgKzM5LjDC
sEMgIChoaWdoID0gICswLjDCsEMpCnBvd2VyMTogICAgICAxOTEuMDAgVwoKW3Jvb3RAdHVsMTYz
cDEgfl0jIGxzIC9zeXMvZGV2aWNlcy9wbGF0Zm9ybS8KYWxhcm10aW1lciAgaWJtcG93ZXJudi4w
ICBwb3dlciAgcnRjLWdlbmVyaWMgIHNlcmlhbDgyNTAgIHVldmVudApbcm9vdEB0dWwxNjNwMSB+
XSMgbHMgL3N5cy9kZXZpY2VzL3BsYXRmb3JtL2libXBvd2VybnYuMC9od21vbi9od21vbjAvCmRl
dmljZQkgICAgZmFuMl9taW4JZmFuNF9taW4gICAgZmFuNl9taW4JZmFuOF9taW4gICBwb3dlcgpm
YW4xX2ZhdWx0ICBmYW4zX2ZhdWx0CWZhbjVfZmF1bHQgIGZhbjdfZmF1bHQJaW4xX2ZhdWx0ICBw
b3dlcjFfaW5wdXQKZmFuMV9pbnB1dCAgZmFuM19pbnB1dAlmYW41X2lucHV0ICBmYW43X2lucHV0
CWluMl9mYXVsdCAgc3Vic3lzdGVtCmZhbjFfbWluICAgIGZhbjNfbWluCWZhbjVfbWluICAgIGZh
bjdfbWluCWluM19mYXVsdCAgdGVtcDFfaW5wdXQKZmFuMl9mYXVsdCAgZmFuNF9mYXVsdAlmYW42
X2ZhdWx0ICBmYW44X2ZhdWx0CWluNF9mYXVsdCAgdGVtcDFfbWF4CmZhbjJfaW5wdXQgIGZhbjRf
aW5wdXQJZmFuNl9pbnB1dCAgZmFuOF9pbnB1dAluYW1lCSAgIHVldmVudApbcm9vdEB0dWwxNjNw
MSB+XSMgCltyb290QHR1bDE2M3AxIH5dIyBscyAvc3lzL2NsYXNzL2h3bW9uL2h3bW9uMC8KZGV2
aWNlCSAgICBmYW4yX21pbglmYW40X21pbiAgICBmYW42X21pbglmYW44X21pbiAgIHBvd2VyCmZh
bjFfZmF1bHQgIGZhbjNfZmF1bHQJZmFuNV9mYXVsdCAgZmFuN19mYXVsdAlpbjFfZmF1bHQgIHBv
d2VyMV9pbnB1dApmYW4xX2lucHV0ICBmYW4zX2lucHV0CWZhbjVfaW5wdXQgIGZhbjdfaW5wdXQJ
aW4yX2ZhdWx0ICBzdWJzeXN0ZW0KZmFuMV9taW4gICAgZmFuM19taW4JZmFuNV9taW4gICAgZmFu
N19taW4JaW4zX2ZhdWx0ICB0ZW1wMV9pbnB1dApmYW4yX2ZhdWx0ICBmYW40X2ZhdWx0CWZhbjZf
ZmF1bHQgIGZhbjhfZmF1bHQJaW40X2ZhdWx0ICB0ZW1wMV9tYXgKZmFuMl9pbnB1dCAgZmFuNF9p
bnB1dAlmYW42X2lucHV0ICBmYW44X2lucHV0CW5hbWUJICAgdWV2ZW50Cltyb290QHR1bDE2M3Ax
IH5dIwoKU2lnbmVkLW9mZi1ieTogTmVlbGVzaCBHdXB0YSA8bmVlbGVndXBAbGludXgudm5ldC5p
Ym0uY29tPgotLS0KCkNoYW5nZXMgaW4gdjQKPT09PT09PT09PT09PQotIFJlcGxhY2VkIHByX2Vy
cigpIHdpdGggZGV2X2VycigpIGZvciBsb2dnaW4gcHJpbnQgbWVzc2FnZXMuCi0gVXNpbmcga3N0
cnRvdTMyKCkgZnVuY3Rpb24gZm9yIGNvbnZlcnRpbmcgc3RyaW5nIHRvIHUzMiBpbnN0ZWFkIG9m
IHNzY2FuZigpLgoKQ2hhbmdlcyBpbiB2Mwo9PT09PT09PT09PT09Ci0gRml4ZWQgYW4gZW5kaWFu
bmVzcyBidWcgbGVhZGluZyB0aGUgZHJpdmVyIHRvIGJyZWFrIG9uIExFLgotIEZpeGVkIGEgYnVn
IHRoYXQgd2hlbiBvbmUgb2YgdGhlICdhdHRyaWJ1dGVfZ3JvdXAnIG5vdCBwb3B1bGF0ZWQsIGZv
bGxvd2luZwogIGdyb3VwcyBhdHRyaWJ1dGVzIHdlcmUgZHJvcHBlZC4KLSBSZXdyaXRlIHRoZSBn
ZXRfc2Vuc29yX2luZGV4X2F0dHIoKSBmdW5jdGlvbiB0byBoYW5kbGUgYWxsIHRoZSBlcnJvciBz
Y2VuYXJpb3MKICBsaWtlICdzc2NhbmYnIGV0Yy4KLSBGaXhlZCBhbGwgdGhlIGVycm9ycy93YXJu
aW5ncyByZWxhdGVkIHRvIGNvZGluZyBzdHlsZS93aGl0ZXNwYWNlLgotIEFkZGVkICdEb2N1bWVu
dGF0aW9uJyBmaWxlcy4KLSBBZGRyZXNzZWQgcmVtYWluaW5nIHJldmlldyBjb21tZW50cyBvbiBW
Mi4KCkNoYW5nZXMgaW4gdjIKPT09PT09PT09PT09PQotIEdlbmVyaWMgdXNlIG9mIGRldm1fKiBm
dW5jdGlvbnMgaW4gaHdtb24gbGlrZSB1c2luZyBkZXZtX2t6YWxsb2MoKSBmb3IgZHluYW1pYwog
IG1lbW9yeSByZXF1ZXN0LCBhdm9pZGluZyB0aGUgbmVlZCB0byBleHBsaWNpdCBmcmVlIG9mIG1l
bW9yeS4KICBBZGRpbmcgJ3N0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAnIGFzIG1lbWJlciBvZiBwbGF0
Zm9ybSBkYXRhIHN0cnVjdHVyZSB0byBiZQogIHBvcHVsYXRlZCBhbmQgdGhlbiBwYXNzZWQgdG8g
ZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoKS4KCiAgTm90ZTogSGF2aW5n
IGFuIGFycmF5IG9mIHBvaW50ZXJzIG9mICdhdHRyaWJ1dGVfZ3JvdXAnIGFuZCBlYWNoIGdyb3Vw
CiAgY29ycmVzcG9uZHMgdG8gJ2VudW0gc2Vuc29ycycgdHlwZS4gTm90IGNvbXBsZXRlbHkgc3Vy
ZSwgaWYgaXQncyBpZGVhbCBvcgogIGNvdWxkIGhhdmUganVzdCBvbmUgZ3JvdXAgcG9wdWxhdGVk
IHdpdGggYXR0cmlidXRlcyBvZiBzZW5zb3IgdHlwZXM/CgotICdpYm1wb3dlcm52JyBpcyBub3Qg
aG90LXBsdWdnYWJsZSBkZXZpY2Ugc28gbW92aW5nICdwbGF0Zm9ybV9kcml2ZXInIGNhbGxiYWNr
CiAgZnVuY3Rpb24gKHByb2JlKSBhcyBwYXJ0IG9mIF9faW5pdCBjb2RlLgotIEZpeGVkIGlzc3Vl
cyByZWxhdGVkIHRvIGNvZGluZyBzdHlsZS4KLSBPdGhlciBnZW5lcmFsIGNvbW1lbnRzIGluIHYx
LgoKIC4uLi9kZXZpY2V0cmVlL2JpbmRpbmdzL2h3bW9uL2libXBvd2VybnYudHh0ICAgICAgIHwg
ICAyNyArCiBEb2N1bWVudGF0aW9uL2h3bW9uL2libXBvd2VybnYgICAgICAgICAgICAgICAgICAg
ICB8ICAgNDEgKysKIGRyaXZlcnMvaHdtb24vS2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHwgICAxMSArCiBkcml2ZXJzL2h3bW9uL01ha2VmaWxlICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB8ICAgIDEgCiBkcml2ZXJzL2h3bW9uL2libXBvd2VybnYuYyAgICAgICAgICAg
ICAgICAgICAgICAgICB8ICAzNjIgKysrKysrKysrKysrKysrKysrKysKIDUgZmlsZXMgY2hhbmdl
ZCwgNDQyIGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBEb2N1bWVudGF0aW9uL2Rl
dmljZXRyZWUvYmluZGluZ3MvaHdtb24vaWJtcG93ZXJudi50eHQKIGNyZWF0ZSBtb2RlIDEwMDY0
NCBEb2N1bWVudGF0aW9uL2h3bW9uL2libXBvd2VybnYKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2
ZXJzL2h3bW9uL2libXBvd2VybnYuYwoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNl
dHJlZS9iaW5kaW5ncy9od21vbi9pYm1wb3dlcm52LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNl
dHJlZS9iaW5kaW5ncy9od21vbi9pYm1wb3dlcm52LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwLi5lM2JkMWViCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9k
ZXZpY2V0cmVlL2JpbmRpbmdzL2h3bW9uL2libXBvd2VybnYudHh0CkBAIC0wLDAgKzEsMjcgQEAK
K0lCTSBQT1dFUk5WIHBsYXRmb3JtIHNlbnNvcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KKworUmVxdWlyZWQgbm9kZSBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBtdXN0IGJlIG9u
ZSBvZgorCQkiaWJtLG9wYWwtc2Vuc29yLWNvb2xpbmctZmFuIgorCQkiaWJtLG9wYWwtc2Vuc29y
LWFtYi10ZW1wIgorCQkiaWJtLG9wYWwtc2Vuc29yLXBvd2VyLXN1cHBseSIKKwkJImlibSxvcGFs
LXNlbnNvci1wb3dlciIKKy0gc2Vuc29yLWlkOiBhbiBvcGFxdWUgaWQgcHJvdmlkZWQgYnkgdGhl
IGZpcm13YXJlIHRvIHRoZSBrZXJuZWwsIGlkZW50aWZpZXMgYQorCSAgICAgZ2l2ZW4gc2Vuc29y
IGFuZCBpdHMgYXR0cmlidXRlIGRhdGEKKworRXhhbXBsZSBzZW5zb3JzIG5vZGU6CisKK2Nvb2xp
bmctZmFuIzgtZGF0YSB7CisJc2Vuc29yLWlkID0gPDB4NzA1MjEwNz47CisJcGhhbmRsZSA9IDww
eDEwMDAwMDI4PjsKKwlsaW51eCxwaGFuZGxlID0gPDB4MTAwMDAwMjg+OworCWNvbXBhdGlibGUg
PSAiaWJtLG9wYWwtc2Vuc29yLWNvb2xpbmctZmFuIjsKK307CisKK2FtYi10ZW1wIzEtdGhycyB7
CisJc2Vuc29yLWlkID0gPDB4NTA5NjAwMD47CisJcGhhbmRsZSA9IDwweDEwMDAwMDE3PjsKKwls
aW51eCxwaGFuZGxlID0gPDB4MTAwMDAwMTc+OworCWNvbXBhdGlibGUgPSAiaWJtLG9wYWwtc2Vu
c29yLWFtYi10ZW1wIjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2libXBv
d2VybnYgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2libXBvd2VybnYKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMC4uNjQ0MjQ1YQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRp
b24vaHdtb24vaWJtcG93ZXJudgpAQCAtMCwwICsxLDQxIEBACitLZXJuZWwgRHJpdmVyIElCTVBP
V0VOVgorPT09PT09PT09PT09PT09PT09PT09PT0KKworU3VwcG9ydGVkIHN5c3RlbXM6CisgICog
QW55IHJlY2VudCBJQk0gUCBzZXJ2ZXJzIGJhc2VkIG9uIFBPV0VSTlYgcGxhdGZvcm0KKworQXV0
aG9yOiBOZWVsZXNoIEd1cHRhCisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitUaGlzIGRy
aXZlciBpbXBsZW1lbnRzIHJlYWRpbmcgdGhlIHBsYXRmb3JtIHNlbnNvcnMgZGF0YSBsaWtlIHRl
bXBlcmF0dXJlL2Zhbi8KK3ZvbHRhZ2UvcG93ZXIgZm9yICdQT1dFUk5WJyBwbGF0Zm9ybS4KKwor
VGhlIGRyaXZlciB1c2VzIHRoZSBwbGF0Zm9ybSBkZXZpY2UgaW5mcmFzdHJ1Y3R1cmUuIEl0IHBy
b2JlcyB0aGUgZGV2aWNlIHRyZWUKK2ZvciBzZW5zb3IgZGV2aWNlcyBkdXJpbmcgdGhlIF9faW5p
dCBwaGFzZSBhbmQgcmVnaXN0ZXJzIHRoZW0gd2l0aCB0aGUgJ2h3bW9uJy4KKydod21vbicgcG9w
dWxhdGVzIHRoZSAnc3lzZnMnIHRyZWUgaGF2aW5nIGF0dHJpYnV0ZSBmaWxlcywgZWFjaCBmb3Ig
YSBnaXZlbgorc2Vuc29yIHR5cGUgYW5kIGl0cyBhdHRyaWJ1dGUgZGF0YS4KKworQWxsIHRoZSBu
b2RlcyBpbiB0aGUgRFQgYXBwZWFyIHVuZGVyICIvaWJtLG9wYWwvc2Vuc29ycyIgYW5kIGVhY2gg
dmFsaWQgbm9kZSBpbgordGhlIERUIG1hcHMgdG8gYW4gYXR0cmlidXRlIGZpbGUgaW4gJ3N5c2Zz
Jy4gVGhlIG5vZGUgZXhwb3J0cyB1bmlxdWUgJ3NlbnNvci1pZCcKK3doaWNoIHRoZSBkcml2ZXIg
dXNlcyB0byBtYWtlIGFuIE9QQUwgY2FsbCB0byB0aGUgZmlybXdhcmUuCisKK1VzYWdlIG5vdGVz
CistLS0tLS0tLS0tLQorVGhlIGRyaXZlciBpcyBidWlsdCBzdGF0aWNhbGx5IHdpdGggdGhlIGtl
cm5lbCBieSBlbmFibGluZyB0aGUgY29uZmlnCitDT05GSUdfU0VOU09SU19JQk1QT1dFUk5WLiBJ
dCBjYW4gYWxzbyBiZSBidWlsdCBhcyBtb2R1bGUgJ2libXBvd2VybnYnLgorCitTeXNmcyBhdHRy
aWJ1dGVzCistLS0tLS0tLS0tLS0tLS0tCisKK2ZhblhfaW5wdXQJCU1lYXN1cmVkIFJQTSB2YWx1
ZS4KK2ZhblhfbWluCQlUaHJlc2hvbGQgUlBNIGZvciBhbGVydCBnZW5lcmF0aW9uLgorZmFuWF9m
YXVsdAkJMDogTm8gZmFpbCBjb25kaXRpb24KKwkJCTE6IEZhaWxpbmcgZmFuCit0ZW1wWF9pbnB1
dAkJTWVhc3VyZWQgYW1iaWVudCB0ZW1wZXJhdHVyZS4KK3RlbXBYX21heAkJVGhyZXNob2xkIGFt
YmllbnQgdGVtcGVyYXR1cmUgZm9yIGFsZXJ0IGdlbmVyYXRpb24uCitpblhfaW5wdXQJCU1lYXN1
cmVkIHBvd2VyIHN1cHBseSB2b2x0YWdlCitpblhfZmF1bHQJCTA6IE5vIGZhaWwgY29uZGl0aW9u
LgorCQkJMTogRmFpbGluZyBwb3dlciBzdXBwbHkuCitwb3dlcjFfaW5wdXQJCVN5c3RlbSBwb3dl
ciBjb25zdW1wdGlvbiAobWljcm9XYXR0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9LY29u
ZmlnIGIvZHJpdmVycy9od21vbi9LY29uZmlnCmluZGV4IDAyZDNkODUuLjI5YzNmY2IgMTAwNjQ0
Ci0tLSBhL2RyaXZlcnMvaHdtb24vS2NvbmZpZworKysgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcK
QEAgLTU1NCw2ICs1NTQsMTcgQEAgY29uZmlnIFNFTlNPUlNfSUJNUEVYCiAJICBUaGlzIGRyaXZl
ciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3
aWxsIGJlIGNhbGxlZCBpYm1wZXguCiAKK2NvbmZpZyBTRU5TT1JTX0lCTVBPV0VSTlYKKwl0cmlz
dGF0ZSAiSUJNIFBPV0VSTlYgcGxhdGZvcm0gc2Vuc29ycyIKKwlkZXBlbmRzIG9uIFBQQ19QT1dF
Uk5WCisJZGVmYXVsdCB5CisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1
cHBvcnQgZm9yIHRoZSB0ZW1wZXJhdHVyZS9mYW4vcG93ZXIKKwkgIHNlbnNvcnMgb24geW91ciBQ
b3dlck5WIHBsYXRmb3JtLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBh
IG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGlibXBvd2VybnYu
CisKIGNvbmZpZyBTRU5TT1JTX0lJT19IV01PTgogCXRyaXN0YXRlICJId21vbiBkcml2ZXIgdGhh
dCB1c2VzIGNoYW5uZWxzIHNwZWNpZmllZCB2aWEgaWlvIG1hcHMiCiAJZGVwZW5kcyBvbiBJSU8K
ZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUgYi9kcml2ZXJzL2h3bW9uL01ha2Vm
aWxlCmluZGV4IDNkYzBmMDIuLmZjNGVkMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vTWFr
ZWZpbGUKKysrIGIvZHJpdmVycy9od21vbi9NYWtlZmlsZQpAQCAtNzEsNiArNzEsNyBAQCBvYmot
JChDT05GSUdfU0VOU09SU19VTFRSQTQ1KQkrPSB1bHRyYTQ1X2Vudi5vCiBvYmotJChDT05GSUdf
U0VOU09SU19JNUtfQU1CKQkrPSBpNWtfYW1iLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0lCTUFF
TSkJKz0gaWJtYWVtLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0lCTVBFWCkJKz0gaWJtcGV4Lm8K
K29iai0kKENPTkZJR19TRU5TT1JTX0lCTVBPV0VSTlYpKz0gaWJtcG93ZXJudi5vCiBvYmotJChD
T05GSUdfU0VOU09SU19JSU9fSFdNT04pICs9IGlpb19od21vbi5vCiBvYmotJChDT05GSUdfU0VO
U09SU19JTkEyMDkpCSs9IGluYTIwOS5vCiBvYmotJChDT05GSUdfU0VOU09SU19JTkEyWFgpCSs9
IGluYTJ4eC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2libXBvd2VybnYuYyBiL2RyaXZl
cnMvaHdtb24vaWJtcG93ZXJudi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu
LjQ0ZGNkOTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2h3bW9uL2libXBvd2VybnYuYwpA
QCAtMCwwICsxLDM2MiBAQAorLyoKKyAqIElCTSBQb3dlck5WIHBsYXRmb3JtIHNlbnNvcnMgZm9y
IHRlbXBlcmF0dXJlL2Zhbi92b2x0YWdlL3Bvd2VyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgSUJN
CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdl
bmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0
IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMg
ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBX
SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m
CisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu
ICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxz
LgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4KKyAqLworCisj
ZGVmaW5lIERSVk5BTUUJCSJpYm1wb3dlcm52IgorI2RlZmluZSBwcl9mbXQoZm10KQlEUlZOQU1F
ICI6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9k
dWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24u
aD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+
CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2
aWNlLmg+CisjaW5jbHVkZSA8YXNtL29wYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKwor
I2RlZmluZSBNQVhfQVRUUl9MRU4JMzIKKworLyogU2Vuc29yIHN1ZmZpeCBuYW1lIGZyb20gRFQg
Ki8KKyNkZWZpbmUgRFRfRkFVTFRfQVRUUl9TVUZGSVgJCSJmYXVsdGVkIgorI2RlZmluZSBEVF9E
QVRBX0FUVFJfU1VGRklYCQkiZGF0YSIKKyNkZWZpbmUgRFRfVEhSRVNIT0xEX0FUVFJfU1VGRklY
CSJ0aHJzIgorCisvKgorICogRW51bWVyYXRlcyBhbGwgdGhlIHR5cGVzIG9mIHNlbnNvcnMgaW4g
dGhlIFBPV0VSTlYgcGxhdGZvcm0gYW5kIGRvZXMgaW5kZXgKKyAqIGludG8gJ3N0cnVjdCBzZW5z
b3JfZ3JvdXAnCisgKi8KK2VudW0gc2Vuc29ycyB7CisJRkFOLAorCUFNQklFTlRfVEVNUCwKKwlQ
T1dFUl9TVVBQTFksCisJUE9XRVJfSU5QVVQsCisJTUFYX1NFTlNPUl9UWVBFLAorfTsKKworc3Rh
dGljIHN0cnVjdCBzZW5zb3JfZ3JvdXAgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hh
ciAqY29tcGF0aWJsZTsKKwlzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGdyb3VwOworCXUzMiBhdHRy
X2NvdW50OworfSBzZW5zb3JfZ3JvdXBzW10gPSB7CisJeyJmYW4iLCAiaWJtLG9wYWwtc2Vuc29y
LWNvb2xpbmctZmFuIn0sCisJeyJ0ZW1wIiwgImlibSxvcGFsLXNlbnNvci1hbWItdGVtcCJ9LAor
CXsiaW4iLCAiaWJtLG9wYWwtc2Vuc29yLXBvd2VyLXN1cHBseSJ9LAorCXsicG93ZXIiLCAiaWJt
LG9wYWwtc2Vuc29yLXBvd2VyIn0KK307CisKK3N0cnVjdCBzZW5zb3JfZGF0YSB7CisJdTMyIGlk
OyAvKiBBbiBvcGFxdWUgaWQgb2YgdGhlIGZpcm13YXJlIGZvciBlYWNoIHNlbnNvciAqLworCWVu
dW0gc2Vuc29ycyB0eXBlOworCWNoYXIgbmFtZVtNQVhfQVRUUl9MRU5dOworCXN0cnVjdCBkZXZp
Y2VfYXR0cmlidXRlIGRldl9hdHRyOworfTsKKworc3RydWN0IHBsYXRmb3JtX2RhdGEgeworCWNv
bnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmF0dHJfZ3JvdXBzW01BWF9TRU5TT1JfVFlQRSAr
IDFdOworCXUzMiBzZW5zb3JzX2NvdW50OyAvKiBUb3RhbCBjb3VudCBvZiBzZW5zb3JzIGZyb20g
ZWFjaCBncm91cCAqLworfTsKKworLyogUGxhdGZvcm0gZGV2aWNlIHJlcHJlc2VudGluZyBhbGwg
dGhlIGlibXBvd2VybnYgc2Vuc29ycyAqLworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ug
KnBkZXZpY2U7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfc2Vuc29yKHN0cnVjdCBkZXZpY2UgKmRl
diwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCQkgICBjaGFyICpidWYpCit7
CisJc3RydWN0IHNlbnNvcl9kYXRhICpzZGF0YSA9IGNvbnRhaW5lcl9vZihkZXZhdHRyLCBzdHJ1
Y3Qgc2Vuc29yX2RhdGEsCisJCQkJCQkgZGV2X2F0dHIpOworCXNzaXplX3QgcmV0OworCXUzMiB4
OworCisJcmV0ID0gb3BhbF9nZXRfc2Vuc29yX2RhdGEoc2RhdGEtPmlkLCAmeCk7CisJaWYgKHJl
dCkKKwkJcmV0dXJuIHJldDsKKworCS8qIENvbnZlcnQgdGVtcGVyYXR1cmUgdG8gbWlsbGktZGVn
cmVlcyAqLworCWlmIChzZGF0YS0+dHlwZSA9PSBBTUJJRU5UX1RFTVApCisJCXggKj0gMTAwMDsK
KwkvKiBDb252ZXJ0IHBvd2VyIHRvIG1pY3JvLXdhdHRzICovCisJZWxzZSBpZiAoc2RhdGEtPnR5
cGUgPT0gUE9XRVJfSU5QVVQpCisJCXggKj0gMTAwMDAwMDsKKworCXJldHVybiBzcHJpbnRmKGJ1
ZiwgIiV1XG4iLCB4KTsKK30KKworc3RhdGljIGludCBfX2luaXQgZ2V0X3NlbnNvcl9pbmRleF9h
dHRyKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiAqaW5kZXgsCisJCQkJCWNoYXIgKmF0dHIpCit7CisJ
Y2hhciAqaGFzaF9wb3MgPSBzdHJjaHIobmFtZSwgJyMnKTsKKwljaGFyIGJ1Zls4XSA9IHsgMCB9
OworCWNoYXIgKmRhc2hfcG9zOworCXUzMiBjb3B5X2xlbjsKKworCWlmICghaGFzaF9wb3MpCisJ
CXJldHVybiAtRUlOVkFMOworCisJZGFzaF9wb3MgPSBzdHJjaHIoaGFzaF9wb3MsICctJyk7CisJ
aWYgKCFkYXNoX3BvcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljb3B5X2xlbiA9IGRhc2hfcG9z
IC0gaGFzaF9wb3MgLSAxOworCWlmIChjb3B5X2xlbiA+PSBzaXplb2YoYnVmKSkKKwkJcmV0dXJu
IC1FSU5WQUw7CisKKwlzdHJuY3B5KGJ1ZiwgaGFzaF9wb3MgKyAxLCBjb3B5X2xlbik7CisKKwlp
ZiAoa3N0cnRvdTMyKGJ1ZiwgMTAsIGluZGV4KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdHJu
Y3B5KGF0dHIsIGRhc2hfcG9zICsgMSwgTUFYX0FUVFJfTEVOKTsKKworCXJldHVybiAwOworfQor
CisvKgorICogVGhpcyBmdW5jdGlvbiB0cmFuc2xhdGVzIHRoZSBEVCBub2RlIG5hbWUgaW50byB0
aGUgJ2h3bW9uJyBhdHRyaWJ1dGUgbmFtZS4KKyAqIElCTVBPV0VSTlYgZGV2aWNlIG5vZGUgYXBw
ZWFyIGxpa2UgY29vbGluZy1mYW4jMi1kYXRhLCBhbWItdGVtcCMxLXRocnMgZXRjLgorICogd2hp
Y2ggbmVlZCB0byBiZSBtYXBwZWQgYXMgZmFuMl9pbnB1dCwgdGVtcDFfbWF4IHJlc3BlY3RpdmVs
eSBiZWZvcmUKKyAqIHBvcHVsYXRpbmcgdGhlbSBpbnNpZGUgaHdtb24gZGV2aWNlIGNsYXNzLgor
ICovCitzdGF0aWMgaW50IF9faW5pdCBjcmVhdGVfaHdtb25fYXR0cl9uYW1lKHN0cnVjdCBkZXZp
Y2UgKmRldiwgZW51bSBzZW5zb3JzIHR5cGUsCisJCQkJCSBjb25zdCBjaGFyICpub2RlX25hbWUs
CisJCQkJCSBjaGFyICpod21vbl9hdHRyX25hbWUpCit7CisJY2hhciBhdHRyX3N1ZmZpeFtNQVhf
QVRUUl9MRU5dOworCWNoYXIgKmF0dHJfbmFtZTsKKwl1MzIgaW5kZXg7CisJaW50IGVycjsKKwor
CWVyciA9IGdldF9zZW5zb3JfaW5kZXhfYXR0cihub2RlX25hbWUsICZpbmRleCwgYXR0cl9zdWZm
aXgpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihkZXYsICJTZW5zb3IgZGV2aWNlIG5vZGUgbmFt
ZSAnJXMnIGlzIGludmFsaWRcbiIsCisJCQlub2RlX25hbWUpOworCQlyZXR1cm4gZXJyOworCX0K
KworCWlmICghc3RyY21wKGF0dHJfc3VmZml4LCBEVF9GQVVMVF9BVFRSX1NVRkZJWCkpIHsKKwkJ
YXR0cl9uYW1lID0gImZhdWx0IjsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXR0cl9zdWZmaXgsIERU
X0RBVEFfQVRUUl9TVUZGSVgpKSB7CisJCWF0dHJfbmFtZSA9ICJpbnB1dCI7CisJfSBlbHNlIGlm
ICghc3RyY21wKGF0dHJfc3VmZml4LCBEVF9USFJFU0hPTERfQVRUUl9TVUZGSVgpKSB7CisJCWlm
ICh0eXBlID09IEFNQklFTlRfVEVNUCkKKwkJCWF0dHJfbmFtZSA9ICJtYXgiOworCQllbHNlIGlm
ICh0eXBlID09IEZBTikKKwkJCWF0dHJfbmFtZSA9ICJtaW4iOworCQllbHNlCisJCQlyZXR1cm4g
LUVOT0VOVDsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlzbnByaW50Ziho
d21vbl9hdHRyX25hbWUsIE1BWF9BVFRSX0xFTiwgIiVzJWRfJXMiLAorCQkgc2Vuc29yX2dyb3Vw
c1t0eXBlXS5uYW1lLCBpbmRleCwgYXR0cl9uYW1lKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGlj
IGludCBfX2luaXQgcG9wdWxhdGVfYXR0cl9ncm91cHMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAq
cGRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2
ZGF0YShwZGV2KTsKKwljb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICoqcGdyb3VwcyA9IHBk
YXRhLT5hdHRyX2dyb3VwczsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9wYWwsICpucDsKKwllbnVt
IHNlbnNvcnMgdHlwZTsKKworCW9wYWwgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL2libSxvcGFs
L3NlbnNvcnMiKTsKKwlpZiAoIW9wYWwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiT3BhbCBu
b2RlICdzZW5zb3JzJyBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlm
b3JfZWFjaF9jaGlsZF9vZl9ub2RlKG9wYWwsIG5wKSB7CisJCWlmIChucC0+bmFtZSA9PSBOVUxM
KQorCQkJY29udGludWU7CisKKwkJZm9yICh0eXBlID0gMDsgdHlwZSA8IE1BWF9TRU5TT1JfVFlQ
RTsgdHlwZSsrKQorCQkJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLAorCQkJCQlzZW5z
b3JfZ3JvdXBzW3R5cGVdLmNvbXBhdGlibGUpKSB7CisJCQkJc2Vuc29yX2dyb3Vwc1t0eXBlXS5h
dHRyX2NvdW50Kys7CisJCQkJYnJlYWs7CisJCQl9CisJfQorCisJb2Zfbm9kZV9wdXQob3BhbCk7
CisKKwlmb3IgKHR5cGUgPSAwOyB0eXBlIDwgTUFYX1NFTlNPUl9UWVBFOyB0eXBlKyspIHsKKwkJ
c2Vuc29yX2dyb3Vwc1t0eXBlXS5ncm91cC5hdHRycyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2
LAorCQkJCQlzaXplb2Yoc3RydWN0IGF0dHJpYnV0ZSAqKSAqCisJCQkJCShzZW5zb3JfZ3JvdXBz
W3R5cGVdLmF0dHJfY291bnQgKyAxKSwKKwkJCQkJR0ZQX0tFUk5FTCk7CisJCWlmICghc2Vuc29y
X2dyb3Vwc1t0eXBlXS5ncm91cC5hdHRycykKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXBncm91
cHNbdHlwZV0gPSAmc2Vuc29yX2dyb3Vwc1t0eXBlXS5ncm91cDsKKwkJcGRhdGEtPnNlbnNvcnNf
Y291bnQgKz0gc2Vuc29yX2dyb3Vwc1t0eXBlXS5hdHRyX2NvdW50OworCQlzZW5zb3JfZ3JvdXBz
W3R5cGVdLmF0dHJfY291bnQgPSAwOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogSXRl
cmF0ZSB0aHJvdWdoIHRoZSBkZXZpY2UgdHJlZSBmb3IgZWFjaCBjaGlsZCBvZiAnc2Vuc29ycycg
bm9kZSwgY3JlYXRlCisgKiBhIHN5c2ZzIGF0dHJpYnV0ZSBmaWxlLCB0aGUgZmlsZSBpcyBuYW1l
ZCBieSB0cmFuc2xhdGluZyB0aGUgRFQgbm9kZSBuYW1lCisgKiB0byB0aGUgbmFtZSByZXF1aXJl
ZCBieSB0aGUgaGlnaGVyICdod21vbicgZHJpdmVyIGxpa2UgZmFuMV9pbnB1dCwgdGVtcDFfbWF4
CisgKiBldGMuLgorICovCitzdGF0aWMgaW50IF9faW5pdCBjcmVhdGVfZGV2aWNlX2F0dHJzKHN0
cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RhdGEgKnBk
YXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJY29uc3Qgc3RydWN0IGF0dHJpYnV0
ZV9ncm91cCAqKnBncm91cHMgPSBwZGF0YS0+YXR0cl9ncm91cHM7CisJc3RydWN0IGRldmljZV9u
b2RlICpvcGFsLCAqbnA7CisJc3RydWN0IHNlbnNvcl9kYXRhICpzZGF0YTsKKwljb25zdCBfX2Jl
MzIgKnNlbnNvcl9pZDsKKwllbnVtIHNlbnNvcnMgdHlwZTsKKwl1MzIgY291bnQgPSAwOworCWlu
dCBlcnIgPSAwOworCisJb3BhbCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvaWJtLG9wYWwvc2Vu
c29ycyIpOworCXNkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHBkYXRhLT5zZW5zb3Jz
X2NvdW50ICogc2l6ZW9mKCpzZGF0YSksCisJCQkgICAgIEdGUF9LRVJORUwpOworCWlmICghc2Rh
dGEpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0X3B1dF9ub2RlOworCX0KKworCWZv
cl9lYWNoX2NoaWxkX29mX25vZGUob3BhbCwgbnApIHsKKwkJaWYgKG5wLT5uYW1lID09IE5VTEwp
CisJCQljb250aW51ZTsKKworCQlmb3IgKHR5cGUgPSAwOyB0eXBlIDwgTUFYX1NFTlNPUl9UWVBF
OyB0eXBlKyspCisJCQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsCisJCQkJCXNlbnNv
cl9ncm91cHNbdHlwZV0uY29tcGF0aWJsZSkpCisJCQkJYnJlYWs7CisKKwkJaWYgKHR5cGUgPT0g
TUFYX1NFTlNPUl9UWVBFKQorCQkJY29udGludWU7CisKKwkJc2Vuc29yX2lkID0gb2ZfZ2V0X3By
b3BlcnR5KG5wLCAic2Vuc29yLWlkIiwgTlVMTCk7CisJCWlmICghc2Vuc29yX2lkKSB7CisJCQlk
ZXZfaW5mbygmcGRldi0+ZGV2LAorCQkJCSAiJ3NlbnNvci1pZCcgbWlzc2luZyBpbiB0aGUgbm9k
ZSAnJXMnXG4iLAorCQkJCSBucC0+bmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXNkYXRh
W2NvdW50XS5pZCA9IGJlMzJfdG9fY3B1cChzZW5zb3JfaWQpOworCQlzZGF0YVtjb3VudF0udHlw
ZSA9IHR5cGU7CisJCWVyciA9IGNyZWF0ZV9od21vbl9hdHRyX25hbWUoJnBkZXYtPmRldiwgdHlw
ZSwgbnAtPm5hbWUsCisJCQkJCSAgICAgc2RhdGFbY291bnRdLm5hbWUpOworCQlpZiAoZXJyKQor
CQkJZ290byBleGl0X3B1dF9ub2RlOworCisJCXN5c2ZzX2F0dHJfaW5pdCgmc2RhdGFbY291bnRd
LmRldl9hdHRyLmF0dHIpOworCQlzZGF0YVtjb3VudF0uZGV2X2F0dHIuYXR0ci5uYW1lID0gc2Rh
dGFbY291bnRdLm5hbWU7CisJCXNkYXRhW2NvdW50XS5kZXZfYXR0ci5hdHRyLm1vZGUgPSBTX0lS
VUdPOworCQlzZGF0YVtjb3VudF0uZGV2X2F0dHIuc2hvdyA9IHNob3dfc2Vuc29yOworCisJCXBn
cm91cHNbdHlwZV0tPmF0dHJzW3NlbnNvcl9ncm91cHNbdHlwZV0uYXR0cl9jb3VudCsrXSA9CisJ
CQkJJnNkYXRhW2NvdW50KytdLmRldl9hdHRyLmF0dHI7CisJfQorCitleGl0X3B1dF9ub2RlOgor
CW9mX25vZGVfcHV0KG9wYWwpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0
IGlibXBvd2VybnZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1
Y3QgcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OworCWlu
dCBlcnI7CisKKwlwZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnBkYXRh
KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwbGF0
Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwZGF0YSk7CisJcGRhdGEtPnNlbnNvcnNfY291bnQgPSAw
OworCWVyciA9IHBvcHVsYXRlX2F0dHJfZ3JvdXBzKHBkZXYpOworCWlmIChlcnIpCisJCXJldHVy
biBlcnI7CisKKwkvKiBDcmVhdGUgc3lzZnMgYXR0cmlidXRlIGRhdGEgZm9yIGVhY2ggc2Vuc29y
IGZvdW5kIGluIHRoZSBEVCAqLworCWVyciA9IGNyZWF0ZV9kZXZpY2VfYXR0cnMocGRldik7CisJ
aWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIEZpbmFsbHksIHJlZ2lzdGVyIHdpdGggaHdt
b24gKi8KKwlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3Vw
cygmcGRldi0+ZGV2LCBEUlZOQU1FLAorCQkJCQkJCSAgIHBkYXRhLAorCQkJCQkJCSAgIHBkYXRh
LT5hdHRyX2dyb3Vwcyk7CisKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGh3bW9uX2Rldik7Cit9
CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGlibXBvd2VybnZfZHJpdmVyID0gewor
CS5kcml2ZXIgPSB7CisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkubmFtZSA9IERSVk5BTUUs
CisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGlibXBvd2VybnZfaW5pdCh2b2lkKQorewor
CWludCBlcnI7CisKKwlwZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKERSVk5BTUUsIDAp
OworCWlmICghcGRldmljZSkgeworCQlwcl9lcnIoIkRldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxu
Iik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisKKwllcnIgPSBwbGF0Zm9y
bV9kZXZpY2VfYWRkKHBkZXZpY2UpOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJEZXZpY2UgYWRk
aXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CisJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OworCX0K
KworCWVyciA9IHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmaWJtcG93ZXJudl9kcml2ZXIsIGlibXBv
d2VybnZfcHJvYmUpOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJQbGF0ZnJvbSBkcml2ZXIgcHJv
YmUgZmFpbGVkXG4iKTsKKwkJZ290byBleGl0X2RldmljZV9kZWw7CisJfQorCisJcmV0dXJuIDA7
CisKK2V4aXRfZGV2aWNlX2RlbDoKKwlwbGF0Zm9ybV9kZXZpY2VfZGVsKHBkZXZpY2UpOworZXhp
dF9kZXZpY2VfcHV0OgorCXBsYXRmb3JtX2RldmljZV9wdXQocGRldmljZSk7CitleGl0OgorCXJl
dHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpYm1wb3dlcm52X2V4aXQodm9pZCkK
K3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaWJtcG93ZXJudl9kcml2ZXIpOworCXBs
YXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkZXZpY2UpOworfQorCitNT0RVTEVfQVVUSE9SKCJO
ZWVsZXNoIEd1cHRhIDxuZWVsZWd1cEBsaW51eC52bmV0LmlibS5jb20+Iik7CitNT0RVTEVfREVT
Q1JJUFRJT04oIklCTSBQT1dFUk5WIHBsYXRmb3JtIHNlbnNvcnMiKTsKK01PRFVMRV9MSUNFTlNF
KCJHUEwiKTsKKworbW9kdWxlX2luaXQoaWJtcG93ZXJudl9pbml0KTsKK21vZHVsZV9leGl0KGli
bXBvd2VybnZfZXhpdCk7CgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX18KbG0tc2Vuc29ycyBtYWlsaW5nIGxpc3QKbG0tc2Vuc29yc0BsbS1zZW5zb3JzLm9y
ZwpodHRwOi8vbGlzdHMubG0tc2Vuc29ycy5vcmcvbWFpbG1hbi9saXN0aW5mby9sbS1zZW5zb3Jz
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [lm-sensors] [PATCH v4] powerpc/powernv: hwmon driver for power, fan rpm, voltage and temperatur
2014-07-04 11:14 ` [lm-sensors] " Neelesh Gupta
(?)
@ 2014-07-05 2:25 ` Guenter Roeck
-1 siblings, 0 replies; 11+ messages in thread
From: Guenter Roeck @ 2014-07-05 2:25 UTC (permalink / raw)
To: Neelesh Gupta, linuxppc-dev-uLR06cmDAlY/bJ5BZ2RsiQ,
jdelvare-l3A5Bk7waGM, lm-sensors-GZX6beZjE8VD60Wz+7aTrA
Cc: benh-XVmvHMARGAS8U2dJNN8I7kB+6BGkLq7r,
svaidy-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8,
sbhat-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8,
devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
T24gMDcvMDQvMjAxNCAwNDowMiBBTSwgTmVlbGVzaCBHdXB0YSB3cm90ZToKPiBUaGlzIHBhdGNo
IGFkZHMgYmFzaWMga2VybmVsIHN1cHBvcnQgZm9yIHJlYWRpbmcgcG93ZXIgdmFsdWVzLCBmYW4K
PiBzcGVlZCBycG0sIHZvbHRhZ2UgYW5kIHRlbXBlcmF0dXJlIGRhdGEgb24gcG93ZXJudiBwbGF0
Zm9ybXMgd2hpY2ggd2lsbAo+IGJlIGV4cG9ydGVkIHRvIHVzZXIgc3BhY2UgdGhyb3VnaCBzeXNm
cyBpbnRlcmZhY2UuCj4KCkhpIE5lZWxlc2gsCgpDb3B5aW5nIGRldmljZXRyZWUgbWFpbGluZyBs
aXN0LiBQbGVhc2UgY29weSBpdCBvbiB0aGUgbmV4dCAoaG9wZWZ1bGx5IGZpbmFsKQpyZXZpc2lv
bjsgZGV2aWNldHJlZSBtYWludGFpbmVycyBhdCBsZWFzdCBuZWVkIGEgY2hhbmNlIHRvIGNvbW1l
bnQuClsgWWVzLCBJIHVuZGVyc3RhbmQgdGhpcyBpcyBhIHNoaXBwaW5nIHByb2R1Y3QsIGJ1dCBz
dGlsbCAuLi4gXQoKSSBhbSBvayB3aXRoIHRoZSBjb2RlIGV4Y2VwdCBmb3IgYSBjb3VwbGUgb2Yg
bWlub3Igbml0cGlja3MgKHNlZSBiZWxvdykuCgpUaGFua3MsCkd1ZW50ZXIKCj4gVGVzdCByZXN1
bHRzOgo+IC0tLS0tLS0tLS0tLS0KPiBbcm9vdEB0dWwxNjNwMSB+XSMgc2Vuc29ycwo+IGlibXBv
d2VybnYtaXNhLTAwMDAKPiBBZGFwdGVyOiBJU0EgYWRhcHRlcgo+IGZhbjE6ICAgICAgICA1NTY3
IFJQTSAgKG1pbiA9ICAgIDAgUlBNKQo+IGZhbjI6ICAgICAgICA1MjMyIFJQTSAgKG1pbiA9ICAg
IDAgUlBNKQo+IGZhbjM6ICAgICAgICA1NTMyIFJQTSAgKG1pbiA9ICAgIDAgUlBNKQo+IGZhbjQ6
ICAgICAgICA0OTQ1IFJQTSAgKG1pbiA9ICAgIDAgUlBNKQo+IGZhbjU6ICAgICAgICAgICAwIFJQ
TSAgKG1pbiA9ICAgIDAgUlBNKQo+IGZhbjY6ICAgICAgICAgICAwIFJQTSAgKG1pbiA9ICAgIDAg
UlBNKQo+IGZhbjc6ICAgICAgICA3MzkyIFJQTSAgKG1pbiA9ICAgIDAgUlBNKQo+IGZhbjg6ICAg
ICAgICA3OTM2IFJQTSAgKG1pbiA9ICAgIDAgUlBNKQo+IHRlbXAxOiAgICAgICAgKzM5LjDCsEMg
IChoaWdoID0gICswLjDCsEMpCj4gcG93ZXIxOiAgICAgIDE5MS4wMCBXCj4KPiBbcm9vdEB0dWwx
NjNwMSB+XSMgbHMgL3N5cy9kZXZpY2VzL3BsYXRmb3JtLwo+IGFsYXJtdGltZXIgIGlibXBvd2Vy
bnYuMCAgcG93ZXIgIHJ0Yy1nZW5lcmljICBzZXJpYWw4MjUwICB1ZXZlbnQKPiBbcm9vdEB0dWwx
NjNwMSB+XSMgbHMgL3N5cy9kZXZpY2VzL3BsYXRmb3JtL2libXBvd2VybnYuMC9od21vbi9od21v
bjAvCj4gZGV2aWNlCSAgICBmYW4yX21pbglmYW40X21pbiAgICBmYW42X21pbglmYW44X21pbiAg
IHBvd2VyCj4gZmFuMV9mYXVsdCAgZmFuM19mYXVsdAlmYW41X2ZhdWx0ICBmYW43X2ZhdWx0CWlu
MV9mYXVsdCAgcG93ZXIxX2lucHV0Cj4gZmFuMV9pbnB1dCAgZmFuM19pbnB1dAlmYW41X2lucHV0
ICBmYW43X2lucHV0CWluMl9mYXVsdCAgc3Vic3lzdGVtCj4gZmFuMV9taW4gICAgZmFuM19taW4J
ZmFuNV9taW4gICAgZmFuN19taW4JaW4zX2ZhdWx0ICB0ZW1wMV9pbnB1dAo+IGZhbjJfZmF1bHQg
IGZhbjRfZmF1bHQJZmFuNl9mYXVsdCAgZmFuOF9mYXVsdAlpbjRfZmF1bHQgIHRlbXAxX21heAo+
IGZhbjJfaW5wdXQgIGZhbjRfaW5wdXQJZmFuNl9pbnB1dCAgZmFuOF9pbnB1dAluYW1lCSAgIHVl
dmVudAo+IFtyb290QHR1bDE2M3AxIH5dIwo+IFtyb290QHR1bDE2M3AxIH5dIyBscyAvc3lzL2Ns
YXNzL2h3bW9uL2h3bW9uMC8KPiBkZXZpY2UJICAgIGZhbjJfbWluCWZhbjRfbWluICAgIGZhbjZf
bWluCWZhbjhfbWluICAgcG93ZXIKPiBmYW4xX2ZhdWx0ICBmYW4zX2ZhdWx0CWZhbjVfZmF1bHQg
IGZhbjdfZmF1bHQJaW4xX2ZhdWx0ICBwb3dlcjFfaW5wdXQKPiBmYW4xX2lucHV0ICBmYW4zX2lu
cHV0CWZhbjVfaW5wdXQgIGZhbjdfaW5wdXQJaW4yX2ZhdWx0ICBzdWJzeXN0ZW0KPiBmYW4xX21p
biAgICBmYW4zX21pbglmYW41X21pbiAgICBmYW43X21pbglpbjNfZmF1bHQgIHRlbXAxX2lucHV0
Cj4gZmFuMl9mYXVsdCAgZmFuNF9mYXVsdAlmYW42X2ZhdWx0ICBmYW44X2ZhdWx0CWluNF9mYXVs
dCAgdGVtcDFfbWF4Cj4gZmFuMl9pbnB1dCAgZmFuNF9pbnB1dAlmYW42X2lucHV0ICBmYW44X2lu
cHV0CW5hbWUJICAgdWV2ZW50Cj4gW3Jvb3RAdHVsMTYzcDEgfl0jCj4KPiBTaWduZWQtb2ZmLWJ5
OiBOZWVsZXNoIEd1cHRhIDxuZWVsZWd1cEBsaW51eC52bmV0LmlibS5jb20+Cj4gLS0tCj4KPiBD
aGFuZ2VzIGluIHY0Cj4gPT09PT09PT09PT09PQo+IC0gUmVwbGFjZWQgcHJfZXJyKCkgd2l0aCBk
ZXZfZXJyKCkgZm9yIGxvZ2dpbiBwcmludCBtZXNzYWdlcy4KPiAtIFVzaW5nIGtzdHJ0b3UzMigp
IGZ1bmN0aW9uIGZvciBjb252ZXJ0aW5nIHN0cmluZyB0byB1MzIgaW5zdGVhZCBvZiBzc2NhbmYo
KS4KPgo+IENoYW5nZXMgaW4gdjMKPiA9PT09PT09PT09PT09Cj4gLSBGaXhlZCBhbiBlbmRpYW5u
ZXNzIGJ1ZyBsZWFkaW5nIHRoZSBkcml2ZXIgdG8gYnJlYWsgb24gTEUuCj4gLSBGaXhlZCBhIGJ1
ZyB0aGF0IHdoZW4gb25lIG9mIHRoZSAnYXR0cmlidXRlX2dyb3VwJyBub3QgcG9wdWxhdGVkLCBm
b2xsb3dpbmcKPiAgICBncm91cHMgYXR0cmlidXRlcyB3ZXJlIGRyb3BwZWQuCj4gLSBSZXdyaXRl
IHRoZSBnZXRfc2Vuc29yX2luZGV4X2F0dHIoKSBmdW5jdGlvbiB0byBoYW5kbGUgYWxsIHRoZSBl
cnJvciBzY2VuYXJpb3MKPiAgICBsaWtlICdzc2NhbmYnIGV0Yy4KPiAtIEZpeGVkIGFsbCB0aGUg
ZXJyb3JzL3dhcm5pbmdzIHJlbGF0ZWQgdG8gY29kaW5nIHN0eWxlL3doaXRlc3BhY2UuCj4gLSBB
ZGRlZCAnRG9jdW1lbnRhdGlvbicgZmlsZXMuCj4gLSBBZGRyZXNzZWQgcmVtYWluaW5nIHJldmll
dyBjb21tZW50cyBvbiBWMi4KPgo+IENoYW5nZXMgaW4gdjIKPiA9PT09PT09PT09PT09Cj4gLSBH
ZW5lcmljIHVzZSBvZiBkZXZtXyogZnVuY3Rpb25zIGluIGh3bW9uIGxpa2UgdXNpbmcgZGV2bV9r
emFsbG9jKCkgZm9yIGR5bmFtaWMKPiAgICBtZW1vcnkgcmVxdWVzdCwgYXZvaWRpbmcgdGhlIG5l
ZWQgdG8gZXhwbGljaXQgZnJlZSBvZiBtZW1vcnkuCj4gICAgQWRkaW5nICdzdHJ1Y3QgYXR0cmli
dXRlX2dyb3VwJyBhcyBtZW1iZXIgb2YgcGxhdGZvcm0gZGF0YSBzdHJ1Y3R1cmUgdG8gYmUKPiAg
ICBwb3B1bGF0ZWQgYW5kIHRoZW4gcGFzc2VkIHRvIGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVy
X3dpdGhfZ3JvdXBzKCkuCj4KPiAgICBOb3RlOiBIYXZpbmcgYW4gYXJyYXkgb2YgcG9pbnRlcnMg
b2YgJ2F0dHJpYnV0ZV9ncm91cCcgYW5kIGVhY2ggZ3JvdXAKPiAgICBjb3JyZXNwb25kcyB0byAn
ZW51bSBzZW5zb3JzJyB0eXBlLiBOb3QgY29tcGxldGVseSBzdXJlLCBpZiBpdCdzIGlkZWFsIG9y
Cj4gICAgY291bGQgaGF2ZSBqdXN0IG9uZSBncm91cCBwb3B1bGF0ZWQgd2l0aCBhdHRyaWJ1dGVz
IG9mIHNlbnNvciB0eXBlcz8KPgo+IC0gJ2libXBvd2VybnYnIGlzIG5vdCBob3QtcGx1Z2dhYmxl
IGRldmljZSBzbyBtb3ZpbmcgJ3BsYXRmb3JtX2RyaXZlcicgY2FsbGJhY2sKPiAgICBmdW5jdGlv
biAocHJvYmUpIGFzIHBhcnQgb2YgX19pbml0IGNvZGUuCj4gLSBGaXhlZCBpc3N1ZXMgcmVsYXRl
ZCB0byBjb2Rpbmcgc3R5bGUuCj4gLSBPdGhlciBnZW5lcmFsIGNvbW1lbnRzIGluIHYxLgo+Cj4g
ICAuLi4vZGV2aWNldHJlZS9iaW5kaW5ncy9od21vbi9pYm1wb3dlcm52LnR4dCAgICAgICB8ICAg
MjcgKwo+ICAgRG9jdW1lbnRhdGlvbi9od21vbi9pYm1wb3dlcm52ICAgICAgICAgICAgICAgICAg
ICAgfCAgIDQxICsrCj4gICBkcml2ZXJzL2h3bW9uL0tjb25maWcgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB8ICAgMTEgKwo+ICAgZHJpdmVycy9od21vbi9NYWtlZmlsZSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgfCAgICAxCj4gICBkcml2ZXJzL2h3bW9uL2libXBvd2VybnYuYyAg
ICAgICAgICAgICAgICAgICAgICAgICB8ICAzNjIgKysrKysrKysrKysrKysrKysrKysKPiAgIDUg
ZmlsZXMgY2hhbmdlZCwgNDQyIGluc2VydGlvbnMoKykKPiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBE
b2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaHdtb24vaWJtcG93ZXJudi50eHQKPiAg
IGNyZWF0ZSBtb2RlIDEwMDY0NCBEb2N1bWVudGF0aW9uL2h3bW9uL2libXBvd2VybnYKPiAgIGNy
ZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2h3bW9uL2libXBvd2VybnYuYwo+Cj4gZGlmZiAtLWdp
dCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9od21vbi9pYm1wb3dlcm52LnR4
dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9od21vbi9pYm1wb3dlcm52LnR4
dAo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMC4uZTNiZDFlYgo+IC0tLSAv
ZGV2L251bGwKPiArKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaHdtb24v
aWJtcG93ZXJudi50eHQKPiBAQCAtMCwwICsxLDI3IEBACj4gK0lCTSBQT1dFUk5WIHBsYXRmb3Jt
IHNlbnNvcnMKPiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICsKPiArUmVxdWlyZWQg
bm9kZSBwcm9wZXJ0aWVzOgo+ICstIGNvbXBhdGlibGU6IG11c3QgYmUgb25lIG9mCj4gKwkJImli
bSxvcGFsLXNlbnNvci1jb29saW5nLWZhbiIKPiArCQkiaWJtLG9wYWwtc2Vuc29yLWFtYi10ZW1w
Igo+ICsJCSJpYm0sb3BhbC1zZW5zb3ItcG93ZXItc3VwcGx5Igo+ICsJCSJpYm0sb3BhbC1zZW5z
b3ItcG93ZXIiCj4gKy0gc2Vuc29yLWlkOiBhbiBvcGFxdWUgaWQgcHJvdmlkZWQgYnkgdGhlIGZp
cm13YXJlIHRvIHRoZSBrZXJuZWwsIGlkZW50aWZpZXMgYQo+ICsJICAgICBnaXZlbiBzZW5zb3Ig
YW5kIGl0cyBhdHRyaWJ1dGUgZGF0YQo+ICsKPiArRXhhbXBsZSBzZW5zb3JzIG5vZGU6Cj4gKwo+
ICtjb29saW5nLWZhbiM4LWRhdGEgewo+ICsJc2Vuc29yLWlkID0gPDB4NzA1MjEwNz47Cj4gKwlw
aGFuZGxlID0gPDB4MTAwMDAwMjg+Owo+ICsJbGludXgscGhhbmRsZSA9IDwweDEwMDAwMDI4PjsK
PiArCWNvbXBhdGlibGUgPSAiaWJtLG9wYWwtc2Vuc29yLWNvb2xpbmctZmFuIjsKCnBoYW5kbGUg
YW5kIGxpbnV4LXBoYW5kbGUgYXJlIG5laXRoZXIgZG9jdW1lbnRlZCBub3IgdXNlZC4gRWl0aGVy
IGRvY3VtZW50IG9yIGRyb3AuCgo+ICt9Owo+ICsKPiArYW1iLXRlbXAjMS10aHJzIHsKPiArCXNl
bnNvci1pZCA9IDwweDUwOTYwMDA+Owo+ICsJcGhhbmRsZSA9IDwweDEwMDAwMDE3PjsKPiArCWxp
bnV4LHBoYW5kbGUgPSA8MHgxMDAwMDAxNz47Cj4gKwljb21wYXRpYmxlID0gImlibSxvcGFsLXNl
bnNvci1hbWItdGVtcCI7Cj4gK307Cj4gZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24v
aWJtcG93ZXJudiBiL0RvY3VtZW50YXRpb24vaHdtb24vaWJtcG93ZXJudgo+IG5ldyBmaWxlIG1v
ZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMC4uNjQ0MjQ1YQo+IC0tLSAvZGV2L251bGwKPiArKysg
Yi9Eb2N1bWVudGF0aW9uL2h3bW9uL2libXBvd2VybnYKPiBAQCAtMCwwICsxLDQxIEBACj4gK0tl
cm5lbCBEcml2ZXIgSUJNUE9XRU5WCj4gKz09PT09PT09PT09PT09PT09PT09PT09Cj4gKwo+ICtT
dXBwb3J0ZWQgc3lzdGVtczoKPiArICAqIEFueSByZWNlbnQgSUJNIFAgc2VydmVycyBiYXNlZCBv
biBQT1dFUk5WIHBsYXRmb3JtCj4gKwo+ICtBdXRob3I6IE5lZWxlc2ggR3VwdGEKPiArCj4gK0Rl
c2NyaXB0aW9uCj4gKy0tLS0tLS0tLS0tCj4gKwo+ICtUaGlzIGRyaXZlciBpbXBsZW1lbnRzIHJl
YWRpbmcgdGhlIHBsYXRmb3JtIHNlbnNvcnMgZGF0YSBsaWtlIHRlbXBlcmF0dXJlL2Zhbi8KPiAr
dm9sdGFnZS9wb3dlciBmb3IgJ1BPV0VSTlYnIHBsYXRmb3JtLgo+ICsKPiArVGhlIGRyaXZlciB1
c2VzIHRoZSBwbGF0Zm9ybSBkZXZpY2UgaW5mcmFzdHJ1Y3R1cmUuIEl0IHByb2JlcyB0aGUgZGV2
aWNlIHRyZWUKPiArZm9yIHNlbnNvciBkZXZpY2VzIGR1cmluZyB0aGUgX19pbml0IHBoYXNlIGFu
ZCByZWdpc3RlcnMgdGhlbSB3aXRoIHRoZSAnaHdtb24nLgo+ICsnaHdtb24nIHBvcHVsYXRlcyB0
aGUgJ3N5c2ZzJyB0cmVlIGhhdmluZyBhdHRyaWJ1dGUgZmlsZXMsIGVhY2ggZm9yIGEgZ2l2ZW4K
PiArc2Vuc29yIHR5cGUgYW5kIGl0cyBhdHRyaWJ1dGUgZGF0YS4KPiArCj4gK0FsbCB0aGUgbm9k
ZXMgaW4gdGhlIERUIGFwcGVhciB1bmRlciAiL2libSxvcGFsL3NlbnNvcnMiIGFuZCBlYWNoIHZh
bGlkIG5vZGUgaW4KPiArdGhlIERUIG1hcHMgdG8gYW4gYXR0cmlidXRlIGZpbGUgaW4gJ3N5c2Zz
Jy4gVGhlIG5vZGUgZXhwb3J0cyB1bmlxdWUgJ3NlbnNvci1pZCcKPiArd2hpY2ggdGhlIGRyaXZl
ciB1c2VzIHRvIG1ha2UgYW4gT1BBTCBjYWxsIHRvIHRoZSBmaXJtd2FyZS4KPiArCj4gK1VzYWdl
IG5vdGVzCj4gKy0tLS0tLS0tLS0tCj4gK1RoZSBkcml2ZXIgaXMgYnVpbHQgc3RhdGljYWxseSB3
aXRoIHRoZSBrZXJuZWwgYnkgZW5hYmxpbmcgdGhlIGNvbmZpZwo+ICtDT05GSUdfU0VOU09SU19J
Qk1QT1dFUk5WLiBJdCBjYW4gYWxzbyBiZSBidWlsdCBhcyBtb2R1bGUgJ2libXBvd2VybnYnLgo+
ICsKPiArU3lzZnMgYXR0cmlidXRlcwo+ICstLS0tLS0tLS0tLS0tLS0tCj4gKwo+ICtmYW5YX2lu
cHV0CQlNZWFzdXJlZCBSUE0gdmFsdWUuCj4gK2ZhblhfbWluCQlUaHJlc2hvbGQgUlBNIGZvciBh
bGVydCBnZW5lcmF0aW9uLgo+ICtmYW5YX2ZhdWx0CQkwOiBObyBmYWlsIGNvbmRpdGlvbgo+ICsJ
CQkxOiBGYWlsaW5nIGZhbgo+ICt0ZW1wWF9pbnB1dAkJTWVhc3VyZWQgYW1iaWVudCB0ZW1wZXJh
dHVyZS4KPiArdGVtcFhfbWF4CQlUaHJlc2hvbGQgYW1iaWVudCB0ZW1wZXJhdHVyZSBmb3IgYWxl
cnQgZ2VuZXJhdGlvbi4KPiAraW5YX2lucHV0CQlNZWFzdXJlZCBwb3dlciBzdXBwbHkgdm9sdGFn
ZQo+ICtpblhfZmF1bHQJCTA6IE5vIGZhaWwgY29uZGl0aW9uLgo+ICsJCQkxOiBGYWlsaW5nIHBv
d2VyIHN1cHBseS4KPiArcG93ZXIxX2lucHV0CQlTeXN0ZW0gcG93ZXIgY29uc3VtcHRpb24gKG1p
Y3JvV2F0dCkKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9LY29uZmlnIGIvZHJpdmVycy9o
d21vbi9LY29uZmlnCj4gaW5kZXggMDJkM2Q4NS4uMjljM2ZjYiAxMDA2NDQKPiAtLS0gYS9kcml2
ZXJzL2h3bW9uL0tjb25maWcKPiArKysgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcKPiBAQCAtNTU0
LDYgKzU1NCwxNyBAQCBjb25maWcgU0VOU09SU19JQk1QRVgKPiAgIAkgIFRoaXMgZHJpdmVyIGNh
biBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKPiAgIAkgIHdp
bGwgYmUgY2FsbGVkIGlibXBleC4KPgo+ICtjb25maWcgU0VOU09SU19JQk1QT1dFUk5WCj4gKwl0
cmlzdGF0ZSAiSUJNIFBPV0VSTlYgcGxhdGZvcm0gc2Vuc29ycyIKPiArCWRlcGVuZHMgb24gUFBD
X1BPV0VSTlYKPiArCWRlZmF1bHQgeQo+ICsJaGVscAo+ICsJICBJZiB5b3Ugc2F5IHllcyBoZXJl
IHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIHRlbXBlcmF0dXJlL2Zhbi9wb3dlcgo+ICsJICBzZW5z
b3JzIG9uIHlvdXIgUG93ZXJOViBwbGF0Zm9ybS4KPiArCj4gKwkgIFRoaXMgZHJpdmVyIGNhbiBh
bHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQo+ICsJICB3aWxsIGJl
IGNhbGxlZCBpYm1wb3dlcm52Lgo+ICsKPiAgIGNvbmZpZyBTRU5TT1JTX0lJT19IV01PTgo+ICAg
CXRyaXN0YXRlICJId21vbiBkcml2ZXIgdGhhdCB1c2VzIGNoYW5uZWxzIHNwZWNpZmllZCB2aWEg
aWlvIG1hcHMiCj4gICAJZGVwZW5kcyBvbiBJSU8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21v
bi9NYWtlZmlsZSBiL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKPiBpbmRleCAzZGMwZjAyLi5mYzRl
ZDI2IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKPiArKysgYi9kcml2ZXJz
L2h3bW9uL01ha2VmaWxlCj4gQEAgLTcxLDYgKzcxLDcgQEAgb2JqLSQoQ09ORklHX1NFTlNPUlNf
VUxUUkE0NSkJKz0gdWx0cmE0NV9lbnYubwo+ICAgb2JqLSQoQ09ORklHX1NFTlNPUlNfSTVLX0FN
QikJKz0gaTVrX2FtYi5vCj4gICBvYmotJChDT05GSUdfU0VOU09SU19JQk1BRU0pCSs9IGlibWFl
bS5vCj4gICBvYmotJChDT05GSUdfU0VOU09SU19JQk1QRVgpCSs9IGlibXBleC5vCj4gK29iai0k
KENPTkZJR19TRU5TT1JTX0lCTVBPV0VSTlYpKz0gaWJtcG93ZXJudi5vCj4gICBvYmotJChDT05G
SUdfU0VOU09SU19JSU9fSFdNT04pICs9IGlpb19od21vbi5vCj4gICBvYmotJChDT05GSUdfU0VO
U09SU19JTkEyMDkpCSs9IGluYTIwOS5vCj4gICBvYmotJChDT05GSUdfU0VOU09SU19JTkEyWFgp
CSs9IGluYTJ4eC5vCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaWJtcG93ZXJudi5jIGIv
ZHJpdmVycy9od21vbi9pYm1wb3dlcm52LmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4
IDAwMDAwMDAuLjQ0ZGNkOTkKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVycy9od21vbi9p
Ym1wb3dlcm52LmMKPiBAQCAtMCwwICsxLDM2MiBAQAo+ICsvKgo+ICsgKiBJQk0gUG93ZXJOViBw
bGF0Zm9ybSBzZW5zb3JzIGZvciB0ZW1wZXJhdHVyZS9mYW4vdm9sdGFnZS9wb3dlcgo+ICsgKiBD
b3B5cmlnaHQgKEMpIDIwMTQgSUJNCj4gKyAqCj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNv
ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cj4gKyAqIGl0IHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlz
aGVkIGJ5Cj4gKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9u
IDIgb2YgdGhlIExpY2Vuc2UsIG9yCj4gKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl
cnNpb24uCj4gKyAqCj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w
ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAo+ICsgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7
IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgo+ICsgKiBNRVJDSEFOVEFCSUxJ
VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCj4gKyAqIEdO
VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCj4gKyAqCj4gKyAqIFlv
dSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlCj4gKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLgo+ICsgKi8KPiArCj4gKyNkZWZp
bmUgRFJWTkFNRQkJImlibXBvd2VybnYiCj4gKyNkZWZpbmUgcHJfZm10KGZtdCkJRFJWTkFNRSAi
OiAiIGZtdAo+ICsKPiArI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KPiArI2luY2x1ZGUgPGxpbnV4
L21vZHVsZS5oPgo+ICsjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Cj4gKyNpbmNsdWRlIDxsaW51
eC9od21vbi5oPgo+ICsjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KPiArI2luY2x1ZGUg
PGxpbnV4L29mLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Cj4gKwo+ICsjaW5jbHVkZSA8
bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cj4gKyNpbmNsdWRlIDxhc20vb3BhbC5oPgo+ICsjaW5j
bHVkZSA8bGludXgvZXJyLmg+Cj4gKwo+ICsjZGVmaW5lIE1BWF9BVFRSX0xFTgkzMgo+ICsKPiAr
LyogU2Vuc29yIHN1ZmZpeCBuYW1lIGZyb20gRFQgKi8KPiArI2RlZmluZSBEVF9GQVVMVF9BVFRS
X1NVRkZJWAkJImZhdWx0ZWQiCj4gKyNkZWZpbmUgRFRfREFUQV9BVFRSX1NVRkZJWAkJImRhdGEi
Cj4gKyNkZWZpbmUgRFRfVEhSRVNIT0xEX0FUVFJfU1VGRklYCSJ0aHJzIgo+ICsKPiArLyoKPiAr
ICogRW51bWVyYXRlcyBhbGwgdGhlIHR5cGVzIG9mIHNlbnNvcnMgaW4gdGhlIFBPV0VSTlYgcGxh
dGZvcm0gYW5kIGRvZXMgaW5kZXgKPiArICogaW50byAnc3RydWN0IHNlbnNvcl9ncm91cCcKPiAr
ICovCj4gK2VudW0gc2Vuc29ycyB7Cj4gKwlGQU4sCj4gKwlBTUJJRU5UX1RFTVAsCj4gKwlQT1dF
Ul9TVVBQTFksCj4gKwlQT1dFUl9JTlBVVCwKPiArCU1BWF9TRU5TT1JfVFlQRSwKPiArfTsKPiAr
Cj4gK3N0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2dyb3VwIHsKPiArCWNvbnN0IGNoYXIgKm5hbWU7Cj4g
Kwljb25zdCBjaGFyICpjb21wYXRpYmxlOwo+ICsJc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBncm91
cDsKPiArCXUzMiBhdHRyX2NvdW50Owo+ICt9IHNlbnNvcl9ncm91cHNbXSA9IHsKPiArCXsiZmFu
IiwgImlibSxvcGFsLXNlbnNvci1jb29saW5nLWZhbiJ9LAo+ICsJeyJ0ZW1wIiwgImlibSxvcGFs
LXNlbnNvci1hbWItdGVtcCJ9LAo+ICsJeyJpbiIsICJpYm0sb3BhbC1zZW5zb3ItcG93ZXItc3Vw
cGx5In0sCj4gKwl7InBvd2VyIiwgImlibSxvcGFsLXNlbnNvci1wb3dlciJ9Cj4gK307Cj4gKwo+
ICtzdHJ1Y3Qgc2Vuc29yX2RhdGEgewo+ICsJdTMyIGlkOyAvKiBBbiBvcGFxdWUgaWQgb2YgdGhl
IGZpcm13YXJlIGZvciBlYWNoIHNlbnNvciAqLwo+ICsJZW51bSBzZW5zb3JzIHR5cGU7Cj4gKwlj
aGFyIG5hbWVbTUFYX0FUVFJfTEVOXTsKPiArCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9h
dHRyOwo+ICt9Owo+ICsKPiArc3RydWN0IHBsYXRmb3JtX2RhdGEgewo+ICsJY29uc3Qgc3RydWN0
IGF0dHJpYnV0ZV9ncm91cCAqYXR0cl9ncm91cHNbTUFYX1NFTlNPUl9UWVBFICsgMV07Cj4gKwl1
MzIgc2Vuc29yc19jb3VudDsgLyogVG90YWwgY291bnQgb2Ygc2Vuc29ycyBmcm9tIGVhY2ggZ3Jv
dXAgKi8KPiArfTsKPiArCj4gKy8qIFBsYXRmb3JtIGRldmljZSByZXByZXNlbnRpbmcgYWxsIHRo
ZSBpYm1wb3dlcm52IHNlbnNvcnMgKi8KPiArc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ug
KnBkZXZpY2U7Cj4gKwo+ICtzdGF0aWMgc3NpemVfdCBzaG93X3NlbnNvcihzdHJ1Y3QgZGV2aWNl
ICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAo+ICsJCQkgICBjaGFyICpi
dWYpCj4gK3sKPiArCXN0cnVjdCBzZW5zb3JfZGF0YSAqc2RhdGEgPSBjb250YWluZXJfb2YoZGV2
YXR0ciwgc3RydWN0IHNlbnNvcl9kYXRhLAo+ICsJCQkJCQkgZGV2X2F0dHIpOwo+ICsJc3NpemVf
dCByZXQ7Cj4gKwl1MzIgeDsKPiArCj4gKwlyZXQgPSBvcGFsX2dldF9zZW5zb3JfZGF0YShzZGF0
YS0+aWQsICZ4KTsKPiArCWlmIChyZXQpCj4gKwkJcmV0dXJuIHJldDsKPiArCj4gKwkvKiBDb252
ZXJ0IHRlbXBlcmF0dXJlIHRvIG1pbGxpLWRlZ3JlZXMgKi8KPiArCWlmIChzZGF0YS0+dHlwZSA9
PSBBTUJJRU5UX1RFTVApCj4gKwkJeCAqPSAxMDAwOwo+ICsJLyogQ29udmVydCBwb3dlciB0byBt
aWNyby13YXR0cyAqLwo+ICsJZWxzZSBpZiAoc2RhdGEtPnR5cGUgPT0gUE9XRVJfSU5QVVQpCj4g
KwkJeCAqPSAxMDAwMDAwOwo+ICsKPiArCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB4KTsK
PiArfQo+ICsKPiArc3RhdGljIGludCBfX2luaXQgZ2V0X3NlbnNvcl9pbmRleF9hdHRyKGNvbnN0
IGNoYXIgKm5hbWUsIHUzMiAqaW5kZXgsCj4gKwkJCQkJY2hhciAqYXR0cikKPiArewo+ICsJY2hh
ciAqaGFzaF9wb3MgPSBzdHJjaHIobmFtZSwgJyMnKTsKPiArCWNoYXIgYnVmWzhdID0geyAwIH07
Cj4gKwljaGFyICpkYXNoX3BvczsKPiArCXUzMiBjb3B5X2xlbjsKPiArCj4gKwlpZiAoIWhhc2hf
cG9zKQo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsKPiArCWRhc2hfcG9zID0gc3RyY2hyKGhhc2hf
cG9zLCAnLScpOwo+ICsJaWYgKCFkYXNoX3BvcykKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCj4g
Kwljb3B5X2xlbiA9IGRhc2hfcG9zIC0gaGFzaF9wb3MgLSAxOwo+ICsJaWYgKGNvcHlfbGVuID49
IHNpemVvZihidWYpKQo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsKPiArCXN0cm5jcHkoYnVmLCBo
YXNoX3BvcyArIDEsIGNvcHlfbGVuKTsKPiArCj4gKwlpZiAoa3N0cnRvdTMyKGJ1ZiwgMTAsIGlu
ZGV4KSkKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCnNtYXRjaCBpc24ndCBnb2luZyB0byBsaWtl
IHRoYXQuIFBsZWFzZSB1c2UKCglpbnQgZXJyOwoJLi4uCgllcnIgPSBrc3RydG91MzIoYnVmLCAx
MCwgaW5kZXgpKTsKCWlmIChlcnIpCgkJcmV0dXJuIGVycjsKCj4gKwlzdHJuY3B5KGF0dHIsIGRh
c2hfcG9zICsgMSwgTUFYX0FUVFJfTEVOKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiAr
LyoKPiArICogVGhpcyBmdW5jdGlvbiB0cmFuc2xhdGVzIHRoZSBEVCBub2RlIG5hbWUgaW50byB0
aGUgJ2h3bW9uJyBhdHRyaWJ1dGUgbmFtZS4KPiArICogSUJNUE9XRVJOViBkZXZpY2Ugbm9kZSBh
cHBlYXIgbGlrZSBjb29saW5nLWZhbiMyLWRhdGEsIGFtYi10ZW1wIzEtdGhycyBldGMuCj4gKyAq
IHdoaWNoIG5lZWQgdG8gYmUgbWFwcGVkIGFzIGZhbjJfaW5wdXQsIHRlbXAxX21heCByZXNwZWN0
aXZlbHkgYmVmb3JlCj4gKyAqIHBvcHVsYXRpbmcgdGhlbSBpbnNpZGUgaHdtb24gZGV2aWNlIGNs
YXNzLgo+ICsgKi8KPiArc3RhdGljIGludCBfX2luaXQgY3JlYXRlX2h3bW9uX2F0dHJfbmFtZShz
dHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gc2Vuc29ycyB0eXBlLAo+ICsJCQkJCSBjb25zdCBjaGFy
ICpub2RlX25hbWUsCj4gKwkJCQkJIGNoYXIgKmh3bW9uX2F0dHJfbmFtZSkKPiArewo+ICsJY2hh
ciBhdHRyX3N1ZmZpeFtNQVhfQVRUUl9MRU5dOwo+ICsJY2hhciAqYXR0cl9uYW1lOwo+ICsJdTMy
IGluZGV4Owo+ICsJaW50IGVycjsKPiArCj4gKwllcnIgPSBnZXRfc2Vuc29yX2luZGV4X2F0dHIo
bm9kZV9uYW1lLCAmaW5kZXgsIGF0dHJfc3VmZml4KTsKPiArCWlmIChlcnIpIHsKPiArCQlkZXZf
ZXJyKGRldiwgIlNlbnNvciBkZXZpY2Ugbm9kZSBuYW1lICclcycgaXMgaW52YWxpZFxuIiwKPiAr
CQkJbm9kZV9uYW1lKTsKPiArCQlyZXR1cm4gZXJyOwo+ICsJfQo+ICsKPiArCWlmICghc3RyY21w
KGF0dHJfc3VmZml4LCBEVF9GQVVMVF9BVFRSX1NVRkZJWCkpIHsKPiArCQlhdHRyX25hbWUgPSAi
ZmF1bHQiOwo+ICsJfSBlbHNlIGlmICghc3RyY21wKGF0dHJfc3VmZml4LCBEVF9EQVRBX0FUVFJf
U1VGRklYKSkgewo+ICsJCWF0dHJfbmFtZSA9ICJpbnB1dCI7Cj4gKwl9IGVsc2UgaWYgKCFzdHJj
bXAoYXR0cl9zdWZmaXgsIERUX1RIUkVTSE9MRF9BVFRSX1NVRkZJWCkpIHsKPiArCQlpZiAodHlw
ZSA9PSBBTUJJRU5UX1RFTVApCj4gKwkJCWF0dHJfbmFtZSA9ICJtYXgiOwo+ICsJCWVsc2UgaWYg
KHR5cGUgPT0gRkFOKQo+ICsJCQlhdHRyX25hbWUgPSAibWluIjsKPiArCQllbHNlCj4gKwkJCXJl
dHVybiAtRU5PRU5UOwo+ICsJfSBlbHNlIHsKPiArCQlyZXR1cm4gLUVOT0VOVDsKPiArCX0KPiAr
Cj4gKwlzbnByaW50Zihod21vbl9hdHRyX25hbWUsIE1BWF9BVFRSX0xFTiwgIiVzJWRfJXMiLAo+
ICsJCSBzZW5zb3JfZ3JvdXBzW3R5cGVdLm5hbWUsIGluZGV4LCBhdHRyX25hbWUpOwo+ICsJcmV0
dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgX19pbml0IHBvcHVsYXRlX2F0dHJfZ3JvdXBz
KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gK3sKPiArCXN0cnVjdCBwbGF0Zm9ybV9k
YXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwo+ICsJY29uc3Qgc3RydWN0
IGF0dHJpYnV0ZV9ncm91cCAqKnBncm91cHMgPSBwZGF0YS0+YXR0cl9ncm91cHM7Cj4gKwlzdHJ1
Y3QgZGV2aWNlX25vZGUgKm9wYWwsICpucDsKPiArCWVudW0gc2Vuc29ycyB0eXBlOwo+ICsKPiAr
CW9wYWwgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL2libSxvcGFsL3NlbnNvcnMiKTsKPiArCWlm
ICghb3BhbCkgewo+ICsJCWRldl9lcnIoJnBkZXYtPmRldiwgIk9wYWwgbm9kZSAnc2Vuc29ycycg
bm90IGZvdW5kXG4iKTsKPiArCQlyZXR1cm4gLUVOT0RFVjsKPiArCX0KPiArCj4gKwlmb3JfZWFj
aF9jaGlsZF9vZl9ub2RlKG9wYWwsIG5wKSB7Cj4gKwkJaWYgKG5wLT5uYW1lID09IE5VTEwpCj4g
KwkJCWNvbnRpbnVlOwo+ICsKPiArCQlmb3IgKHR5cGUgPSAwOyB0eXBlIDwgTUFYX1NFTlNPUl9U
WVBFOyB0eXBlKyspCj4gKwkJCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwKPiArCQkJ
CQlzZW5zb3JfZ3JvdXBzW3R5cGVdLmNvbXBhdGlibGUpKSB7Cj4gKwkJCQlzZW5zb3JfZ3JvdXBz
W3R5cGVdLmF0dHJfY291bnQrKzsKPiArCQkJCWJyZWFrOwo+ICsJCQl9Cj4gKwl9Cj4gKwo+ICsJ
b2Zfbm9kZV9wdXQob3BhbCk7Cj4gKwo+ICsJZm9yICh0eXBlID0gMDsgdHlwZSA8IE1BWF9TRU5T
T1JfVFlQRTsgdHlwZSsrKSB7Cj4gKwkJc2Vuc29yX2dyb3Vwc1t0eXBlXS5ncm91cC5hdHRycyA9
IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LAo+ICsJCQkJCXNpemVvZihzdHJ1Y3QgYXR0cmlidXRl
ICopICoKPiArCQkJCQkoc2Vuc29yX2dyb3Vwc1t0eXBlXS5hdHRyX2NvdW50ICsgMSksCj4gKwkJ
CQkJR0ZQX0tFUk5FTCk7Cj4gKwkJaWYgKCFzZW5zb3JfZ3JvdXBzW3R5cGVdLmdyb3VwLmF0dHJz
KQo+ICsJCQlyZXR1cm4gLUVOT01FTTsKPiArCj4gKwkJcGdyb3Vwc1t0eXBlXSA9ICZzZW5zb3Jf
Z3JvdXBzW3R5cGVdLmdyb3VwOwo+ICsJCXBkYXRhLT5zZW5zb3JzX2NvdW50ICs9IHNlbnNvcl9n
cm91cHNbdHlwZV0uYXR0cl9jb3VudDsKPiArCQlzZW5zb3JfZ3JvdXBzW3R5cGVdLmF0dHJfY291
bnQgPSAwOwo+ICsJfQo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICsvKgo+ICsgKiBJdGVy
YXRlIHRocm91Z2ggdGhlIGRldmljZSB0cmVlIGZvciBlYWNoIGNoaWxkIG9mICdzZW5zb3JzJyBu
b2RlLCBjcmVhdGUKPiArICogYSBzeXNmcyBhdHRyaWJ1dGUgZmlsZSwgdGhlIGZpbGUgaXMgbmFt
ZWQgYnkgdHJhbnNsYXRpbmcgdGhlIERUIG5vZGUgbmFtZQo+ICsgKiB0byB0aGUgbmFtZSByZXF1
aXJlZCBieSB0aGUgaGlnaGVyICdod21vbicgZHJpdmVyIGxpa2UgZmFuMV9pbnB1dCwgdGVtcDFf
bWF4Cj4gKyAqIGV0Yy4uCj4gKyAqLwo+ICtzdGF0aWMgaW50IF9faW5pdCBjcmVhdGVfZGV2aWNl
X2F0dHJzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gK3sKPiArCXN0cnVjdCBwbGF0
Zm9ybV9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwo+ICsJY29uc3Qg
c3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqKnBncm91cHMgPSBwZGF0YS0+YXR0cl9ncm91cHM7Cj4g
KwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9wYWwsICpucDsKPiArCXN0cnVjdCBzZW5zb3JfZGF0YSAq
c2RhdGE7Cj4gKwljb25zdCBfX2JlMzIgKnNlbnNvcl9pZDsKPiArCWVudW0gc2Vuc29ycyB0eXBl
Owo+ICsJdTMyIGNvdW50ID0gMDsKPiArCWludCBlcnIgPSAwOwo+ICsKPiArCW9wYWwgPSBvZl9m
aW5kX25vZGVfYnlfcGF0aCgiL2libSxvcGFsL3NlbnNvcnMiKTsKPiArCXNkYXRhID0gZGV2bV9r
emFsbG9jKCZwZGV2LT5kZXYsIHBkYXRhLT5zZW5zb3JzX2NvdW50ICogc2l6ZW9mKCpzZGF0YSks
Cj4gKwkJCSAgICAgR0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIXNkYXRhKSB7Cj4gKwkJZXJyID0gLUVO
T01FTTsKPiArCQlnb3RvIGV4aXRfcHV0X25vZGU7Cj4gKwl9Cj4gKwo+ICsJZm9yX2VhY2hfY2hp
bGRfb2Zfbm9kZShvcGFsLCBucCkgewo+ICsJCWlmIChucC0+bmFtZSA9PSBOVUxMKQo+ICsJCQlj
b250aW51ZTsKPiArCj4gKwkJZm9yICh0eXBlID0gMDsgdHlwZSA8IE1BWF9TRU5TT1JfVFlQRTsg
dHlwZSsrKQo+ICsJCQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsCj4gKwkJCQkJc2Vu
c29yX2dyb3Vwc1t0eXBlXS5jb21wYXRpYmxlKSkKPiArCQkJCWJyZWFrOwo+ICsKPiArCQlpZiAo
dHlwZSA9PSBNQVhfU0VOU09SX1RZUEUpCj4gKwkJCWNvbnRpbnVlOwo+ICsKPiArCQlzZW5zb3Jf
aWQgPSBvZl9nZXRfcHJvcGVydHkobnAsICJzZW5zb3ItaWQiLCBOVUxMKTsKPiArCQlpZiAoIXNl
bnNvcl9pZCkgewo+ICsJCQlkZXZfaW5mbygmcGRldi0+ZGV2LAo+ICsJCQkJICInc2Vuc29yLWlk
JyBtaXNzaW5nIGluIHRoZSBub2RlICclcydcbiIsCj4gKwkJCQkgbnAtPm5hbWUpOwo+ICsJCQlj
b250aW51ZTsKPiArCQl9Cj4gKwo+ICsJCXNkYXRhW2NvdW50XS5pZCA9IGJlMzJfdG9fY3B1cChz
ZW5zb3JfaWQpOwo+ICsJCXNkYXRhW2NvdW50XS50eXBlID0gdHlwZTsKPiArCQllcnIgPSBjcmVh
dGVfaHdtb25fYXR0cl9uYW1lKCZwZGV2LT5kZXYsIHR5cGUsIG5wLT5uYW1lLAo+ICsJCQkJCSAg
ICAgc2RhdGFbY291bnRdLm5hbWUpOwo+ICsJCWlmIChlcnIpCj4gKwkJCWdvdG8gZXhpdF9wdXRf
bm9kZTsKPiArCj4gKwkJc3lzZnNfYXR0cl9pbml0KCZzZGF0YVtjb3VudF0uZGV2X2F0dHIuYXR0
cik7Cj4gKwkJc2RhdGFbY291bnRdLmRldl9hdHRyLmF0dHIubmFtZSA9IHNkYXRhW2NvdW50XS5u
YW1lOwo+ICsJCXNkYXRhW2NvdW50XS5kZXZfYXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPOwo+ICsJ
CXNkYXRhW2NvdW50XS5kZXZfYXR0ci5zaG93ID0gc2hvd19zZW5zb3I7Cj4gKwo+ICsJCXBncm91
cHNbdHlwZV0tPmF0dHJzW3NlbnNvcl9ncm91cHNbdHlwZV0uYXR0cl9jb3VudCsrXSA9Cj4gKwkJ
CQkmc2RhdGFbY291bnQrK10uZGV2X2F0dHIuYXR0cjsKPiArCX0KPiArCj4gK2V4aXRfcHV0X25v
ZGU6Cj4gKwlvZl9ub2RlX3B1dChvcGFsKTsKPiArCXJldHVybiBlcnI7Cj4gK30KPiArCj4gK3N0
YXRpYyBpbnQgX19pbml0IGlibXBvd2VybnZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAq
cGRldikKPiArewo+ICsJc3RydWN0IHBsYXRmb3JtX2RhdGEgKnBkYXRhOwo+ICsJc3RydWN0IGRl
dmljZSAqaHdtb25fZGV2Owo+ICsJaW50IGVycjsKPiArCj4gKwlwZGF0YSA9IGRldm1fa3phbGxv
YygmcGRldi0+ZGV2LCBzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIXBkYXRh
KQo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICsKPiArCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYs
IHBkYXRhKTsKPiArCXBkYXRhLT5zZW5zb3JzX2NvdW50ID0gMDsKPiArCWVyciA9IHBvcHVsYXRl
X2F0dHJfZ3JvdXBzKHBkZXYpOwo+ICsJaWYgKGVycikKPiArCQlyZXR1cm4gZXJyOwo+ICsKPiAr
CS8qIENyZWF0ZSBzeXNmcyBhdHRyaWJ1dGUgZGF0YSBmb3IgZWFjaCBzZW5zb3IgZm91bmQgaW4g
dGhlIERUICovCj4gKwllcnIgPSBjcmVhdGVfZGV2aWNlX2F0dHJzKHBkZXYpOwo+ICsJaWYgKGVy
cikKPiArCQlyZXR1cm4gZXJyOwo+ICsKPiArCS8qIEZpbmFsbHksIHJlZ2lzdGVyIHdpdGggaHdt
b24gKi8KPiArCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3Jv
dXBzKCZwZGV2LT5kZXYsIERSVk5BTUUsCj4gKwkJCQkJCQkgICBwZGF0YSwKPiArCQkJCQkJCSAg
IHBkYXRhLT5hdHRyX2dyb3Vwcyk7Cj4gKwo+ICsJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhod21v
bl9kZXYpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBpYm1wb3dl
cm52X2RyaXZlciA9IHsKPiArCS5kcml2ZXIgPSB7Cj4gKwkJLm93bmVyID0gVEhJU19NT0RVTEUs
Cj4gKwkJLm5hbWUgPSBEUlZOQU1FLAo+ICsJfSwKPiArfTsKPiArCj4gK3N0YXRpYyBpbnQgX19p
bml0IGlibXBvd2VybnZfaW5pdCh2b2lkKQo+ICt7Cj4gKwlpbnQgZXJyOwo+ICsKPiArCXBkZXZp
Y2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoRFJWTkFNRSwgMCk7Cj4gKwlpZiAoIXBkZXZpY2Up
IHsKPiArCQlwcl9lcnIoIkRldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7Cj4gKwkJZXJyID0g
LUVOT01FTTsKPiArCQlnb3RvIGV4aXQ7Cj4gKwl9Cj4gKwo+ICsJZXJyID0gcGxhdGZvcm1fZGV2
aWNlX2FkZChwZGV2aWNlKTsKPiArCWlmIChlcnIpIHsKPiArCQlwcl9lcnIoIkRldmljZSBhZGRp
dGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKPiArCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKPiAr
CX0KPiArCj4gKwllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmlibXBvd2VybnZfZHJpdmVy
LCBpYm1wb3dlcm52X3Byb2JlKTsKPiArCWlmIChlcnIpIHsKPiArCQlwcl9lcnIoIlBsYXRmcm9t
IGRyaXZlciBwcm9iZSBmYWlsZWRcbiIpOwo+ICsJCWdvdG8gZXhpdF9kZXZpY2VfZGVsOwo+ICsJ
fQo+ICsKPiArCXJldHVybiAwOwo+ICsKPiArZXhpdF9kZXZpY2VfZGVsOgo+ICsJcGxhdGZvcm1f
ZGV2aWNlX2RlbChwZGV2aWNlKTsKPiArZXhpdF9kZXZpY2VfcHV0Ogo+ICsJcGxhdGZvcm1fZGV2
aWNlX3B1dChwZGV2aWNlKTsKPiArZXhpdDoKPiArCXJldHVybiBlcnI7Cj4gK30KPiArCj4gK3N0
YXRpYyB2b2lkIF9fZXhpdCBpYm1wb3dlcm52X2V4aXQodm9pZCkKPiArewo+ICsJcGxhdGZvcm1f
ZHJpdmVyX3VucmVnaXN0ZXIoJmlibXBvd2VybnZfZHJpdmVyKTsKPiArCXBsYXRmb3JtX2Rldmlj
ZV91bnJlZ2lzdGVyKHBkZXZpY2UpOwo+ICt9Cj4gKwo+ICtNT0RVTEVfQVVUSE9SKCJOZWVsZXNo
IEd1cHRhIDxuZWVsZWd1cEBsaW51eC52bmV0LmlibS5jb20+Iik7Cj4gK01PRFVMRV9ERVNDUklQ
VElPTigiSUJNIFBPV0VSTlYgcGxhdGZvcm0gc2Vuc29ycyIpOwo+ICtNT0RVTEVfTElDRU5TRSgi
R1BMIik7Cj4gKwo+ICttb2R1bGVfaW5pdChpYm1wb3dlcm52X2luaXQpOwo+ICttb2R1bGVfZXhp
dChpYm1wb3dlcm52X2V4aXQpOwo+Cj4KPgoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fCmxtLXNlbnNvcnMgbWFpbGluZyBsaXN0CmxtLXNlbnNvcnNAbG0t
c2Vuc29ycy5vcmcKaHR0cDovL2xpc3RzLmxtLXNlbnNvcnMub3JnL21haWxtYW4vbGlzdGluZm8v
bG0tc2Vuc29ycw=
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4] powerpc/powernv: hwmon driver for power, fan rpm, voltage and temperature
@ 2014-07-05 2:25 ` Guenter Roeck
0 siblings, 0 replies; 11+ messages in thread
From: Guenter Roeck @ 2014-07-05 2:25 UTC (permalink / raw)
To: Neelesh Gupta, linuxppc-dev, jdelvare, lm-sensors
Cc: sbhat, devicetree@vger.kernel.org
On 07/04/2014 04:02 AM, Neelesh Gupta wrote:
> This patch adds basic kernel support for reading power values, fan
> speed rpm, voltage and temperature data on powernv platforms which will
> be exported to user space through sysfs interface.
>
Hi Neelesh,
Copying devicetree mailing list. Please copy it on the next (hopefully final)
revision; devicetree maintainers at least need a chance to comment.
[ Yes, I understand this is a shipping product, but still ... ]
I am ok with the code except for a couple of minor nitpicks (see below).
Thanks,
Guenter
> Test results:
> -------------
> [root@tul163p1 ~]# sensors
> ibmpowernv-isa-0000
> Adapter: ISA adapter
> fan1: 5567 RPM (min = 0 RPM)
> fan2: 5232 RPM (min = 0 RPM)
> fan3: 5532 RPM (min = 0 RPM)
> fan4: 4945 RPM (min = 0 RPM)
> fan5: 0 RPM (min = 0 RPM)
> fan6: 0 RPM (min = 0 RPM)
> fan7: 7392 RPM (min = 0 RPM)
> fan8: 7936 RPM (min = 0 RPM)
> temp1: +39.0°C (high = +0.0°C)
> power1: 191.00 W
>
> [root@tul163p1 ~]# ls /sys/devices/platform/
> alarmtimer ibmpowernv.0 power rtc-generic serial8250 uevent
> [root@tul163p1 ~]# ls /sys/devices/platform/ibmpowernv.0/hwmon/hwmon0/
> device fan2_min fan4_min fan6_min fan8_min power
> fan1_fault fan3_fault fan5_fault fan7_fault in1_fault power1_input
> fan1_input fan3_input fan5_input fan7_input in2_fault subsystem
> fan1_min fan3_min fan5_min fan7_min in3_fault temp1_input
> fan2_fault fan4_fault fan6_fault fan8_fault in4_fault temp1_max
> fan2_input fan4_input fan6_input fan8_input name uevent
> [root@tul163p1 ~]#
> [root@tul163p1 ~]# ls /sys/class/hwmon/hwmon0/
> device fan2_min fan4_min fan6_min fan8_min power
> fan1_fault fan3_fault fan5_fault fan7_fault in1_fault power1_input
> fan1_input fan3_input fan5_input fan7_input in2_fault subsystem
> fan1_min fan3_min fan5_min fan7_min in3_fault temp1_input
> fan2_fault fan4_fault fan6_fault fan8_fault in4_fault temp1_max
> fan2_input fan4_input fan6_input fan8_input name uevent
> [root@tul163p1 ~]#
>
> Signed-off-by: Neelesh Gupta <neelegup@linux.vnet.ibm.com>
> ---
>
> Changes in v4
> =============
> - Replaced pr_err() with dev_err() for loggin print messages.
> - Using kstrtou32() function for converting string to u32 instead of sscanf().
>
> Changes in v3
> =============
> - Fixed an endianness bug leading the driver to break on LE.
> - Fixed a bug that when one of the 'attribute_group' not populated, following
> groups attributes were dropped.
> - Rewrite the get_sensor_index_attr() function to handle all the error scenarios
> like 'sscanf' etc.
> - Fixed all the errors/warnings related to coding style/whitespace.
> - Added 'Documentation' files.
> - Addressed remaining review comments on V2.
>
> Changes in v2
> =============
> - Generic use of devm_* functions in hwmon like using devm_kzalloc() for dynamic
> memory request, avoiding the need to explicit free of memory.
> Adding 'struct attribute_group' as member of platform data structure to be
> populated and then passed to devm_hwmon_device_register_with_groups().
>
> Note: Having an array of pointers of 'attribute_group' and each group
> corresponds to 'enum sensors' type. Not completely sure, if it's ideal or
> could have just one group populated with attributes of sensor types?
>
> - 'ibmpowernv' is not hot-pluggable device so moving 'platform_driver' callback
> function (probe) as part of __init code.
> - Fixed issues related to coding style.
> - Other general comments in v1.
>
> .../devicetree/bindings/hwmon/ibmpowernv.txt | 27 +
> Documentation/hwmon/ibmpowernv | 41 ++
> drivers/hwmon/Kconfig | 11 +
> drivers/hwmon/Makefile | 1
> drivers/hwmon/ibmpowernv.c | 362 ++++++++++++++++++++
> 5 files changed, 442 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/hwmon/ibmpowernv.txt
> create mode 100644 Documentation/hwmon/ibmpowernv
> create mode 100644 drivers/hwmon/ibmpowernv.c
>
> diff --git a/Documentation/devicetree/bindings/hwmon/ibmpowernv.txt b/Documentation/devicetree/bindings/hwmon/ibmpowernv.txt
> new file mode 100644
> index 0000000..e3bd1eb
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/hwmon/ibmpowernv.txt
> @@ -0,0 +1,27 @@
> +IBM POWERNV platform sensors
> +----------------------------
> +
> +Required node properties:
> +- compatible: must be one of
> + "ibm,opal-sensor-cooling-fan"
> + "ibm,opal-sensor-amb-temp"
> + "ibm,opal-sensor-power-supply"
> + "ibm,opal-sensor-power"
> +- sensor-id: an opaque id provided by the firmware to the kernel, identifies a
> + given sensor and its attribute data
> +
> +Example sensors node:
> +
> +cooling-fan#8-data {
> + sensor-id = <0x7052107>;
> + phandle = <0x10000028>;
> + linux,phandle = <0x10000028>;
> + compatible = "ibm,opal-sensor-cooling-fan";
phandle and linux-phandle are neither documented nor used. Either document or drop.
> +};
> +
> +amb-temp#1-thrs {
> + sensor-id = <0x5096000>;
> + phandle = <0x10000017>;
> + linux,phandle = <0x10000017>;
> + compatible = "ibm,opal-sensor-amb-temp";
> +};
> diff --git a/Documentation/hwmon/ibmpowernv b/Documentation/hwmon/ibmpowernv
> new file mode 100644
> index 0000000..644245a
> --- /dev/null
> +++ b/Documentation/hwmon/ibmpowernv
> @@ -0,0 +1,41 @@
> +Kernel Driver IBMPOWENV
> +=======================
> +
> +Supported systems:
> + * Any recent IBM P servers based on POWERNV platform
> +
> +Author: Neelesh Gupta
> +
> +Description
> +-----------
> +
> +This driver implements reading the platform sensors data like temperature/fan/
> +voltage/power for 'POWERNV' platform.
> +
> +The driver uses the platform device infrastructure. It probes the device tree
> +for sensor devices during the __init phase and registers them with the 'hwmon'.
> +'hwmon' populates the 'sysfs' tree having attribute files, each for a given
> +sensor type and its attribute data.
> +
> +All the nodes in the DT appear under "/ibm,opal/sensors" and each valid node in
> +the DT maps to an attribute file in 'sysfs'. The node exports unique 'sensor-id'
> +which the driver uses to make an OPAL call to the firmware.
> +
> +Usage notes
> +-----------
> +The driver is built statically with the kernel by enabling the config
> +CONFIG_SENSORS_IBMPOWERNV. It can also be built as module 'ibmpowernv'.
> +
> +Sysfs attributes
> +----------------
> +
> +fanX_input Measured RPM value.
> +fanX_min Threshold RPM for alert generation.
> +fanX_fault 0: No fail condition
> + 1: Failing fan
> +tempX_input Measured ambient temperature.
> +tempX_max Threshold ambient temperature for alert generation.
> +inX_input Measured power supply voltage
> +inX_fault 0: No fail condition.
> + 1: Failing power supply.
> +power1_input System power consumption (microWatt)
> diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
> index 02d3d85..29c3fcb 100644
> --- a/drivers/hwmon/Kconfig
> +++ b/drivers/hwmon/Kconfig
> @@ -554,6 +554,17 @@ config SENSORS_IBMPEX
> This driver can also be built as a module. If so, the module
> will be called ibmpex.
>
> +config SENSORS_IBMPOWERNV
> + tristate "IBM POWERNV platform sensors"
> + depends on PPC_POWERNV
> + default y
> + help
> + If you say yes here you get support for the temperature/fan/power
> + sensors on your PowerNV platform.
> +
> + This driver can also be built as a module. If so, the module
> + will be called ibmpowernv.
> +
> config SENSORS_IIO_HWMON
> tristate "Hwmon driver that uses channels specified via iio maps"
> depends on IIO
> diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
> index 3dc0f02..fc4ed26 100644
> --- a/drivers/hwmon/Makefile
> +++ b/drivers/hwmon/Makefile
> @@ -71,6 +71,7 @@ obj-$(CONFIG_SENSORS_ULTRA45) += ultra45_env.o
> obj-$(CONFIG_SENSORS_I5K_AMB) += i5k_amb.o
> obj-$(CONFIG_SENSORS_IBMAEM) += ibmaem.o
> obj-$(CONFIG_SENSORS_IBMPEX) += ibmpex.o
> +obj-$(CONFIG_SENSORS_IBMPOWERNV)+= ibmpowernv.o
> obj-$(CONFIG_SENSORS_IIO_HWMON) += iio_hwmon.o
> obj-$(CONFIG_SENSORS_INA209) += ina209.o
> obj-$(CONFIG_SENSORS_INA2XX) += ina2xx.o
> diff --git a/drivers/hwmon/ibmpowernv.c b/drivers/hwmon/ibmpowernv.c
> new file mode 100644
> index 0000000..44dcd99
> --- /dev/null
> +++ b/drivers/hwmon/ibmpowernv.c
> @@ -0,0 +1,362 @@
> +/*
> + * IBM PowerNV platform sensors for temperature/fan/voltage/power
> + * Copyright (C) 2014 IBM
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program.
> + */
> +
> +#define DRVNAME "ibmpowernv"
> +#define pr_fmt(fmt) DRVNAME ": " fmt
> +
> +#include <linux/init.h>
> +#include <linux/module.h>
> +#include <linux/kernel.h>
> +#include <linux/hwmon.h>
> +#include <linux/hwmon-sysfs.h>
> +#include <linux/of.h>
> +#include <linux/slab.h>
> +
> +#include <linux/platform_device.h>
> +#include <asm/opal.h>
> +#include <linux/err.h>
> +
> +#define MAX_ATTR_LEN 32
> +
> +/* Sensor suffix name from DT */
> +#define DT_FAULT_ATTR_SUFFIX "faulted"
> +#define DT_DATA_ATTR_SUFFIX "data"
> +#define DT_THRESHOLD_ATTR_SUFFIX "thrs"
> +
> +/*
> + * Enumerates all the types of sensors in the POWERNV platform and does index
> + * into 'struct sensor_group'
> + */
> +enum sensors {
> + FAN,
> + AMBIENT_TEMP,
> + POWER_SUPPLY,
> + POWER_INPUT,
> + MAX_SENSOR_TYPE,
> +};
> +
> +static struct sensor_group {
> + const char *name;
> + const char *compatible;
> + struct attribute_group group;
> + u32 attr_count;
> +} sensor_groups[] = {
> + {"fan", "ibm,opal-sensor-cooling-fan"},
> + {"temp", "ibm,opal-sensor-amb-temp"},
> + {"in", "ibm,opal-sensor-power-supply"},
> + {"power", "ibm,opal-sensor-power"}
> +};
> +
> +struct sensor_data {
> + u32 id; /* An opaque id of the firmware for each sensor */
> + enum sensors type;
> + char name[MAX_ATTR_LEN];
> + struct device_attribute dev_attr;
> +};
> +
> +struct platform_data {
> + const struct attribute_group *attr_groups[MAX_SENSOR_TYPE + 1];
> + u32 sensors_count; /* Total count of sensors from each group */
> +};
> +
> +/* Platform device representing all the ibmpowernv sensors */
> +static struct platform_device *pdevice;
> +
> +static ssize_t show_sensor(struct device *dev, struct device_attribute *devattr,
> + char *buf)
> +{
> + struct sensor_data *sdata = container_of(devattr, struct sensor_data,
> + dev_attr);
> + ssize_t ret;
> + u32 x;
> +
> + ret = opal_get_sensor_data(sdata->id, &x);
> + if (ret)
> + return ret;
> +
> + /* Convert temperature to milli-degrees */
> + if (sdata->type == AMBIENT_TEMP)
> + x *= 1000;
> + /* Convert power to micro-watts */
> + else if (sdata->type == POWER_INPUT)
> + x *= 1000000;
> +
> + return sprintf(buf, "%u\n", x);
> +}
> +
> +static int __init get_sensor_index_attr(const char *name, u32 *index,
> + char *attr)
> +{
> + char *hash_pos = strchr(name, '#');
> + char buf[8] = { 0 };
> + char *dash_pos;
> + u32 copy_len;
> +
> + if (!hash_pos)
> + return -EINVAL;
> +
> + dash_pos = strchr(hash_pos, '-');
> + if (!dash_pos)
> + return -EINVAL;
> +
> + copy_len = dash_pos - hash_pos - 1;
> + if (copy_len >= sizeof(buf))
> + return -EINVAL;
> +
> + strncpy(buf, hash_pos + 1, copy_len);
> +
> + if (kstrtou32(buf, 10, index))
> + return -EINVAL;
> +
smatch isn't going to like that. Please use
int err;
...
err = kstrtou32(buf, 10, index));
if (err)
return err;
> + strncpy(attr, dash_pos + 1, MAX_ATTR_LEN);
> +
> + return 0;
> +}
> +
> +/*
> + * This function translates the DT node name into the 'hwmon' attribute name.
> + * IBMPOWERNV device node appear like cooling-fan#2-data, amb-temp#1-thrs etc.
> + * which need to be mapped as fan2_input, temp1_max respectively before
> + * populating them inside hwmon device class.
> + */
> +static int __init create_hwmon_attr_name(struct device *dev, enum sensors type,
> + const char *node_name,
> + char *hwmon_attr_name)
> +{
> + char attr_suffix[MAX_ATTR_LEN];
> + char *attr_name;
> + u32 index;
> + int err;
> +
> + err = get_sensor_index_attr(node_name, &index, attr_suffix);
> + if (err) {
> + dev_err(dev, "Sensor device node name '%s' is invalid\n",
> + node_name);
> + return err;
> + }
> +
> + if (!strcmp(attr_suffix, DT_FAULT_ATTR_SUFFIX)) {
> + attr_name = "fault";
> + } else if (!strcmp(attr_suffix, DT_DATA_ATTR_SUFFIX)) {
> + attr_name = "input";
> + } else if (!strcmp(attr_suffix, DT_THRESHOLD_ATTR_SUFFIX)) {
> + if (type == AMBIENT_TEMP)
> + attr_name = "max";
> + else if (type == FAN)
> + attr_name = "min";
> + else
> + return -ENOENT;
> + } else {
> + return -ENOENT;
> + }
> +
> + snprintf(hwmon_attr_name, MAX_ATTR_LEN, "%s%d_%s",
> + sensor_groups[type].name, index, attr_name);
> + return 0;
> +}
> +
> +static int __init populate_attr_groups(struct platform_device *pdev)
> +{
> + struct platform_data *pdata = platform_get_drvdata(pdev);
> + const struct attribute_group **pgroups = pdata->attr_groups;
> + struct device_node *opal, *np;
> + enum sensors type;
> +
> + opal = of_find_node_by_path("/ibm,opal/sensors");
> + if (!opal) {
> + dev_err(&pdev->dev, "Opal node 'sensors' not found\n");
> + return -ENODEV;
> + }
> +
> + for_each_child_of_node(opal, np) {
> + if (np->name == NULL)
> + continue;
> +
> + for (type = 0; type < MAX_SENSOR_TYPE; type++)
> + if (of_device_is_compatible(np,
> + sensor_groups[type].compatible)) {
> + sensor_groups[type].attr_count++;
> + break;
> + }
> + }
> +
> + of_node_put(opal);
> +
> + for (type = 0; type < MAX_SENSOR_TYPE; type++) {
> + sensor_groups[type].group.attrs = devm_kzalloc(&pdev->dev,
> + sizeof(struct attribute *) *
> + (sensor_groups[type].attr_count + 1),
> + GFP_KERNEL);
> + if (!sensor_groups[type].group.attrs)
> + return -ENOMEM;
> +
> + pgroups[type] = &sensor_groups[type].group;
> + pdata->sensors_count += sensor_groups[type].attr_count;
> + sensor_groups[type].attr_count = 0;
> + }
> +
> + return 0;
> +}
> +
> +/*
> + * Iterate through the device tree for each child of 'sensors' node, create
> + * a sysfs attribute file, the file is named by translating the DT node name
> + * to the name required by the higher 'hwmon' driver like fan1_input, temp1_max
> + * etc..
> + */
> +static int __init create_device_attrs(struct platform_device *pdev)
> +{
> + struct platform_data *pdata = platform_get_drvdata(pdev);
> + const struct attribute_group **pgroups = pdata->attr_groups;
> + struct device_node *opal, *np;
> + struct sensor_data *sdata;
> + const __be32 *sensor_id;
> + enum sensors type;
> + u32 count = 0;
> + int err = 0;
> +
> + opal = of_find_node_by_path("/ibm,opal/sensors");
> + sdata = devm_kzalloc(&pdev->dev, pdata->sensors_count * sizeof(*sdata),
> + GFP_KERNEL);
> + if (!sdata) {
> + err = -ENOMEM;
> + goto exit_put_node;
> + }
> +
> + for_each_child_of_node(opal, np) {
> + if (np->name == NULL)
> + continue;
> +
> + for (type = 0; type < MAX_SENSOR_TYPE; type++)
> + if (of_device_is_compatible(np,
> + sensor_groups[type].compatible))
> + break;
> +
> + if (type == MAX_SENSOR_TYPE)
> + continue;
> +
> + sensor_id = of_get_property(np, "sensor-id", NULL);
> + if (!sensor_id) {
> + dev_info(&pdev->dev,
> + "'sensor-id' missing in the node '%s'\n",
> + np->name);
> + continue;
> + }
> +
> + sdata[count].id = be32_to_cpup(sensor_id);
> + sdata[count].type = type;
> + err = create_hwmon_attr_name(&pdev->dev, type, np->name,
> + sdata[count].name);
> + if (err)
> + goto exit_put_node;
> +
> + sysfs_attr_init(&sdata[count].dev_attr.attr);
> + sdata[count].dev_attr.attr.name = sdata[count].name;
> + sdata[count].dev_attr.attr.mode = S_IRUGO;
> + sdata[count].dev_attr.show = show_sensor;
> +
> + pgroups[type]->attrs[sensor_groups[type].attr_count++] =
> + &sdata[count++].dev_attr.attr;
> + }
> +
> +exit_put_node:
> + of_node_put(opal);
> + return err;
> +}
> +
> +static int __init ibmpowernv_probe(struct platform_device *pdev)
> +{
> + struct platform_data *pdata;
> + struct device *hwmon_dev;
> + int err;
> +
> + pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
> + if (!pdata)
> + return -ENOMEM;
> +
> + platform_set_drvdata(pdev, pdata);
> + pdata->sensors_count = 0;
> + err = populate_attr_groups(pdev);
> + if (err)
> + return err;
> +
> + /* Create sysfs attribute data for each sensor found in the DT */
> + err = create_device_attrs(pdev);
> + if (err)
> + return err;
> +
> + /* Finally, register with hwmon */
> + hwmon_dev = devm_hwmon_device_register_with_groups(&pdev->dev, DRVNAME,
> + pdata,
> + pdata->attr_groups);
> +
> + return PTR_ERR_OR_ZERO(hwmon_dev);
> +}
> +
> +static struct platform_driver ibmpowernv_driver = {
> + .driver = {
> + .owner = THIS_MODULE,
> + .name = DRVNAME,
> + },
> +};
> +
> +static int __init ibmpowernv_init(void)
> +{
> + int err;
> +
> + pdevice = platform_device_alloc(DRVNAME, 0);
> + if (!pdevice) {
> + pr_err("Device allocation failed\n");
> + err = -ENOMEM;
> + goto exit;
> + }
> +
> + err = platform_device_add(pdevice);
> + if (err) {
> + pr_err("Device addition failed (%d)\n", err);
> + goto exit_device_put;
> + }
> +
> + err = platform_driver_probe(&ibmpowernv_driver, ibmpowernv_probe);
> + if (err) {
> + pr_err("Platfrom driver probe failed\n");
> + goto exit_device_del;
> + }
> +
> + return 0;
> +
> +exit_device_del:
> + platform_device_del(pdevice);
> +exit_device_put:
> + platform_device_put(pdevice);
> +exit:
> + return err;
> +}
> +
> +static void __exit ibmpowernv_exit(void)
> +{
> + platform_driver_unregister(&ibmpowernv_driver);
> + platform_device_unregister(pdevice);
> +}
> +
> +MODULE_AUTHOR("Neelesh Gupta <neelegup@linux.vnet.ibm.com>");
> +MODULE_DESCRIPTION("IBM POWERNV platform sensors");
> +MODULE_LICENSE("GPL");
> +
> +module_init(ibmpowernv_init);
> +module_exit(ibmpowernv_exit);
>
>
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4] powerpc/powernv: hwmon driver for power, fan rpm, voltage and temperature
@ 2014-07-05 2:25 ` Guenter Roeck
0 siblings, 0 replies; 11+ messages in thread
From: Guenter Roeck @ 2014-07-05 2:25 UTC (permalink / raw)
To: Neelesh Gupta, linuxppc-dev-uLR06cmDAlY/bJ5BZ2RsiQ,
jdelvare-l3A5Bk7waGM, lm-sensors-GZX6beZjE8VD60Wz+7aTrA
Cc: benh-XVmvHMARGAS8U2dJNN8I7kB+6BGkLq7r,
svaidy-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8,
sbhat-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8,
devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
On 07/04/2014 04:02 AM, Neelesh Gupta wrote:
> This patch adds basic kernel support for reading power values, fan
> speed rpm, voltage and temperature data on powernv platforms which will
> be exported to user space through sysfs interface.
>
Hi Neelesh,
Copying devicetree mailing list. Please copy it on the next (hopefully final)
revision; devicetree maintainers at least need a chance to comment.
[ Yes, I understand this is a shipping product, but still ... ]
I am ok with the code except for a couple of minor nitpicks (see below).
Thanks,
Guenter
> Test results:
> -------------
> [root@tul163p1 ~]# sensors
> ibmpowernv-isa-0000
> Adapter: ISA adapter
> fan1: 5567 RPM (min = 0 RPM)
> fan2: 5232 RPM (min = 0 RPM)
> fan3: 5532 RPM (min = 0 RPM)
> fan4: 4945 RPM (min = 0 RPM)
> fan5: 0 RPM (min = 0 RPM)
> fan6: 0 RPM (min = 0 RPM)
> fan7: 7392 RPM (min = 0 RPM)
> fan8: 7936 RPM (min = 0 RPM)
> temp1: +39.0°C (high = +0.0°C)
> power1: 191.00 W
>
> [root@tul163p1 ~]# ls /sys/devices/platform/
> alarmtimer ibmpowernv.0 power rtc-generic serial8250 uevent
> [root@tul163p1 ~]# ls /sys/devices/platform/ibmpowernv.0/hwmon/hwmon0/
> device fan2_min fan4_min fan6_min fan8_min power
> fan1_fault fan3_fault fan5_fault fan7_fault in1_fault power1_input
> fan1_input fan3_input fan5_input fan7_input in2_fault subsystem
> fan1_min fan3_min fan5_min fan7_min in3_fault temp1_input
> fan2_fault fan4_fault fan6_fault fan8_fault in4_fault temp1_max
> fan2_input fan4_input fan6_input fan8_input name uevent
> [root@tul163p1 ~]#
> [root@tul163p1 ~]# ls /sys/class/hwmon/hwmon0/
> device fan2_min fan4_min fan6_min fan8_min power
> fan1_fault fan3_fault fan5_fault fan7_fault in1_fault power1_input
> fan1_input fan3_input fan5_input fan7_input in2_fault subsystem
> fan1_min fan3_min fan5_min fan7_min in3_fault temp1_input
> fan2_fault fan4_fault fan6_fault fan8_fault in4_fault temp1_max
> fan2_input fan4_input fan6_input fan8_input name uevent
> [root@tul163p1 ~]#
>
> Signed-off-by: Neelesh Gupta <neelegup-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
> ---
>
> Changes in v4
> =============
> - Replaced pr_err() with dev_err() for loggin print messages.
> - Using kstrtou32() function for converting string to u32 instead of sscanf().
>
> Changes in v3
> =============
> - Fixed an endianness bug leading the driver to break on LE.
> - Fixed a bug that when one of the 'attribute_group' not populated, following
> groups attributes were dropped.
> - Rewrite the get_sensor_index_attr() function to handle all the error scenarios
> like 'sscanf' etc.
> - Fixed all the errors/warnings related to coding style/whitespace.
> - Added 'Documentation' files.
> - Addressed remaining review comments on V2.
>
> Changes in v2
> =============
> - Generic use of devm_* functions in hwmon like using devm_kzalloc() for dynamic
> memory request, avoiding the need to explicit free of memory.
> Adding 'struct attribute_group' as member of platform data structure to be
> populated and then passed to devm_hwmon_device_register_with_groups().
>
> Note: Having an array of pointers of 'attribute_group' and each group
> corresponds to 'enum sensors' type. Not completely sure, if it's ideal or
> could have just one group populated with attributes of sensor types?
>
> - 'ibmpowernv' is not hot-pluggable device so moving 'platform_driver' callback
> function (probe) as part of __init code.
> - Fixed issues related to coding style.
> - Other general comments in v1.
>
> .../devicetree/bindings/hwmon/ibmpowernv.txt | 27 +
> Documentation/hwmon/ibmpowernv | 41 ++
> drivers/hwmon/Kconfig | 11 +
> drivers/hwmon/Makefile | 1
> drivers/hwmon/ibmpowernv.c | 362 ++++++++++++++++++++
> 5 files changed, 442 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/hwmon/ibmpowernv.txt
> create mode 100644 Documentation/hwmon/ibmpowernv
> create mode 100644 drivers/hwmon/ibmpowernv.c
>
> diff --git a/Documentation/devicetree/bindings/hwmon/ibmpowernv.txt b/Documentation/devicetree/bindings/hwmon/ibmpowernv.txt
> new file mode 100644
> index 0000000..e3bd1eb
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/hwmon/ibmpowernv.txt
> @@ -0,0 +1,27 @@
> +IBM POWERNV platform sensors
> +----------------------------
> +
> +Required node properties:
> +- compatible: must be one of
> + "ibm,opal-sensor-cooling-fan"
> + "ibm,opal-sensor-amb-temp"
> + "ibm,opal-sensor-power-supply"
> + "ibm,opal-sensor-power"
> +- sensor-id: an opaque id provided by the firmware to the kernel, identifies a
> + given sensor and its attribute data
> +
> +Example sensors node:
> +
> +cooling-fan#8-data {
> + sensor-id = <0x7052107>;
> + phandle = <0x10000028>;
> + linux,phandle = <0x10000028>;
> + compatible = "ibm,opal-sensor-cooling-fan";
phandle and linux-phandle are neither documented nor used. Either document or drop.
> +};
> +
> +amb-temp#1-thrs {
> + sensor-id = <0x5096000>;
> + phandle = <0x10000017>;
> + linux,phandle = <0x10000017>;
> + compatible = "ibm,opal-sensor-amb-temp";
> +};
> diff --git a/Documentation/hwmon/ibmpowernv b/Documentation/hwmon/ibmpowernv
> new file mode 100644
> index 0000000..644245a
> --- /dev/null
> +++ b/Documentation/hwmon/ibmpowernv
> @@ -0,0 +1,41 @@
> +Kernel Driver IBMPOWENV
> +=======================
> +
> +Supported systems:
> + * Any recent IBM P servers based on POWERNV platform
> +
> +Author: Neelesh Gupta
> +
> +Description
> +-----------
> +
> +This driver implements reading the platform sensors data like temperature/fan/
> +voltage/power for 'POWERNV' platform.
> +
> +The driver uses the platform device infrastructure. It probes the device tree
> +for sensor devices during the __init phase and registers them with the 'hwmon'.
> +'hwmon' populates the 'sysfs' tree having attribute files, each for a given
> +sensor type and its attribute data.
> +
> +All the nodes in the DT appear under "/ibm,opal/sensors" and each valid node in
> +the DT maps to an attribute file in 'sysfs'. The node exports unique 'sensor-id'
> +which the driver uses to make an OPAL call to the firmware.
> +
> +Usage notes
> +-----------
> +The driver is built statically with the kernel by enabling the config
> +CONFIG_SENSORS_IBMPOWERNV. It can also be built as module 'ibmpowernv'.
> +
> +Sysfs attributes
> +----------------
> +
> +fanX_input Measured RPM value.
> +fanX_min Threshold RPM for alert generation.
> +fanX_fault 0: No fail condition
> + 1: Failing fan
> +tempX_input Measured ambient temperature.
> +tempX_max Threshold ambient temperature for alert generation.
> +inX_input Measured power supply voltage
> +inX_fault 0: No fail condition.
> + 1: Failing power supply.
> +power1_input System power consumption (microWatt)
> diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
> index 02d3d85..29c3fcb 100644
> --- a/drivers/hwmon/Kconfig
> +++ b/drivers/hwmon/Kconfig
> @@ -554,6 +554,17 @@ config SENSORS_IBMPEX
> This driver can also be built as a module. If so, the module
> will be called ibmpex.
>
> +config SENSORS_IBMPOWERNV
> + tristate "IBM POWERNV platform sensors"
> + depends on PPC_POWERNV
> + default y
> + help
> + If you say yes here you get support for the temperature/fan/power
> + sensors on your PowerNV platform.
> +
> + This driver can also be built as a module. If so, the module
> + will be called ibmpowernv.
> +
> config SENSORS_IIO_HWMON
> tristate "Hwmon driver that uses channels specified via iio maps"
> depends on IIO
> diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
> index 3dc0f02..fc4ed26 100644
> --- a/drivers/hwmon/Makefile
> +++ b/drivers/hwmon/Makefile
> @@ -71,6 +71,7 @@ obj-$(CONFIG_SENSORS_ULTRA45) += ultra45_env.o
> obj-$(CONFIG_SENSORS_I5K_AMB) += i5k_amb.o
> obj-$(CONFIG_SENSORS_IBMAEM) += ibmaem.o
> obj-$(CONFIG_SENSORS_IBMPEX) += ibmpex.o
> +obj-$(CONFIG_SENSORS_IBMPOWERNV)+= ibmpowernv.o
> obj-$(CONFIG_SENSORS_IIO_HWMON) += iio_hwmon.o
> obj-$(CONFIG_SENSORS_INA209) += ina209.o
> obj-$(CONFIG_SENSORS_INA2XX) += ina2xx.o
> diff --git a/drivers/hwmon/ibmpowernv.c b/drivers/hwmon/ibmpowernv.c
> new file mode 100644
> index 0000000..44dcd99
> --- /dev/null
> +++ b/drivers/hwmon/ibmpowernv.c
> @@ -0,0 +1,362 @@
> +/*
> + * IBM PowerNV platform sensors for temperature/fan/voltage/power
> + * Copyright (C) 2014 IBM
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program.
> + */
> +
> +#define DRVNAME "ibmpowernv"
> +#define pr_fmt(fmt) DRVNAME ": " fmt
> +
> +#include <linux/init.h>
> +#include <linux/module.h>
> +#include <linux/kernel.h>
> +#include <linux/hwmon.h>
> +#include <linux/hwmon-sysfs.h>
> +#include <linux/of.h>
> +#include <linux/slab.h>
> +
> +#include <linux/platform_device.h>
> +#include <asm/opal.h>
> +#include <linux/err.h>
> +
> +#define MAX_ATTR_LEN 32
> +
> +/* Sensor suffix name from DT */
> +#define DT_FAULT_ATTR_SUFFIX "faulted"
> +#define DT_DATA_ATTR_SUFFIX "data"
> +#define DT_THRESHOLD_ATTR_SUFFIX "thrs"
> +
> +/*
> + * Enumerates all the types of sensors in the POWERNV platform and does index
> + * into 'struct sensor_group'
> + */
> +enum sensors {
> + FAN,
> + AMBIENT_TEMP,
> + POWER_SUPPLY,
> + POWER_INPUT,
> + MAX_SENSOR_TYPE,
> +};
> +
> +static struct sensor_group {
> + const char *name;
> + const char *compatible;
> + struct attribute_group group;
> + u32 attr_count;
> +} sensor_groups[] = {
> + {"fan", "ibm,opal-sensor-cooling-fan"},
> + {"temp", "ibm,opal-sensor-amb-temp"},
> + {"in", "ibm,opal-sensor-power-supply"},
> + {"power", "ibm,opal-sensor-power"}
> +};
> +
> +struct sensor_data {
> + u32 id; /* An opaque id of the firmware for each sensor */
> + enum sensors type;
> + char name[MAX_ATTR_LEN];
> + struct device_attribute dev_attr;
> +};
> +
> +struct platform_data {
> + const struct attribute_group *attr_groups[MAX_SENSOR_TYPE + 1];
> + u32 sensors_count; /* Total count of sensors from each group */
> +};
> +
> +/* Platform device representing all the ibmpowernv sensors */
> +static struct platform_device *pdevice;
> +
> +static ssize_t show_sensor(struct device *dev, struct device_attribute *devattr,
> + char *buf)
> +{
> + struct sensor_data *sdata = container_of(devattr, struct sensor_data,
> + dev_attr);
> + ssize_t ret;
> + u32 x;
> +
> + ret = opal_get_sensor_data(sdata->id, &x);
> + if (ret)
> + return ret;
> +
> + /* Convert temperature to milli-degrees */
> + if (sdata->type == AMBIENT_TEMP)
> + x *= 1000;
> + /* Convert power to micro-watts */
> + else if (sdata->type == POWER_INPUT)
> + x *= 1000000;
> +
> + return sprintf(buf, "%u\n", x);
> +}
> +
> +static int __init get_sensor_index_attr(const char *name, u32 *index,
> + char *attr)
> +{
> + char *hash_pos = strchr(name, '#');
> + char buf[8] = { 0 };
> + char *dash_pos;
> + u32 copy_len;
> +
> + if (!hash_pos)
> + return -EINVAL;
> +
> + dash_pos = strchr(hash_pos, '-');
> + if (!dash_pos)
> + return -EINVAL;
> +
> + copy_len = dash_pos - hash_pos - 1;
> + if (copy_len >= sizeof(buf))
> + return -EINVAL;
> +
> + strncpy(buf, hash_pos + 1, copy_len);
> +
> + if (kstrtou32(buf, 10, index))
> + return -EINVAL;
> +
smatch isn't going to like that. Please use
int err;
...
err = kstrtou32(buf, 10, index));
if (err)
return err;
> + strncpy(attr, dash_pos + 1, MAX_ATTR_LEN);
> +
> + return 0;
> +}
> +
> +/*
> + * This function translates the DT node name into the 'hwmon' attribute name.
> + * IBMPOWERNV device node appear like cooling-fan#2-data, amb-temp#1-thrs etc.
> + * which need to be mapped as fan2_input, temp1_max respectively before
> + * populating them inside hwmon device class.
> + */
> +static int __init create_hwmon_attr_name(struct device *dev, enum sensors type,
> + const char *node_name,
> + char *hwmon_attr_name)
> +{
> + char attr_suffix[MAX_ATTR_LEN];
> + char *attr_name;
> + u32 index;
> + int err;
> +
> + err = get_sensor_index_attr(node_name, &index, attr_suffix);
> + if (err) {
> + dev_err(dev, "Sensor device node name '%s' is invalid\n",
> + node_name);
> + return err;
> + }
> +
> + if (!strcmp(attr_suffix, DT_FAULT_ATTR_SUFFIX)) {
> + attr_name = "fault";
> + } else if (!strcmp(attr_suffix, DT_DATA_ATTR_SUFFIX)) {
> + attr_name = "input";
> + } else if (!strcmp(attr_suffix, DT_THRESHOLD_ATTR_SUFFIX)) {
> + if (type == AMBIENT_TEMP)
> + attr_name = "max";
> + else if (type == FAN)
> + attr_name = "min";
> + else
> + return -ENOENT;
> + } else {
> + return -ENOENT;
> + }
> +
> + snprintf(hwmon_attr_name, MAX_ATTR_LEN, "%s%d_%s",
> + sensor_groups[type].name, index, attr_name);
> + return 0;
> +}
> +
> +static int __init populate_attr_groups(struct platform_device *pdev)
> +{
> + struct platform_data *pdata = platform_get_drvdata(pdev);
> + const struct attribute_group **pgroups = pdata->attr_groups;
> + struct device_node *opal, *np;
> + enum sensors type;
> +
> + opal = of_find_node_by_path("/ibm,opal/sensors");
> + if (!opal) {
> + dev_err(&pdev->dev, "Opal node 'sensors' not found\n");
> + return -ENODEV;
> + }
> +
> + for_each_child_of_node(opal, np) {
> + if (np->name == NULL)
> + continue;
> +
> + for (type = 0; type < MAX_SENSOR_TYPE; type++)
> + if (of_device_is_compatible(np,
> + sensor_groups[type].compatible)) {
> + sensor_groups[type].attr_count++;
> + break;
> + }
> + }
> +
> + of_node_put(opal);
> +
> + for (type = 0; type < MAX_SENSOR_TYPE; type++) {
> + sensor_groups[type].group.attrs = devm_kzalloc(&pdev->dev,
> + sizeof(struct attribute *) *
> + (sensor_groups[type].attr_count + 1),
> + GFP_KERNEL);
> + if (!sensor_groups[type].group.attrs)
> + return -ENOMEM;
> +
> + pgroups[type] = &sensor_groups[type].group;
> + pdata->sensors_count += sensor_groups[type].attr_count;
> + sensor_groups[type].attr_count = 0;
> + }
> +
> + return 0;
> +}
> +
> +/*
> + * Iterate through the device tree for each child of 'sensors' node, create
> + * a sysfs attribute file, the file is named by translating the DT node name
> + * to the name required by the higher 'hwmon' driver like fan1_input, temp1_max
> + * etc..
> + */
> +static int __init create_device_attrs(struct platform_device *pdev)
> +{
> + struct platform_data *pdata = platform_get_drvdata(pdev);
> + const struct attribute_group **pgroups = pdata->attr_groups;
> + struct device_node *opal, *np;
> + struct sensor_data *sdata;
> + const __be32 *sensor_id;
> + enum sensors type;
> + u32 count = 0;
> + int err = 0;
> +
> + opal = of_find_node_by_path("/ibm,opal/sensors");
> + sdata = devm_kzalloc(&pdev->dev, pdata->sensors_count * sizeof(*sdata),
> + GFP_KERNEL);
> + if (!sdata) {
> + err = -ENOMEM;
> + goto exit_put_node;
> + }
> +
> + for_each_child_of_node(opal, np) {
> + if (np->name == NULL)
> + continue;
> +
> + for (type = 0; type < MAX_SENSOR_TYPE; type++)
> + if (of_device_is_compatible(np,
> + sensor_groups[type].compatible))
> + break;
> +
> + if (type == MAX_SENSOR_TYPE)
> + continue;
> +
> + sensor_id = of_get_property(np, "sensor-id", NULL);
> + if (!sensor_id) {
> + dev_info(&pdev->dev,
> + "'sensor-id' missing in the node '%s'\n",
> + np->name);
> + continue;
> + }
> +
> + sdata[count].id = be32_to_cpup(sensor_id);
> + sdata[count].type = type;
> + err = create_hwmon_attr_name(&pdev->dev, type, np->name,
> + sdata[count].name);
> + if (err)
> + goto exit_put_node;
> +
> + sysfs_attr_init(&sdata[count].dev_attr.attr);
> + sdata[count].dev_attr.attr.name = sdata[count].name;
> + sdata[count].dev_attr.attr.mode = S_IRUGO;
> + sdata[count].dev_attr.show = show_sensor;
> +
> + pgroups[type]->attrs[sensor_groups[type].attr_count++] =
> + &sdata[count++].dev_attr.attr;
> + }
> +
> +exit_put_node:
> + of_node_put(opal);
> + return err;
> +}
> +
> +static int __init ibmpowernv_probe(struct platform_device *pdev)
> +{
> + struct platform_data *pdata;
> + struct device *hwmon_dev;
> + int err;
> +
> + pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
> + if (!pdata)
> + return -ENOMEM;
> +
> + platform_set_drvdata(pdev, pdata);
> + pdata->sensors_count = 0;
> + err = populate_attr_groups(pdev);
> + if (err)
> + return err;
> +
> + /* Create sysfs attribute data for each sensor found in the DT */
> + err = create_device_attrs(pdev);
> + if (err)
> + return err;
> +
> + /* Finally, register with hwmon */
> + hwmon_dev = devm_hwmon_device_register_with_groups(&pdev->dev, DRVNAME,
> + pdata,
> + pdata->attr_groups);
> +
> + return PTR_ERR_OR_ZERO(hwmon_dev);
> +}
> +
> +static struct platform_driver ibmpowernv_driver = {
> + .driver = {
> + .owner = THIS_MODULE,
> + .name = DRVNAME,
> + },
> +};
> +
> +static int __init ibmpowernv_init(void)
> +{
> + int err;
> +
> + pdevice = platform_device_alloc(DRVNAME, 0);
> + if (!pdevice) {
> + pr_err("Device allocation failed\n");
> + err = -ENOMEM;
> + goto exit;
> + }
> +
> + err = platform_device_add(pdevice);
> + if (err) {
> + pr_err("Device addition failed (%d)\n", err);
> + goto exit_device_put;
> + }
> +
> + err = platform_driver_probe(&ibmpowernv_driver, ibmpowernv_probe);
> + if (err) {
> + pr_err("Platfrom driver probe failed\n");
> + goto exit_device_del;
> + }
> +
> + return 0;
> +
> +exit_device_del:
> + platform_device_del(pdevice);
> +exit_device_put:
> + platform_device_put(pdevice);
> +exit:
> + return err;
> +}
> +
> +static void __exit ibmpowernv_exit(void)
> +{
> + platform_driver_unregister(&ibmpowernv_driver);
> + platform_device_unregister(pdevice);
> +}
> +
> +MODULE_AUTHOR("Neelesh Gupta <neelegup-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>");
> +MODULE_DESCRIPTION("IBM POWERNV platform sensors");
> +MODULE_LICENSE("GPL");
> +
> +module_init(ibmpowernv_init);
> +module_exit(ibmpowernv_exit);
>
>
>
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [lm-sensors] [PATCH v4] powerpc/powernv: hwmon driver for power, fan rpm, voltage and temperatur
2014-07-05 2:25 ` Guenter Roeck
(?)
@ 2014-07-07 6:56 ` Benjamin Herrenschmidt
-1 siblings, 0 replies; 11+ messages in thread
From: Benjamin Herrenschmidt @ 2014-07-07 6:56 UTC (permalink / raw)
To: Guenter Roeck
Cc: devicetree@vger.kernel.org, lm-sensors, sbhat, Neelesh Gupta,
linuxppc-dev, jdelvare
On Fri, 2014-07-04 at 19:25 -0700, Guenter Roeck wrote:
> > +cooling-fan#8-data {
> > + sensor-id = <0x7052107>;
> > + phandle = <0x10000028>;
> > + linux,phandle = <0x10000028>;
> > + compatible = "ibm,opal-sensor-cooling-fan";
>
> phandle and linux-phandle are neither documented nor used. Either
> document or drop.
They are core device-tree stuff, as such they are used potentially
anywhere and afaik can be / are generated by DTC but yes, this is
not the place to document them.
Or rather, "phandle" is, "linux,phandle" is an older variant used
for backward compatibility that our firmware still generates but
definitely something we can strip from the doc.
Cheers,
Ben,
_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4] powerpc/powernv: hwmon driver for power, fan rpm, voltage and temperature
@ 2014-07-07 6:56 ` Benjamin Herrenschmidt
0 siblings, 0 replies; 11+ messages in thread
From: Benjamin Herrenschmidt @ 2014-07-07 6:56 UTC (permalink / raw)
To: Guenter Roeck
Cc: devicetree@vger.kernel.org, lm-sensors, sbhat, Neelesh Gupta,
linuxppc-dev, jdelvare
On Fri, 2014-07-04 at 19:25 -0700, Guenter Roeck wrote:
> > +cooling-fan#8-data {
> > + sensor-id = <0x7052107>;
> > + phandle = <0x10000028>;
> > + linux,phandle = <0x10000028>;
> > + compatible = "ibm,opal-sensor-cooling-fan";
>
> phandle and linux-phandle are neither documented nor used. Either
> document or drop.
They are core device-tree stuff, as such they are used potentially
anywhere and afaik can be / are generated by DTC but yes, this is
not the place to document them.
Or rather, "phandle" is, "linux,phandle" is an older variant used
for backward compatibility that our firmware still generates but
definitely something we can strip from the doc.
Cheers,
Ben,
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4] powerpc/powernv: hwmon driver for power, fan rpm, voltage and temperature
@ 2014-07-07 6:56 ` Benjamin Herrenschmidt
0 siblings, 0 replies; 11+ messages in thread
From: Benjamin Herrenschmidt @ 2014-07-07 6:56 UTC (permalink / raw)
To: Guenter Roeck
Cc: devicetree@vger.kernel.org, lm-sensors, sbhat, Neelesh Gupta,
linuxppc-dev, jdelvare
On Fri, 2014-07-04 at 19:25 -0700, Guenter Roeck wrote:
> > +cooling-fan#8-data {
> > + sensor-id = <0x7052107>;
> > + phandle = <0x10000028>;
> > + linux,phandle = <0x10000028>;
> > + compatible = "ibm,opal-sensor-cooling-fan";
>
> phandle and linux-phandle are neither documented nor used. Either
> document or drop.
They are core device-tree stuff, as such they are used potentially
anywhere and afaik can be / are generated by DTC but yes, this is
not the place to document them.
Or rather, "phandle" is, "linux,phandle" is an older variant used
for backward compatibility that our firmware still generates but
definitely something we can strip from the doc.
Cheers,
Ben,
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [lm-sensors] [PATCH v4] powerpc/powernv: hwmon driver for power, fan rpm, voltage and temperatur
2014-07-07 6:56 ` Benjamin Herrenschmidt
(?)
@ 2014-07-07 12:59 ` Guenter Roeck
-1 siblings, 0 replies; 11+ messages in thread
From: Guenter Roeck @ 2014-07-07 12:59 UTC (permalink / raw)
To: Benjamin Herrenschmidt
Cc: Neelesh Gupta, linuxppc-dev-uLR06cmDAlY/bJ5BZ2RsiQ,
jdelvare-l3A5Bk7waGM, lm-sensors-GZX6beZjE8VD60Wz+7aTrA,
svaidy-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8,
sbhat-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8,
devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
On 07/06/2014 11:56 PM, Benjamin Herrenschmidt wrote:
> On Fri, 2014-07-04 at 19:25 -0700, Guenter Roeck wrote:
>>> +cooling-fan#8-data {
>>> + sensor-id = <0x7052107>;
>>> + phandle = <0x10000028>;
>>> + linux,phandle = <0x10000028>;
>>> + compatible = "ibm,opal-sensor-cooling-fan";
>>
>> phandle and linux-phandle are neither documented nor used. Either
>> document or drop.
>
> They are core device-tree stuff, as such they are used potentially
> anywhere and afaik can be / are generated by DTC but yes, this is
> not the place to document them.
>
Turns out they are documented elsewhere. See
Documentation/devicetree/booting-without-of.txt.
> Or rather, "phandle" is, "linux,phandle" is an older variant used
> for backward compatibility that our firmware still generates but
> definitely something we can strip from the doc.
>
Both are not mentioned in any other bindings, so my take is they should
not be mentioned here either.
Thanks,
Guenter
_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4] powerpc/powernv: hwmon driver for power, fan rpm, voltage and temperature
@ 2014-07-07 12:59 ` Guenter Roeck
0 siblings, 0 replies; 11+ messages in thread
From: Guenter Roeck @ 2014-07-07 12:59 UTC (permalink / raw)
To: Benjamin Herrenschmidt
Cc: devicetree@vger.kernel.org, lm-sensors, sbhat, Neelesh Gupta,
linuxppc-dev, jdelvare
On 07/06/2014 11:56 PM, Benjamin Herrenschmidt wrote:
> On Fri, 2014-07-04 at 19:25 -0700, Guenter Roeck wrote:
>>> +cooling-fan#8-data {
>>> + sensor-id = <0x7052107>;
>>> + phandle = <0x10000028>;
>>> + linux,phandle = <0x10000028>;
>>> + compatible = "ibm,opal-sensor-cooling-fan";
>>
>> phandle and linux-phandle are neither documented nor used. Either
>> document or drop.
>
> They are core device-tree stuff, as such they are used potentially
> anywhere and afaik can be / are generated by DTC but yes, this is
> not the place to document them.
>
Turns out they are documented elsewhere. See
Documentation/devicetree/booting-without-of.txt.
> Or rather, "phandle" is, "linux,phandle" is an older variant used
> for backward compatibility that our firmware still generates but
> definitely something we can strip from the doc.
>
Both are not mentioned in any other bindings, so my take is they should
not be mentioned here either.
Thanks,
Guenter
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4] powerpc/powernv: hwmon driver for power, fan rpm, voltage and temperature
@ 2014-07-07 12:59 ` Guenter Roeck
0 siblings, 0 replies; 11+ messages in thread
From: Guenter Roeck @ 2014-07-07 12:59 UTC (permalink / raw)
To: Benjamin Herrenschmidt
Cc: Neelesh Gupta, linuxppc-dev-uLR06cmDAlY/bJ5BZ2RsiQ,
jdelvare-l3A5Bk7waGM, lm-sensors-GZX6beZjE8VD60Wz+7aTrA,
svaidy-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8,
sbhat-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8,
devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
On 07/06/2014 11:56 PM, Benjamin Herrenschmidt wrote:
> On Fri, 2014-07-04 at 19:25 -0700, Guenter Roeck wrote:
>>> +cooling-fan#8-data {
>>> + sensor-id = <0x7052107>;
>>> + phandle = <0x10000028>;
>>> + linux,phandle = <0x10000028>;
>>> + compatible = "ibm,opal-sensor-cooling-fan";
>>
>> phandle and linux-phandle are neither documented nor used. Either
>> document or drop.
>
> They are core device-tree stuff, as such they are used potentially
> anywhere and afaik can be / are generated by DTC but yes, this is
> not the place to document them.
>
Turns out they are documented elsewhere. See
Documentation/devicetree/booting-without-of.txt.
> Or rather, "phandle" is, "linux,phandle" is an older variant used
> for backward compatibility that our firmware still generates but
> definitely something we can strip from the doc.
>
Both are not mentioned in any other bindings, so my take is they should
not be mentioned here either.
Thanks,
Guenter
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2014-07-07 12:59 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-07-04 11:02 [PATCH v4] powerpc/powernv: hwmon driver for power, fan rpm, voltage and temperature Neelesh Gupta
2014-07-04 11:14 ` [lm-sensors] " Neelesh Gupta
[not found] ` <20140704105343.22437.52125.stgit-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2014-07-05 2:25 ` [lm-sensors] [PATCH v4] powerpc/powernv: hwmon driver for power, fan rpm, voltage and temperatur Guenter Roeck
2014-07-05 2:25 ` [PATCH v4] powerpc/powernv: hwmon driver for power, fan rpm, voltage and temperature Guenter Roeck
2014-07-05 2:25 ` Guenter Roeck
2014-07-07 6:56 ` [lm-sensors] [PATCH v4] powerpc/powernv: hwmon driver for power, fan rpm, voltage and temperatur Benjamin Herrenschmidt
2014-07-07 6:56 ` [PATCH v4] powerpc/powernv: hwmon driver for power, fan rpm, voltage and temperature Benjamin Herrenschmidt
2014-07-07 6:56 ` Benjamin Herrenschmidt
2014-07-07 12:59 ` [lm-sensors] [PATCH v4] powerpc/powernv: hwmon driver for power, fan rpm, voltage and temperatur Guenter Roeck
2014-07-07 12:59 ` [PATCH v4] powerpc/powernv: hwmon driver for power, fan rpm, voltage and temperature Guenter Roeck
2014-07-07 12:59 ` Guenter Roeck
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.