diff mbox

[RFC,v2,3/9] dts: add device tree nodes for the core temperatures

Message ID 1421910562-18973-4-git-send-email-clg@fr.ibm.com
State Superseded
Headers show

Commit Message

Cédric Le Goater Jan. 22, 2015, 7:09 a.m. UTC
This patch simply adds sensors nodes for the core temperatures. It
uses the core PIR as a resource identifier to fit in the sensor model.

For the moment, only the core temperature is exposed in the device
tree. The trip bits which could be provided as an alarm need to be 
investigated because they seem to be always set.

The device tree nodes use the new layout.

Signed-off-by: Cédric Le Goater <clg@fr.ibm.com>
---
 core/sensor.c |    2 ++
 hw/dts.c      |   42 ++++++++++++++++++++++++++++++++++++++++++
 include/dts.h |    1 +
 3 files changed, 45 insertions(+)
diff mbox

Patch

diff --git a/core/sensor.c b/core/sensor.c
index b109030d8c44..95ad03d91c3c 100644
--- a/core/sensor.c
+++ b/core/sensor.c
@@ -41,4 +41,6 @@  void sensor_init(void)
 {
 	/* Register OPAL interface */
 	opal_register(OPAL_SENSOR_READ, opal_sensor_read, 3);
+
+	dts_sensor_create_nodes();
 }
diff --git a/hw/dts.c b/hw/dts.c
index c94e879b192a..4590d0dba7b6 100644
--- a/hw/dts.c
+++ b/hw/dts.c
@@ -164,3 +164,45 @@  int64_t dts_sensor_read(uint32_t sensor_hndl, uint32_t *sensor_data)
 
 	return rc;
 }
+
+bool dts_sensor_create_nodes(void)
+{
+	uint8_t sensor_class = SENSOR_DTS_CORE_TEMP|SENSOR_DTS;
+
+	struct proc_chip *chip;
+	struct dt_node *sensors;
+	char name[64];
+
+	sensors = dt_find_by_path(dt_root, "/ibm,opal/sensors");
+	if (!sensors) {
+		prerror("DTS: dt node /ibm,opal/sensors not found\n");
+		return false;
+	}
+
+	/* build the device tree nodes :
+	 *
+	 *     sensors/core-temp@pir
+	 *
+	 * The core is identified by its PIR, is stored in the resource
+	 * number of the sensor handler.
+	 */
+	for_each_chip(chip) {
+		struct cpu_thread *c;
+
+		for_each_available_core_in_chip(c, chip->id) {
+			struct dt_node *node;
+			uint32_t handler;
+
+			snprintf(name, sizeof(name), "core-temp@%x", c->pir);
+
+			handler = sensor_make_handler(sensor_class,
+					c->pir, SENSOR_DTS_ATTR_CORE_TEMP_MAX);
+			node = dt_new(sensors, name);
+			dt_add_property_string(node, "compatible",
+					       "ibm,opal-sensor");
+			dt_add_property_cells(node, "sensor-data", handler);
+		}
+	}
+
+	return true;
+}
diff --git a/include/dts.h b/include/dts.h
index 18933909ee08..f506c58efb6f 100644
--- a/include/dts.h
+++ b/include/dts.h
@@ -20,5 +20,6 @@ 
 #include <stdint.h>
 
 extern int64_t dts_sensor_read(uint32_t sensor_hndl, uint32_t *sensor_data);
+extern bool dts_sensor_create_nodes(void);
 
 #endif /* __DTS_H */