diff options
Diffstat (limited to 'hw/ipmi')
-rw-r--r-- | hw/ipmi/ipmi-sensor.c | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/hw/ipmi/ipmi-sensor.c b/hw/ipmi/ipmi-sensor.c index cabb7459..9e6d5b98 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; } |