blob: 0f21ae3af1ea6029d66024ab50587f7cebbdc489 [file]
/** @file
This file defines the manageability transport interface library and functions.
Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR>
Copyright (c) 2024, Ampere Computing LLC. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef MANAGEABILITY_TRANSPORT_LIB_H_
#define MANAGEABILITY_TRANSPORT_LIB_H_
#define MANAGEABILITY_TRANSPORT_TOKEN_VERSION_MAJOR 1
#define MANAGEABILITY_TRANSPORT_TOKEN_VERSION_MINOR 0
#define MANAGEABILITY_TRANSPORT_TOKEN_VERSION ((MANAGEABILITY_TRANSPORT_TOKEN_VERSION_MAJOR << 8) |\
MANAGEABILITY_TRANSPORT_TOKEN_VERSION_MINOR)
#define MANAGEABILITY_TRANSPORT_PAYLOAD_SIZE_FROM_CAPABILITY(a) (1 << ((a & MANAGEABILITY_TRANSPORT_CAPABILITY_MAXIMUM_PAYLOAD_MASK) >>\
MANAGEABILITY_TRANSPORT_CAPABILITY_MAXIMUM_PAYLOAD_BIT_POSITION))
typedef struct _MANAGEABILITY_TRANSPORT_FUNCTION_V1_0 MANAGEABILITY_TRANSPORT_FUNCTION_V1_0;
typedef struct _MANAGEABILITY_TRANSPORT MANAGEABILITY_TRANSPORT;
typedef struct _MANAGEABILITY_TRANSPORT_TOKEN MANAGEABILITY_TRANSPORT_TOKEN;
typedef struct _MANAGEABILITY_TRANSFER_TOKEN MANAGEABILITY_TRANSFER_TOKEN;
///
/// Optional transport header and trailer required
/// for the transport interface.
///
typedef VOID *MANAGEABILITY_TRANSPORT_HEADER;
typedef VOID *MANAGEABILITY_TRANSPORT_TRAILER;
///
/// The transport interface specific hardware information.
///
typedef union {
UINT16 IoAddress16;
UINT32 IoAddress32;
} MANAGEABILITY_TRANSPORT_HARDWARE_IO;
///
/// Manageability KCS protocol interface hardware information.
///
typedef struct {
BOOLEAN MemoryMap;
MANAGEABILITY_TRANSPORT_HARDWARE_IO IoBaseAddress;
MANAGEABILITY_TRANSPORT_HARDWARE_IO IoDataInAddress;
MANAGEABILITY_TRANSPORT_HARDWARE_IO IoDataOutAddress;
MANAGEABILITY_TRANSPORT_HARDWARE_IO IoCommandAddress;
MANAGEABILITY_TRANSPORT_HARDWARE_IO IoStatusAddress;
} MANAGEABILITY_TRANSPORT_KCS_HARDWARE_INFO;
#define MANAGEABILITY_TRANSPORT_KCS_IO_MAP_IO FALSE
#define MANAGEABILITY_TRANSPORT_KCS_MEMORY_MAP_IO TRUE
///
/// Manageability SSIF protocol interface hardware information
///
typedef struct {
UINT32 BmcSlaveAddress;
} MANAGEABILITY_TRANSPORT_SSIF_HARDWARE_INFO;
///
/// Manageability Serial protocol interface hardware information.
///
typedef struct {
UINT8 IpmiRequesterAddress;
UINT8 IpmiResponderAddress;
UINT8 IpmiRequesterLUN;
UINT8 IpmiResponderLUN;
} MANAGEABILITY_TRANSPORT_SERIAL_HARDWARE_INFO;
typedef union {
VOID *Pointer;
MANAGEABILITY_TRANSPORT_KCS_HARDWARE_INFO *Kcs;
MANAGEABILITY_TRANSPORT_SSIF_HARDWARE_INFO *Ssif;
MANAGEABILITY_TRANSPORT_SERIAL_HARDWARE_INFO *Serial;
} MANAGEABILITY_TRANSPORT_HARDWARE_INFORMATION;
///
/// Additional transport interface status.
///
typedef UINT32 MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS;
#define MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS_NO_ERRORS 0x00000000
#define MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS_ERROR 0x00000001
#define MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS_BUSY_IN_READ 0x00000002
#define MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS_BUSY_IN_WRITE 0x00000004
#define MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS_INVALID_COMMAND 0x00000008
#define MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS_NOT_AVAILABLE 0xffffffff
///
/// Additional transport interface features.
///
typedef UINT32 MANAGEABILITY_TRANSPORT_CAPABILITY;
/// Bit 0
#define MANAGEABILITY_TRANSPORT_CAPABILITY_MULTIPLE_TRANSFER_TOKENS 0x00000001
/// Bit 1
#define MANAGEABILITY_TRANSPORT_CAPABILITY_ASYNCHRONOUS_TRANSFER 0x00000002
/// Bit 2 - Reserved
/// Bit 7:3 - Transport interface maximum payload size, which is (2 ^ bit[7:3] - 1)
/// bit[7:3] means no maximum payload.
#define MANAGEABILITY_TRANSPORT_CAPABILITY_MAXIMUM_PAYLOAD_MASK 0x000000f8
#define MANAGEABILITY_TRANSPORT_CAPABILITY_MAXIMUM_PAYLOAD_BIT_POSITION 3
#define MANAGEABILITY_TRANSPORT_CAPABILITY_MAXIMUM_PAYLOAD_NOT_AVAILABLE 0x00
/// Bit 8:31 - Reserved
///
/// Definitions of Manageability transport interface functions.
/// This is a union that can accommodate the new functions
/// introduced to the Manageability transport library in the future.
/// The new added function must has its own MANAGEABILITY_TRANSPORT_FUNCTION
/// structure with the incremental version number.
/// e.g., MANAGEABILITY_TRANSPORT_FUNCTION_V1_1.
///
/// The new function must be added base on the last version of
/// MANAGEABILITY_TRANSPORT_FUNCTION to keep the backward compatability.
///
typedef union {
MANAGEABILITY_TRANSPORT_FUNCTION_V1_0 *Version1_0;
} MANAGEABILITY_TRANSPORT_FUNCTION;
///
/// Manageability specification GUID/Name table structure
///
typedef struct {
EFI_GUID *SpecificationGuid;
CHAR16 *SpecificationName;
} MANAGEABILITY_SPECIFICATION_NAME;
///
/// Definitions of Transmit/Receive package
///
typedef struct {
UINT8 *TransmitPayload;
UINT32 TransmitSizeInByte;
UINT32 TransmitTimeoutInMillisecond;
} MANAGEABILITY_TRANSMIT_PACKAGE;
typedef struct {
UINT8 *ReceiveBuffer;
UINT32 ReceiveSizeInByte;
UINT32 TransmitTimeoutInMillisecond;
} MANAGEABILITY_RECEIVE_PACKAGE;
///
/// Definitions of Manageability transport interface.
///
struct _MANAGEABILITY_TRANSPORT {
EFI_GUID *ManageabilityTransportSpecification; ///< The Manageability Transport Interface spec.
UINT16 TransportVersion; ///< The version of transport interface
///< function that indicates which version
///< of MANAGEABILITY_TRANSPORT_FUNCTION
///< is unsupported by this library.
CHAR16 *TransportName; ///< Human readable string of
///< this transport interface.
MANAGEABILITY_TRANSPORT_FUNCTION Function; ///< Transport functions
};
///
/// Definitions of Manageability transport token.
///
struct _MANAGEABILITY_TRANSPORT_TOKEN {
EFI_GUID *ManageabilityProtocolSpecification; ///< The Manageability Protocol spec.
MANAGEABILITY_TRANSPORT *Transport;
};
#define MANAGEABILITY_TRANSPORT_NO_TIMEOUT 0
///
/// The Manageability transport receive token used to receive
/// the response from transport interface after transmitting the
/// request.
///
struct _MANAGEABILITY_TRANSFER_TOKEN {
EFI_EVENT ReceiveEvent; ///< The EFI event is created to
///< wait the signal for the readiness
///< of response data.
///< If NULL, transport library should
///< just return the response data in
///< ReceiveBuffer then the process returns
///< to caller. Otherwise the transport
///< library can signal event when the
///< response is ready for caller. That
///< means the transport library can
///< optionally implement the asynchronous
///< transfer mechanism or when the multiple
///< transport sessions are acquired.
MANAGEABILITY_TRANSPORT_HEADER TransmitHeader; ///< This is the transport-specific header
///< which is sent discretely of payload.
///< This field can be NULL if the transport
///< doesn't require this.
UINT16 TransmitHeaderSize; ///< Transmit header size in byte.
MANAGEABILITY_TRANSPORT_TRAILER TransmitTrailer; ///< This is the transport-specific trailer
///< which is sent discretely of payload.
///< This field can be NULL if the transport
///< doesn't require this.
UINT16 TransmitTrailerSize; ///< Transmit trailer size in byte.
MANAGEABILITY_TRANSMIT_PACKAGE TransmitPackage; ///< The payload sent to transport interface.
MANAGEABILITY_RECEIVE_PACKAGE ReceivePackage; ///< The buffer to receive the response.
EFI_STATUS TransferStatus; ///< The EFI Status of the transfer.
MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS TransportAdditionalStatus; ///< The additional status of transport
///< interface.
};
/**
This function acquires to create a transport session to transmit manageability
packet. A transport token is returned to caller for the follow up operations.
@param [in] ManageabilityProtocolSpec The protocol spec the transport interface is acquired for.
@param [out] TransportToken The pointer to receive the transport token created by
the target transport interface library.
@retval EFI_SUCCESS Token is created successfully.
@retval EFI_OUT_OF_RESOURCES Out of resource to create a new transport session.
@retval EFI_UNSUPPORTED Protocol is not supported on this transport interface.
@retval Otherwise Other errors.
**/
EFI_STATUS
AcquireTransportSession (
IN EFI_GUID *ManageabilityProtocolSpec,
OUT MANAGEABILITY_TRANSPORT_TOKEN **TransportToken
);
/**
This function returns the transport capabilities according to
the manageability protocol.
@param [in] TransportToken Transport token acquired from manageability
transport library.
@param [out] TransportFeature Pointer to receive transport capabilities.
See the definitions of
MANAGEABILITY_TRANSPORT_CAPABILITY.
@retval EFI_SUCCESS TransportCapability is returned successfully.
@retval EFI_INVALID_PARAMETER TransportToken is not a valid token.
**/
EFI_STATUS
GetTransportCapability (
IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken,
OUT MANAGEABILITY_TRANSPORT_CAPABILITY *TransportCapability
);
/**
This function releases the manageability transport session.
@param [in] TransportToken The transport token acquired through
AcquireTransportSession.
@retval EFI_SUCCESS Token is released successfully.
@retval EFI_INVALID_PARAMETER Invalid TransportToken.
@retval Otherwise Other errors.
**/
EFI_STATUS
ReleaseTransportSession (
IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken
);
/**
This function initializes the transport interface.
@param [in] TransportToken The transport token acquired through
AcquireTransportSession function.
@param [in] HardwareInfo This is the optional hardware information
assigned to this transport interface.
@retval EFI_SUCCESS Transport interface is initialized
successfully.
@retval EFI_INVALID_PARAMETER The invalid transport token.
@retval EFI_NOT_READY The transport interface works fine but
@retval is not ready.
@retval EFI_DEVICE_ERROR The transport interface has problems.
@retval EFI_ALREADY_STARTED Teh protocol interface has already initialized.
@retval Otherwise Other errors.
**/
typedef
EFI_STATUS
(EFIAPI *MANAGEABILITY_TRANSPORT_INIT)(
IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken,
IN MANAGEABILITY_TRANSPORT_HARDWARE_INFORMATION HardwareInfo OPTIONAL
);
/**
This function returns the transport interface status.
The generic EFI_STATUS is returned to caller directly, The additional
information of transport interface could be optionally returned in
TransportAdditionalStatus to describes the status that can't be
described obviously through EFI_STATUS.
See the definition of MANAGEABILITY_TRANSPORT_STATUS.
@param [in] TransportToken The transport token acquired through
AcquireTransportSession function.
@param [out] TransportAdditionalStatus The additional status of transport
interface.
NULL means no additional status of this
transport interface.
@retval EFI_SUCCESS Transport interface status is returned.
@retval EFI_INVALID_PARAMETER The invalid transport token.
@retval EFI_DEVICE_ERROR The transport interface has problems to return
@retval status.
Otherwise Other errors.
**/
typedef
EFI_STATUS
(EFIAPI *MANAGEABILITY_TRANSPORT_STATUS)(
IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken,
OUT MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS *TransportAdditionalStatus OPTIONAL
);
/**
This function resets the transport interface.
The generic EFI_STATUS is returned to caller directly after reseting transport
interface. The additional information of transport interface could be optionally
returned in TransportAdditionalStatus to describes the status that can't be
described obviously through EFI_STATUS.
See the definition of MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS.
@param [in] TransportToken The transport token acquired through
AcquireTransportSession function.
@param [out] TransportAdditionalStatus The additional status of specific transport
interface after the reset.
NULL means no additional status of this
transport interface.
@retval EFI_SUCCESS Transport interface status is returned.
@retval EFI_INVALID_PARAMETER The invalid transport token.
@retval EFI_TIMEOUT The reset process is time out.
@retval EFI_DEVICE_ERROR The transport interface has problems to return
status.
Otherwise Other errors.
**/
typedef
EFI_STATUS
(EFIAPI *MANAGEABILITY_TRANSPORT_RESET)(
IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken,
OUT MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS *TransportAdditionalStatus OPTIONAL
);
/**
This function transmit the request over target transport interface.
The generic EFI_STATUS is returned to caller directly after reseting transport
interface. The additional information of transport interface could be optionally
returned in TransportAdditionalStatus to describes the status that can't be
described obviously through EFI_STATUS.
See the definition of MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS.
@param [in] TransportToken The transport token acquired through
AcquireTransportSession function.
@param [in] TransferToken The transfer token, see the definition of
MANAGEABILITY_TRANSFER_TOKEN.
@retval The EFI status is returned in MANAGEABILITY_TRANSFER_TOKEN.
**/
typedef
VOID
(EFIAPI *MANAGEABILITY_TRANSPORT_TRANSMIT_RECEIVE)(
IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken,
IN MANAGEABILITY_TRANSFER_TOKEN *TransferToken
);
///
/// The first version of Manageability transport interface function.
///
struct _MANAGEABILITY_TRANSPORT_FUNCTION_V1_0 {
MANAGEABILITY_TRANSPORT_INIT TransportInit; ///< Initial the transport.
MANAGEABILITY_TRANSPORT_STATUS TransportStatus; ///< Get the transport status.
MANAGEABILITY_TRANSPORT_RESET TransportReset; ///< Reset the transport.
MANAGEABILITY_TRANSPORT_TRANSMIT_RECEIVE TransportTransmitReceive; ///< Transmit the packet over
///< transport and get the
///< response back.
};
#endif