| /* |
| * CXL CDAT Structure |
| * |
| * Copyright (C) 2021 Avery Design Systems, Inc. |
| * |
| * This work is licensed under the terms of the GNU GPL, version 2 or later. |
| * See the COPYING file in the top-level directory. |
| */ |
| |
| #ifndef CXL_CDAT_H |
| #define CXL_CDAT_H |
| |
| #include "hw/cxl/cxl_pci.h" |
| #include "hw/pci/pcie_doe.h" |
| |
| /* |
| * Reference: |
| * Coherent Device Attribute Table (CDAT) Specification, Rev. 1.03, July. 2022 |
| * Compute Express Link (CXL) Specification, Rev. 3.1, Aug. 2023 |
| */ |
| /* Table Access DOE - CXL r3.1 8.1.11 */ |
| #define CXL_DOE_TABLE_ACCESS 2 |
| #define CXL_DOE_PROTOCOL_CDAT ((CXL_DOE_TABLE_ACCESS << 16) | CXL_VENDOR_ID) |
| |
| /* Read Entry - CXL r3.1 8.1.11.1 */ |
| #define CXL_DOE_TAB_TYPE_CDAT 0 |
| #define CXL_DOE_TAB_ENT_MAX 0xFFFF |
| |
| /* Read Entry Request - CXL r3.1 8.1.11.1 Table 8-13 */ |
| #define CXL_DOE_TAB_REQ 0 |
| typedef struct CDATReq { |
| DOEHeader header; |
| uint8_t req_code; |
| uint8_t table_type; |
| uint16_t entry_handle; |
| } QEMU_PACKED CDATReq; |
| |
| /* Read Entry Response - CXL r3.1 8.1.11.1 Table 8-14 */ |
| #define CXL_DOE_TAB_RSP 0 |
| typedef struct CDATRsp { |
| DOEHeader header; |
| uint8_t rsp_code; |
| uint8_t table_type; |
| uint16_t entry_handle; |
| } QEMU_PACKED CDATRsp; |
| |
| /* CDAT Table Format - CDAT Table 1 */ |
| #define CXL_CDAT_REV 2 |
| typedef struct CDATTableHeader { |
| uint32_t length; |
| uint8_t revision; |
| uint8_t checksum; |
| uint8_t reserved[6]; |
| uint32_t sequence; |
| } QEMU_PACKED CDATTableHeader; |
| |
| /* CDAT Structure Types - CDAT Table 2 */ |
| typedef enum { |
| CDAT_TYPE_DSMAS = 0, |
| CDAT_TYPE_DSLBIS = 1, |
| CDAT_TYPE_DSMSCIS = 2, |
| CDAT_TYPE_DSIS = 3, |
| CDAT_TYPE_DSEMTS = 4, |
| CDAT_TYPE_SSLBIS = 5, |
| } CDATType; |
| |
| typedef struct CDATSubHeader { |
| uint8_t type; |
| uint8_t reserved; |
| uint16_t length; |
| } CDATSubHeader; |
| |
| /* Device Scoped Memory Affinity Structure - CDAT Table 3 */ |
| typedef struct CDATDsmas { |
| CDATSubHeader header; |
| uint8_t DSMADhandle; |
| uint8_t flags; |
| #define CDAT_DSMAS_FLAG_NV (1 << 2) |
| #define CDAT_DSMAS_FLAG_SHAREABLE (1 << 3) |
| #define CDAT_DSMAS_FLAG_HW_COHERENT (1 << 4) |
| #define CDAT_DSMAS_FLAG_DYNAMIC_CAP (1 << 5) |
| uint16_t reserved; |
| uint64_t DPA_base; |
| uint64_t DPA_length; |
| } CDATDsmas; |
| QEMU_BUILD_BUG_ON(sizeof(CDATDsmas) != 24); |
| |
| /* Device Scoped Latency and Bandwidth Information Structure - CDAT Table 5 */ |
| typedef struct CDATDslbis { |
| CDATSubHeader header; |
| uint8_t handle; |
| /* Definitions of these fields refer directly to HMAT fields */ |
| uint8_t flags; |
| uint8_t data_type; |
| uint8_t reserved; |
| uint64_t entry_base_unit; |
| uint16_t entry[3]; |
| uint16_t reserved2; |
| } CDATDslbis; |
| QEMU_BUILD_BUG_ON(sizeof(CDATDslbis) != 24); |
| |
| /* Device Scoped Memory Side Cache Information Structure - CDAT Table 6 */ |
| typedef struct CDATDsmscis { |
| CDATSubHeader header; |
| uint8_t DSMAS_handle; |
| uint8_t reserved[3]; |
| uint64_t memory_side_cache_size; |
| uint32_t cache_attributes; |
| } QEMU_PACKED CDATDsmscis; |
| |
| /* Device Scoped Initiator Structure - CDAT Table 7 */ |
| typedef struct CDATDsis { |
| CDATSubHeader header; |
| uint8_t flags; |
| uint8_t handle; |
| uint16_t reserved; |
| } QEMU_PACKED CDATDsis; |
| |
| /* Device Scoped EFI Memory Type Structure - CDAT Table 8 */ |
| typedef struct CDATDsemts { |
| CDATSubHeader header; |
| uint8_t DSMAS_handle; |
| uint8_t EFI_memory_type_attr; |
| uint16_t reserved; |
| uint64_t DPA_offset; |
| uint64_t DPA_length; |
| } CDATDsemts; |
| QEMU_BUILD_BUG_ON(sizeof(CDATDsemts) != 24); |
| |
| /* Switch Scoped Latency and Bandwidth Information Structure - CDAT Table 9 */ |
| typedef struct CDATSslbisHeader { |
| CDATSubHeader header; |
| uint8_t data_type; |
| uint8_t reserved[3]; |
| uint64_t entry_base_unit; |
| } CDATSslbisHeader; |
| QEMU_BUILD_BUG_ON(sizeof(CDATSslbisHeader) != 16); |
| |
| #define CDAT_PORT_ID_USP 0x100 |
| /* Switch Scoped Latency and Bandwidth Entry - CDAT Table 10 */ |
| typedef struct CDATSslbe { |
| uint16_t port_x_id; |
| uint16_t port_y_id; |
| uint16_t latency_bandwidth; |
| uint16_t reserved; |
| } CDATSslbe; |
| QEMU_BUILD_BUG_ON(sizeof(CDATSslbe) != 8); |
| |
| typedef struct CDATSslbis { |
| CDATSslbisHeader sslbis_header; |
| CDATSslbe sslbe[]; |
| } CDATSslbis; |
| |
| typedef struct CDATEntry { |
| void *base; |
| uint32_t length; |
| } CDATEntry; |
| |
| typedef struct CDATObject { |
| CDATEntry *entry; |
| int entry_len; |
| |
| int (*build_cdat_table)(CDATSubHeader ***cdat_table, void *priv); |
| void (*free_cdat_table)(CDATSubHeader **cdat_table, int num, void *priv); |
| bool to_update; |
| void *private; |
| char *filename; |
| uint8_t *buf; |
| struct CDATSubHeader **built_buf; |
| int built_buf_len; |
| } CDATObject; |
| #endif /* CXL_CDAT_H */ |