[Skiboot] [PATCH v2 1/2] FSP/EPOW: Add support for FSP EPOW events in OPAL
Stewart Smith
stewart at linux.vnet.ibm.com
Tue May 12 13:03:20 AEST 2015
couple of global comments:
- generally this patch is pretty hard to read, there's a lot of change
going on, can you break it up into smaller chunks?
- documentation on API is missing and API appears to change.
Vipin K Parashar <vipin at linux.vnet.ibm.com> writes:
> diff --git a/hw/fsp/fsp-epow.c b/hw/fsp/fsp-epow.c
> index eaba8bb..97b082a 100644
> --- a/hw/fsp/fsp-epow.c
> +++ b/hw/fsp/fsp-epow.c
> @@ -1,10 +1,11 @@
> -/* Copyright 2013-2014 IBM Corp.
> +/*
> + * 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
> + * 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,
If this is different to other files, please submit separate patch that
fixes everywhere to be consistent.
> @@ -13,229 +14,217 @@
> * See the License for the specific language governing permissions and
> * limitations under the License.
> */
> -/*
> - * Handle FSP Environmental and Power Warning (EPOW) events notification
> - */
> -#include <skiboot.h>
> -#include <console.h>
> +
> +/* FSP Early Power Off Warning (EPOW) support */
> +
Please submit general re-org as sep patch.
> #include <fsp.h>
> #include <device.h>
> -#include <stdio.h>
> -#include <spcn.h>
> -#include <opal.h>
> +#include <lock.h>
> #include <opal-msg.h>
> +#include <opal-api.h>
>
> #include "fsp-epow.h"
>
> -#define PREFIX "FSPEPOW: "
> +#define PREFIX "FSP-EPOW: "
I've finally gotten sick enough of seeing #define PREFIX around that
I've gone and implemented pr_fmt for our printf/prlog function, so when
you resubmit this patch, please use it.
> /*
> * System EPOW status
> *
> - * This value is exported to the host. Each individual element in this array
> - * [0..(OPAL_SYSEPOW_MAX -1)] contains detailed status (in it's bit positions)
> - * corresponding to a particular defined EPOW sub class. For example.
> - *
> - * epow_status[OPAL_SYSEPOW_POWER] will reflect whether the system has one or
> - * more of power subsystem specific EPOW events like OPAL_SYSPOWER_UPS,
> - * OPAL_SYSPOWER_CHNG, OPAL_SYSPOWER_FAIL or OPAL_SYSPOWER_INCL.
> + * This value is exported to the host. Each individual element in this
> + * array [0...(OPAL_MAX_EPOW_CLASSES-1)] contains bitwise EPOW event info
> + * corresponding to particular defined EPOW sub class. For example.
> + * opal_epow_status[OPAL_EPOW_POWER] will reflect power related EPOW events.
> */
> -static int16_t epow_status[OPAL_SYSEPOW_MAX];
> +static u32 opal_epow_status[OPAL_MAX_EPOW_CLASSES];
Please also add a doc/opal-api/ file describing the OPAL calls and data
structures.
Is this an API change though? Going from 16 to 32bits looks like it.
> -/* Process FSP sent SPCN based information */
> -static void epow_process_base_event(u8 *epow)
> -{
> +/* Utilty Failure (UF) bit status */
> +static u8 utility_fail_mask;
>
> - epow_status[OPAL_SYSEPOW_POWER] &= ~(OPAL_SYSPOWER_CHNG |
> - OPAL_SYSPOWER_FAIL | OPAL_SYSPOWER_INCL);
> - /*
> - * FIXME: As of now, SPCN_FAULT_LOG event is not being used
> - * as it does not map to any generic defined OPAL EPOW event.
> - */
> - if (epow[3] & SPCN_CNF_CHNG) {
> - /*
> - * The frequency of the SPCN_CNF_CHNG message is very
> - * high on POWER7 and POWER8 systems which will fill
> - * up the Sapphire log buffer. SPCN configuration
> - * change does not take down the system, hence the
> - * logging of these type of messages can be avoided to
> - * save precious log buffer space.
> - */
> - epow_status[OPAL_SYSEPOW_POWER] |= OPAL_SYSPOWER_CHNG;
> - }
> +/* Battery Low (BL) bit status */
> +static u8 battery_low_mask;
>
> - if (epow[3] & SPCN_POWR_FAIL) {
> - prlog(PR_TRACE, PREFIX "FSP message with SPCN_POWR_FAIL\n");
> - epow_status[OPAL_SYSEPOW_POWER] |= OPAL_SYSPOWER_FAIL;
> - }
> +/* Process EPOW event notification */
> +static bool process_epow_event(struct fsp_msg *msg)
I don't think this comment adds anything that cannot be inferred from
the name of the function.
> +{
> + u8 ups_status;
> + int epow_reason;
> + bool new_epow_event = false;
> + bool unknown_epow = false;
>
> - if (epow[3] & SPCN_INCL_POWR) {
> - prlog(PR_TRACE, PREFIX "FSP message with SPCN_INCL_POWR\n");
> - epow_status[OPAL_SYSEPOW_POWER] |= OPAL_SYSPOWER_INCL;
> - }
> -}
> + prlog(PR_DEBUG, PREFIX "UPS byte = 0x%x, SPCN byte = 0x%x\n",
> + msg->data.bytes[1], msg->data.bytes[2]);
>
> -/* Process FSP sent EPOW based information */
> -static void epow_process_ex1_event(u8 *epow)
> -{
> - epow_status[OPAL_SYSEPOW_POWER] &= ~OPAL_SYSPOWER_UPS;
> - epow_status[OPAL_SYSEPOW_TEMP] &= ~(OPAL_SYSTEMP_AMB | OPAL_SYSTEMP_INT);
> + /* UPS status bits information. */
> + ups_status = msg->data.bytes[1];
>
> - if (epow[4] == EPOW_ON_UPS) {
> - prlog(PR_TRACE, PREFIX "FSP message with EPOW_ON_UPS\n");
> - epow_status[OPAL_SYSEPOW_POWER] |= OPAL_SYSPOWER_UPS;
> + /*
> + * Check if there is any change in UF and BL bits,
> + * signifying new EPOW event.
> + */
> + lock(&epow_lock);
> + if (utility_fail_mask != (ups_status & UPS_UTILITY_FAIL)) {
> + /* Update new utilty fail mask */
> + utility_fail_mask = (ups_status & UPS_UTILITY_FAIL);
> + new_epow_event = true;
> }
>
> - if (epow[4] == EPOW_TMP_AMB) {
> - prlog(PR_TRACE, PREFIX "FSP message with EPOW_TMP_AMB\n");
> - epow_status[OPAL_SYSEPOW_TEMP] |= OPAL_SYSTEMP_AMB;
> + /*
> + * With non-zero utility fail mask, check if there is any change in
> + * battery low mask value . With zero utility fail mask value, battery
> + * low mask change doesn't trigger EPOW event.
> + */
> + if (utility_fail_mask) {
> + if (battery_low_mask != (ups_status & UPS_BATTERY_LOW)) {
> + /* Update new battery low mask */
> + battery_low_mask = (ups_status & UPS_BATTERY_LOW);
> + new_epow_event = true;
> + }
> }
>
> - if (epow[4] == EPOW_TMP_INT) {
> - prlog(PR_TRACE, PREFIX "FSP message with EPOW_TMP_INT\n");
> - epow_status[OPAL_SYSEPOW_TEMP] |= OPAL_SYSTEMP_INT;
> + prlog(PR_DEBUG, PREFIX "UF Mask = 0x%x, BL Mask = 0x%x. "
> + "New EPOW event = %d\n", utility_fail_mask,
> + battery_low_mask, new_epow_event);
> +
> + if (new_epow_event == false) {
> + unlock(&epow_lock);
> + return false;
> }
> -}
>
> -/* Update the system EPOW status */
> -static void fsp_epow_update(u8 *epow, int epow_type)
> -{
> - int16_t old_epow_status[OPAL_SYSEPOW_MAX];
> - bool epow_changed = false;
> - int rc;
> + /* Collect EPOW reason code information */
> + epow_reason = msg->data.bytes[4];
>
> - lock(&epow_lock);
> + /* Proceed with new EPOW event processing */
> + switch (epow_reason) {
> + case EPOW_NONE:
> + if (!utility_fail_mask && !battery_low_mask) {
> + memset(opal_epow_status, 0, sizeof(opal_epow_status));
> + prlog(PR_INFO,
> + PREFIX "EPOW condition returned to normal\n");
> + } else
> + unknown_epow = true;
> + break;
>
> - /* Copy over and clear system EPOW status */
> - memcpy(old_epow_status, epow_status, sizeof(old_epow_status));
> - switch(epow_type) {
> - case EPOW_NORMAL:
> - epow_process_base_event(epow);
> - /* FIXME: IPL mode information present but not used */
> + case EPOW_ON_UPS:
> + if (utility_fail_mask && !battery_low_mask) {
> + opal_epow_status[OPAL_EPOW_POWER] = OPAL_EPOW_POWER_UPS;
> + prlog(PR_INFO,
> + PREFIX "EPOW due to system on UPS power\n");
> + } else if (utility_fail_mask && battery_low_mask) {
> + opal_epow_status[OPAL_EPOW_POWER] =
> + OPAL_EPOW_POWER_UPS_LOW;
> + prlog(PR_INFO,
> + PREFIX "EPOW due to system on UPS power "
> + "with UPS battery low.\n");
> + } else
> + unknown_epow = true;
> break;
> - case EPOW_EX1:
> - epow_process_base_event(epow);
> - epow_process_ex1_event(epow);
> - /* FIXME: IPL mode information present but not used */
> - /* FIXME: Key position information present but not used */
> +
> + case EPOW_AMB_TEMP:
> + if (utility_fail_mask && !battery_low_mask) {
> + opal_epow_status[OPAL_EPOW_TEMP] =
> + OPAL_EPOW_TEMP_HIGH_AMB;
> + prlog(PR_INFO,
> + PREFIX "EPOW due to high ambient temp\n");
> + } else if (utility_fail_mask && battery_low_mask) {
> + opal_epow_status[OPAL_EPOW_TEMP] =
> + OPAL_EPOW_TEMP_CRIT_AMB;
> + prlog(PR_INFO,
> + PREFIX "EPOW due to critical ambient temp\n");
> + } else
> + unknown_epow = true;
> break;
> - case EPOW_EX2:
> - /*FIXME: IPL mode information present but not used */
> - /*FIXME: Key position information present but not used */
> +
> + case EPOW_INT_TEMP:
> + if (utility_fail_mask && !battery_low_mask) {
> + opal_epow_status[OPAL_EPOW_TEMP] =
> + OPAL_EPOW_TEMP_HIGH_INT;
> + prlog(PR_INFO,
> + PREFIX "EPOW due to high internal temp\n");
> + } else if (utility_fail_mask && battery_low_mask) {
> + opal_epow_status[OPAL_EPOW_TEMP] =
> + OPAL_EPOW_TEMP_CRIT_INT;
> + prlog(PR_INFO,
> + PREFIX "EPOW due to critical internal temp\n");
> + } else
> + unknown_epow = true;
> break;
> +
> default:
> - prlog(PR_WARNING, PREFIX "Unknown EPOW event notification\n");
> - break;
> + unknown_epow = true;
> }
> unlock(&epow_lock);
>
> - if (memcmp(epow_status, old_epow_status, sizeof(epow_status)))
> - epow_changed = true;
> + prlog(PR_DEBUG, PREFIX "Supported EPOW classes = %d. "
> + "EPOW Status = 0x%x 0x%x 0x%x\n", OPAL_MAX_EPOW_CLASSES,
> + opal_epow_status[0], opal_epow_status[1],
> opal_epow_status[2]);
Not quite sure why there's this prlog here about what EPOW classes are
supported, isn't this determined at startup?
>
> - /* Send OPAL message notification */
> - if (epow_changed) {
> - rc = opal_queue_msg(OPAL_MSG_EPOW, NULL, NULL);
> - if (rc) {
> - prlog(PR_ERR, PREFIX "OPAL EPOW message queuing failed\n");
> - return;
> - }
> + if (unknown_epow) {
> + prerror(PREFIX "Unknown EPOW. UF Mask = 0x%x, BL Mask = 0x%x, "
> + "Reason = %d\n", utility_fail_mask,
> + battery_low_mask, epow_reason);
> + return false;
> }
> +
> + return true;
> }
>
> -/* Process captured EPOW event notification */
> -static void fsp_process_epow(struct fsp_msg *msg, int epow_type)
> +/*
> + * Notify host about EPOW event. Host should make a OPAL call
> + * subsequently to obtain EPOW event information.
> + */
> +static void notify_epow_event(void)
> +{
> + int rc;
> +
> + /* Send OPAL message notification */
> + rc = opal_queue_msg(OPAL_MSG_EPOW, NULL, NULL);
> + if (rc)
> + prerror(PREFIX "OPAL message queuing failed for EPOW event. "
> + "rc = %d\n", rc);
> + else
> + prlog(PR_INFO, PREFIX "Notified host about EPOW event.\n");
> +}
> +
> +/* Process panel status notification */
> +static void process_panel_status(struct fsp_msg *msg, int panel_type)
> {
> - struct fsp_msg *resp;
> - u8 epow[8];
> + bool new_epow_event;
>
> - /* Basic EPOW signature */
> + /* Match panel status notification signature */
> if (msg->data.bytes[0] != 0xF2) {
> - prlog(PR_ERR, PREFIX "Signature mismatch\n");
> + prerror(PREFIX "Signature mismatch\n");
> return;
> }
>
> - /* Common to all EPOW event types */
> - epow[0] = msg->data.bytes[0];
> - epow[1] = msg->data.bytes[1];
> - epow[2] = msg->data.bytes[2];
> - epow[3] = msg->data.bytes[3];
> -
> - /*
> - * After receiving the FSP async message, HV needs to
> - * ask for the detailed panel status through corresponding
> - * mbox command. HV need not use the received details status
> - * as it does not have any thing more or new than what came
> - * along with the original FSP async message. But requesting
> - * for the detailed panel status exclussively is necessary as
> - * it forms a kind of handshaking with the FSP. Without this
> - * step, FSP wont be sending any new panel status messages.
> - */
> - switch(epow_type) {
> - case EPOW_NORMAL:
> - resp = fsp_mkmsg(FSP_CMD_STATUS_REQ, 0);
> - if (resp == NULL) {
> - prerror(PREFIX "%s : Message allocation failed\n",
> - __func__);
> - break;
> - }
> - if (fsp_queue_msg(resp, fsp_freemsg)) {
> - fsp_freemsg(resp);
> - prerror(PREFIX "%s : Failed to queue response "
> - "message\n", __func__);
> - }
> - break;
> - case EPOW_EX1:
> - /* EPOW_EX1 specific extra event data */
> - epow[4] = msg->data.bytes[4];
> - resp = fsp_mkmsg(FSP_CMD_STATUS_EX1_REQ, 0);
> - if (resp == NULL) {
> - prerror(PREFIX "%s : Message allocation failed\n",
> - __func__);
> - break;
> - }
> - if (fsp_queue_msg(resp, fsp_freemsg)) {
> - fsp_freemsg(resp);
> - prerror(PREFIX "%s : Failed to queue response "
> - "message\n", __func__);
> - }
> - break;
> - case EPOW_EX2:
> - resp = fsp_mkmsg(FSP_CMD_STATUS_EX2_REQ, 0);
> - if (resp == NULL) {
> - prerror(PREFIX "%s : Message allocation failed\n",
> - __func__);
> - break;
> - }
> - if (fsp_queue_msg(resp, fsp_freemsg)) {
> - fsp_freemsg(resp);
> - prerror(PREFIX "%s : Failed to queue response "
> - "message\n", __func__);
> - }
> - break;
> - default:
> - prlog(PR_WARNING, PREFIX "Unknown EPOW event notification\n");
> + /* EPOW event information is encoded in extended panel 1 status */
> + if (panel_type != PANEL_EX1)
> return;
> - }
> - fsp_epow_update(epow, epow_type);
> +
> + /* Process EPOW event information and */
> + new_epow_event = process_epow_event(msg);
> +
> + /* Notify host if new EPOW event detected */
> + if (new_epow_event)
> + notify_epow_event();
> }
>
> /*
> * EPOW OPAL interface
> *
> * The host requests for the system EPOW status through this
> - * OPAl call, where it passes a buffer with a give length.
> - * Sapphire fills the buffer with updated system EPOW status
> - * and then updates the length variable back to reflect the
> - * number of EPOW sub classes it has updated the buffer with.
> + * OPAl call. Host passes an buffer address as first argument
nitpick: a buffer, not an buffer.
> + * while second argument contains number of EPOW classes known
> + * by it. OPAL populates passed buffer with its EPOW status
> + * and updates variable having number of classes with number of
> + * EPOW classes for which it has returned status.
> */
> -static int64_t fsp_opal_get_epow_status(int16_t *out_epow,
> - int16_t *length)
> +static int32_t opal_get_epow_status(u32 *epow_status,
> + int32_t
> *num_epow_classes)
This does look like a API change.
If you *must* change OPAL API, you *MUST* do it in a forward and
backwards compatible way and very carefully document old and new in
doc/opal-api/ (and in commit message)
> @@ -274,13 +261,13 @@ static bool fsp_epow_message(u32 cmd_sub_mod, struct fsp_msg *msg)
> {
> switch(cmd_sub_mod) {
> case FSP_CMD_PANELSTATUS:
> - fsp_process_epow(msg, EPOW_NORMAL);
> + process_panel_status(msg, PANEL_NORMAL);
> return true;
> case FSP_CMD_PANELSTATUS_EX1:
> - fsp_process_epow(msg, EPOW_EX1);
> + process_panel_status(msg, PANEL_EX1);
> return true;
> case FSP_CMD_PANELSTATUS_EX2:
> - fsp_process_epow(msg, EPOW_EX2);
> + process_panel_status(msg, PANEL_EX2);
> return true;
I don't know why FSP chooses to call it panel status, but probably
better to refer to it is epow here?
> }
> return false;
> @@ -292,12 +279,25 @@ static struct fsp_client fsp_epow_client = {
>
> void fsp_epow_init(void)
> {
> - struct dt_node *np;
> + struct dt_node *node_epow;
>
> + /* Register FSP EPOW notifications */
> fsp_register_client(&fsp_epow_client, FSP_MCLASS_SERVICE);
> - opal_register(OPAL_GET_EPOW_STATUS, fsp_opal_get_epow_status, 2);
> - np = dt_new(opal_node, "epow");
> - dt_add_property_strings(np, "compatible", "ibm,opal-v3-epow");
> - dt_add_property_strings(np, "epow-classes", "power", "temperature", "cooling");
> - prlog(PR_TRACE, PREFIX "FSP EPOW support initialized\n");
> +
> + /* Register host OPAL EPOW interface */
> + opal_register(OPAL_GET_EPOW_STATUS, opal_get_epow_status, 2);
Having fsp in function name makes more sense as this is the FSP handler
for this API.
> +
> + /* Create EPOW device tree node */
> + node_epow = dt_new(opal_node, "epow");
> + if (!node_epow) {
> + prerror(PREFIX "Failed to create epow device tree node\n");
> + return;
> + }
> +
> + /* Add EPOW node properties */
> + dt_add_property_strings(node_epow, "compatible",
> "ibm,opal-epow");
why change in compatible? This means we're breaking API, right?
> + dt_add_property_strings(node_epow, "epow-classes", "power", "temp",
> + "cooling");
> +
> + prlog(PR_INFO, PREFIX "FSP EPOW support initialized\n");
> }
> diff --git a/hw/fsp/fsp-epow.h b/hw/fsp/fsp-epow.h
> index 24a0ae9..7dfd8c6 100644
> --- a/hw/fsp/fsp-epow.h
> +++ b/hw/fsp/fsp-epow.h
> @@ -14,27 +15,34 @@
> * limitations under the License.
> */
>
> -/*
> - * Handle FSP EPOW event notifications
> - */
> +/* FSP EPOW (Early Power Off Warning) support */
>
> #ifndef __FSP_EPOW_H
> #define __FSP_EPOW_H
>
> -/* FSP based EPOW event notifications */
> -#define EPOW_NORMAL 0x00 /* panel status normal */
> -#define EPOW_EX1 0x01 /* panel status extended 1 */
> -#define EPOW_EX2 0x02 /* Panel status extended 2 */
> +/* Timeout values for various EPOW events */
> +#define TIMEOUT_EPOW_POWER_UPS 900
> +#define TIMEOUT_EPOW_POWER_UPS_LOW 20
> +#define TIMEOUT_EPOW_TEMP_HIGH_AMB 900
> +#define TIMEOUT_EPOW_TEMP_CRIT_AMB 20
> +#define TIMEOUT_EPOW_TEMP_HIGH_INT 900
> +#define TIMEOUT_EPOW_TEMP_CRIT_INT 20
Please specify units somewhere. These are just from FSP spec? We can't
interrogate FSP at all for these?
> -/* SPCN notifications */
> -#define SPCN_CNF_CHNG 0x08 /* SPCN configuration change */
> -#define SPCN_FAULT_LOG 0x04 /* SPCN fault to log */
> -#define SPCN_POWR_FAIL 0x02 /* SPCN impending power failure */
> -#define SPCN_INCL_POWR 0x01 /* SPCN incomplete power */
> +/* FSP Panel Status type */
> +#define PANEL_NORMAL 0 /* Normal Panel */
> +#define PANEL_EX1 1 /* Extended Panel 1 */
> +#define PANEL_EX2 2 /* Extended Panel 2 */
>
> -/* EPOW reason code notifications */
> +/* EPOW reason codes */
> +#define EPOW_NONE 0 /* EPOW normal/reset */
> #define EPOW_ON_UPS 1 /* System on UPS */
> -#define EPOW_TMP_AMB 2 /* Over ambient temperature */
> -#define EPOW_TMP_INT 3 /* Over internal temperature */
> +#define EPOW_AMB_TEMP 2 /* Over ambient temperature */
> +#define EPOW_INT_TEMP 3 /* Over internal temperature */
> +
> +/* UPS bits mask used in EPOW notifications */
> +#define UPS_PRESENT 0x80 /* UPS present */
> +#define UPS_UTILITY_FAIL 0x40 /* UPS utility fail */
> +#define UPS_BYPASED 0x20 /* UPS bypassed */
> +#define UPS_BATTERY_LOW 0x10 /* UPS battery low */
>
> #endif
> diff --git a/include/opal-api.h b/include/opal-api.h
> index 1698311..12e427c 100644
> --- a/include/opal-api.h
> +++ b/include/opal-api.h
> @@ -1,10 +1,11 @@
> -/* Copyright 2013-2014 IBM Corp.
> +/*
> + * 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
> + * 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,
Only change if making consistent with other files, and even then, as a
separate patch.
> @@ -384,13 +385,6 @@ enum OpalSlotLedState {
> OPAL_SLOT_LED_STATE_ON = 1 /* LED is ON */
> };
>
> -enum OpalEpowStatus {
> - OPAL_EPOW_NONE = 0,
> - OPAL_EPOW_UPS = 1,
> - OPAL_EPOW_OVER_AMBIENT_TEMP = 2,
> - OPAL_EPOW_OVER_INTERNAL_TEMP = 3
> -};
> -
So... is the API changing or not? I'm a bit unclear now and it seems
non-obvious from the changes to opal-api.h
> enum OpalCheckTokenStatus {
> OPAL_TOKEN_ABSENT = 0,
> OPAL_TOKEN_PRESENT = 1
> @@ -444,46 +438,6 @@ struct opal_ipmi_msg {
> uint8_t data[];
> };
>
> -/*
> - * EPOW status sharing (OPAL and the host)
> - *
> - * The host will pass on OPAL, a buffer of length OPAL_SYSEPOW_MAX
> - * with individual elements being 16 bits wide to fetch the system
> - * wide EPOW status. Each element in the buffer will contain the
> - * EPOW status in it's bit representation for a particular EPOW sub
> - * class as defiend here. So multiple detailed EPOW status bits
> - * specific for any sub class can be represented in a single buffer
> - * element as it's bit representation.
> - */
> -
> -/* System EPOW type */
> -enum OpalSysEpow {
> - OPAL_SYSEPOW_POWER = 0, /* Power EPOW */
> - OPAL_SYSEPOW_TEMP = 1, /* Temperature EPOW */
> - OPAL_SYSEPOW_COOLING = 2, /* Cooling EPOW */
> - OPAL_SYSEPOW_MAX = 3, /* Max EPOW categories */
> -};
> -
> -/* Power EPOW */
> -enum OpalSysPower {
> - OPAL_SYSPOWER_UPS = 0x0001, /* System on UPS power */
> - OPAL_SYSPOWER_CHNG = 0x0002, /* System power configuration change */
> - OPAL_SYSPOWER_FAIL = 0x0004, /* System impending power failure */
> - OPAL_SYSPOWER_INCL = 0x0008, /* System incomplete power */
> -};
> -
> -/* Temperature EPOW */
> -enum OpalSysTemp {
> - OPAL_SYSTEMP_AMB = 0x0001, /* System over ambient temperature */
> - OPAL_SYSTEMP_INT = 0x0002, /* System over internal temperature */
> - OPAL_SYSTEMP_HMD = 0x0004, /* System over ambient humidity */
> -};
> -
> -/* Cooling EPOW */
> -enum OpalSysCooling {
> - OPAL_SYSCOOL_INSF = 0x0001, /* System insufficient cooling */
> -};
> -
> /* FSP memory errors handling */
> enum OpalMemErr_Version {
> OpalMemErr_V1 = 1,
> @@ -941,6 +895,36 @@ struct opal_i2c_request {
> __be64 buffer_ra; /* Buffer real address */
> };
>
> +/*
> + * EPOW status sharing (OPAL and the host)
> + *
> + * The host will pass on OPAL, a buffer of length OPAL_EPOW_MAX_CLASSES
> + * to fetch system wide EPOW status. Each element in the returned buffer
> + * will contain bitwise EPOW status for each EPOW sub class.
> + */
> +
> +/* EPOW types */
> +enum OpalEpow {
> + OPAL_EPOW_POWER = 0, /* Power EPOW */
> + OPAL_EPOW_TEMP = 1, /* Temperature EPOW */
> + OPAL_EPOW_COOLING = 2, /* Cooling EPOW */
> + OPAL_MAX_EPOW_CLASSES = 3, /* Max EPOW categories */
> +};
> +
> +/* Power EPOW events */
> +enum OpalEpowPower {
> + OPAL_EPOW_POWER_UPS = 0x1, /* System on UPS power */
> + OPAL_EPOW_POWER_UPS_LOW = 0x2, /* System on UPS power with low battery*/
> +};
> +
> +/* Temperature EPOW events */
> +enum OpalEpowTemp {
> + OPAL_EPOW_TEMP_HIGH_AMB = 0x1, /* High ambient temperature */
> + OPAL_EPOW_TEMP_CRIT_AMB = 0x2, /* Critical ambient temperature */
> + OPAL_EPOW_TEMP_HIGH_INT = 0x4, /* High internal temperature */
> + OPAL_EPOW_TEMP_CRIT_INT = 0x8, /* Critical internal temperature */
> +};
> +
Not sure why all these have changed
More information about the Skiboot
mailing list