xref: /qemu/include/hw/cxl/cxl_cdat.h (revision aba578bdace5303a441f8a37aad781b5cb06f38c)
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