/** @file Generic IPMI transport layer common head file during PEI phase @copyright Copyright 2016 - 2021 Intel Corporation.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef _PEI_IPMI_COMMON_BMC_H_ #define _PEI_IPMI_COMMON_BMC_H_ #include #define MAX_TEMP_DATA 160 #define BMC_SLAVE_ADDRESS 0x20 #define MAX_SOFT_COUNT 10 #define COMP_CODE_NORMAL 0x00 // // IPMI command completion codes to check for in the UpdateErrorStatus routine. // These completion codes indicate a soft error and a running total of the occurrences // of these errors is maintained. // #define COMP_CODE_NODE_BUSY 0xC0 #define COMP_CODE_TIMEOUT 0xC3 #define COMP_CODE_OUT_OF_SPACE 0xC4 #define COMP_CODE_OUT_OF_RANGE 0xC9 #define COMP_CODE_CMD_RESP_NOT_PROVIDED 0xCE #define COMP_CODE_FAIL_DUP_REQUEST 0xCF #define COMP_CODE_SDR_REP_IN_UPDATE_MODE 0xD0 #define COMP_CODE_DEV_IN_FW_UPDATE_MODE 0xD1 #define COMP_CODE_BMC_INIT_IN_PROGRESS 0xD2 #define COMP_CODE_UNSPECIFIED 0xFF #define COMPLETION_CODES \ { \ COMP_CODE_NODE_BUSY, COMP_CODE_TIMEOUT, COMP_CODE_OUT_OF_SPACE, COMP_CODE_OUT_OF_RANGE, \ COMP_CODE_CMD_RESP_NOT_PROVIDED, COMP_CODE_FAIL_DUP_REQUEST, COMP_CODE_SDR_REP_IN_UPDATE_MODE, \ COMP_CODE_DEV_IN_FW_UPDATE_MODE, COMP_CODE_BMC_INIT_IN_PROGRESS, COMP_CODE_UNSPECIFIED \ } // // Ensure proper structure formats // #pragma pack(1) // // Pei Ipmi instance data // typedef struct { UINTN Signature; UINT64 KcsTimeoutPeriod; UINT8 SlaveAddress; UINT8 TempData[MAX_TEMP_DATA]; BMC_STATUS BmcStatus; UINT64 ErrorStatus; UINT8 SoftErrorCount; UINT16 IpmiIoBase; PEI_IPMI_TRANSPORT_PPI IpmiTransportPpi; EFI_PEI_PPI_DESCRIPTOR PeiIpmiBmcDataDesc; } PEI_IPMI_BMC_INSTANCE_DATA; // // Structure of IPMI Command buffer // #define IPMI_COMMAND_HEADER_SIZE 2 typedef struct { UINT8 Lun : 2; UINT8 NetFunction : 6; UINT8 Command; UINT8 CommandData[MAX_TEMP_DATA - IPMI_COMMAND_HEADER_SIZE]; } IPMI_COMMAND; // // Structure of IPMI Command response buffer // #define IPMI_RESPONSE_HEADER_SIZE 3 typedef struct { UINT8 Lun : 2; UINT8 NetFunction : 6; UINT8 Command; UINT8 CompletionCode; UINT8 ResponseData[MAX_TEMP_DATA - IPMI_RESPONSE_HEADER_SIZE]; } IPMI_RESPONSE; #pragma pack() EFI_STATUS PeiIpmiSendCommandToBmc ( IN PEI_IPMI_TRANSPORT_PPI *This, IN UINT8 NetFunction, IN UINT8 Lun, IN UINT8 Command, IN UINT8 *CommandData, IN UINT8 CommandDataSize, IN OUT UINT8 *ResponseData, IN OUT UINT8 *ResponseDataSize, IN VOID *Context ) /*++ Routine Description: Send IPMI command to BMC Arguments: This - Pointer to IPMI protocol instance NetFunction - Net Function of command to send Lun - LUN of command to send Command - IPMI command to send CommandData - Pointer to command data buffer, if needed CommandDataSize - Size of command data buffer ResponseData - Pointer to response data buffer ResponseDataSize - Pointer to response data buffer size Context - Context Returns: EFI_INVALID_PARAMETER - One of the input values is bad EFI_DEVICE_ERROR - IPMI command failed EFI_BUFFER_TOO_SMALL - Response buffer is too small EFI_SUCCESS - Command completed successfully --*/ ; EFI_STATUS PeiIpmiBmcStatus ( IN PEI_IPMI_TRANSPORT_PPI *This, OUT BMC_STATUS *BmcStatus, OUT SM_COM_ADDRESS *ComAddress, IN VOID *Context ) /*++ Routine Description: Updates the BMC status and returns the Com Address Arguments: This - Pointer to IPMI protocol instance BmcStatus - BMC status ComAddress - Com Address Context - Context Returns: EFI_SUCCESS - Success --*/ ; #endif //_PEI_IPMI_COMMON_BMC_H_