/** @file
KCS Transport Hook head file.
@copyright
Copyright 1999 - 2021 Intel Corporation.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef _KCS_BMC_H
#define _KCS_BMC_H
#include
#include
#include
#include
#define KCS_WRITE_START 0x61
#define KCS_WRITE_END 0x62
#define KCS_READ 0x68
#define KCS_GET_STATUS 0x60
#define KCS_ABORT 0x60
#define KCS_DELAY_UNIT 50 // [s] Each KSC IO delay
//
// In OpenBMC, UpdateMode: the bit 7 of byte 4 in get device id command is used for the BMC status:
// 0 means BMC is ready, 1 means BMC is not ready.
// At the very beginning of BMC power on, the status is 1 means BMC is in booting process and not ready. It is not the flag for force update mode.
//
#define BMC_READY 0
#define KCS_ABORT_RETRY_COUNT 1
//#define TIMEOUT64(a,b) ((INT64)((b) - (a)) < 0)
typedef enum {
KcsIdleState,
KcsReadState,
KcsWriteState,
KcsErrorState
} KCS_STATE;
typedef union {
UINT8 RawData;
struct {
UINT8 Obf : 1;
UINT8 Ibf : 1;
UINT8 SmAtn : 1;
UINT8 CD : 1;
UINT8 Oem1 : 1;
UINT8 Oem2 : 1;
UINT8 State : 2;
} Status;
} KCS_STATUS;
//
//External Fucntion List
//
EFI_STATUS
SendDataToBmcPort (
UINT64 KcsTimeoutPeriod,
UINT16 KcsPort,
VOID *Context,
UINT8 *Data,
UINT8 DataSize
)
/*++
Routine Description:
Send data to BMC
Arguments:
IpmiInstance - The pointer of IPMI_BMC_INSTANCE_DATA
Context - The context of this operation
Data - The data pointer to be sent
DataSize - The data size
Returns:
EFI_SUCCESS - Send out the data successfully
--*/
;
EFI_STATUS
ReceiveBmcDataFromPort (
UINT64 KcsTimeoutPeriod,
UINT16 KcsPort,
VOID *Context,
UINT8 *Data,
UINT8 *DataSize
)
/*++
Routine Description:
Routine Description:
Receive data from BMC
Arguments:
IpmiInstance - The pointer of IPMI_BMC_INSTANCE_DATA
Context - The context of this operation
Data - The buffer pointer
DataSize - The buffer size
Returns:
EFI_SUCCESS - Received data successfully
--*/
;
//
//Internal Fucntion List
//
EFI_STATUS
KcsErrorExit (
UINT64 KcsTimeoutPeriod,
UINT16 KcsPort,
VOID *Context
)
/*++
Routine Description:
Check the KCS error status
Arguments:
IpmiInstance - The pointer of IPMI_BMC_INSTANCE_DATA
KcsPort - The base port of KCS
Context - The Context for this operation
Returns:
EFI_DEVICE_ERROR - The device error happened
EFI_SUCCESS - Successfully check the KCS error status
--*/
;
EFI_STATUS
KcsCheckStatus (
UINT64 KcsTimeoutPeriod,
UINT16 KcsPort,
KCS_STATE KcsState,
BOOLEAN *Idle,
VOID *Context
)
/*++
Routine Description:
Ckeck KCS status
Arguments:
IpmiInstance - The pointer of IPMI_BMC_INSTANCE_DATA
KcsPort - The base port of KCS
KcsState - The state of KCS to be checked
Idle - If the KCS is idle
Context - The context for this operation
Returns:
EFI_SUCCESS - Checked the KCS status successfully
--*/
;
EFI_STATUS
SendDataToBmc (
UINT64 KcsTimeoutPeriod,
UINT16 KcsPort,
VOID *Context,
UINT8 *Data,
UINT8 DataSize
)
/*++
Routine Description:
Send data to BMC
Arguments:
IpmiInstance - The pointer of IPMI_BMC_INSTANCE_DATA
Context - The context of this operation
Data - The data pointer to be sent
DataSize - The data size
Returns:
EFI_SUCCESS - Send out the data successfully
--*/
;
EFI_STATUS
ReceiveBmcData (
UINT64 KcsTimeoutPeriod,
UINT16 KcsPort,
VOID *Context,
UINT8 *Data,
UINT8 *DataSize
)
/*++
Routine Description:
Routine Description:
Receive data from BMC
Arguments:
IpmiInstance - The pointer of IPMI_BMC_INSTANCE_DATA
Context - The context of this operation
Data - The buffer pointer
DataSize - The buffer size
Returns:
EFI_SUCCESS - Received data successfully
--*/
;
#endif