@@ -41,4 +41,6 @@ void sensor_init(void)
{
/* Register OPAL interface */
opal_register(OPAL_SENSOR_READ, opal_sensor_read, 3);
+
+ dts_sensor_create_nodes();
}
@@ -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;
+}
@@ -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 */
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(+)