| .. _opal-messages: |
| |
| OPAL_MESSAGE |
| ============ |
| |
| The host OS can use OPAL_GET_MSG to retrive messages queued by OPAL. The |
| messages are defined by enum opal_msg_type. The host is notified of there |
| being messages to be consumed by the OPAL_EVENT_MSG_PENDING bit being set. |
| |
| An opal_msg is: :: |
| |
| struct opal_msg { |
| __be32 msg_type; |
| __be32 size; |
| __be64 params[8]; |
| }; |
| |
| The data structure is ALWAYS at least this size (4+4+8*8 = 72 bytes). Some |
| messages define fewer than eight parameters. For messages that do not |
| define all eight parameters, the value in the undefined parameters is |
| undefined, although can safely be memcpy()d or otherwise moved. |
| |
| In the device tree, there's an opal-msg-size property of the OPAL node that |
| says the size of a struct opal-msg. Kernel will use this property to allocate |
| memory for opal_msg structure. See ``OPAL_GET_MESSAGE`` documentation for |
| details. |
| :: |
| |
| ibm,opal { |
| opal-msg-size = <0x48>; |
| } |
| |
| |
| OPAL_MSG_ASYNC_COMP |
| ------------------- |
| :: |
| |
| params[0] = token |
| params[1] = rc |
| |
| Additional parameters are function-specific. |
| |
| OPAL_MSG_MEM_ERR |
| ---------------- |
| |
| .. _OPAL_MSG_EPOW: |
| |
| OPAL_MSG_EPOW |
| ------------- |
| |
| Used by OPAL to issue environmental and power warnings to host OS for |
| conditions requiring an earlier poweroff. A few examples of these are high |
| ambient temperature or system running on UPS power with low UPS battery. |
| Host OS can query OPAL via :ref:`OPAL_GET_EPOW_STATUS` API to obtain information about |
| EPOW conditions present. Refer include/opal-api.h for description of |
| all supported EPOW events. OPAL_SYSPOWER_CHNG, OPAL_SYSPOWER_FAIL and |
| OPAL_SYSPOWER_INC events don't require system poweroff. |
| |
| Host OS should look for 'ibm,opal-v3-epow' string as compatible property |
| for 'epow' node under OPAL device-tree to determine epow support. |
| |
| OPAL_MSG_SHUTDOWN |
| ----------------- |
| |
| Used by OPAL to inform the host OS it must imitate a graceful shutdown. Uses |
| the first parameter to indicate weather the system is going down for shutdown |
| or a reboot. :: |
| |
| params[0] = 0x01 reboot, 0x00 shutdown |
| |
| .. _OPAL_MSG_HMI_EVT: |
| |
| OPAL_MSG_HMI_EVT |
| ---------------- |
| |
| Used by OPAL to sends the OPAL HMI Event to the host OS that reports a |
| summary of HMI error and whether it was successfully recovered or not. |
| |
| HMI is a Hypervisor Maintenance Interrupt usually reports error related |
| to processor recovery/checkstop, NX checkstop and Timer facility. Hypervisor |
| then takes this opportunity to analyze and recover from some of these errors. |
| Hypervisor takes assistance from OPAL layer to handle and recover from |
| HMI. After handling HMI, OPAL layer sends the summary of error report and |
| status of recovery action using HMI event structure shown below. |
| |
| The HMI event structure uses version numbering to allow future enhancement |
| to accommodate additional members. The version start from V1 onward. |
| Version 0 is invalid version and unsupported. |
| |
| The current version of HMI event structure V2 and is backward compatible |
| to V1 version. |
| |
| Notes: |
| |
| - When adding new structure to the union in future, the version number |
| must be bumped. |
| - All future versions must be backward compatible to all its older versions. |
| - Size of this structure should not exceed that of struct opal_msg. |
| |
| :: |
| |
| struct OpalHMIEvent { |
| uint8_t version; /* 0x00 */ |
| uint8_t severity; /* 0x01 */ |
| uint8_t type; /* 0x02 */ |
| uint8_t disposition; /* 0x03 */ |
| uint8_t reserved_1[4]; /* 0x04 */ |
| |
| __be64 hmer; |
| /* TFMR register. Valid only for TFAC and TFMR_PARITY error type. */ |
| __be64 tfmr; |
| |
| /* version 2 and later */ |
| union { |
| /* |
| * checkstop info (Core/NX). |
| * Valid for OpalHMI_ERROR_MALFUNC_ALERT. |
| */ |
| struct { |
| uint8_t xstop_type; /* enum OpalHMI_XstopType */ |
| uint8_t reserved_1[3]; |
| __be32 xstop_reason; |
| union { |
| __be32 pir; /* for CHECKSTOP_TYPE_CORE */ |
| __be32 chip_id; /* for CHECKSTOP_TYPE_NX */ |
| } u; |
| } xstop_error; |
| } u; |
| }; |
| |
| .. _OPAL_MSG_DPO: |
| |
| OPAL_MSG_DPO |
| ------------ |
| |
| Delayed poweroff where OPAL informs host OS that a poweroff has been |
| requested and a forced shutdown will happen in future. Host OS can use |
| OPAL_GET_DPO_STATUS API to query OPAL the number of seconds remaining |
| before a forced poweroff will occur. |
| |
| .. _OPAL_MSG_PRD: |
| |
| OPAL_MSG_PRD |
| ------------ |
| |
| This message is a OPAL-to-HBRT notification, and contains a |
| struct opal_prd_msg: :: |
| |
| enum opal_prd_msg_type { |
| OPAL_PRD_MSG_TYPE_INIT = 0, /* HBRT --> OPAL */ |
| OPAL_PRD_MSG_TYPE_FINI, /* HBRT --> OPAL */ |
| OPAL_PRD_MSG_TYPE_ATTN, /* HBRT <-- OPAL */ |
| OPAL_PRD_MSG_TYPE_ATTN_ACK, /* HBRT --> OPAL */ |
| OPAL_PRD_MSG_TYPE_OCC_ERROR, /* HBRT <-- OPAL */ |
| OPAL_PRD_MSG_TYPE_OCC_RESET, /* HBRT <-- OPAL */ |
| }; |
| |
| struct opal_prd_msg { |
| uint8_t type; |
| uint8_t pad[3]; |
| __be32 token; |
| union { |
| struct { |
| __be64 version; |
| __be64 ipoll; |
| } init; |
| struct { |
| __be64 proc; |
| __be64 ipoll_status; |
| __be64 ipoll_mask; |
| } attn; |
| struct { |
| __be64 proc; |
| __be64 ipoll_ack; |
| } attn_ack; |
| struct { |
| __be64 chip; |
| } occ_error; |
| struct { |
| __be64 chip; |
| } occ_reset; |
| }; |
| }; |
| |
| Responses from the kernel use the same message format, but are passed |
| through the :ref:`OPAL_PRD_MSG` call. |
| |
| OPAL_MSG_OCC |
| ------------ |
| |
| This is used by OPAL to inform host about OCC events like OCC reset, |
| OCC load and throttle status change by OCC which can indicate the |
| host the reason for frequency throttling/unthrottling. :: |
| |
| #define OCC_RESET 0 |
| #define OCC_LOAD 1 |
| #define OCC_THROTTLE 2 |
| #define OCC_MAX_THROTTLE_STATUS 5 |
| /* |
| * struct opal_occ_msg: |
| * type: OCC_RESET, OCC_LOAD, OCC_THROTTLE |
| * chip: chip id |
| * throttle status: Indicates the reason why OCC may have limited |
| * the max Pstate of the chip. |
| * 0x00 = No throttle |
| * 0x01 = Power Cap |
| * 0x02 = Processor Over Temperature |
| * 0x03 = Power Supply Failure (currently not used) |
| * 0x04 = Over current (currently not used) |
| * 0x05 = OCC Reset (not reliable as some failures will not allow for |
| * OCC to update throttle status) |
| */ |
| struct opal_occ_msg { |
| __be64 type; |
| __be64 chip; |
| __be64 throttle_status; |
| }; |
| |
| Host should read opal_occ_msg.chip and opal_occ_msg.throttle_status |
| only when ``opal_occ_msg.type = OCC_THROTTLE``. |
| If host receives ``OCC_THROTTLE`` after an ``OCC_RESET`` then this throttle |
| message will have a special meaning which indicates that all the OCCs |
| have become active after a reset. In such cases ``opal_occ_msg.chip`` and |
| ``opal_occ_msg.throttle_status`` will be set to 0 and host should not use |
| these values. |
| |
| If ``opal_occ_msg.type > 2`` then host should ignore the message for now, |
| new events can be defined for ``opal_occ_msg.type`` in the future versions |
| of OPAL. |
| |
| OPAL_MSG_PRD2 |
| ------------- |
| |
| This message is a OPAL-to-HBRT notification. Its same as OPAL_MSG_PRD except |
| this one supports passing more than 64bytes (8*8) of data. |