xref: /openbmc/qemu/include/hw/cxl/cxl_component.h (revision a118c4aff4087eafb68f7132b233ad548cf16376)
19e58f52dSBen Widawsky /*
29e58f52dSBen Widawsky  * QEMU CXL Component
39e58f52dSBen Widawsky  *
49e58f52dSBen Widawsky  * Copyright (c) 2020 Intel
59e58f52dSBen Widawsky  *
69e58f52dSBen Widawsky  * This work is licensed under the terms of the GNU GPL, version 2. See the
79e58f52dSBen Widawsky  * COPYING file in the top-level directory.
89e58f52dSBen Widawsky  */
99e58f52dSBen Widawsky 
109e58f52dSBen Widawsky #ifndef CXL_COMPONENT_H
119e58f52dSBen Widawsky #define CXL_COMPONENT_H
129e58f52dSBen Widawsky 
138700ee15SJonathan Cameron /* CXL r3.1 Section 8.2.4: CXL.cache and CXL.mem Registers  */
149e58f52dSBen Widawsky #define CXL2_COMPONENT_IO_REGION_SIZE 0x1000
159e58f52dSBen Widawsky #define CXL2_COMPONENT_CM_REGION_SIZE 0x1000
169e58f52dSBen Widawsky #define CXL2_COMPONENT_BLOCK_SIZE 0x10000
179e58f52dSBen Widawsky 
189e58f52dSBen Widawsky #include "qemu/range.h"
192ef0f219SMarkus Armbruster #include "hw/cxl/cxl_cdat.h"
209e58f52dSBen Widawsky #include "hw/register.h"
21aba578bdSHuai-Cheng Kuo #include "qapi/error.h"
229e58f52dSBen Widawsky 
239e58f52dSBen Widawsky enum reg_type {
249e58f52dSBen Widawsky     CXL2_DEVICE,
259e58f52dSBen Widawsky     CXL2_TYPE3_DEVICE,
269e58f52dSBen Widawsky     CXL2_LOGICAL_DEVICE,
279e58f52dSBen Widawsky     CXL2_ROOT_PORT,
283a95f572SJonathan Cameron     CXL2_RC,
299e58f52dSBen Widawsky     CXL2_UPSTREAM_PORT,
304a583303SJonathan Cameron     CXL2_DOWNSTREAM_PORT,
314a583303SJonathan Cameron     CXL3_SWITCH_MAILBOX_CCI,
329e58f52dSBen Widawsky };
339e58f52dSBen Widawsky 
349e58f52dSBen Widawsky /*
359e58f52dSBen Widawsky  * Capability registers are defined at the top of the CXL.cache/mem region and
369e58f52dSBen Widawsky  * are packed. For our purposes we will always define the caps in the same
379e58f52dSBen Widawsky  * order.
388700ee15SJonathan Cameron  * CXL r3.1 Table 8-22: CXL_CAPABILITY_ID Assignment for details.
399e58f52dSBen Widawsky  */
409e58f52dSBen Widawsky 
418700ee15SJonathan Cameron /* CXL r3.1 Section 8.2.4.1: CXL Capability Header Register */
428700ee15SJonathan Cameron #define CXL_CAPABILITY_VERSION 1
439e58f52dSBen Widawsky REG32(CXL_CAPABILITY_HEADER, 0)
449e58f52dSBen Widawsky     FIELD(CXL_CAPABILITY_HEADER, ID, 0, 16)
459e58f52dSBen Widawsky     FIELD(CXL_CAPABILITY_HEADER, VERSION, 16, 4)
469e58f52dSBen Widawsky     FIELD(CXL_CAPABILITY_HEADER, CACHE_MEM_VERSION, 20, 4)
479e58f52dSBen Widawsky     FIELD(CXL_CAPABILITY_HEADER, ARRAY_SIZE, 24, 8)
489e58f52dSBen Widawsky 
499e58f52dSBen Widawsky #define CXLx_CAPABILITY_HEADER(type, offset)                  \
509e58f52dSBen Widawsky     REG32(CXL_##type##_CAPABILITY_HEADER, offset)             \
519e58f52dSBen Widawsky         FIELD(CXL_##type##_CAPABILITY_HEADER, ID, 0, 16)      \
529e58f52dSBen Widawsky         FIELD(CXL_##type##_CAPABILITY_HEADER, VERSION, 16, 4) \
539e58f52dSBen Widawsky         FIELD(CXL_##type##_CAPABILITY_HEADER, PTR, 20, 12)
549e58f52dSBen Widawsky CXLx_CAPABILITY_HEADER(RAS, 0x4)
559e58f52dSBen Widawsky CXLx_CAPABILITY_HEADER(LINK, 0x8)
569e58f52dSBen Widawsky CXLx_CAPABILITY_HEADER(HDM, 0xc)
579e58f52dSBen Widawsky CXLx_CAPABILITY_HEADER(EXTSEC, 0x10)
589e58f52dSBen Widawsky CXLx_CAPABILITY_HEADER(SNOOP, 0x14)
599e58f52dSBen Widawsky 
609e58f52dSBen Widawsky /*
619e58f52dSBen Widawsky  * Capability structures contain the actual registers that the CXL component
629e58f52dSBen Widawsky  * implements. Some of these are specific to certain types of components, but
639e58f52dSBen Widawsky  * this implementation leaves enough space regardless.
649e58f52dSBen Widawsky  */
659e58f52dSBen Widawsky 
66a185ff05SJonathan Cameron /* CXL r3.1 Section 8.2.4.17: CXL RAS Capability Structure */
67a185ff05SJonathan Cameron #define CXL_RAS_CAPABILITY_VERSION 3
689e58f52dSBen Widawsky /* Give ample space for caps before this */
699e58f52dSBen Widawsky #define CXL_RAS_REGISTERS_OFFSET 0x80
709e58f52dSBen Widawsky #define CXL_RAS_REGISTERS_SIZE   0x58
719e58f52dSBen Widawsky REG32(CXL_RAS_UNC_ERR_STATUS, CXL_RAS_REGISTERS_OFFSET)
72415442a1SJonathan Cameron #define CXL_RAS_UNC_ERR_CACHE_DATA_PARITY 0
73415442a1SJonathan Cameron #define CXL_RAS_UNC_ERR_CACHE_ADDRESS_PARITY 1
74415442a1SJonathan Cameron #define CXL_RAS_UNC_ERR_CACHE_BE_PARITY 2
75415442a1SJonathan Cameron #define CXL_RAS_UNC_ERR_CACHE_DATA_ECC 3
76415442a1SJonathan Cameron #define CXL_RAS_UNC_ERR_MEM_DATA_PARITY 4
77415442a1SJonathan Cameron #define CXL_RAS_UNC_ERR_MEM_ADDRESS_PARITY 5
78415442a1SJonathan Cameron #define CXL_RAS_UNC_ERR_MEM_BE_PARITY 6
79415442a1SJonathan Cameron #define CXL_RAS_UNC_ERR_MEM_DATA_ECC 7
80415442a1SJonathan Cameron #define CXL_RAS_UNC_ERR_REINIT_THRESHOLD 8
81415442a1SJonathan Cameron #define CXL_RAS_UNC_ERR_RSVD_ENCODING 9
82415442a1SJonathan Cameron #define CXL_RAS_UNC_ERR_POISON_RECEIVED 10
83415442a1SJonathan Cameron #define CXL_RAS_UNC_ERR_RECEIVER_OVERFLOW 11
84415442a1SJonathan Cameron #define CXL_RAS_UNC_ERR_INTERNAL 14
85415442a1SJonathan Cameron #define CXL_RAS_UNC_ERR_CXL_IDE_TX 15
86415442a1SJonathan Cameron #define CXL_RAS_UNC_ERR_CXL_IDE_RX 16
87415442a1SJonathan Cameron #define CXL_RAS_UNC_ERR_CXL_UNUSED 63 /* Magic value */
889e58f52dSBen Widawsky REG32(CXL_RAS_UNC_ERR_MASK, CXL_RAS_REGISTERS_OFFSET + 0x4)
899e58f52dSBen Widawsky REG32(CXL_RAS_UNC_ERR_SEVERITY, CXL_RAS_REGISTERS_OFFSET + 0x8)
909e58f52dSBen Widawsky REG32(CXL_RAS_COR_ERR_STATUS, CXL_RAS_REGISTERS_OFFSET + 0xc)
91415442a1SJonathan Cameron #define CXL_RAS_COR_ERR_CACHE_DATA_ECC 0
92415442a1SJonathan Cameron #define CXL_RAS_COR_ERR_MEM_DATA_ECC 1
93415442a1SJonathan Cameron #define CXL_RAS_COR_ERR_CRC_THRESHOLD 2
94415442a1SJonathan Cameron #define CXL_RAS_COR_ERR_RETRY_THRESHOLD 3
95415442a1SJonathan Cameron #define CXL_RAS_COR_ERR_CACHE_POISON_RECEIVED 4
96415442a1SJonathan Cameron #define CXL_RAS_COR_ERR_MEM_POISON_RECEIVED 5
97415442a1SJonathan Cameron #define CXL_RAS_COR_ERR_PHYSICAL 6
989e58f52dSBen Widawsky REG32(CXL_RAS_COR_ERR_MASK, CXL_RAS_REGISTERS_OFFSET + 0x10)
999e58f52dSBen Widawsky REG32(CXL_RAS_ERR_CAP_CTRL, CXL_RAS_REGISTERS_OFFSET + 0x14)
100415442a1SJonathan Cameron     FIELD(CXL_RAS_ERR_CAP_CTRL, FIRST_ERROR_POINTER, 0, 6)
101a185ff05SJonathan Cameron     FIELD(CXL_RAS_ERR_CAP_CTRL, MULTIPLE_HEADER_RECORDING_CAP, 9, 1)
102a185ff05SJonathan Cameron     FIELD(CXL_RAS_ERR_POISON_ENABLED, POISON_ENABLED, 13, 1)
103415442a1SJonathan Cameron REG32(CXL_RAS_ERR_HEADER0, CXL_RAS_REGISTERS_OFFSET + 0x18)
104415442a1SJonathan Cameron #define CXL_RAS_ERR_HEADER_NUM 32
1059e58f52dSBen Widawsky /* Offset 0x18 - 0x58 reserved for RAS logs */
1069e58f52dSBen Widawsky 
1078700ee15SJonathan Cameron /* CXL r3.1 Section 8.2.4.18: CXL Security Capability Structure */
1089e58f52dSBen Widawsky #define CXL_SEC_REGISTERS_OFFSET \
1099e58f52dSBen Widawsky     (CXL_RAS_REGISTERS_OFFSET + CXL_RAS_REGISTERS_SIZE)
1109e58f52dSBen Widawsky #define CXL_SEC_REGISTERS_SIZE   0 /* We don't implement 1.1 downstream ports */
1119e58f52dSBen Widawsky 
11240ecac10SJonathan Cameron /* CXL r3.1 Section 8.2.4.19: CXL Link Capability Structure */
1138700ee15SJonathan Cameron #define CXL_LINK_CAPABILITY_VERSION 2
1149e58f52dSBen Widawsky #define CXL_LINK_REGISTERS_OFFSET \
1159e58f52dSBen Widawsky     (CXL_SEC_REGISTERS_OFFSET + CXL_SEC_REGISTERS_SIZE)
11640ecac10SJonathan Cameron #define CXL_LINK_REGISTERS_SIZE   0x50
1179e58f52dSBen Widawsky 
118ae243dbfSJonathan Cameron /* CXL r3.1 Section 8.2.4.20: CXL HDM Decoder Capability Structure */
119ae243dbfSJonathan Cameron #define HDM_DECODE_MAX 10 /* Maximum decoders for Devices */
120ae243dbfSJonathan Cameron #define CXL_HDM_CAPABILITY_VERSION 3
1219e58f52dSBen Widawsky #define CXL_HDM_REGISTERS_OFFSET \
1229e58f52dSBen Widawsky     (CXL_LINK_REGISTERS_OFFSET + CXL_LINK_REGISTERS_SIZE)
1239e58f52dSBen Widawsky #define CXL_HDM_REGISTERS_SIZE (0x10 + 0x20 * HDM_DECODE_MAX)
1249e58f52dSBen Widawsky #define HDM_DECODER_INIT(n)                                                    \
1259e58f52dSBen Widawsky   REG32(CXL_HDM_DECODER##n##_BASE_LO,                                          \
1269e58f52dSBen Widawsky         CXL_HDM_REGISTERS_OFFSET + (0x20 * n) + 0x10)                          \
1279e58f52dSBen Widawsky             FIELD(CXL_HDM_DECODER##n##_BASE_LO, L, 28, 4)                      \
1289e58f52dSBen Widawsky   REG32(CXL_HDM_DECODER##n##_BASE_HI,                                          \
1299e58f52dSBen Widawsky         CXL_HDM_REGISTERS_OFFSET + (0x20 * n) + 0x14)                          \
1309e58f52dSBen Widawsky   REG32(CXL_HDM_DECODER##n##_SIZE_LO,                                          \
1319e58f52dSBen Widawsky         CXL_HDM_REGISTERS_OFFSET + (0x20 * n) + 0x18)                          \
1329e58f52dSBen Widawsky   REG32(CXL_HDM_DECODER##n##_SIZE_HI,                                          \
1339e58f52dSBen Widawsky         CXL_HDM_REGISTERS_OFFSET + (0x20 * n) + 0x1C)                          \
1349e58f52dSBen Widawsky   REG32(CXL_HDM_DECODER##n##_CTRL,                                             \
1359e58f52dSBen Widawsky         CXL_HDM_REGISTERS_OFFSET + (0x20 * n) + 0x20)                          \
1369e58f52dSBen Widawsky             FIELD(CXL_HDM_DECODER##n##_CTRL, IG, 0, 4)                         \
1379e58f52dSBen Widawsky             FIELD(CXL_HDM_DECODER##n##_CTRL, IW, 4, 4)                         \
1389e58f52dSBen Widawsky             FIELD(CXL_HDM_DECODER##n##_CTRL, LOCK_ON_COMMIT, 8, 1)             \
1399e58f52dSBen Widawsky             FIELD(CXL_HDM_DECODER##n##_CTRL, COMMIT, 9, 1)                     \
1409e58f52dSBen Widawsky             FIELD(CXL_HDM_DECODER##n##_CTRL, COMMITTED, 10, 1)                 \
1419e58f52dSBen Widawsky             FIELD(CXL_HDM_DECODER##n##_CTRL, ERR, 11, 1)                       \
1429e58f52dSBen Widawsky             FIELD(CXL_HDM_DECODER##n##_CTRL, TYPE, 12, 1)                      \
143ae243dbfSJonathan Cameron             FIELD(CXL_HDM_DECODER##n##_CTRL, BI, 13, 1)                        \
144ae243dbfSJonathan Cameron             FIELD(CXL_HDM_DECODER##n##_CTRL, UIO, 14, 1)                       \
145ae243dbfSJonathan Cameron             FIELD(CXL_HDM_DECODER##n##_CTRL, UIG, 16, 4)                       \
146ae243dbfSJonathan Cameron             FIELD(CXL_HDM_DECODER##n##_CTRL, UIW, 20, 4)                       \
147ae243dbfSJonathan Cameron             FIELD(CXL_HDM_DECODER##n##_CTRL, ISP, 24, 4)                       \
1489e58f52dSBen Widawsky   REG32(CXL_HDM_DECODER##n##_TARGET_LIST_LO,                                   \
1499e58f52dSBen Widawsky         CXL_HDM_REGISTERS_OFFSET + (0x20 * n) + 0x24)                          \
1509e58f52dSBen Widawsky   REG32(CXL_HDM_DECODER##n##_TARGET_LIST_HI,                                   \
151e967413fSJonathan Cameron         CXL_HDM_REGISTERS_OFFSET + (0x20 * n) + 0x28)                          \
152e967413fSJonathan Cameron   REG32(CXL_HDM_DECODER##n##_DPA_SKIP_LO,                                      \
153e967413fSJonathan Cameron         CXL_HDM_REGISTERS_OFFSET + (0x20 * n) + 0x24)                          \
154e967413fSJonathan Cameron   REG32(CXL_HDM_DECODER##n##_DPA_SKIP_HI,                                      \
1559e58f52dSBen Widawsky         CXL_HDM_REGISTERS_OFFSET + (0x20 * n) + 0x28)
1569e58f52dSBen Widawsky 
1579e58f52dSBen Widawsky REG32(CXL_HDM_DECODER_CAPABILITY, CXL_HDM_REGISTERS_OFFSET)
1589e58f52dSBen Widawsky     FIELD(CXL_HDM_DECODER_CAPABILITY, DECODER_COUNT, 0, 4)
1599e58f52dSBen Widawsky     FIELD(CXL_HDM_DECODER_CAPABILITY, TARGET_COUNT, 4, 4)
1609e58f52dSBen Widawsky     FIELD(CXL_HDM_DECODER_CAPABILITY, INTERLEAVE_256B, 8, 1)
1619e58f52dSBen Widawsky     FIELD(CXL_HDM_DECODER_CAPABILITY, INTERLEAVE_4K, 9, 1)
1629e58f52dSBen Widawsky     FIELD(CXL_HDM_DECODER_CAPABILITY, POISON_ON_ERR_CAP, 10, 1)
163ae243dbfSJonathan Cameron     FIELD(CXL_HDM_DECODER_CAPABILITY, 3_6_12_WAY, 11, 1)
164ae243dbfSJonathan Cameron     FIELD(CXL_HDM_DECODER_CAPABILITY, 16_WAY, 12, 1)
165ae243dbfSJonathan Cameron     FIELD(CXL_HDM_DECODER_CAPABILITY, UIO, 13, 1)
166ae243dbfSJonathan Cameron     FIELD(CXL_HDM_DECODER_CAPABILITY, UIO_DECODER_COUNT, 16, 4)
167ae243dbfSJonathan Cameron     FIELD(CXL_HDM_DECODER_CAPABILITY, MEMDATA_NXM_CAP, 20, 1)
168ae243dbfSJonathan Cameron     FIELD(CXL_HDM_DECODER_CAPABILITY, SUPPORTED_COHERENCY_MODEL, 21, 2)
1699e58f52dSBen Widawsky REG32(CXL_HDM_DECODER_GLOBAL_CONTROL, CXL_HDM_REGISTERS_OFFSET + 4)
1709e58f52dSBen Widawsky     FIELD(CXL_HDM_DECODER_GLOBAL_CONTROL, POISON_ON_ERR_EN, 0, 1)
1719e58f52dSBen Widawsky     FIELD(CXL_HDM_DECODER_GLOBAL_CONTROL, HDM_DECODER_ENABLE, 1, 1)
1729e58f52dSBen Widawsky 
173e967413fSJonathan Cameron /* Support 4 decoders at all levels of topology */
174e967413fSJonathan Cameron #define CXL_HDM_DECODER_COUNT 4
175e967413fSJonathan Cameron 
1769e58f52dSBen Widawsky HDM_DECODER_INIT(0);
17761c44bcfSJonathan Cameron HDM_DECODER_INIT(1);
178e967413fSJonathan Cameron HDM_DECODER_INIT(2);
179e967413fSJonathan Cameron HDM_DECODER_INIT(3);
1809e58f52dSBen Widawsky 
1818700ee15SJonathan Cameron /*
1828700ee15SJonathan Cameron  * CXL r3.1 Section 8.2.4.21: CXL Extended Security Capability Structure
1838700ee15SJonathan Cameron  * (Root complex only)
1848700ee15SJonathan Cameron  */
1859e58f52dSBen Widawsky #define EXTSEC_ENTRY_MAX        256
1868700ee15SJonathan Cameron #define CXL_EXTSEC_CAP_VERSION 2
1879e58f52dSBen Widawsky #define CXL_EXTSEC_REGISTERS_OFFSET \
1889e58f52dSBen Widawsky     (CXL_HDM_REGISTERS_OFFSET + CXL_HDM_REGISTERS_SIZE)
1899e58f52dSBen Widawsky #define CXL_EXTSEC_REGISTERS_SIZE   (8 * EXTSEC_ENTRY_MAX + 4)
1909e58f52dSBen Widawsky 
1918700ee15SJonathan Cameron /* CXL r3.1 Section 8.2.4.22: CXL IDE Capability Structure */
1928700ee15SJonathan Cameron #define CXL_IDE_CAP_VERSION 2
1939e58f52dSBen Widawsky #define CXL_IDE_REGISTERS_OFFSET \
1949e58f52dSBen Widawsky     (CXL_EXTSEC_REGISTERS_OFFSET + CXL_EXTSEC_REGISTERS_SIZE)
1958700ee15SJonathan Cameron #define CXL_IDE_REGISTERS_SIZE   0x24
1969e58f52dSBen Widawsky 
1978700ee15SJonathan Cameron /* CXL r3.1 Section 8.2.4.23 - CXL Snoop Filter Capability Structure */
1988700ee15SJonathan Cameron #define CXL_SNOOP_CAP_VERSION 1
1999e58f52dSBen Widawsky #define CXL_SNOOP_REGISTERS_OFFSET \
2009e58f52dSBen Widawsky     (CXL_IDE_REGISTERS_OFFSET + CXL_IDE_REGISTERS_SIZE)
2019e58f52dSBen Widawsky #define CXL_SNOOP_REGISTERS_SIZE   0x8
2029e58f52dSBen Widawsky 
203b342489aSJonathan Cameron QEMU_BUILD_BUG_MSG((CXL_SNOOP_REGISTERS_OFFSET +
204b342489aSJonathan Cameron                     CXL_SNOOP_REGISTERS_SIZE) >= 0x1000,
2059e58f52dSBen Widawsky                    "No space for registers");
2069e58f52dSBen Widawsky 
2079e58f52dSBen Widawsky typedef struct component_registers {
2089e58f52dSBen Widawsky     /*
2099e58f52dSBen Widawsky      * Main memory region to be registered with QEMU core.
2109e58f52dSBen Widawsky      */
2119e58f52dSBen Widawsky     MemoryRegion component_registers;
2129e58f52dSBen Widawsky 
2139e58f52dSBen Widawsky     /*
2148700ee15SJonathan Cameron      * CXL r3.1 Table 8-21: CXL Subsystem Component Register Ranges
2159e58f52dSBen Widawsky      *   0x0000 - 0x0fff CXL.io registers
2169e58f52dSBen Widawsky      *   0x1000 - 0x1fff CXL.cache and CXL.mem
2179e58f52dSBen Widawsky      *   0x2000 - 0xdfff Implementation specific
2189e58f52dSBen Widawsky      *   0xe000 - 0xe3ff CXL ARB/MUX registers
2199e58f52dSBen Widawsky      *   0xe400 - 0xffff RSVD
2209e58f52dSBen Widawsky      */
2219e58f52dSBen Widawsky     uint32_t io_registers[CXL2_COMPONENT_IO_REGION_SIZE >> 2];
2229e58f52dSBen Widawsky     MemoryRegion io;
2239e58f52dSBen Widawsky 
2249e58f52dSBen Widawsky     uint32_t cache_mem_registers[CXL2_COMPONENT_CM_REGION_SIZE >> 2];
2259e58f52dSBen Widawsky     uint32_t cache_mem_regs_write_mask[CXL2_COMPONENT_CM_REGION_SIZE >> 2];
2269e58f52dSBen Widawsky     MemoryRegion cache_mem;
2279e58f52dSBen Widawsky 
2289e58f52dSBen Widawsky     MemoryRegion impl_specific;
2299e58f52dSBen Widawsky     MemoryRegion arb_mux;
2309e58f52dSBen Widawsky     MemoryRegion rsvd;
2319e58f52dSBen Widawsky 
2329e58f52dSBen Widawsky     /* special_ops is used for any component that needs any specific handling */
2339e58f52dSBen Widawsky     MemoryRegionOps *special_ops;
2349e58f52dSBen Widawsky } ComponentRegisters;
2359e58f52dSBen Widawsky 
2369e58f52dSBen Widawsky /*
2379e58f52dSBen Widawsky  * A CXL component represents all entities in a CXL hierarchy. This includes,
2389e58f52dSBen Widawsky  * host bridges, root ports, upstream/downstream switch ports, and devices
2399e58f52dSBen Widawsky  */
2409e58f52dSBen Widawsky typedef struct cxl_component {
2419e58f52dSBen Widawsky     ComponentRegisters crb;
2429e58f52dSBen Widawsky     union {
2439e58f52dSBen Widawsky         struct {
2449e58f52dSBen Widawsky             Range dvsecs[CXL20_MAX_DVSEC];
2459e58f52dSBen Widawsky             uint16_t dvsec_offset;
2469e58f52dSBen Widawsky             struct PCIDevice *pdev;
2479e58f52dSBen Widawsky         };
2489e58f52dSBen Widawsky     };
249aba578bdSHuai-Cheng Kuo 
250aba578bdSHuai-Cheng Kuo     CDATObject cdat;
2519e58f52dSBen Widawsky } CXLComponentState;
2529e58f52dSBen Widawsky 
2539e58f52dSBen Widawsky void cxl_component_register_block_init(Object *obj,
2549e58f52dSBen Widawsky                                        CXLComponentState *cxl_cstate,
2559e58f52dSBen Widawsky                                        const char *type);
2569e58f52dSBen Widawsky void cxl_component_register_init_common(uint32_t *reg_state,
2579e58f52dSBen Widawsky                                         uint32_t *write_msk,
2589e58f52dSBen Widawsky                                         enum reg_type type);
2599e58f52dSBen Widawsky 
2609e58f52dSBen Widawsky void cxl_component_create_dvsec(CXLComponentState *cxl_cstate,
2619e58f52dSBen Widawsky                                 enum reg_type cxl_dev_type, uint16_t length,
2629e58f52dSBen Widawsky                                 uint16_t type, uint8_t rev, uint8_t *body);
2639e58f52dSBen Widawsky 
264f5a4e1a6SJonathan Cameron int cxl_decoder_count_enc(int count);
26587de174aSJonathan Cameron int cxl_decoder_count_dec(int enc_cnt);
2669e58f52dSBen Widawsky 
267829de299SJonathan Cameron uint8_t cxl_interleave_ways_enc(int iw, Error **errp);
26887de174aSJonathan Cameron int cxl_interleave_ways_dec(uint8_t iw_enc, Error **errp);
269829de299SJonathan Cameron uint8_t cxl_interleave_granularity_enc(uint64_t gran, Error **errp);
270829de299SJonathan Cameron 
271f5a4e1a6SJonathan Cameron hwaddr cxl_decode_ig(int ig);
272829de299SJonathan Cameron 
2730b4aec24SJonathan Cameron CXLComponentState *cxl_get_hb_cstate(PCIHostState *hb);
274154070eaSJonathan Cameron bool cxl_get_hb_passthrough(PCIHostState *hb);
2750b4aec24SJonathan Cameron 
276*e0ddabc6SZhao Liu bool cxl_doe_cdat_init(CXLComponentState *cxl_cstate, Error **errp);
277aba578bdSHuai-Cheng Kuo void cxl_doe_cdat_release(CXLComponentState *cxl_cstate);
278aba578bdSHuai-Cheng Kuo void cxl_doe_cdat_update(CXLComponentState *cxl_cstate, Error **errp);
279aba578bdSHuai-Cheng Kuo 
2809e58f52dSBen Widawsky #endif
281