diff options
author | Pridhiviraj Paidipeddi <ppaidipe@linux.vnet.ibm.com> | 2016-11-03 23:28:11 +0530 |
---|---|---|
committer | Stewart Smith <stewart@linux.vnet.ibm.com> | 2016-11-08 11:33:55 +1100 |
commit | 566150620014c5ee941dd84480fb8b6223abbb33 (patch) | |
tree | 3e7f6d8bec68820825b598421fe9df09e20dad93 /hw/ipmi | |
parent | 8c3f5cdca9a644afc62b2acdc9bdf4ea3673d213 (diff) | |
download | skiboot-566150620014c5ee941dd84480fb8b6223abbb33.zip skiboot-566150620014c5ee941dd84480fb8b6223abbb33.tar.gz skiboot-566150620014c5ee941dd84480fb8b6223abbb33.tar.bz2 |
hw/ipmi-sensor: Fix setting of firmware progress sensor properly.
Currently Hostboot populates /bmc/sensors dt node and corresponding sensors
only for BMC platforms, And for FSP platforms hostboot is not populating any
fsp sensors(Management sensors) and also there is no firmware progress sensor
exist in fsp platforms. Due to which OPAL incorrectly setting firmware status
on a sensor id "00" which is not at all exist.
On a FSP system:
cat /sys/firmware/opal/msglog | grep -i setting
[ 21.189204883,6] IPMI: setting fw progress sensor 00 to 07
[ 21.189559121,6] IPMI: setting fw progress sensor 00 to 13
cat /sys/firmware/opal/msglog | grep -i skiboot
[ 84.127416495,5] SkiBoot skiboot-5.4.0-rc3 starting...
On a BMC system:
cat /sys/firmware/opal/msglog | grep -i setting
[ 3.166286901,6] IPMI: setting fw progress sensor 05 to 14
[ 14.259153338,6] IPMI: setting fw progress sensor 05 to 07
[ 14.469070593,5] IPMI: Resetting boot count on successful boot
[ 15.001210324,6] IPMI: setting fw progress sensor 05 to 13
So this patch fixes this incorrect setting on a fsp system, and also sets the sensor
only if OPAL initialises ipmi sensors and corresponding sensor exists for a given
sensor type in the device tree.
After patch:
On a FSP system:
cat /sys/firmware/opal/msglog | grep -i setting
On a BMC system:
cat /sys/firmware/opal/msglog | grep -i setting
[ 3.164859816,6] IPMI: setting fw progress sensor 05 to 14
[ 14.024941077,6] IPMI: setting fw progress sensor 05 to 07
[ 14.211514767,5] IPMI: Resetting boot count on successful boot
[ 14.252554375,6] IPMI: setting fw progress sensor 05 to 13
Signed-off-by: Pridhiviraj Paidipeddi <ppaidipe@linux.vnet.ibm.com>
[stewart@linux.vnet.ibm.com: return OPAL_UNSUPPORTED on !sensors_present,
make ipmi_sensor_type_present() static in ipmi-sensor.c]
Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
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 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; } |