1aba578bdSHuai-Cheng Kuo /* 2aba578bdSHuai-Cheng Kuo * CXL CDAT Structure 3aba578bdSHuai-Cheng Kuo * 4aba578bdSHuai-Cheng Kuo * Copyright (C) 2021 Avery Design Systems, Inc. 5aba578bdSHuai-Cheng Kuo * 6aba578bdSHuai-Cheng Kuo * This work is licensed under the terms of the GNU GPL, version 2 or later. 7aba578bdSHuai-Cheng Kuo * See the COPYING file in the top-level directory. 8aba578bdSHuai-Cheng Kuo */ 9aba578bdSHuai-Cheng Kuo 10aba578bdSHuai-Cheng Kuo #ifndef CXL_CDAT_H 11aba578bdSHuai-Cheng Kuo #define CXL_CDAT_H 12aba578bdSHuai-Cheng Kuo 13aba578bdSHuai-Cheng Kuo #include "hw/cxl/cxl_pci.h" 14674b0a57SMarkus Armbruster #include "hw/pci/pcie_doe.h" 15aba578bdSHuai-Cheng Kuo 16aba578bdSHuai-Cheng Kuo /* 17aba578bdSHuai-Cheng Kuo * Reference: 18aba578bdSHuai-Cheng Kuo * Coherent Device Attribute Table (CDAT) Specification, Rev. 1.03, July. 2022 198700ee15SJonathan Cameron * Compute Express Link (CXL) Specification, Rev. 3.1, Aug. 2023 20aba578bdSHuai-Cheng Kuo */ 218700ee15SJonathan Cameron /* Table Access DOE - CXL r3.1 8.1.11 */ 22aba578bdSHuai-Cheng Kuo #define CXL_DOE_TABLE_ACCESS 2 23aba578bdSHuai-Cheng Kuo #define CXL_DOE_PROTOCOL_CDAT ((CXL_DOE_TABLE_ACCESS << 16) | CXL_VENDOR_ID) 24aba578bdSHuai-Cheng Kuo 258700ee15SJonathan Cameron /* Read Entry - CXL r3.1 8.1.11.1 */ 26aba578bdSHuai-Cheng Kuo #define CXL_DOE_TAB_TYPE_CDAT 0 27aba578bdSHuai-Cheng Kuo #define CXL_DOE_TAB_ENT_MAX 0xFFFF 28aba578bdSHuai-Cheng Kuo 298700ee15SJonathan Cameron /* Read Entry Request - CXL r3.1 8.1.11.1 Table 8-13 */ 30aba578bdSHuai-Cheng Kuo #define CXL_DOE_TAB_REQ 0 31aba578bdSHuai-Cheng Kuo typedef struct CDATReq { 32aba578bdSHuai-Cheng Kuo DOEHeader header; 33aba578bdSHuai-Cheng Kuo uint8_t req_code; 34aba578bdSHuai-Cheng Kuo uint8_t table_type; 35aba578bdSHuai-Cheng Kuo uint16_t entry_handle; 36aba578bdSHuai-Cheng Kuo } QEMU_PACKED CDATReq; 37aba578bdSHuai-Cheng Kuo 388700ee15SJonathan Cameron /* Read Entry Response - CXL r3.1 8.1.11.1 Table 8-14 */ 39aba578bdSHuai-Cheng Kuo #define CXL_DOE_TAB_RSP 0 40aba578bdSHuai-Cheng Kuo typedef struct CDATRsp { 41aba578bdSHuai-Cheng Kuo DOEHeader header; 42aba578bdSHuai-Cheng Kuo uint8_t rsp_code; 43aba578bdSHuai-Cheng Kuo uint8_t table_type; 44aba578bdSHuai-Cheng Kuo uint16_t entry_handle; 45aba578bdSHuai-Cheng Kuo } QEMU_PACKED CDATRsp; 46aba578bdSHuai-Cheng Kuo 47aba578bdSHuai-Cheng Kuo /* CDAT Table Format - CDAT Table 1 */ 48aba578bdSHuai-Cheng Kuo #define CXL_CDAT_REV 2 49aba578bdSHuai-Cheng Kuo typedef struct CDATTableHeader { 50aba578bdSHuai-Cheng Kuo uint32_t length; 51aba578bdSHuai-Cheng Kuo uint8_t revision; 52aba578bdSHuai-Cheng Kuo uint8_t checksum; 53aba578bdSHuai-Cheng Kuo uint8_t reserved[6]; 54aba578bdSHuai-Cheng Kuo uint32_t sequence; 55aba578bdSHuai-Cheng Kuo } QEMU_PACKED CDATTableHeader; 56aba578bdSHuai-Cheng Kuo 57aba578bdSHuai-Cheng Kuo /* CDAT Structure Types - CDAT Table 2 */ 58aba578bdSHuai-Cheng Kuo typedef enum { 59aba578bdSHuai-Cheng Kuo CDAT_TYPE_DSMAS = 0, 60aba578bdSHuai-Cheng Kuo CDAT_TYPE_DSLBIS = 1, 61aba578bdSHuai-Cheng Kuo CDAT_TYPE_DSMSCIS = 2, 62aba578bdSHuai-Cheng Kuo CDAT_TYPE_DSIS = 3, 63aba578bdSHuai-Cheng Kuo CDAT_TYPE_DSEMTS = 4, 64aba578bdSHuai-Cheng Kuo CDAT_TYPE_SSLBIS = 5, 65aba578bdSHuai-Cheng Kuo } CDATType; 66aba578bdSHuai-Cheng Kuo 67aba578bdSHuai-Cheng Kuo typedef struct CDATSubHeader { 68aba578bdSHuai-Cheng Kuo uint8_t type; 69aba578bdSHuai-Cheng Kuo uint8_t reserved; 70aba578bdSHuai-Cheng Kuo uint16_t length; 71aba578bdSHuai-Cheng Kuo } CDATSubHeader; 72aba578bdSHuai-Cheng Kuo 73aba578bdSHuai-Cheng Kuo /* Device Scoped Memory Affinity Structure - CDAT Table 3 */ 74aba578bdSHuai-Cheng Kuo typedef struct CDATDsmas { 75aba578bdSHuai-Cheng Kuo CDATSubHeader header; 76aba578bdSHuai-Cheng Kuo uint8_t DSMADhandle; 77aba578bdSHuai-Cheng Kuo uint8_t flags; 78aba578bdSHuai-Cheng Kuo #define CDAT_DSMAS_FLAG_NV (1 << 2) 79aba578bdSHuai-Cheng Kuo #define CDAT_DSMAS_FLAG_SHAREABLE (1 << 3) 80aba578bdSHuai-Cheng Kuo #define CDAT_DSMAS_FLAG_HW_COHERENT (1 << 4) 81aba578bdSHuai-Cheng Kuo #define CDAT_DSMAS_FLAG_DYNAMIC_CAP (1 << 5) 82aba578bdSHuai-Cheng Kuo uint16_t reserved; 83aba578bdSHuai-Cheng Kuo uint64_t DPA_base; 84aba578bdSHuai-Cheng Kuo uint64_t DPA_length; 85*00691b1fSThomas Huth } CDATDsmas; 86*00691b1fSThomas Huth QEMU_BUILD_BUG_ON(sizeof(CDATDsmas) != 24); 87aba578bdSHuai-Cheng Kuo 88aba578bdSHuai-Cheng Kuo /* Device Scoped Latency and Bandwidth Information Structure - CDAT Table 5 */ 89aba578bdSHuai-Cheng Kuo typedef struct CDATDslbis { 90aba578bdSHuai-Cheng Kuo CDATSubHeader header; 91aba578bdSHuai-Cheng Kuo uint8_t handle; 92aba578bdSHuai-Cheng Kuo /* Definitions of these fields refer directly to HMAT fields */ 93aba578bdSHuai-Cheng Kuo uint8_t flags; 94aba578bdSHuai-Cheng Kuo uint8_t data_type; 95aba578bdSHuai-Cheng Kuo uint8_t reserved; 96aba578bdSHuai-Cheng Kuo uint64_t entry_base_unit; 97aba578bdSHuai-Cheng Kuo uint16_t entry[3]; 98aba578bdSHuai-Cheng Kuo uint16_t reserved2; 99*00691b1fSThomas Huth } CDATDslbis; 100*00691b1fSThomas Huth QEMU_BUILD_BUG_ON(sizeof(CDATDslbis) != 24); 101aba578bdSHuai-Cheng Kuo 102aba578bdSHuai-Cheng Kuo /* Device Scoped Memory Side Cache Information Structure - CDAT Table 6 */ 103aba578bdSHuai-Cheng Kuo typedef struct CDATDsmscis { 104aba578bdSHuai-Cheng Kuo CDATSubHeader header; 105aba578bdSHuai-Cheng Kuo uint8_t DSMAS_handle; 106aba578bdSHuai-Cheng Kuo uint8_t reserved[3]; 107aba578bdSHuai-Cheng Kuo uint64_t memory_side_cache_size; 108aba578bdSHuai-Cheng Kuo uint32_t cache_attributes; 109aba578bdSHuai-Cheng Kuo } QEMU_PACKED CDATDsmscis; 110aba578bdSHuai-Cheng Kuo 111aba578bdSHuai-Cheng Kuo /* Device Scoped Initiator Structure - CDAT Table 7 */ 112aba578bdSHuai-Cheng Kuo typedef struct CDATDsis { 113aba578bdSHuai-Cheng Kuo CDATSubHeader header; 114aba578bdSHuai-Cheng Kuo uint8_t flags; 115aba578bdSHuai-Cheng Kuo uint8_t handle; 116aba578bdSHuai-Cheng Kuo uint16_t reserved; 117aba578bdSHuai-Cheng Kuo } QEMU_PACKED CDATDsis; 118aba578bdSHuai-Cheng Kuo 119aba578bdSHuai-Cheng Kuo /* Device Scoped EFI Memory Type Structure - CDAT Table 8 */ 120aba578bdSHuai-Cheng Kuo typedef struct CDATDsemts { 121aba578bdSHuai-Cheng Kuo CDATSubHeader header; 122aba578bdSHuai-Cheng Kuo uint8_t DSMAS_handle; 123aba578bdSHuai-Cheng Kuo uint8_t EFI_memory_type_attr; 124aba578bdSHuai-Cheng Kuo uint16_t reserved; 125aba578bdSHuai-Cheng Kuo uint64_t DPA_offset; 126aba578bdSHuai-Cheng Kuo uint64_t DPA_length; 127*00691b1fSThomas Huth } CDATDsemts; 128*00691b1fSThomas Huth QEMU_BUILD_BUG_ON(sizeof(CDATDsemts) != 24); 129aba578bdSHuai-Cheng Kuo 130aba578bdSHuai-Cheng Kuo /* Switch Scoped Latency and Bandwidth Information Structure - CDAT Table 9 */ 131aba578bdSHuai-Cheng Kuo typedef struct CDATSslbisHeader { 132aba578bdSHuai-Cheng Kuo CDATSubHeader header; 133aba578bdSHuai-Cheng Kuo uint8_t data_type; 134aba578bdSHuai-Cheng Kuo uint8_t reserved[3]; 135aba578bdSHuai-Cheng Kuo uint64_t entry_base_unit; 136c68f81feSThomas Huth } CDATSslbisHeader; 137c68f81feSThomas Huth QEMU_BUILD_BUG_ON(sizeof(CDATSslbisHeader) != 16); 138aba578bdSHuai-Cheng Kuo 139882877fcSJonathan Cameron #define CDAT_PORT_ID_USP 0x100 140aba578bdSHuai-Cheng Kuo /* Switch Scoped Latency and Bandwidth Entry - CDAT Table 10 */ 141aba578bdSHuai-Cheng Kuo typedef struct CDATSslbe { 142aba578bdSHuai-Cheng Kuo uint16_t port_x_id; 143aba578bdSHuai-Cheng Kuo uint16_t port_y_id; 144aba578bdSHuai-Cheng Kuo uint16_t latency_bandwidth; 145aba578bdSHuai-Cheng Kuo uint16_t reserved; 146c68f81feSThomas Huth } CDATSslbe; 147c68f81feSThomas Huth QEMU_BUILD_BUG_ON(sizeof(CDATSslbe) != 8); 148aba578bdSHuai-Cheng Kuo 149aba578bdSHuai-Cheng Kuo typedef struct CDATSslbis { 150aba578bdSHuai-Cheng Kuo CDATSslbisHeader sslbis_header; 151aba578bdSHuai-Cheng Kuo CDATSslbe sslbe[]; 152c68f81feSThomas Huth } CDATSslbis; 153aba578bdSHuai-Cheng Kuo 154aba578bdSHuai-Cheng Kuo typedef struct CDATEntry { 155aba578bdSHuai-Cheng Kuo void *base; 156aba578bdSHuai-Cheng Kuo uint32_t length; 157aba578bdSHuai-Cheng Kuo } CDATEntry; 158aba578bdSHuai-Cheng Kuo 159aba578bdSHuai-Cheng Kuo typedef struct CDATObject { 160aba578bdSHuai-Cheng Kuo CDATEntry *entry; 161aba578bdSHuai-Cheng Kuo int entry_len; 162aba578bdSHuai-Cheng Kuo 163aba578bdSHuai-Cheng Kuo int (*build_cdat_table)(CDATSubHeader ***cdat_table, void *priv); 164aba578bdSHuai-Cheng Kuo void (*free_cdat_table)(CDATSubHeader **cdat_table, int num, void *priv); 165aba578bdSHuai-Cheng Kuo bool to_update; 166aba578bdSHuai-Cheng Kuo void *private; 167aba578bdSHuai-Cheng Kuo char *filename; 168aba578bdSHuai-Cheng Kuo uint8_t *buf; 169aba578bdSHuai-Cheng Kuo struct CDATSubHeader **built_buf; 170aba578bdSHuai-Cheng Kuo int built_buf_len; 171aba578bdSHuai-Cheng Kuo } CDATObject; 172aba578bdSHuai-Cheng Kuo #endif /* CXL_CDAT_H */ 173