blob: 30f9eb05f119f8ae5b6adc1fdb58875a0d82708e [file]
/** @file
EFI CXL I/O Protocol provides the interfaces to interact with the CXL-specific
subsystems of CXL devices. Other interactions with CXL devices should be
routed through EFI_PCI_IO_PROTOCOL
Copyright (c) 2026, Google, LLC. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef __CXL_IO_H__
#define __CXL_IO_H__
#include <Uefi/UefiBaseType.h>
#include "IndustryStandard/Cxl20.h"
#include "Protocol/PciIo.h"
#include <IndustryStandard/Cxl.h>
#include <IndustryStandard/CxlCdat.h>
///
/// Global ID for the CXL I/O Protocol
///
// 8fac60b2-bbc1-41de-a797-9875cdd3a8f8
#define EDKII_CXL_IO_PROTOCOL_GUID \
{ \
0x8fac60b2, 0xbbc1, 0x41de, {0xa7, 0x97, 0x98, 0x75, 0xcd, 0xd3, 0xa8, 0xf8 } \
}
typedef struct _EDKII_CXL_IO_PROTOCOL EDKII_CXL_IO_PROTOCOL;
/**
Performs a CXL DOE transaction.
@param This A pointer to the EDKII_CXL_IO_PROTOCOL instance.
@param RequestBuffer Payload of the request. This buffer should contain anything needed
for the DOE request beyond the standard 2 DWORD header. If not extra
data is required, this may be NULL.
@param RequestBufferSize Size of the request buffer in bytes. If RequestBuffer is NULL,
RequestBufferSize must be 0.
@param ResponseBuffer Destination buffer for the response.
@param ResponseBufferSize As an input parameter, the maximum size of the buffer.
As an output parameter, the actual size of the response.
@retval EFI_SUCCESS The data was read from or written to the CXL controller.
@retval EFI_UNSUPPORTED This device does not support DOE.
@retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.
@retval EFI_INVALID_PARAMETER One or more parameters are invalid.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_CXL_IO_PROTOCOL_IO_DOE_TRANSACT)(
IN EDKII_CXL_IO_PROTOCOL *This,
IN CONST VOID *RequestBuffer,
IN UINTN RequestBufferSize,
OUT VOID *ResponseBuffer,
IN OUT UINTN *ResponseBufferSize
);
/**
Transacts a set of regblock registers.
@param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
@param[in] RegBlock The type of regblock regs.
@param[in] Offset Offset from the start of the regblock.
@param[in, out] Buf The bufer to write or fill.
@param[in] Size The size of the buffer.
@retval EFI_SUCCESS All bytes were written or read successfully.
@retval other Something went wrong.
*/
typedef
EFI_STATUS
(EFIAPI *EDKII_CXL_IO_PROTOCOL_IO_REGBLOCK)(
IN EDKII_CXL_IO_PROTOCOL *This,
IN UINT32 RegBlock,
IN UINT64 Offset,
IN VOID *Buf,
IN UINTN Size
);
typedef struct {
///
/// Read CXL DVSEC.
///
EDKII_CXL_IO_PROTOCOL_IO_REGBLOCK Read;
///
/// Write CXL DVSEC.
///
EDKII_CXL_IO_PROTOCOL_IO_REGBLOCK Write;
} EDKII_CXL_IO_PROTOCOL_REGBLOCK_ACCESS;
/**
Reads a set of DVSEC registers.
@param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
@param[in] CxlDvsecId The DVSEC to read or write. See #defines prefixed with CXL_DVSEC_ID_.
@param[in] Offset Offset from the start of the DVSEC.
@param[in, out] Buf The buffer to write or fill.
@param[in] Size The size of the buffer.
@retval EFI_SUCCESS All bytes were written or read successfully.
@retval other Something went wrong.
*/
typedef
EFI_STATUS
(EFIAPI *EDKII_CXL_IO_PROTOCOL_IO_DVSEC)(
IN EDKII_CXL_IO_PROTOCOL *This,
IN UINT32 CxlDvsecId,
IN UINT32 Offset,
IN VOID *Buf,
IN UINTN Size
);
typedef struct {
///
/// Read CXL DVSEC.
///
EDKII_CXL_IO_PROTOCOL_IO_DVSEC Read;
///
/// Write CXL DVSEC.
///
EDKII_CXL_IO_PROTOCOL_IO_DVSEC Write;
} EDKII_CXL_IO_PROTOCOL_DVSEC_ACCESS;
///
/// EFI CXL I/O Protocol provides the interfaces to interact with the CXL-specific
/// subsystems of CXL devices. Other interactions with CXL devices should be
/// routed through EFI_PCI_IO_PROTOCOL.
///
struct _EDKII_CXL_IO_PROTOCOL {
///
/// Access to the associated PciIo protocol for this CXL device.
///
EFI_PCI_IO_PROTOCOL *PciIo;
///
/// Data object exchange request-response transaction.
///
EDKII_CXL_IO_PROTOCOL_IO_DOE_TRANSACT DoeTransact;
///
/// Regblock register getter/setter.
///
EDKII_CXL_IO_PROTOCOL_REGBLOCK_ACCESS Regblock;
///
/// DVSEC register getter/setter.
///
EDKII_CXL_IO_PROTOCOL_DVSEC_ACCESS Dvsec;
};
extern EFI_GUID gEdkiiCxlIoProtocolGuid;
#endif