aboutsummaryrefslogtreecommitdiff
path: root/hw/ipmi
diff options
context:
space:
mode:
authorPridhiviraj Paidipeddi <ppaidipe@linux.vnet.ibm.com>2016-11-03 23:28:11 +0530
committerStewart Smith <stewart@linux.vnet.ibm.com>2016-11-08 11:33:55 +1100
commit566150620014c5ee941dd84480fb8b6223abbb33 (patch)
tree3e7f6d8bec68820825b598421fe9df09e20dad93 /hw/ipmi
parent8c3f5cdca9a644afc62b2acdc9bdf4ea3673d213 (diff)
downloadskiboot-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.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;
}