aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hw/ipmi/ipmi-sensor.c44
1 files changed, 42 insertions, 2 deletions
diff --git a/hw/ipmi/ipmi-sensor.c b/hw/ipmi/ipmi-sensor.c
index cabb745..9e6d5b9 100644
--- a/hw/ipmi/ipmi-sensor.c
+++ b/hw/ipmi/ipmi-sensor.c
@@ -19,6 +19,7 @@
#include <opal.h>
#include <skiboot.h>
#include <string.h>
+#include <stdbool.h>
#define IPMI_WRITE_SENSOR (1 << 0)
@@ -28,6 +29,8 @@
#define MAX_IPMI_SENSORS 255
static int16_t sensors[MAX_IPMI_SENSORS];
+static bool sensors_present = false;
+
struct set_sensor_req {
u8 sensor_number;
u8 operation;
@@ -37,6 +40,26 @@ struct set_sensor_req {
u8 event_data[3];
};
+static bool ipmi_sensor_type_present(uint8_t sensor_type)
+{
+ const struct dt_property *type_prop;
+ uint8_t type;
+ struct dt_node *node;
+
+ dt_for_each_compatible(dt_root, node, "ibm,ipmi-sensor") {
+ type_prop = dt_find_property(node, "ipmi-sensor-type");
+ if (!type_prop) {
+ prlog(PR_ERR, "IPMI: sensor doesn't have ipmi-sensor-type\n");
+ continue;
+ }
+
+ type = (uint8_t)dt_property_get_cell(type_prop, 0);
+ if (type == sensor_type)
+ return true;
+ }
+ return false;
+}
+
uint8_t ipmi_get_sensor_number(uint8_t sensor_type)
{
assert(sensor_type < MAX_IPMI_SENSORS);
@@ -47,11 +70,19 @@ int ipmi_set_boot_count(void)
{
struct set_sensor_req req;
struct ipmi_msg *msg;
- int boot_count_sensor = sensors[BOOT_COUNT_SENSOR_TYPE];
+ int boot_count_sensor;
+
+ if (!sensors_present)
+ return OPAL_UNSUPPORTED;
if (!ipmi_present())
return OPAL_CLOSED;
+ if (!ipmi_sensor_type_present(BOOT_COUNT_SENSOR_TYPE))
+ return OPAL_HARDWARE;
+
+ boot_count_sensor = sensors[BOOT_COUNT_SENSOR_TYPE];
+
if (boot_count_sensor < 0) {
prlog(PR_DEBUG, "IPMI: boot count set but not present\n");
return OPAL_HARDWARE;
@@ -77,11 +108,19 @@ int ipmi_set_fw_progress_sensor(uint8_t state)
{
struct ipmi_msg *msg;
struct set_sensor_req request;
- int fw_sensor_num = sensors[FW_PROGRESS_SENSOR_TYPE];
+ int fw_sensor_num;
+
+ if (!sensors_present)
+ return OPAL_UNSUPPORTED;
if (!ipmi_present())
return OPAL_CLOSED;
+ if (!ipmi_sensor_type_present(FW_PROGRESS_SENSOR_TYPE))
+ return OPAL_HARDWARE;
+
+ fw_sensor_num = sensors[FW_PROGRESS_SENSOR_TYPE];
+
if (fw_sensor_num < 0) {
prlog(PR_DEBUG, "IPMI: fw progress set but not present\n");
return OPAL_HARDWARE;
@@ -131,4 +170,5 @@ void ipmi_sensor_init(void)
assert(type < MAX_IPMI_SENSORS);
sensors[type] = num;
}
+ sensors_present = true;
}