diff --git a/MdePkg/Include/IndustryStandard/CxlCdat.h b/MdePkg/Include/IndustryStandard/CxlCdat.h new file mode 100644 index 0000000000..2f3e899ee5 --- /dev/null +++ b/MdePkg/Include/IndustryStandard/CxlCdat.h @@ -0,0 +1,149 @@ +/** @file + CXL CDAT structure definitions + + This file contains the structure definitions based on the + Coherent Device Attribute Table (CDAT) Specification 1.01 + + Copyright (c) 2026, Google LLC. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#pragma once + +/// +/// Definition for the CDAT Header. +/// Coherent Device Attribute Table 1.01 Specification. +/// +typedef struct { + UINT32 Length; // Length of the enture table in bytes. + UINT8 Revision; // Must be 1. + UINT8 Checksum; // Checksum value that results in sum of 0. + UINT8 Reserved[6]; + UINT32 Sequence; // Sequence number to indicate changes in sub tables. +} CXL_CDAT_HEADER; + +typedef struct { + CXL_CDAT_HEADER Header; + /// Subtables, each beginning with CXL_CDAT_COMMON_SUBTABLE_HEADER. + UINT8 Data[]; +} CXL_CDAT_STRUCTURE; + +/// +/// CDAT Structure Types. +/// Coherent Device Attribute Table 1.01 Specification. +/// +typedef enum { + CxlCdatTypeDsmas = 0, + CxlCdatTypeDslbis = 1, + CxlCdatTypeDsmscis = 2, + CxlCdatTypeDsis = 3, + CxlCdatTypeDsemts = 4, + CxlCdatTypeSslbis = 5, +} CXL_CDAT_TYPE; + +typedef struct { + UINT8 Type; // CXL_CDAT_TYPE type. + UINT8 Reserved; + UINT16 Length; // Length of only the subtable in bytes. +} CXL_CDAT_COMMON_SUBTABLE_HEADER; + +/// +/// Definition for the Device Scoped Memory Affinity Structure (DSMAS). +/// Coherent Device Attribute Table 1.01 Specification. +/// +/// The DSMAS table contains handles to Device Scoped Memory Affinity Domains +/// (DSMAD, not a typo of DSMAS). A DSMAD is a contiguous Device Physical +/// Address (DPA) range that should be treated as a distinct memory proximity +/// domain. +/// +/// Host-side software is expected to map either: +/// * a non-interleaved DSMAD handle to a single SRAT proximity domain; or +/// * an interleaved set of DSMAD handles to a single SRAT proximity domain. +/// +typedef struct { + CXL_CDAT_COMMON_SUBTABLE_HEADER Header; + UINT8 DsmadHandle; + UINT8 Flags; + UINT8 Reserved[2]; + UINT64 DpaBase; + UINT64 DpaLength; +} CXL_CDAT_DEVICE_SCOPED_MEMORY_AFFINITY_STRUCTURE; + +/// +/// Definition for the Device Scoped Memory Latency and Bandwidth Structure. +/// Coherent Device Attribute Table 1.01 Specification. +/// +typedef struct { + CXL_CDAT_COMMON_SUBTABLE_HEADER Header; + UINT8 Handle; + UINT8 Flags; + UINT8 DataType; + UINT8 Reserved0; + UINT64 EntryBaseUnit; + UINT16 Entry[3]; // See the spec for a full definition of this field. + UINT8 Reserved1[2]; +} CXL_CDAT_DEVICE_SCOPED_LAT_BW_STRUCTURE; + +/// +/// Definition for the Device Scoped Memory Side Cache Information Structure +/// Coherent Device Attribute Table 1.01 Specification. +/// +typedef struct { + CXL_CDAT_COMMON_SUBTABLE_HEADER Header; + UINT8 DsmasHandle; + UINT8 Flags; + UINT8 Reserved[3]; + UINT64 MemorySideCacheSize; + UINT32 CacheAttributes; +} CXL_CDAT_DEVICE_SCOPED_MEMORY_SIDE_CACHE_INFO_STRUCTURE; + +/// +/// Definition for the Device Scoped Initiator Structure +/// Coherent Device Attribute Table 1.01 Specification. +/// +typedef struct { + CXL_CDAT_COMMON_SUBTABLE_HEADER Header; + UINT8 Flags; + UINT8 Handle; + UINT8 Reserved[2]; +} CXL_CDAT_DEVICE_SCOPED_INITIATOR_STRUCTURE; + +typedef enum { + CxlCdatEfiConventionalMemory = 0, + CxlCdatEfiConventionalMemorySp = 1, + CxlCdatEfiReservedMemory = 2, +} CXL_CDAT_EFI_MEMORY_TYPE; + +/// +/// Definition for the Device Scoped EFI Memory Type Structure +/// Coherent Device Attribute Table 1.01 Specification. +/// +typedef struct { + CXL_CDAT_COMMON_SUBTABLE_HEADER Header; + UINT8 DsmasHandle; + UINT8 EfiMemoryType; + UINT8 Reserved[2]; + UINT64 DpaOffset; + UINT64 DpaLength; +} CXL_CDAT_DEVICE_SCOPED_EFI_MEMORY_TYPE_STRUCTURE; + +/// +/// Definition for the Switch Scoped Latency and Bandwidth Information Structure +/// Coherent Device Attribute Table 1.01 Specification. +/// +typedef struct { + UINT16 PortXId; + UINT16 PortYId; + UINT16 LatOrBw; + UINT16 Reserved; +} CXL_CDAT_SSLBE_ENTRY; + +typedef struct { + CXL_CDAT_COMMON_SUBTABLE_HEADER Header; + UINT8 DataType; + UINT8 Reserved[3]; + UINT64 EntryBaseUnit; + CXL_CDAT_SSLBE_ENTRY Entry[]; +} CXL_CDAT_SWITCH_SCOPED_LAT_BW_INFO_STRUCTURE;