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