blob: 33787de54e17f2b93938d65b8b9878f95518c0be [file]
/** @file
IPMI Blob Transfer driver
Copyright (c) 2022-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
@par https://github.com/openbmc/phosphor-ipmi-blobs/blob/master/README.md
**/
#pragma once
#include <Library/IpmiLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <IndustryStandard/Ipmi.h>
#include <IndustryStandard/IpmiNetFnOem.h>
#define IPMI_OEM_BLOB_TRANSFER_CMD 0x80
#define BLOB_MAX_DATA_PER_PACKET 64
#define BLOB_TRANSFER_STAT_OPEN_R BIT0
#define BLOB_TRANSFER_STAT_OPEN_W BIT1
#define BLOB_TRANSFER_STAT_COMMITING BIT2
#define BLOB_TRANSFER_STAT_COMMITTED BIT3
#define BLOB_TRANSFER_STAT_COMMIT_ERROR BIT4
// Bits 5-7 are reserved
// Bits 8-15 are blob-specific definitions
//
// Blob Transfer Function Prototypes
//
/**
This function retrieves the count of blob transfers available through the IPMI.
@param[out] Count The number of active blobs
@retval EFI_SUCCESS Successfully retrieved the number of active blobs.
@retval Other An error occurred
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_IPMI_BLOB_TRANSFER_PROTOCOL_GET_COUNT)(
OUT UINT32 *Count
);
/**
This function enumerates blob transfers available through the IPMI.
@param[in] BlobIndex The 0-based Index of the blob to enumerate
@param[out] BlobId The ID of the blob
@retval EFI_SUCCESS Successfully enumerated the blob.
@retval Other An error occurred
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_IPMI_BLOB_TRANSFER_PROTOCOL_ENUMERATE)(
IN UINT32 BlobIndex,
OUT CHAR8 *BlobId
);
/**
This function is designed to open a session for a specific blob
identified by its ID, using the IPMI.
@param[in] BlobId The ID of the blob to open
@param[in] Flags Flags to control how the blob is opened
Available flags are:
BLOB_TRANSFER_STAT_OPEN_R
BLOB_TRANSFER_STAT_OPEN_W
BLOB_TRANSFER_STAT_COMMITING
BLOB_TRANSFER_STAT_COMMITTED
BLOB_TRANSFER_STAT_COMMIT_ERROR
@param[out] SessionId A unique session identifier
@retval EFI_SUCCESS Successfully opened the blob.
@retval Other An error occurred
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_IPMI_BLOB_TRANSFER_PROTOCOL_OPEN)(
IN CHAR8 *BlobId,
IN UINT16 Flags,
OUT UINT16 *SessionId
);
/**
This function reads data from a blob over the IPMI.
@param[in] SessionId The session ID returned from a call to BlobOpen
@param[in] Offset The offset of the blob from which to start reading
@param[in] RequestedSize The length of data to read
@param[out] Data Data read from the blob
@retval EFI_SUCCESS Successfully read from the blob.
@retval EFI_BAD_BUFFER_SIZE RequestedSize is bigger than BLOB_MAX_DATA_PER_PACKET
@retval Other An error occurred
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_IPMI_BLOB_TRANSFER_PROTOCOL_READ)(
IN UINT16 SessionId,
IN UINT32 Offset,
IN UINT32 RequestedSize,
OUT UINT8 *Data
);
/**
This function writes data to a blob over the IPMI.
@param[in] SessionId The session ID returned from a call to BlobOpen
@param[in] Offset The offset of the blob from which to start writing
@param[in] Data A pointer to the data to write
@param[in] WriteLength The length to write
@retval EFI_SUCCESS Successfully wrote to the blob.
@retval EFI_BAD_BUFFER_SIZE WriteLength is bigger than BLOB_MAX_DATA_PER_PACKET
@retval Other An error occurred
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_IPMI_BLOB_TRANSFER_PROTOCOL_WRITE)(
IN UINT16 SessionId,
IN UINT32 Offset,
IN UINT8 *Data,
IN UINT32 WriteLength
);
/**
This function commits data to a blob over the IPMI.
@param[in] SessionId The session ID returned from a call to BlobOpen
@param[in] CommitDataLength The length of data to commit to the blob
@param[in] CommitData A pointer to the data to commit. This is optional.
@retval EFI_SUCCESS Successful commit to the blob.
@retval Other An error occurred
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_IPMI_BLOB_TRANSFER_PROTOCOL_COMMIT)(
IN UINT16 SessionId,
IN UINT8 CommitDataLength,
IN UINT8 *CommitData OPTIONAL
);
/**
This function close a session associated with a blob transfer over the IPMI.
@param[in] SessionId The session ID returned from a call to BlobOpen
@retval EFI_SUCCESS The blob was closed.
@retval Other An error occurred
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_IPMI_BLOB_TRANSFER_PROTOCOL_CLOSE)(
IN UINT16 SessionId
);
/**
This function deletes a specific blob identified by its ID over the IPMI.
@param[in] BlobId The BlobId to be deleted
@retval EFI_SUCCESS The blob was deleted.
@retval Other An error occurred
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_IPMI_BLOB_TRANSFER_PROTOCOL_DELETE)(
IN CHAR8 *BlobId
);
/**
This function retrieve the status of a specific blob identified by BlobId from an IPMI.
@param[in] BlobId The Blob ID to gather statistics for
@param[out] BlobState The current state of the blob
@param[out] Size Size in bytes of the blob. This is optional.
@param[out] MetadataLength Length of the optional metadata
@param[out] Metadata Optional blob-specific metadata
@retval EFI_SUCCESS The blob statistics were successfully gathered.
@retval Other An error occurred
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_IPMI_BLOB_TRANSFER_PROTOCOL_STAT)(
IN CHAR8 *BlobId,
OUT UINT16 *BlobState,
OUT UINT32 *Size OPTIONAL,
OUT UINT8 *MetadataLength OPTIONAL,
OUT UINT8 *Metadata OPTIONAL
);
/**
This function query the status of a blob transfer session in an IPMI.
@param[in] SessionId The ID of the session to gather statistics for
@param[out] BlobState The current state of the blob
@param[out] Size Size in bytes of the blob. This is optional.
@param[out] MetadataLength Length of the optional metadata
@param[out] Metadata Optional blob-specific metadata
@retval EFI_SUCCESS The blob statistics were successfully gathered.
@retval Other An error occurred
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_IPMI_BLOB_TRANSFER_PROTOCOL_SESSION_STAT)(
IN UINT16 SessionId,
OUT UINT16 *BlobState,
OUT UINT32 *Size OPTIONAL,
OUT UINT8 *MetadataLength OPTIONAL,
OUT UINT8 *Metadata OPTIONAL
);
/**
This function writes metadata to a blob associated with a session in an IPMI.
@param[in] SessionId The ID of the session to write metadata for
@param[in] Offset The offset of the metadata to write to
@param[in] Data The data to write to the metadata
@param[in] WriteLength The length to write
@retval EFI_SUCCESS The blob metadata was successfully written.
@retval EFI_BAD_BUFFER_SIZE WriteLength is bigger than BLOB_MAX_DATA_PER_PACKET
@retval Other An error occurred
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_IPMI_BLOB_TRANSFER_PROTOCOL_WRITE_META)(
IN UINT16 SessionId,
IN UINT32 Offset,
IN UINT8 *Data,
IN UINT32 WriteLength
);
//
// Structure of EDKII_IPMI_BLOB_TRANSFER_PROTOCOL
//
struct _EDKII_IPMI_BLOB_TRANSFER_PROTOCOL {
EDKII_IPMI_BLOB_TRANSFER_PROTOCOL_GET_COUNT BlobGetCount;
EDKII_IPMI_BLOB_TRANSFER_PROTOCOL_ENUMERATE BlobEnumerate;
EDKII_IPMI_BLOB_TRANSFER_PROTOCOL_OPEN BlobOpen;
EDKII_IPMI_BLOB_TRANSFER_PROTOCOL_READ BlobRead;
EDKII_IPMI_BLOB_TRANSFER_PROTOCOL_WRITE BlobWrite;
EDKII_IPMI_BLOB_TRANSFER_PROTOCOL_COMMIT BlobCommit;
EDKII_IPMI_BLOB_TRANSFER_PROTOCOL_CLOSE BlobClose;
EDKII_IPMI_BLOB_TRANSFER_PROTOCOL_DELETE BlobDelete;
EDKII_IPMI_BLOB_TRANSFER_PROTOCOL_STAT BlobStat;
EDKII_IPMI_BLOB_TRANSFER_PROTOCOL_SESSION_STAT BlobSessionStat;
EDKII_IPMI_BLOB_TRANSFER_PROTOCOL_WRITE_META BlobWriteMeta;
};
typedef struct _EDKII_IPMI_BLOB_TRANSFER_PROTOCOL EDKII_IPMI_BLOB_TRANSFER_PROTOCOL;
extern EFI_GUID gEdkiiIpmiBlobTransferProtocolGuid;