/** @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_