[Skiboot] [PATCH v2 01/13] core: add a platform op to read sensors

Cédric Le Goater clg at fr.ibm.com
Sat Feb 21 01:27:24 AEDT 2015


This patch introduces an initial framework to define a sensor_read
operation per platform. It also proposes a few helper routines to
work on the sensor 'handler' which identifies a sensor and attribute
in the OPAL_SENSOR_READ call.

Signed-off-by: Cédric Le Goater <clg at fr.ibm.com>
---

 Changes since v1:

 - removed 'sensor_read' operation for the open power platform as it
   was not adding much value.
 - moved the creation of the /ibm,opal/sensors node in sensor_init()
 - moved the sensor_init() call before platform.init() to make sure
   the FSP is initialized after the sensor node is created
 - changed OPAL_UNSUPPORTED to OPAL_PARAMETER in opal_sensor_read(). 
   will add an extra patch for this specific change

 Changes since RFC:

 - added a 'sensor_read' operation for the open power platform

 core/Makefile.inc           |    2 +-
 core/init.c                 |    4 ++++
 core/sensor.c               |   41 ++++++++++++++++++++++++++++++++
 hw/fsp/fsp-sensor.c         |   13 ++++------
 include/fsp.h               |    2 ++
 include/platform.h          |    6 +++++
 include/sensor.h            |   55 +++++++++++++++++++++++++++++++++++++++++++
 platforms/ibm-fsp/common.c  |    5 ++++
 platforms/ibm-fsp/firenze.c |    1 +
 platforms/ibm-fsp/ibm-fsp.h |    3 +++
 10 files changed, 122 insertions(+), 10 deletions(-)
 create mode 100644 core/sensor.c
 create mode 100644 include/sensor.h

diff --git a/core/Makefile.inc b/core/Makefile.inc
index 590780ff634b..5f5fe04874f9 100644
--- a/core/Makefile.inc
+++ b/core/Makefile.inc
@@ -7,7 +7,7 @@ CORE_OBJS += timebase.o opal-msg.o pci.o pci-opal.o fast-reboot.o
 CORE_OBJS += device.o exceptions.o trace.o affinity.o vpd.o
 CORE_OBJS += hostservices.o platform.o nvram.o hmi.o
 CORE_OBJS += console-log.o ipmi.o time-utils.o pel.o pool.o errorlog.o
-CORE_OBJS += timer.o i2c.o rtc.o flash.o
+CORE_OBJS += timer.o i2c.o rtc.o flash.o sensor.o
 CORE=core/built-in.o
 
 CFLAGS_SKIP_core/relocate.o = -pg -fstack-protector-all
diff --git a/core/init.c b/core/init.c
index cee0e19adfae..8bbc33c15b42 100644
--- a/core/init.c
+++ b/core/init.c
@@ -44,6 +44,7 @@
 #include <libfdt/libfdt.h>
 #include <hostservices.h>
 #include <timer.h>
+#include <sensor.h>
 
 #include <ipmi.h>
 
@@ -633,6 +634,9 @@ void __noreturn main_cpu_entry(const void *fdt, u32 master_cpu)
 	/* Initialize i2c */
 	p8_i2c_init();
 
+	/* Register routine to dispatch and read sensors */
+	sensor_init();
+
 	/*
 	 * We have initialized the basic HW, we can now call into the
 	 * platform to perform subsequent inits, such as establishing
diff --git a/core/sensor.c b/core/sensor.c
new file mode 100644
index 000000000000..6c37a913a848
--- /dev/null
+++ b/core/sensor.c
@@ -0,0 +1,41 @@
+/* Copyright 2013-2014 IBM Corp.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *	http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#include <sensor.h>
+#include <skiboot.h>
+#include <device.h>
+#include <opal.h>
+#include <opal-api.h>
+
+struct dt_node *sensor_node;
+
+static int64_t opal_sensor_read(uint32_t sensor_hndl, int token,
+		uint32_t *sensor_data)
+{
+	if (platform.sensor_read)
+		return platform.sensor_read(sensor_hndl, token, sensor_data);
+
+	return OPAL_PARAMETER;
+}
+
+void sensor_init(void)
+{
+	sensor_node = dt_new(opal_node, "sensors");
+
+	/* Register OPAL interface */
+	opal_register(OPAL_SENSOR_READ, opal_sensor_read, 3);
+}
diff --git a/hw/fsp/fsp-sensor.c b/hw/fsp/fsp-sensor.c
index 39e4e8ee8627..1435e671a3c2 100644
--- a/hw/fsp/fsp-sensor.c
+++ b/hw/fsp/fsp-sensor.c
@@ -36,7 +36,8 @@
 #include <spcn.h>
 #include <opal-api.h>
 #include <opal-msg.h>
-#include<errorlog.h>
+#include <errorlog.h>
+#include <sensor.h>
 
 #define INVALID_DATA	((uint32_t)-1)
 
@@ -490,7 +491,7 @@ static int64_t parse_sensor_id(uint32_t id, struct opal_sensor_data *attr)
 }
 
 
-static int64_t fsp_opal_read_sensor(uint32_t sensor_hndl, int token,
+int64_t fsp_opal_read_sensor(uint32_t sensor_hndl, int token,
 		uint32_t *sensor_data)
 {
 	struct opal_sensor_data *attr;
@@ -691,14 +692,11 @@ static void add_sensor_ids(struct dt_node *sensors)
 static void add_opal_sensor_node(void)
 {
 	int index;
-	struct dt_node *sensors;
 
 	if (!fsp_present())
 		return;
 
-	sensors = dt_new(opal_node, "sensors");
-
-	add_sensor_ids(sensors);
+	add_sensor_ids(sensor_node);
 
 	/* Reset the entry count of each modifier */
 	for (index = 0; spcn_mod_data[index].mod != SPCN_MOD_LAST;
@@ -729,9 +727,6 @@ void fsp_init_sensor(void)
 	/* Map TCE */
 	fsp_tce_map(PSI_DMA_SENSOR_BUF, sensor_buffer, PSI_DMA_SENSOR_BUF_SZ);
 
-	/* Register OPAL interface */
-	opal_register(OPAL_SENSOR_READ, fsp_opal_read_sensor, 3);
-
 	msg.resp = &resp;
 
 	/* Traverse using all the modifiers to know all the sensors available
diff --git a/include/fsp.h b/include/fsp.h
index b65ef98ad2da..d4ffd114b329 100644
--- a/include/fsp.h
+++ b/include/fsp.h
@@ -768,6 +768,8 @@ extern void fsp_memory_err_init(void);
 
 /* Sensor */
 extern void fsp_init_sensor(void);
+extern int64_t fsp_opal_read_sensor(uint32_t sensor_hndl, int token,
+			uint32_t *sensor_data);
 
 /* Diagnostic */
 extern void fsp_init_diag(void);
diff --git a/include/platform.h b/include/platform.h
index 690772e5b1f8..b5a2cf37a220 100644
--- a/include/platform.h
+++ b/include/platform.h
@@ -138,6 +138,12 @@ struct platform {
 	 * Executed just prior to handing control over to the payload.
 	 */
 	void		(*exit)(void);
+
+	/*
+	 * Read a sensor value
+	 */
+	int64_t		(*sensor_read)(uint32_t sensor_hndl, int token,
+				       uint32_t *sensor_data);
 };
 
 extern struct platform __platforms_start;
diff --git a/include/sensor.h b/include/sensor.h
new file mode 100644
index 000000000000..bd099c3748af
--- /dev/null
+++ b/include/sensor.h
@@ -0,0 +1,55 @@
+/* Copyright 2013-2014 IBM Corp.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *	http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __SENSOR_H
+#define __SENSOR_H
+
+/*
+ * A sensor handler is a four bytes value which identifies a sensor by
+ * its resource class (temperature, fans ...), a resource identifier
+ * and an attribute number (data, status, ...) :
+ *
+ *                 Res.
+ *     | Attr.  | Class  |   Resource Id  |
+ *     |--------|--------|----------------|
+ *
+ *
+ * Helper routines to build or use the sensor handler.
+ */
+#define sensor_make_handler(sensor_class, sensor_rid, sensor_attr) \
+	(((sensor_attr) << 24) | ((sensor_class) & 0xff) << 16 | \
+	 ((sensor_rid) & 0xffff))
+
+#define sensor_get_frc(handler)		(((handler) >> 16) & 0xff)
+#define sensor_get_rid(handler)		((handler) & 0xffff)
+#define sensor_get_attr(handler)	((handler) >> 24)
+
+/*
+ * Sensor families
+ *
+ * This identifier is used to dispatch calls to OPAL_SENSOR_READ to
+ * the appropriate component. FSP is the initial family.
+ */
+#define SENSOR_FSP 0x0
+
+/*
+ * root node of all sensors : /ibm,opal/sensors
+ */
+extern struct dt_node *sensor_node;
+
+extern void sensor_init(void);
+
+#endif /* __SENSOR_H */
diff --git a/platforms/ibm-fsp/common.c b/platforms/ibm-fsp/common.c
index 5eb2a14cbecf..695d8e47db7c 100644
--- a/platforms/ibm-fsp/common.c
+++ b/platforms/ibm-fsp/common.c
@@ -203,3 +203,8 @@ int64_t ibm_fsp_cec_power_down(uint64_t request)
 	return OPAL_SUCCESS;
 }
 
+int64_t ibm_fsp_sensor_read(uint32_t sensor_hndl, int token,
+				uint32_t *sensor_data)
+{
+	return fsp_opal_read_sensor(sensor_hndl, token, sensor_data);
+}
diff --git a/platforms/ibm-fsp/firenze.c b/platforms/ibm-fsp/firenze.c
index 258a6b340c40..57b5ce57efae 100644
--- a/platforms/ibm-fsp/firenze.c
+++ b/platforms/ibm-fsp/firenze.c
@@ -399,4 +399,5 @@ DECLARE_PLATFORM(firenze) = {
 	.occ_timeout		= ibm_fsp_occ_timeout,
 	.elog_commit		= elog_fsp_commit,
 	.load_resource		= fsp_load_resource,
+	.sensor_read		= ibm_fsp_sensor_read,
 } ;
diff --git a/platforms/ibm-fsp/ibm-fsp.h b/platforms/ibm-fsp/ibm-fsp.h
index 160038ae5745..48a089143147 100644
--- a/platforms/ibm-fsp/ibm-fsp.h
+++ b/platforms/ibm-fsp/ibm-fsp.h
@@ -26,4 +26,7 @@ extern int64_t ibm_fsp_cec_reboot(void);
 struct errorlog;
 extern int elog_fsp_commit(struct errorlog *buf);
 
+extern int64_t ibm_fsp_sensor_read(uint32_t sensor_hndl, int token,
+				uint32_t *sensor_data);
+
 #endif /*  __IBM_FSP_COMMON_H */
-- 
1.7.10.4



More information about the Skiboot mailing list