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