From nobody Mon Feb 9 10:23:32 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=stgolabs.net) ARC-Seal: i=2; a=rsa-sha256; t=1754883369; cv=pass; d=zohomail.com; s=zohoarc; b=bWiShgpW+cE7J1DysZB4TetBt2Pr8jvYOFhYtahP9UMW+YkLYmdf/EjFQ9kWrUmI8idCb9slbmSfgLFZFzYI17juACPVJsb/Qxs4bhAz+PfHNFBMuyaMxT+pYtd9MrEgI3yvoADuzFZPnLMSaOQiKqdwbBWd8+4fUDU/oLXHIKU= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1754883369; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=I6Q+CBhi62xj0DL71t7WBUgHDZofnn8/U3Qei8O+Gqk=; b=YhUtcSwS8DnLGvDZ+XPe7stQ932yxm1daE2K+IQEEB1sRqLJXLJDLoqgMhRb+cQYMHkUNDg/GQh7f1hDaoZTlHRE0Vc62dsrPSGM/RBiRpRdfBi0hUdTzLVDdlgxNL9GDZAJ4hUHrxhLCLWnun+M4tAgUFDGugierlrsEHyladI= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=stgolabs.net) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1754883369954109.23718612546054; Sun, 10 Aug 2025 20:36:09 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ulJJ8-0004xq-M5; Sun, 10 Aug 2025 23:34:46 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ulJJ0-0004wq-25 for qemu-devel@nongnu.org; Sun, 10 Aug 2025 23:34:38 -0400 Received: from cyan.elm.relay.mailchannels.net ([23.83.212.47]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ulJIw-00049q-GQ for qemu-devel@nongnu.org; Sun, 10 Aug 2025 23:34:37 -0400 Received: from relay.mailchannels.net (localhost [127.0.0.1]) by relay.mailchannels.net (Postfix) with ESMTP id AB5038372E; Mon, 11 Aug 2025 03:34:27 +0000 (UTC) Received: from pdx1-sub0-mail-a236.dreamhost.com (trex-blue-9.trex.outbound.svc.cluster.local [100.96.13.39]) (Authenticated sender: dreamhost) by relay.mailchannels.net (Postfix) with ESMTPA id 4CF28835A3; Mon, 11 Aug 2025 03:34:27 +0000 (UTC) Received: from pdx1-sub0-mail-a236.dreamhost.com (pop.dreamhost.com [64.90.62.162]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384) by 100.96.13.39 (trex/7.1.3); Mon, 11 Aug 2025 03:34:27 +0000 Received: from offworld.lan (syn-076-167-199-067.res.spectrum.com [76.167.199.67]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: dave@stgolabs.net) by pdx1-sub0-mail-a236.dreamhost.com (Postfix) with ESMTPSA id 4c0gH64m9Rz6v; Sun, 10 Aug 2025 20:34:26 -0700 (PDT) X-Sender-Id: dreamhost|x-authsender|dave@stgolabs.net ARC-Seal: i=1; s=arc-2022; d=mailchannels.net; t=1754883267; a=rsa-sha256; cv=none; b=PPK3ff2iawsnQZmZtQQ7dNV7oATvMmZnGeqzN277ZJ631IqdP1XoHGd9RDaJXuBvgS5/Ti VAKLxcyqbZyHHEJnc/ftjGFjzwZIlaXnQu4aWkB3dBss3CjaMq2qoBmu+WGIMFLSVZKfsW u8ZzwelBu1T3rhXCC4g4aW+HQ879qcNEp/DpmnqYDrHkJ6uLIrnB39SgHwNAlBCw+mP6TG GPlL9ww8R0KCoQqMhJ+QIvx0V7Goi9O90+uS+DX82yI4S887B5NU+srpWABsAs7WSypqmM ZSSrf13EL2rByTxhQkhPZSjG/CJdIRZTjSwUwJbGRSnGLMPoRsBjQ9DYxFq7NQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=mailchannels.net; s=arc-2022; t=1754883267; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=I6Q+CBhi62xj0DL71t7WBUgHDZofnn8/U3Qei8O+Gqk=; b=eXYpnHFyu5P5Mas49Hleer73KbkjB8rWqVdfd6byJIy/kuvGaDMWra4dSCR+c6CEHSpIDV K6Nw+sbtsiKiiSAw78MC+gQSAqg5bRUOOiYKHaC7RtvG5Xll7ZWnke+qrY9xpRUyALk6gE I9ijWCWoZGveitST9ZkcG3g2t62bIPD1cch19NsLqlIKVAljPQs9Xk8x6/SqpGvk9k1wD0 uA4z8TxHgXz5o5BxZ+m1iZ99aWdPTAW+McBdwSyW9GaWV/UUmTgQtmKGIiv5OOXf1ESK7a MoE8aYVguPP6orfjERlufjwqHAQoQzFO6aAa5Eu4sxG7E1triQ4Qyx6fAwAQpw== ARC-Authentication-Results: i=1; rspamd-698857ffff-fkw4h; auth=pass smtp.auth=dreamhost smtp.mailfrom=dave@stgolabs.net X-Sender-Id: dreamhost|x-authsender|dave@stgolabs.net X-MC-Relay: Neutral X-MailChannels-SenderId: dreamhost|x-authsender|dave@stgolabs.net X-MailChannels-Auth-Id: dreamhost X-Relation-Arithmetic: 3fb6dc9e2e306baa_1754883267590_1525435007 X-MC-Loop-Signature: 1754883267590:1730140255 X-MC-Ingress-Time: 1754883267589 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=stgolabs.net; s=dreamhost; t=1754883267; bh=I6Q+CBhi62xj0DL71t7WBUgHDZofnn8/U3Qei8O+Gqk=; h=From:To:Cc:Subject:Date:Content-Transfer-Encoding; b=SCLBpNcvFXyNo0TJNPZyR+tGPYf/mu/SDKsxfAQu60yuNIersYzdefRRjRETrmDGw 7QCry8P8QxG/8R4m2PKsXib+qypwWgMm5s6QDbhlNDtJ5FVHFeD0AhG7JkGsgwp59z mHCw1hgpp9JTTxIF72x1cwBy+jUZojXWlXIXDqOvBgfNmKDpu4eE6gUedUgu3gRDzy VisW4OsyqI4O92jX4H7ivAMQDuPpG7LZcbmc2awblWvZ6xEdAaoT74tNoGj1aK31BN Aw6/Tx93X8Wg+BO6rmHawWp4edT3SE+x7gihl5s4I+2Tb4AwEQBVPXklUijbBcZFT4 i87AK0LEL9BtA== From: Davidlohr Bueso To: jonathan.cameron@huawei.com Cc: ira.weiny@intel.com, alucerop@amd.com, a.manzanares@samsung.com, linux-cxl@vger.kernel.org, qemu-devel@nongnu.org, Davidlohr Bueso , Jonathan Cameron Subject: [PATCH 1/4] hw/pcie: Support enabling flit mode Date: Sun, 10 Aug 2025 20:34:02 -0700 Message-Id: <20250811033405.332295-2-dave@stgolabs.net> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250811033405.332295-1-dave@stgolabs.net> References: <20250811033405.332295-1-dave@stgolabs.net> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=23.83.212.47; envelope-from=dave@stgolabs.net; helo=cyan.elm.relay.mailchannels.net X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @stgolabs.net) X-ZM-MESSAGEID: 1754883372869124100 Content-Type: text/plain; charset="utf-8" As with the link speed and width training, have ad-hoc property for setting the flit mode and allow CXL components to make use of it. For the CXL root port and dsp cases, always report flit mode but the actual value after 'training' will depend on the downstream device configuration. Suggested-by: Jonathan Cameron Signed-off-by: Davidlohr Bueso --- hw/mem/cxl_type3.c | 9 ++++++--- hw/pci-bridge/cxl_downstream.c | 11 +++++++---- hw/pci-bridge/cxl_root_port.c | 11 +++++++---- hw/pci-bridge/cxl_upstream.c | 19 +++++++++++-------- hw/pci-bridge/gen_pcie_root_port.c | 1 + hw/pci/pcie.c | 23 +++++++++++++++++++---- include/hw/cxl/cxl_device.h | 1 + include/hw/pci-bridge/cxl_upstream_port.h | 1 + include/hw/pci/pcie.h | 2 +- include/hw/pci/pcie_port.h | 1 + 10 files changed, 55 insertions(+), 24 deletions(-) diff --git a/hw/mem/cxl_type3.c b/hw/mem/cxl_type3.c index c4658e0955d5..ecd3a7703b35 100644 --- a/hw/mem/cxl_type3.c +++ b/hw/mem/cxl_type3.c @@ -533,9 +533,10 @@ static void build_dvsecs(CXLType3Dev *ct3d) GPF_DEVICE_DVSEC_REVID, dvsec); =20 dvsec =3D (uint8_t *)&(CXLDVSECPortFlexBus){ - .cap =3D 0x26, /* 68B, IO, Mem, non-MLD */ + /* 68B (maybe), IO, Mem, non-MLD */ + .cap =3D ct3d->flitmode ? 0x6 : 0x26, .ctrl =3D 0x02, /* IO always enabled */ - .status =3D 0x26, /* same as capabilities */ + .status =3D ct3d->flitmode ? 0x6 : 0x26, /* same = */ .rcvd_mod_ts_data_phase1 =3D 0xef, /* WTF? */ }; cxl_component_create_dvsec(cxl_cstate, CXL2_TYPE3_DEVICE, @@ -1501,7 +1502,8 @@ void ct3d_reset(DeviceState *dev) uint32_t *reg_state =3D ct3d->cxl_cstate.crb.cache_mem_registers; uint32_t *write_msk =3D ct3d->cxl_cstate.crb.cache_mem_regs_write_mask; =20 - pcie_cap_fill_link_ep_usp(PCI_DEVICE(dev), ct3d->width, ct3d->speed); + pcie_cap_fill_link_ep_usp(PCI_DEVICE(dev), ct3d->width, ct3d->speed, + ct3d->flitmode); cxl_component_register_init_common(reg_state, write_msk, CXL2_TYPE3_DE= VICE); cxl_device_register_init_t3(ct3d, CXL_T3_MSIX_MBOX); =20 @@ -1540,6 +1542,7 @@ static const Property ct3_props[] =3D { speed, PCIE_LINK_SPEED_32), DEFINE_PROP_PCIE_LINK_WIDTH("x-width", CXLType3Dev, width, PCIE_LINK_WIDTH_16), + DEFINE_PROP_BOOL("256b-flit", CXLType3Dev, flitmode, false), DEFINE_PROP_UINT16("chmu-port", CXLType3Dev, cxl_dstate.chmu[0].port, = 0), }; =20 diff --git a/hw/pci-bridge/cxl_downstream.c b/hw/pci-bridge/cxl_downstream.c index 6aa8586f0161..94dcd52a8017 100644 --- a/hw/pci-bridge/cxl_downstream.c +++ b/hw/pci-bridge/cxl_downstream.c @@ -116,8 +116,9 @@ static void cxl_dsp_reset(DeviceState *qdev) latch_registers(dsp); } =20 -static void build_dvsecs(CXLComponentState *cxl) +static void build_dvsecs(PCIDevice *d, CXLComponentState *cxl) { + PCIESlot *s =3D PCIE_SLOT(d); CXLDVSECRegisterLocator *regloc_dvsec; uint8_t *dvsec; int i; @@ -129,9 +130,10 @@ static void build_dvsecs(CXLComponentState *cxl) EXTENSIONS_PORT_DVSEC_REVID, dvsec); =20 dvsec =3D (uint8_t *)&(CXLDVSECPortFlexBus){ - .cap =3D 0x27, /* Cache, IO, Mem, non-MLD */ + /* 68B (maybe), IO, Mem, non-MLD */ + .cap =3D s->flitmode ? 0x7 : 0x27, .ctrl =3D 0x02, /* IO always enabled */ - .status =3D 0x26, /* same */ + .status =3D s->flitmode ? 0x6 : 0x26, /* same */ .rcvd_mod_ts_data_phase1 =3D 0xef, /* WTF? */ }; cxl_component_create_dvsec(cxl, CXL2_DOWNSTREAM_PORT, @@ -212,7 +214,7 @@ static void cxl_dsp_realize(PCIDevice *d, Error **errp) =20 cxl_cstate->dvsec_offset =3D CXL_DOWNSTREAM_PORT_DVSEC_OFFSET; cxl_cstate->pdev =3D d; - build_dvsecs(cxl_cstate); + build_dvsecs(d, cxl_cstate); cxl_component_register_block_init(OBJECT(d), cxl_cstate, TYPE_CXL_DSP); memory_region_init(&dsp->bar, OBJECT(d), "registers", (2 << 16)); memory_region_add_subregion(&dsp->bar, 0, component_bar); @@ -257,6 +259,7 @@ static const Property cxl_dsp_props[] =3D { speed, PCIE_LINK_SPEED_64), DEFINE_PROP_PCIE_LINK_WIDTH("x-width", PCIESlot, width, PCIE_LINK_WIDTH_16), + DEFINE_PROP_BOOL("256b-flit", PCIESlot, flitmode, true), }; =20 static void cxl_dsp_class_init(ObjectClass *oc, const void *data) diff --git a/hw/pci-bridge/cxl_root_port.c b/hw/pci-bridge/cxl_root_port.c index f035987b6f1f..fd992b808355 100644 --- a/hw/pci-bridge/cxl_root_port.c +++ b/hw/pci-bridge/cxl_root_port.c @@ -109,8 +109,9 @@ static void latch_registers(CXLRootPort *crp) cxl_component_register_init_common(reg_state, write_msk, CXL2_ROOT_POR= T); } =20 -static void build_dvsecs(CXLComponentState *cxl) +static void build_dvsecs(PCIDevice *d, CXLComponentState *cxl) { + PCIESlot *s =3D PCIE_SLOT(d); CXLDVSECRegisterLocator *regloc_dvsec; uint8_t *dvsec; int i; @@ -131,9 +132,10 @@ static void build_dvsecs(CXLComponentState *cxl) GPF_PORT_DVSEC_REVID, dvsec); =20 dvsec =3D (uint8_t *)&(CXLDVSECPortFlexBus){ - .cap =3D 0x26, /* IO, Mem, non-MLD */ + /* 68B (maybe), IO, Mem, non-MLD */ + .cap =3D s->flitmode ? 0x6 : 0x26, .ctrl =3D 0x2, - .status =3D 0x26, /* same */ + .status =3D s->flitmode ? 0x6 : 0x26, /* same */ .rcvd_mod_ts_data_phase1 =3D 0xef, }; cxl_component_create_dvsec(cxl, CXL2_ROOT_PORT, @@ -189,7 +191,7 @@ static void cxl_rp_realize(DeviceState *dev, Error **er= rp) =20 cxl_cstate->dvsec_offset =3D CXL_ROOT_PORT_DVSEC_OFFSET; cxl_cstate->pdev =3D pci_dev; - build_dvsecs(cxl_cstate); + build_dvsecs(pci_dev, cxl_cstate); =20 cxl_component_register_block_init(OBJECT(pci_dev), cxl_cstate, TYPE_CXL_ROOT_PORT); @@ -235,6 +237,7 @@ static const Property gen_rp_props[] =3D { speed, PCIE_LINK_SPEED_64), DEFINE_PROP_PCIE_LINK_WIDTH("x-width", PCIESlot, width, PCIE_LINK_WIDTH_32), + DEFINE_PROP_BOOL("256b-flit", PCIESlot, flitmode, true), }; =20 static void cxl_rp_dvsec_write_config(PCIDevice *dev, uint32_t addr, diff --git a/hw/pci-bridge/cxl_upstream.c b/hw/pci-bridge/cxl_upstream.c index c2150afff39b..6269276408b8 100644 --- a/hw/pci-bridge/cxl_upstream.c +++ b/hw/pci-bridge/cxl_upstream.c @@ -147,12 +147,13 @@ static void cxl_usp_reset(DeviceState *qdev) =20 pci_bridge_reset(qdev); pcie_cap_deverr_reset(d); - pcie_cap_fill_link_ep_usp(d, usp->width, usp->speed); + pcie_cap_fill_link_ep_usp(d, usp->width, usp->speed, usp->flitmode); latch_registers(usp); } =20 -static void build_dvsecs(CXLComponentState *cxl) +static void build_dvsecs(CXLUpstreamPort *usp) { + CXLComponentState *cxl_cstate =3D &usp->cxl_cstate; CXLDVSECRegisterLocator *regloc_dvsec; uint8_t *dvsec; int i; @@ -160,17 +161,18 @@ static void build_dvsecs(CXLComponentState *cxl) dvsec =3D (uint8_t *)&(CXLDVSECPortExt){ .status =3D 0x1, /* Port Power Management Init Complete */ }; - cxl_component_create_dvsec(cxl, CXL2_UPSTREAM_PORT, + cxl_component_create_dvsec(cxl_cstate, CXL2_UPSTREAM_PORT, EXTENSIONS_PORT_DVSEC_LENGTH, EXTENSIONS_PORT_DVSEC, EXTENSIONS_PORT_DVSEC_REVID, dvsec); dvsec =3D (uint8_t *)&(CXLDVSECPortFlexBus){ - .cap =3D 0x27, /* Cache, IO, Mem, non-MLD */ + /* 68B (maybe), Cache, IO, Mem, non-MLD */ + .cap =3D usp->flitmode ? 0x7 : 0x27, .ctrl =3D 0x27, /* Cache, IO, Mem */ - .status =3D 0x26, /* same */ + .status =3D usp->flitmode ? 0x6 : 0x26, /* same */ .rcvd_mod_ts_data_phase1 =3D 0xef, /* WTF? */ }; - cxl_component_create_dvsec(cxl, CXL2_UPSTREAM_PORT, + cxl_component_create_dvsec(cxl_cstate, CXL2_UPSTREAM_PORT, PCIE_CXL3_FLEXBUS_PORT_DVSEC_LENGTH, PCIE_FLEXBUS_PORT_DVSEC, PCIE_CXL3_FLEXBUS_PORT_DVSEC_REVID, dvsec); @@ -186,7 +188,7 @@ static void build_dvsecs(CXLComponentState *cxl) RBI_CXL_CPMU_REG | 0; /* Port so only one 64 bit bar */ regloc_dvsec->reg_base[1 + i].hi =3D 0; } - cxl_component_create_dvsec(cxl, CXL2_UPSTREAM_PORT, + cxl_component_create_dvsec(cxl_cstate, CXL2_UPSTREAM_PORT, REG_LOC_DVSEC_LENGTH, REG_LOC_DVSEC, REG_LOC_DVSEC_REVID, (uint8_t *)regloc_dvse= c); } @@ -381,7 +383,7 @@ static void cxl_usp_realize(PCIDevice *d, Error **errp) } cxl_cstate->dvsec_offset =3D CXL_UPSTREAM_PORT_DVSEC_OFFSET; cxl_cstate->pdev =3D d; - build_dvsecs(cxl_cstate); + build_dvsecs(usp); cxl_component_register_block_init(OBJECT(d), cxl_cstate, TYPE_CXL_USP); memory_region_init(&usp->bar, OBJECT(d), "registers", (2 << 16)); memory_region_add_subregion(&usp->bar, 0, component_bar); @@ -433,6 +435,7 @@ static const Property cxl_upstream_props[] =3D { speed, PCIE_LINK_SPEED_32), DEFINE_PROP_PCIE_LINK_WIDTH("x-width", CXLUpstreamPort, width, PCIE_LINK_WIDTH_16), + DEFINE_PROP_BOOL("256b-flit", CXLUpstreamPort, flitmode, false), }; =20 static void cxl_upstream_class_init(ObjectClass *oc, const void *data) diff --git a/hw/pci-bridge/gen_pcie_root_port.c b/hw/pci-bridge/gen_pcie_ro= ot_port.c index d9078e783bf0..b092463d471e 100644 --- a/hw/pci-bridge/gen_pcie_root_port.c +++ b/hw/pci-bridge/gen_pcie_root_port.c @@ -145,6 +145,7 @@ static const Property gen_rp_props[] =3D { speed, PCIE_LINK_SPEED_16), DEFINE_PROP_PCIE_LINK_WIDTH("x-width", PCIESlot, width, PCIE_LINK_WIDTH_32), + DEFINE_PROP_BOOL("256b-flit", PCIESlot, flitmode, false), }; =20 static void gen_rp_dev_class_init(ObjectClass *klass, const void *data) diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c index eaeb68894e6e..cc8e7c3cbf3f 100644 --- a/hw/pci/pcie.c +++ b/hw/pci/pcie.c @@ -113,7 +113,7 @@ pcie_cap_v1_fill(PCIDevice *dev, uint8_t port, uint8_t = type, uint8_t version) =20 /* Includes setting the target speed default */ static void pcie_cap_fill_lnk(uint8_t *exp_cap, PCIExpLinkWidth width, - PCIExpLinkSpeed speed) + PCIExpLinkSpeed speed, bool flitmode) { /* Clear and fill LNKCAP from what was configured above */ pci_long_test_and_clear_mask(exp_cap + PCI_EXP_LNKCAP, @@ -158,10 +158,15 @@ static void pcie_cap_fill_lnk(uint8_t *exp_cap, PCIEx= pLinkWidth width, PCI_EXP_LNKCAP2_SLS_64_0GB); } } + + if (flitmode) { + pci_long_test_and_set_mask(exp_cap + PCI_EXP_LNKSTA2, + PCI_EXP_LNKSTA2_FLIT); + } } =20 void pcie_cap_fill_link_ep_usp(PCIDevice *dev, PCIExpLinkWidth width, - PCIExpLinkSpeed speed) + PCIExpLinkSpeed speed, bool flitmode) { uint8_t *exp_cap =3D dev->config + dev->exp.exp_cap; =20 @@ -175,7 +180,7 @@ void pcie_cap_fill_link_ep_usp(PCIDevice *dev, PCIExpLi= nkWidth width, QEMU_PCI_EXP_LNKSTA_NLW(width) | QEMU_PCI_EXP_LNKSTA_CLS(speed)); =20 - pcie_cap_fill_lnk(exp_cap, width, speed); + pcie_cap_fill_lnk(exp_cap, width, speed, flitmode); } =20 static void pcie_cap_fill_slot_lnk(PCIDevice *dev) @@ -212,7 +217,7 @@ static void pcie_cap_fill_slot_lnk(PCIDevice *dev) /* the PCI_EXP_LNKSTA_DLLLA will be set in the hotplug function */ } =20 - pcie_cap_fill_lnk(exp_cap, s->width, s->speed); + pcie_cap_fill_lnk(exp_cap, s->width, s->speed, s->flitmode); } =20 int pcie_cap_init(PCIDevice *dev, uint8_t offset, @@ -1106,6 +1111,8 @@ void pcie_sync_bridge_lnk(PCIDevice *bridge_dev) if (!target || !target->exp.exp_cap) { lnksta =3D lnkcap; } else { + uint16_t lnksta2; + lnksta =3D target->config_read(target, target->exp.exp_cap + PCI_EXP_LNKSTA, sizeof(lnksta)); @@ -1119,6 +1126,14 @@ void pcie_sync_bridge_lnk(PCIDevice *bridge_dev) lnksta &=3D ~PCI_EXP_LNKSTA_CLS; lnksta |=3D lnkcap & PCI_EXP_LNKCAP_SLS; } + + lnksta2 =3D target->config_read(target, + target->exp.exp_cap + PCI_EXP_LNKSTA= 2, + sizeof(lnksta2)); + pci_word_test_and_clear_mask(exp_cap + PCI_EXP_LNKSTA2, + PCI_EXP_LNKSTA2_FLIT); + pci_word_test_and_set_mask(exp_cap + PCI_EXP_LNKSTA2, lnksta2 & + PCI_EXP_LNKSTA2_FLIT); } =20 if (!(lnksta & PCI_EXP_LNKSTA_NLW)) { diff --git a/include/hw/cxl/cxl_device.h b/include/hw/cxl/cxl_device.h index 068c20d61ebc..0abfd678b875 100644 --- a/include/hw/cxl/cxl_device.h +++ b/include/hw/cxl/cxl_device.h @@ -796,6 +796,7 @@ struct CXLType3Dev { /* PCIe link characteristics */ PCIExpLinkSpeed speed; PCIExpLinkWidth width; + bool flitmode; =20 /* DOE */ DOECap doe_cdat; diff --git a/include/hw/pci-bridge/cxl_upstream_port.h b/include/hw/pci-bri= dge/cxl_upstream_port.h index db1dfb6afd98..4862601b2a60 100644 --- a/include/hw/pci-bridge/cxl_upstream_port.h +++ b/include/hw/pci-bridge/cxl_upstream_port.h @@ -20,6 +20,7 @@ typedef struct CXLUpstreamPort { =20 PCIExpLinkSpeed speed; PCIExpLinkWidth width; + bool flitmode; =20 DOECap doe_cdat; uint64_t sn; diff --git a/include/hw/pci/pcie.h b/include/hw/pci/pcie.h index ff6ce08e135a..358374b1df81 100644 --- a/include/hw/pci/pcie.h +++ b/include/hw/pci/pcie.h @@ -142,7 +142,7 @@ void pcie_ari_init(PCIDevice *dev, uint16_t offset); void pcie_dev_ser_num_init(PCIDevice *dev, uint16_t offset, uint64_t ser_n= um); void pcie_ats_init(PCIDevice *dev, uint16_t offset, bool aligned); void pcie_cap_fill_link_ep_usp(PCIDevice *dev, PCIExpLinkWidth width, - PCIExpLinkSpeed speed); + PCIExpLinkSpeed speed, bool flitmode); =20 void pcie_cap_slot_pre_plug_cb(HotplugHandler *hotplug_dev, DeviceState *d= ev, Error **errp); diff --git a/include/hw/pci/pcie_port.h b/include/hw/pci/pcie_port.h index 7cd7af8cfa4b..53cd64c5edff 100644 --- a/include/hw/pci/pcie_port.h +++ b/include/hw/pci/pcie_port.h @@ -58,6 +58,7 @@ struct PCIESlot { =20 PCIExpLinkSpeed speed; PCIExpLinkWidth width; + bool flitmode; =20 /* Disable ACS (really for a pcie_root_port) */ bool disable_acs; --=20 2.39.5 From nobody Mon Feb 9 10:23:32 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=stgolabs.net) ARC-Seal: i=2; a=rsa-sha256; t=1754883368; cv=pass; d=zohomail.com; s=zohoarc; b=ERIOsS9Z9QjclQHFsdcMD5SNaHnQxsklBv8nkvp7OjEpoKYg2bOXDc1RULWcDu/8Dr5f9ISKD+hw0z55/zgwHdgzIYGuZHvlu0nmDiAtOpDhkjB/6mDV+/YA6DYaotEC6r8zNy0s0/9AGth7e0hVte5nuUM9qfnUo21ABzvN7Fo= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1754883368; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=m3zmudrbJi3rUAWruVPmWJ/JHGSWiiguedxKVAHxwYo=; b=ImxPDSg2WVLd3ESYkeFeXmASFexF+r96LIfWJe/64ZVzmSiSJwJFMVv8M96muyq7K0vb8nDmhfypPPO39jXZezia3bJ0lM6tuRFErBBncOLgVbzBkShufPSQ1f0NCsJSDa/ay70MjtHEz8ldDa35jsxA/+Gr0EL1hJtbHn0+wVU= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=stgolabs.net) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1754883368142109.08539826328308; Sun, 10 Aug 2025 20:36:08 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ulJJF-0004zv-Co; Sun, 10 Aug 2025 23:34:53 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ulJJ0-0004xC-Ks for qemu-devel@nongnu.org; Sun, 10 Aug 2025 23:34:40 -0400 Received: from iguana.tulip.relay.mailchannels.net ([23.83.218.253]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ulJIw-00049u-F4 for qemu-devel@nongnu.org; Sun, 10 Aug 2025 23:34:38 -0400 Received: from relay.mailchannels.net (localhost [127.0.0.1]) by relay.mailchannels.net (Postfix) with ESMTP id 47E772C441A; Mon, 11 Aug 2025 03:34:28 +0000 (UTC) Received: from pdx1-sub0-mail-a236.dreamhost.com (100-96-2-147.trex-nlb.outbound.svc.cluster.local [100.96.2.147]) (Authenticated sender: dreamhost) by relay.mailchannels.net (Postfix) with ESMTPA id E1E872C43FF; Mon, 11 Aug 2025 03:34:27 +0000 (UTC) Received: from pdx1-sub0-mail-a236.dreamhost.com (pop.dreamhost.com [64.90.62.162]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384) by 100.96.2.147 (trex/7.1.3); Mon, 11 Aug 2025 03:34:28 +0000 Received: from offworld.lan (syn-076-167-199-067.res.spectrum.com [76.167.199.67]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: dave@stgolabs.net) by pdx1-sub0-mail-a236.dreamhost.com (Postfix) with ESMTPSA id 4c0gH72FKBz6f; Sun, 10 Aug 2025 20:34:27 -0700 (PDT) X-Sender-Id: dreamhost|x-authsender|dave@stgolabs.net ARC-Seal: i=1; s=arc-2022; d=mailchannels.net; t=1754883268; a=rsa-sha256; cv=none; b=uBk70Hwa/GMG7rwNI7slmdquarO7iXm5kfpZWusiTJy3uEO6ndYkT3DHbK17Pp7TT9VNBB 1p3ru5FieRpQ9shaWmsqySr+w5nhvglpqMvUhvJes3BeXILFz8ONhDsqHkK+76R5UYa6iP PhvfgaLKGwJ90aT7Uk4+kXTu+MTYnl/G5dYdaglz95DYBEqOX64pp9fjDIxk4nuAXkKV/E fRvGHjaOIZykJSMOpk8RP6vEvw3C8ZoCj+jIVgWzQ/xbIuy/Y3ymNnVAthBHXBMd6x080D PhAzKYzOuazoQ3NAOHtS23MwwC4Y4Nj9m3KTVlvbnEp+hz2UwACar8Qhlh6MoA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=mailchannels.net; s=arc-2022; t=1754883267; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=m3zmudrbJi3rUAWruVPmWJ/JHGSWiiguedxKVAHxwYo=; b=RGvMpWNw/GPzedyAJ/BJ7DaZ8TtxUmHss8BU1ygVr5AvnKUtmCMU4UxiFc2MMqGOUOYmSh qxS34hEib2d4N1lz+RGNvvzi2okD/MCeqa4XtQ1xkQgtX0OfAj/+1/Jif8QUmYgEudfw0L NkB30lNGHgVCelcHi4BUZXflD17FGHVxOvUb06MfQmZHQQ3ly61uWWnctZ0/RcaUnT/aqH b4+yZyPkQrz3NIbN0WxHXrHGQMIlWz6BL3Y/jHcU6ToEAt+La5HBfeZy2E2+7ZZHcLgiD8 83NT6gYK7mioW7kQgVamu4lAEv/WQhbZN0yqDnvU/7NbYWOFfsrlJKjmj8okEg== ARC-Authentication-Results: i=1; rspamd-698857ffff-wx4gx; auth=pass smtp.auth=dreamhost smtp.mailfrom=dave@stgolabs.net X-Sender-Id: dreamhost|x-authsender|dave@stgolabs.net X-MC-Relay: Neutral X-MailChannels-SenderId: dreamhost|x-authsender|dave@stgolabs.net X-MailChannels-Auth-Id: dreamhost X-Callous-Minister: 53ee5c2b28714c42_1754883268190_3530770340 X-MC-Loop-Signature: 1754883268190:2368623293 X-MC-Ingress-Time: 1754883268190 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=stgolabs.net; s=dreamhost; t=1754883267; bh=m3zmudrbJi3rUAWruVPmWJ/JHGSWiiguedxKVAHxwYo=; h=From:To:Cc:Subject:Date:Content-Transfer-Encoding; b=l3s11WGt8CysfK3+GK9eCzpGtXV6v/BT+VatTyOhalcMkUm0/+t+8Ze2yTdqkYrCA ZP3g1ubzqVnDIX/WnG4g+NYCr1o1wUPbbGKYm6pDj8au0PDpLnTqXX5Oy2o9I+w9V6 0FeADodAUOmQo2AqvGGwNnjJ5XgH7/taaHa+Nn/cQz4vCYUr7MEPcoVO59i+uYGGwy /mzXivf1pBbWdVAfHCwWJaWzwAdsBB/I1GLSZsGu3cl6mJN63zHOhIQ4J0vUKpaISP U0pQKsEwFfw+opfOJeisqkFMKDGoXCDu7gVhd0csBaTByGo4qBVvKGZtqundi7lmOO mmcGJMS1URe1w== From: Davidlohr Bueso To: jonathan.cameron@huawei.com Cc: ira.weiny@intel.com, alucerop@amd.com, a.manzanares@samsung.com, linux-cxl@vger.kernel.org, qemu-devel@nongnu.org, Davidlohr Bueso Subject: [PATCH 2/4] hw/cxl: Refactor component register initialization Date: Sun, 10 Aug 2025 20:34:03 -0700 Message-Id: <20250811033405.332295-3-dave@stgolabs.net> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250811033405.332295-1-dave@stgolabs.net> References: <20250811033405.332295-1-dave@stgolabs.net> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=23.83.218.253; envelope-from=dave@stgolabs.net; helo=iguana.tulip.relay.mailchannels.net X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @stgolabs.net) X-ZM-MESSAGEID: 1754883369213116600 Content-Type: text/plain; charset="utf-8" From: Ira Weiny CXL 3.2 8.2.4 Table 8-22 defines which capabilities are mandatory, not permitted, or optional for each type of device. cxl_component_register_init_common() uses a rather odd 'fall through' mechanism to define each component register set. This assumes that any device or capability being added builds on the previous devices capabilities. This is not true as there are mutually exclusive capabilities defined. For example, downstream ports can not have snoop but it can have Back Invalidate capable decoders. Refactor this code to make it easier to add individual capabilities as defined by a device type. Any capability which is not specified by the type is left NULL'ed out which complies with the packed nature of the register array. Update all spec references to 3.2. No functional changes should be seen with this patch. Signed-off-by: Ira Weiny [rebased, no RAS for HBs, r3.2 references] Signed-off-by: Davidlohr Bueso --- hw/cxl/cxl-component-utils.c | 75 +++++++++++----------------------- include/hw/cxl/cxl_component.h | 33 ++++++++++----- 2 files changed, 46 insertions(+), 62 deletions(-) diff --git a/hw/cxl/cxl-component-utils.c b/hw/cxl/cxl-component-utils.c index ce42fa4a2946..a43d227336ca 100644 --- a/hw/cxl/cxl-component-utils.c +++ b/hw/cxl/cxl-component-utils.c @@ -289,32 +289,6 @@ void cxl_component_register_init_common(uint32_t *reg_= state, { int caps =3D 0; =20 - /* - * In CXL 2.0 the capabilities required for each CXL component are such - * that, with the ordering chosen here, a single number can be used to - * define which capabilities should be provided. - */ - switch (type) { - case CXL2_DOWNSTREAM_PORT: - case CXL2_DEVICE: - /* RAS, Link */ - caps =3D 2; - break; - case CXL2_UPSTREAM_PORT: - case CXL2_TYPE3_DEVICE: - case CXL2_LOGICAL_DEVICE: - /* + HDM */ - caps =3D 3; - break; - case CXL2_ROOT_PORT: - case CXL2_RC: - /* + Extended Security, + Snoop */ - caps =3D 5; - break; - default: - abort(); - } - memset(reg_state, 0, CXL2_COMPONENT_CM_REGION_SIZE); =20 /* CXL Capability Header Register */ @@ -322,11 +296,12 @@ void cxl_component_register_init_common(uint32_t *reg= _state, ARRAY_FIELD_DP32(reg_state, CXL_CAPABILITY_HEADER, VERSION, CXL_CAPABILITY_VERSION); ARRAY_FIELD_DP32(reg_state, CXL_CAPABILITY_HEADER, CACHE_MEM_VERSION, = 1); - ARRAY_FIELD_DP32(reg_state, CXL_CAPABILITY_HEADER, ARRAY_SIZE, caps); =20 #define init_cap_reg(reg, id, version) = \ do { = \ - int which =3D R_CXL_##reg##_CAPABILITY_HEADER; = \ + int which =3D CXL_##reg##_CAP_HDR_IDX; = \ + if (CXL_##reg##_CAP_HDR_IDX > caps) = \ + caps =3D CXL_##reg##_CAP_HDR_IDX; = \ reg_state[which] =3D FIELD_DP32(reg_state[which], = \ CXL_##reg##_CAPABILITY_HEADER, ID, i= d); \ reg_state[which] =3D = \ @@ -337,37 +312,35 @@ void cxl_component_register_init_common(uint32_t *reg= _state, CXL_##reg##_REGISTERS_OFFSET); = \ } while (0) =20 + /* CXL r3.2 8.2.4 Table 8-22 */ switch (type) { - case CXL2_DEVICE: - case CXL2_TYPE3_DEVICE: - case CXL2_LOGICAL_DEVICE: case CXL2_ROOT_PORT: + case CXL2_RC: + /* + Extended Security, + Snoop */ + init_cap_reg(EXTSEC, 6, 1); + init_cap_reg(SNOOP, 8, 1); + /* fallthrough */ case CXL2_UPSTREAM_PORT: + case CXL2_TYPE3_DEVICE: + case CXL2_LOGICAL_DEVICE: + /* + HDM */ + init_cap_reg(HDM, 5, 1); + hdm_init_common(reg_state, write_msk, type); + /* fallthrough */ case CXL2_DOWNSTREAM_PORT: - init_cap_reg(RAS, 2, CXL_RAS_CAPABILITY_VERSION); - ras_init_common(reg_state, write_msk); + case CXL2_DEVICE: + /* RAS, Link */ + if (type !=3D CXL2_RC) { + init_cap_reg(RAS, 2, 2); + ras_init_common(reg_state, write_msk); + } + init_cap_reg(LINK, 4, 2); break; default: - break; - } - - init_cap_reg(LINK, 4, CXL_LINK_CAPABILITY_VERSION); - - if (caps < 3) { - return; - } - - if (type !=3D CXL2_ROOT_PORT) { - init_cap_reg(HDM, 5, CXL_HDM_CAPABILITY_VERSION); - hdm_init_common(reg_state, write_msk, type); - } - if (caps < 5) { - return; + abort(); } =20 - init_cap_reg(EXTSEC, 6, CXL_EXTSEC_CAP_VERSION); - init_cap_reg(SNOOP, 8, CXL_SNOOP_CAP_VERSION); - + ARRAY_FIELD_DP32(reg_state, CXL_CAPABILITY_HEADER, ARRAY_SIZE, caps); #undef init_cap_reg } =20 diff --git a/include/hw/cxl/cxl_component.h b/include/hw/cxl/cxl_component.h index b721333cb7aa..cd92cb02532a 100644 --- a/include/hw/cxl/cxl_component.h +++ b/include/hw/cxl/cxl_component.h @@ -32,10 +32,20 @@ enum reg_type { }; =20 /* - * Capability registers are defined at the top of the CXL.cache/mem region= and - * are packed. For our purposes we will always define the caps in the same - * order. - * CXL r3.1 Table 8-22: CXL_CAPABILITY_ID Assignment for details. + * CXL r3.2 - 8.2.4 Table 8-22 and 8-23 + * + * Capability registers are defined at the top of the CXL.cache/mem region. + * They are defined to be packed and at variable offsets. However, NULL + * capabilities can be added to the packed array. To facilitate easier ac= cess + * within the QEMU code, define these at specified offsets. Then NULL out= any + * capabilities for devices which don't (or can't) have a particular capab= ility + * (see cxl_component_register_init_common). NULL capabilities are to be + * ignored by software. + * + * 'offsets' are based on index's which can then be used to report the arr= ay + * size in CXL Capability Header Register (index/offset 0). + * + * See CXL r3.2 Table 8-25 for an example of allowing a 'NULL' header. */ =20 /* CXL r3.1 Section 8.2.4.1: CXL Capability Header Register */ @@ -46,16 +56,17 @@ REG32(CXL_CAPABILITY_HEADER, 0) FIELD(CXL_CAPABILITY_HEADER, CACHE_MEM_VERSION, 20, 4) FIELD(CXL_CAPABILITY_HEADER, ARRAY_SIZE, 24, 8) =20 -#define CXLx_CAPABILITY_HEADER(type, offset) \ - REG32(CXL_##type##_CAPABILITY_HEADER, offset) \ +#define CXLx_CAPABILITY_HEADER(type, idx) \ + enum { CXL_##type##_CAP_HDR_IDX =3D idx }; \ + REG32(CXL_##type##_CAPABILITY_HEADER, (idx * 0x4)) \ FIELD(CXL_##type##_CAPABILITY_HEADER, ID, 0, 16) \ FIELD(CXL_##type##_CAPABILITY_HEADER, VERSION, 16, 4) \ FIELD(CXL_##type##_CAPABILITY_HEADER, PTR, 20, 12) -CXLx_CAPABILITY_HEADER(RAS, 0x4) -CXLx_CAPABILITY_HEADER(LINK, 0x8) -CXLx_CAPABILITY_HEADER(HDM, 0xc) -CXLx_CAPABILITY_HEADER(EXTSEC, 0x10) -CXLx_CAPABILITY_HEADER(SNOOP, 0x14) +CXLx_CAPABILITY_HEADER(RAS, 1) +CXLx_CAPABILITY_HEADER(LINK, 2) +CXLx_CAPABILITY_HEADER(HDM, 3) +CXLx_CAPABILITY_HEADER(EXTSEC, 4) +CXLx_CAPABILITY_HEADER(SNOOP, 5) =20 /* * Capability structures contain the actual registers that the CXL compone= nt --=20 2.39.5 From nobody Mon Feb 9 10:23:32 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=stgolabs.net) ARC-Seal: i=2; a=rsa-sha256; t=1754883397; cv=pass; d=zohomail.com; s=zohoarc; b=Rmd4BEV/awpitoUKNzKYKw2e5dEa+p3tNaDN4sk7e1gtlGeEhnQx8QRImtoZHL3q/r+zI+crE55oR0Hsuu2MkYjHvJ85vrn9jdYpOQ6BiE1TP5Z+gF/SWHLDg/SdNA03dKKSgfjtUY3VBXKqFzhmXtb8tAoffODAiBC5falO1xg= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1754883397; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=F0QSnTgOLesF0aCE7qfgqoYpipQeSin3zJuG38HwYM8=; b=bRbOrLzl+Gm8EI+tRstp1aywzTnHm5LDreqcPGsncngj0K3ClAotGsZvUojAALDLNByVx/pPE9OwleSegIy3U9dqTzPMnZSGvgkNa/Iuykas0lEi/CpAwpyu48o/OGltF0ru0GflKlzvPMmNpJI4VodW/ap6oERTi5UCuoj9r2w= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=stgolabs.net) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1754883397322709.092520369205; Sun, 10 Aug 2025 20:36:37 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ulJJD-0004zF-8h; Sun, 10 Aug 2025 23:34:51 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ulJIz-0004wk-7R for qemu-devel@nongnu.org; Sun, 10 Aug 2025 23:34:38 -0400 Received: from fly.ash.relay.mailchannels.net ([23.83.222.61]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ulJIw-0004A2-GY for qemu-devel@nongnu.org; Sun, 10 Aug 2025 23:34:36 -0400 Received: from relay.mailchannels.net (localhost [127.0.0.1]) by relay.mailchannels.net (Postfix) with ESMTP id CFA2541D5E; Mon, 11 Aug 2025 03:34:28 +0000 (UTC) Received: from pdx1-sub0-mail-a236.dreamhost.com (trex-blue-7.trex.outbound.svc.cluster.local [100.96.43.79]) (Authenticated sender: dreamhost) by relay.mailchannels.net (Postfix) with ESMTPA id 7ABAF437A7; Mon, 11 Aug 2025 03:34:28 +0000 (UTC) Received: from pdx1-sub0-mail-a236.dreamhost.com (pop.dreamhost.com [64.90.62.162]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384) by 100.96.43.79 (trex/7.1.3); Mon, 11 Aug 2025 03:34:28 +0000 Received: from offworld.lan (syn-076-167-199-067.res.spectrum.com [76.167.199.67]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: dave@stgolabs.net) by pdx1-sub0-mail-a236.dreamhost.com (Postfix) with ESMTPSA id 4c0gH76dDNz6v; Sun, 10 Aug 2025 20:34:27 -0700 (PDT) X-Sender-Id: dreamhost|x-authsender|dave@stgolabs.net ARC-Seal: i=1; s=arc-2022; d=mailchannels.net; t=1754883268; a=rsa-sha256; cv=none; b=Nb2ilMRgRC2Re0fbJVGj1rtly8hG2b8mTINNToaQ/xX4H7+a3MIfTvq6doo+2wgvFq37ib oP9yV7ECKVoB/mbAwuZG8tO7v27llvmCR9ak3itjhYeNA31DyyPKbwtxqviDQ9FkzRIskH fJzp8WFziY4roTIYu3L3qvPHSRQkfnp3W+jrtTnz2jAeyu65Grs/jY3J4NslcBGQ/vBgxu VGDYc3Oossh8LxBhRODGo6ml2xJpMK8MZhtrfdyU11A9XdZyBc27vSSr9S8KYV43FRQt19 +m/PrJsrSczERMZOd4nuFYG3Yo8QUZZM7Tkt2Zn8OyzRA5ArZvqeO2p3iU6zDQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=mailchannels.net; s=arc-2022; t=1754883268; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=F0QSnTgOLesF0aCE7qfgqoYpipQeSin3zJuG38HwYM8=; b=w7mGWLeKWrwBQiFNa6skAwShcNJrMOTlvazIkQkJYpGOW41Smogab70021W/gQsdgt6mtH 8ZoHaFFXYE5MA74mRaWjnomHn4AMXuu10zrGgt1SopYB5QtHZR2dG/PrnrJYrXn/2uLWXs T42JjOmuzOUbIebcAsd674HCGrotBCa4RA9Hf9Gvy8B7SKfKucFywcV7XvXoYzWEcPzX4j Ik10fGWGpOTY1QkGdLyQK04i8S0Pwi+wyELMUxQbemnm1g1327rW6zyuGj3aJamWZDnMOC pa/HoY0KFmNiLzFyrxxtsyL7NXNoBJOBctGDaUimdf2+vh8mnXUKLJftr35rsg== ARC-Authentication-Results: i=1; rspamd-64567b6586-nb9n5; auth=pass smtp.auth=dreamhost smtp.mailfrom=dave@stgolabs.net X-Sender-Id: dreamhost|x-authsender|dave@stgolabs.net X-MC-Relay: Neutral X-MailChannels-SenderId: dreamhost|x-authsender|dave@stgolabs.net X-MailChannels-Auth-Id: dreamhost X-Reaction-Harbor: 3ba9798a7bf89247_1754883268761_600204874 X-MC-Loop-Signature: 1754883268761:3584875587 X-MC-Ingress-Time: 1754883268761 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=stgolabs.net; s=dreamhost; t=1754883268; bh=F0QSnTgOLesF0aCE7qfgqoYpipQeSin3zJuG38HwYM8=; h=From:To:Cc:Subject:Date:Content-Transfer-Encoding; b=FZyVd+XCoFqlGgKVRgH6E8JBMBt9OZklwkkmE8/Ug3xNLp7PDT8vxYdpFMO6jxvHH HaiPpMOgcRTBx2OK+2Ni+pNvlwShrgvOJLWmhrsi6ovVRQsj5hWVOA882AjI+zm4em 8PUnNy7VOmuApiXTtTxK3xvk2FsVdr6EyVHuW8eifsaExY6wOlIQ2SmZqo/qgEV0B9 bfbIZggWO6PBH7HUmPtzf/zJ/LwP0Ra9oHQVbwhXZmRVfXRQtAvJEAfKFXab5f5yuc mL1AbxUD3ViMp5/Q/yC1i3UO+EHNTUKrN7PkC+pwbK4t7MSSKOdKiZ7zRGDZ4fBk96 3XVJ6HP5rO+mA== From: Davidlohr Bueso To: jonathan.cameron@huawei.com Cc: ira.weiny@intel.com, alucerop@amd.com, a.manzanares@samsung.com, linux-cxl@vger.kernel.org, qemu-devel@nongnu.org, Davidlohr Bueso Subject: [PATCH 3/4] hw/cxl: Allow BI by default in Window restrictions Date: Sun, 10 Aug 2025 20:34:04 -0700 Message-Id: <20250811033405.332295-4-dave@stgolabs.net> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250811033405.332295-1-dave@stgolabs.net> References: <20250811033405.332295-1-dave@stgolabs.net> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=23.83.222.61; envelope-from=dave@stgolabs.net; helo=fly.ash.relay.mailchannels.net X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @stgolabs.net) X-ZM-MESSAGEID: 1754883399092124100 Content-Type: text/plain; charset="utf-8" Update the CFMW restrictions to also permit Back-Invalidate flows by default, which is aligned with the no-restrictions policy. While at it, document the 'restrictions=3D' option. Signed-off-by: Davidlohr Bueso --- hw/cxl/cxl-host.c | 2 +- qapi/machine.json | 3 ++- qemu-options.hx | 4 +++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/hw/cxl/cxl-host.c b/hw/cxl/cxl-host.c index def2cf75be61..0d17ea3e4c26 100644 --- a/hw/cxl/cxl-host.c +++ b/hw/cxl/cxl-host.c @@ -64,7 +64,7 @@ static void cxl_fixed_memory_window_config(CXLFixedMemory= WindowOptions *object, if (object->has_restrictions) { fw->restrictions =3D object->restrictions; } else { - fw->restrictions =3D 0xf; /* No restrictions */ + fw->restrictions =3D 0x2f; /* No restrictions */ } =20 fw->targets =3D g_malloc0_n(fw->num_targets, sizeof(*fw->targets)); diff --git a/qapi/machine.json b/qapi/machine.json index ac258578e4ab..ea8ba71305b0 100644 --- a/qapi/machine.json +++ b/qapi/machine.json @@ -589,7 +589,8 @@ # BIT(2) - Volatile # BIT(3) - Persistent # BIT(4) - Fixed Device Config -# Default is 0xF +# BIT(5) - BI +# Default is 0x2F # # @targets: Target root bridge IDs from -device ...,id=3D for each # root bridge. diff --git a/qemu-options.hx b/qemu-options.hx index 1f862b19a676..2da65fad3c9f 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -142,7 +142,7 @@ SRST -machine memory-backend=3Dpc.ram -m 512M =20 - ``cxl-fmw.0.targets.0=3Dfirsttarget,cxl-fmw.0.targets.1=3Dsecondtarget= ,cxl-fmw.0.size=3Dsize[,cxl-fmw.0.interleave-granularity=3Dgranularity]`` + ``cxl-fmw.0.targets.0=3Dfirsttarget,cxl-fmw.0.targets.1=3Dsecondtarget= ,cxl-fmw.0.size=3Dsize[,cxl-fmw.0.interleave-granularity=3Dgranularity,rest= rictions=3Drestrictions]`` Define a CXL Fixed Memory Window (CFMW). =20 Described in the CXL 2.0 ECN: CEDT CFMWS & QTG _DSM. @@ -168,6 +168,8 @@ SRST interleave. Default 256 (bytes). Only 256, 512, 1k, 2k, 4k, 8k and 16k granularities supported. =20 + ``restrictions=3Drestrictions`` bitmask with the restrictions of t= he CFMW. + Example: =20 :: --=20 2.39.5 From nobody Mon Feb 9 10:23:32 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=stgolabs.net) ARC-Seal: i=2; a=rsa-sha256; t=1754883367; cv=pass; d=zohomail.com; s=zohoarc; b=kdThq09d+XX6GzxKubFLxgmYnfiQlY15ZjbAnMVdIGaEii0Oz508E9eahe9U64cEQ4ZL7DDxWfX9/90uLkunwQqqvnHXNExUWJhe0qpK+aqOtdKXWmj9tidZfAH00tAazwuqxcT4g0YqDn07w+9qdMkTdaYPyM3wQgyPi9pKwPw= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1754883367; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=uILKmGILpKHxLSPUg/Hi6AfLps5Z6p0FAQdbhoZZhtY=; b=nbMpVfV7Z73EyuBzMt2Cv9Piq/s7WiRDmynV+sB01/GkJrXIKX+xHTn9Mal9cybBbCzXnqjyEC5Qn3bQE+eS8eeqx9L++1Q/ZfnCtoBfkZL3DGjDfevWcEGp+dP7A+2kBqQ5RPiGbdzHqzMRNWk4+GUXxbq7guUIWJ2SucbyWnA= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=stgolabs.net) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 17548833675741004.4102022500391; Sun, 10 Aug 2025 20:36:07 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ulJJ8-0004y0-NE; Sun, 10 Aug 2025 23:34:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ulJJ0-0004wt-8z for qemu-devel@nongnu.org; Sun, 10 Aug 2025 23:34:38 -0400 Received: from shrimp.cherry.relay.mailchannels.net ([23.83.223.164]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ulJIw-0004A8-F2 for qemu-devel@nongnu.org; Sun, 10 Aug 2025 23:34:38 -0400 Received: from relay.mailchannels.net (localhost [127.0.0.1]) by relay.mailchannels.net (Postfix) with ESMTP id 6DFF3784342; Mon, 11 Aug 2025 03:34:29 +0000 (UTC) Received: from pdx1-sub0-mail-a236.dreamhost.com (100-96-19-240.trex-nlb.outbound.svc.cluster.local [100.96.19.240]) (Authenticated sender: dreamhost) by relay.mailchannels.net (Postfix) with ESMTPA id 1BBA77841ED; Mon, 11 Aug 2025 03:34:29 +0000 (UTC) Received: from pdx1-sub0-mail-a236.dreamhost.com (pop.dreamhost.com [64.90.62.162]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384) by 100.96.19.240 (trex/7.1.3); Mon, 11 Aug 2025 03:34:29 +0000 Received: from offworld.lan (syn-076-167-199-067.res.spectrum.com [76.167.199.67]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: dave@stgolabs.net) by pdx1-sub0-mail-a236.dreamhost.com (Postfix) with ESMTPSA id 4c0gH83lRmzHC; Sun, 10 Aug 2025 20:34:28 -0700 (PDT) X-Sender-Id: dreamhost|x-authsender|dave@stgolabs.net ARC-Seal: i=1; s=arc-2022; d=mailchannels.net; t=1754883269; a=rsa-sha256; cv=none; b=AGcgBeiIe2ULJd2XpS2H/vJZVHpTM/7uyNLwg2vBJKEJIqGBrdzFhCUMLltZYhe5BYYtsd q0vHf5IYpt+TfTQmo8NWcpMYxd6ZRJDDLjLxHGUH7npn0QGmqTBSMCj3JR7CNeGiawXpyF Si8Rq+0/5cW4lwG8oPTzVQqhuIFdK+qJjuNHLhwXNAM4ARaXiMMXQTDtiSJWgENekNcjMD whqPwPq8GceeVgka1FFHPmjkiGdnwEciFqBZKOTdeQuu/V91yeIUMDWcmpXGRK5VB+ph2p ALxdobpJPHWf8ZVMpVOuy8INIrHYmUa9oFHZZYH22XqXOnK6fqmBYgDa6gyolw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=mailchannels.net; s=arc-2022; t=1754883269; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=uILKmGILpKHxLSPUg/Hi6AfLps5Z6p0FAQdbhoZZhtY=; b=IXJU18+hfYBnB1y0ZE/Bqsaek4JF/zX6dhsojaxkk87Zlu6iE9bzssPKKu7qTpqYJ+mDie YOoSLg9zQq5wGwXU1u8YWf4RWU22V3b8o5oBK01WoSvb7ZGY12ussnMF7qDyVCGSFWRH0/ VH3xDsghpoEzYPd8qZVRBd1nHFx0oVuuprVwZzDXTDWeD3Nv9p2Um/WKefOC/JiF83v0GN 1dzLwzJZLRQx5Uj4yzYkTN3jD4YA5TsUo64XUNDPMSC3riYES0IPH9TnMn6NMIhoKeXtWA U85duCjnGhLCLHoMztYuWeuNL2BUqU15GZh04RrxhCBVKKcU1gM+vZOvBymcVQ== ARC-Authentication-Results: i=1; rspamd-698857ffff-tgkvl; auth=pass smtp.auth=dreamhost smtp.mailfrom=dave@stgolabs.net X-Sender-Id: dreamhost|x-authsender|dave@stgolabs.net X-MC-Relay: Neutral X-MailChannels-SenderId: dreamhost|x-authsender|dave@stgolabs.net X-MailChannels-Auth-Id: dreamhost X-Belong-White: 09d06b067e85cead_1754883269391_2431456918 X-MC-Loop-Signature: 1754883269391:158543795 X-MC-Ingress-Time: 1754883269391 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=stgolabs.net; s=dreamhost; t=1754883268; bh=uILKmGILpKHxLSPUg/Hi6AfLps5Z6p0FAQdbhoZZhtY=; h=From:To:Cc:Subject:Date:Content-Transfer-Encoding; b=bPGmjcxU8CcpmG8bNPC7IXPwln+mfibqYSNnBmzFZUKd3Y7GerjxXWxBdMSh6cqE5 GJhlvHHT5LPTaNRoUWf0XqNxbak/bY2G52/DsX4Vmsmy8/a9rsF3Y6Gzl1JaUCjeSW w/Dn/V9vaTTK6eCagZvbTpRTlh33+gAdVCPqjX5ELgdmuOTQQQV3ClQOnuLZ7j2p0g RqL44phP8szeZBsQ48yW+Ng51MPJzIyFZ4xYx5nX9UKu3duKvEiqSbQSX3+f9xO7gx nQL/RzLD6ZXzrTtRxcjm9Xl91DnnR6VCy3MU9QxWPACLWnbCcTwkshvnQVoQMjbJZz YssjP+jjFRquw== From: Davidlohr Bueso To: jonathan.cameron@huawei.com Cc: ira.weiny@intel.com, alucerop@amd.com, a.manzanares@samsung.com, linux-cxl@vger.kernel.org, qemu-devel@nongnu.org, Davidlohr Bueso Subject: [PATCH 4/4] hw/cxl: Support type3 HDM-DB Date: Sun, 10 Aug 2025 20:34:05 -0700 Message-Id: <20250811033405.332295-5-dave@stgolabs.net> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250811033405.332295-1-dave@stgolabs.net> References: <20250811033405.332295-1-dave@stgolabs.net> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=23.83.223.164; envelope-from=dave@stgolabs.net; helo=shrimp.cherry.relay.mailchannels.net X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @stgolabs.net) X-ZM-MESSAGEID: 1754883369296116600 Content-Type: text/plain; charset="utf-8" Add basic plumbing for memory expander devices that support Back Invalidation. This introduces a 'hdm-db=3Don|off' parameter and exposes the relevant BI RT/Decoder component cachemem registers. Some noteworthy properties: - Devices require enabling Flit mode. - Explicit BI-ID commit is required. - HDM decoder support both host and dev coherency models. Signed-off-by: Davidlohr Bueso --- docs/system/devices/cxl.rst | 23 ++++++ hw/cxl/cxl-component-utils.c | 135 +++++++++++++++++++++++++++++++-- hw/mem/cxl_type3.c | 14 +++- include/hw/cxl/cxl_component.h | 54 ++++++++++++- include/hw/cxl/cxl_device.h | 3 + 5 files changed, 217 insertions(+), 12 deletions(-) diff --git a/docs/system/devices/cxl.rst b/docs/system/devices/cxl.rst index bf7908429af8..4815de0f2dc4 100644 --- a/docs/system/devices/cxl.rst +++ b/docs/system/devices/cxl.rst @@ -384,6 +384,29 @@ An example of 4 devices below a switch suitable for 1,= 2 or 4 way interleave:: -device cxl-type3,bus=3Dswport3,persistent-memdev=3Dcxl-mem3,lsa=3Dcxl-l= sa3,id=3Dcxl-pmem3,sn=3D0x4 \ -M cxl-fmw.0.targets.0=3Dcxl.1,cxl-fmw.0.size=3D4G,cxl-fmw.0.interleave-= granularity=3D4k =20 +An example of 4 type3 devices with volatile memory below a switch. Two of = the devices +use HDM-DB for coherence:: + + qemu-system-x86_64 -M q35,cxl=3Don -m 4G,maxmem=3D8G,slots=3D8 -smp 4 \ + ... + -object memory-backend-file,id=3Dcxl-mem0,share=3Don,mem-path=3D/tmp/cxl= test.raw,size=3D256M \ + -object memory-backend-file,id=3Dcxl-mem1,share=3Don,mem-path=3D/tmp/cxl= test1.raw,size=3D256M \ + -object memory-backend-file,id=3Dcxl-mem2,share=3Don,mem-path=3D/tmp/cxl= test2.raw,size=3D256M \ + -object memory-backend-file,id=3Dcxl-mem3,share=3Don,mem-path=3D/tmp/cxl= test3.raw,size=3D256M \ + -device pxb-cxl,bus_nr=3D12,bus=3Dpcie.0,id=3Dcxl.1 \ + -device cxl-rp,port=3D0,bus=3Dcxl.1,id=3Droot_port0,chassis=3D0,slot=3D0= \ + -device cxl-rp,port=3D1,bus=3Dcxl.1,id=3Droot_port1,chassis=3D0,slot=3D1= \ + -device cxl-upstream,bus=3Droot_port0,id=3Dus0,256b-flit=3Don \ + -device cxl-downstream,port=3D0,bus=3Dus0,id=3Dswport0,chassis=3D0,slot= =3D4 \ + -device cxl-type3,bus=3Dswport0,volatile-memdev=3Dcxl-mem0,id=3Dcxl-mem0= ,sn=3D0x1,256b-flit=3Don,hdm-db=3Don \ + -device cxl-downstream,port=3D1,bus=3Dus0,id=3Dswport1,chassis=3D0,slot= =3D5 \ + -device cxl-type3,bus=3Dswport1,volatile-memdev=3Dcxl-mem1,id=3Dcxl-mem1= ,sn=3D0x2,256b-flit=3Don,hdm-db=3Don \ + -device cxl-downstream,port=3D2,bus=3Dus0,id=3Dswport2,chassis=3D0,slot= =3D6 \ + -device cxl-type3,bus=3Dswport2,volatile-memdev=3Dcxl-mem2,id=3Dcxl-mem2= ,sn=3D0x3 \ + -device cxl-downstream,port=3D3,bus=3Dus0,id=3Dswport3,chassis=3D0,slot= =3D7 \ + -device cxl-type3,bus=3Dswport3,volatile-memdev=3Dcxl-mem3,id=3Dcxl-mem3= ,sn=3D0x4 \ + -M cxl-fmw.0.targets.0=3Dcxl.1,cxl-fmw.0.size=3D4G,cxl-fmw.0.interleave-= granularity=3D4k + A simple arm/virt example featuring a single direct connected CXL Type 3 Volatile Memory device:: =20 diff --git a/hw/cxl/cxl-component-utils.c b/hw/cxl/cxl-component-utils.c index a43d227336ca..dfdbf23a427c 100644 --- a/hw/cxl/cxl-component-utils.c +++ b/hw/cxl/cxl-component-utils.c @@ -71,10 +71,40 @@ static uint64_t cxl_cache_mem_read_reg(void *opaque, hw= addr offset, case 4: if (cregs->special_ops && cregs->special_ops->read) { return cregs->special_ops->read(cxl_cstate, offset, 4); - } else { - QEMU_BUILD_BUG_ON(sizeof(*cregs->cache_mem_registers) !=3D 4); - return cregs->cache_mem_registers[offset / 4]; } + + QEMU_BUILD_BUG_ON(sizeof(*cregs->cache_mem_registers) !=3D 4); + + if (offset =3D=3D A_CXL_BI_RT_STATUS || + offset =3D=3D A_CXL_BI_DECODER_STATUS) { + int type; + uint64_t started; + + type =3D (offset =3D=3D A_CXL_BI_RT_STATUS) ? + CXL_BISTATE_RT : CXL_BISTATE_DECODER; + started =3D cxl_cstate->bi_state[type].last_commit; + + if (started) { + uint32_t val, *cache_mem =3D cregs->cache_mem_registers; + uint64_t now; + int set; + + val =3D cregs->cache_mem_registers[offset / 4]; + now =3D qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL); + /* arbitrary 100 ms to do the commit */ + set =3D !!(now >=3D started + 100); + + if (offset =3D=3D A_CXL_BI_RT_STATUS) { + val =3D FIELD_DP32(val, CXL_BI_RT_STATUS, COMMITTED, s= et); + } else { + val =3D FIELD_DP32(val, CXL_BI_DECODER_STATUS, COMMITT= ED, + set); + } + stl_le_p((uint8_t *)cache_mem + offset, val); + } + } + + return cregs->cache_mem_registers[offset / 4]; case 8: qemu_log_mask(LOG_UNIMP, "CXL 8 byte cache mem registers not implemented\n"); @@ -123,6 +153,47 @@ static void dumb_hdm_handler(CXLComponentState *cxl_cs= tate, hwaddr offset, } } =20 +static void dumb_bi_handler(CXLComponentState *cxl_cstate, hwaddr offset, + uint32_t value) +{ + ComponentRegisters *cregs =3D &cxl_cstate->crb; + uint32_t sts, *cache_mem =3D cregs->cache_mem_registers; + bool to_commit =3D false; + int type; + + switch (offset) { + case A_CXL_BI_RT_CTRL: + to_commit =3D FIELD_EX32(value, CXL_BI_RT_CTRL, COMMIT); + if (to_commit) { + sts =3D cxl_cache_mem_read_reg(cxl_cstate, + R_CXL_BI_RT_STATUS, 4); + sts =3D FIELD_DP32(sts, CXL_BI_RT_STATUS, COMMITTED, 0); + stl_le_p((uint8_t *)cache_mem + R_CXL_BI_RT_STATUS, sts); + type =3D CXL_BISTATE_RT; + } + break; + case A_CXL_BI_DECODER_CTRL: + to_commit =3D FIELD_EX32(value, CXL_BI_DECODER_CTRL, COMMIT); + if (to_commit) { + sts =3D cxl_cache_mem_read_reg(cxl_cstate, + R_CXL_BI_DECODER_STATUS, 4); + sts =3D FIELD_DP32(sts, CXL_BI_DECODER_STATUS, COMMITTED, 0); + stl_le_p((uint8_t *)cache_mem + R_CXL_BI_DECODER_STATUS, sts); + type =3D CXL_BISTATE_DECODER; + } + break; + default: + break; + } + + if (to_commit) { + cxl_cstate->bi_state[type].last_commit =3D + qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL); + } + + stl_le_p((uint8_t *)cache_mem + offset, value); +} + static void cxl_cache_mem_write_reg(void *opaque, hwaddr offset, uint64_t = value, unsigned size) { @@ -146,6 +217,9 @@ static void cxl_cache_mem_write_reg(void *opaque, hwadd= r offset, uint64_t value, if (offset >=3D A_CXL_HDM_DECODER_CAPABILITY && offset <=3D A_CXL_HDM_DECODER3_TARGET_LIST_HI) { dumb_hdm_handler(cxl_cstate, offset, value); + } else if (offset =3D=3D A_CXL_BI_RT_CTRL || + offset =3D=3D A_CXL_BI_DECODER_CTRL) { + dumb_bi_handler(cxl_cstate, offset, value); } else { cregs->cache_mem_registers[offset / 4] =3D value; } @@ -248,7 +322,7 @@ static void hdm_init_common(uint32_t *reg_state, uint32= _t *write_msk, ARRAY_FIELD_DP32(reg_state, CXL_HDM_DECODER_CAPABILITY, INTERLEAVE_4K,= 1); ARRAY_FIELD_DP32(reg_state, CXL_HDM_DECODER_CAPABILITY, POISON_ON_ERR_CAP, 0); - if (type =3D=3D CXL2_TYPE3_DEVICE) { + if (type =3D=3D CXL2_TYPE3_DEVICE || type =3D=3D CXL3_TYPE3_DEVICE) { ARRAY_FIELD_DP32(reg_state, CXL_HDM_DECODER_CAPABILITY, 3_6_12_WAY= , 1); ARRAY_FIELD_DP32(reg_state, CXL_HDM_DECODER_CAPABILITY, 16_WAY, 1); } else { @@ -260,7 +334,8 @@ static void hdm_init_common(uint32_t *reg_state, uint32= _t *write_msk, UIO_DECODER_COUNT, 0); ARRAY_FIELD_DP32(reg_state, CXL_HDM_DECODER_CAPABILITY, MEMDATA_NXM_CA= P, 0); ARRAY_FIELD_DP32(reg_state, CXL_HDM_DECODER_CAPABILITY, - SUPPORTED_COHERENCY_MODEL, 0); /* Unknown */ + SUPPORTED_COHERENCY_MODEL, + type =3D=3D CXL3_TYPE3_DEVICE ? 3:0); /* host+dev or = Unknown */ ARRAY_FIELD_DP32(reg_state, CXL_HDM_DECODER_GLOBAL_CONTROL, HDM_DECODER_ENABLE, 0); write_msk[R_CXL_HDM_DECODER_GLOBAL_CONTROL] =3D 0x3; @@ -271,7 +346,7 @@ static void hdm_init_common(uint32_t *reg_state, uint32= _t *write_msk, write_msk[R_CXL_HDM_DECODER0_SIZE_HI + i * hdm_inc] =3D 0xffffffff; write_msk[R_CXL_HDM_DECODER0_CTRL + i * hdm_inc] =3D 0x13ff; if (type =3D=3D CXL2_DEVICE || - type =3D=3D CXL2_TYPE3_DEVICE || + type =3D=3D CXL2_TYPE3_DEVICE || type =3D=3D CXL3_TYPE3_DEVICE= || type =3D=3D CXL2_LOGICAL_DEVICE) { write_msk[R_CXL_HDM_DECODER0_TARGET_LIST_LO + i * hdm_inc] =3D 0xf0000000; @@ -283,6 +358,37 @@ static void hdm_init_common(uint32_t *reg_state, uint3= 2_t *write_msk, } } =20 +static void bi_rt_init_common(uint32_t *reg_state, uint32_t *write_msk) +{ + /* switch usp must commit the new BI-ID, timeout of 2secs */ + ARRAY_FIELD_DP32(reg_state, CXL_BI_RT_CAPABILITY, EXPLICIT_COMMIT, 1); + + ARRAY_FIELD_DP32(reg_state, CXL_BI_RT_CTRL, COMMIT, 0); + write_msk[R_CXL_BI_RT_CTRL] =3D 0xffffffff; + + ARRAY_FIELD_DP32(reg_state, CXL_BI_RT_STATUS, COMMITTED, 0); + ARRAY_FIELD_DP32(reg_state, CXL_BI_RT_STATUS, ERR_NOT_COMMITTED, 0); + ARRAY_FIELD_DP32(reg_state, CXL_BI_RT_STATUS, COMMIT_TMO_SCALE, 0x6); + ARRAY_FIELD_DP32(reg_state, CXL_BI_RT_STATUS, COMMIT_TMO_BASE, 0x2); +} + +static void bi_decoder_init_common(uint32_t *reg_state, uint32_t *write_ms= k) +{ + ARRAY_FIELD_DP32(reg_state, CXL_BI_DECODER_CAPABILITY, HDM_D, 0); + /* switch dsp must commit the new BI-ID, timeout of 2secs */ + ARRAY_FIELD_DP32(reg_state, CXL_BI_DECODER_CAPABILITY, EXPLICIT_COMMIT= , 1); + + ARRAY_FIELD_DP32(reg_state, CXL_BI_DECODER_CTRL, BI_FW, 0); + ARRAY_FIELD_DP32(reg_state, CXL_BI_DECODER_CTRL, BI_ENABLE, 0); + ARRAY_FIELD_DP32(reg_state, CXL_BI_DECODER_CTRL, COMMIT, 0); + write_msk[R_CXL_BI_DECODER_CTRL] =3D 0xffffffff; + + ARRAY_FIELD_DP32(reg_state, CXL_BI_DECODER_STATUS, COMMITTED, 0); + ARRAY_FIELD_DP32(reg_state, CXL_BI_DECODER_STATUS, ERR_NOT_COMMITTED, = 0); + ARRAY_FIELD_DP32(reg_state, CXL_BI_DECODER_STATUS, COMMIT_TMO_SCALE, 0= x6); + ARRAY_FIELD_DP32(reg_state, CXL_BI_DECODER_STATUS, COMMIT_TMO_BASE, 0x= 2); +} + void cxl_component_register_init_common(uint32_t *reg_state, uint32_t *write_msk, enum reg_type type) @@ -323,6 +429,7 @@ void cxl_component_register_init_common(uint32_t *reg_s= tate, case CXL2_UPSTREAM_PORT: case CXL2_TYPE3_DEVICE: case CXL2_LOGICAL_DEVICE: + case CXL3_TYPE3_DEVICE: /* + HDM */ init_cap_reg(HDM, 5, 1); hdm_init_common(reg_state, write_msk, type); @@ -340,6 +447,22 @@ void cxl_component_register_init_common(uint32_t *reg_= state, abort(); } =20 + /* back invalidate */ + switch (type) { + case CXL2_UPSTREAM_PORT: + init_cap_reg(BI_RT, 11, CXL_BI_RT_CAP_VERSION); + bi_rt_init_common(reg_state, write_msk); + break; + case CXL2_ROOT_PORT: + case CXL2_DOWNSTREAM_PORT: + case CXL3_TYPE3_DEVICE: + init_cap_reg(BI_DECODER, 12, CXL_BI_DECODER_CAP_VERSION); + bi_decoder_init_common(reg_state, write_msk); + break; + default: + break; + } + ARRAY_FIELD_DP32(reg_state, CXL_CAPABILITY_HEADER, ARRAY_SIZE, caps); #undef init_cap_reg } diff --git a/hw/mem/cxl_type3.c b/hw/mem/cxl_type3.c index ecd3a7703b35..1e55d13c1e93 100644 --- a/hw/mem/cxl_type3.c +++ b/hw/mem/cxl_type3.c @@ -447,6 +447,7 @@ static void build_dvsecs(CXLType3Dev *ct3d) CXLComponentState *cxl_cstate =3D &ct3d->cxl_cstate; CXLDVSECRegisterLocator *regloc_dvsec; uint8_t *dvsec; + uint16_t type =3D ct3d->hdmdb ? CXL3_TYPE3_DEVICE : CXL2_TYPE3_DEVICE; uint32_t range1_size_hi =3D 0, range1_size_lo =3D 0, range1_base_hi =3D 0, range1_base_lo =3D 0, range2_size_hi =3D 0, range2_size_lo =3D 0, @@ -491,7 +492,7 @@ static void build_dvsecs(CXLType3Dev *ct3d) .range2_base_hi =3D range2_base_hi, .range2_base_lo =3D range2_base_lo, }; - cxl_component_create_dvsec(cxl_cstate, CXL2_TYPE3_DEVICE, + cxl_component_create_dvsec(cxl_cstate, type, PCIE_CXL_DEVICE_DVSEC_LENGTH, PCIE_CXL_DEVICE_DVSEC, PCIE_CXL31_DEVICE_DVSEC_REVID, dvsec); @@ -521,14 +522,14 @@ static void build_dvsecs(CXLType3Dev *ct3d) }, }; =20 - cxl_component_create_dvsec(cxl_cstate, CXL2_TYPE3_DEVICE, + cxl_component_create_dvsec(cxl_cstate, type, REG_LOC_DVSEC_LENGTH, REG_LOC_DVSEC, REG_LOC_DVSEC_REVID, (uint8_t *)regloc_dvse= c); dvsec =3D (uint8_t *)&(CXLDVSECDeviceGPF){ .phase2_duration =3D 0x603, /* 3 seconds */ .phase2_power =3D 0x33, /* 0x33 miliwatts */ }; - cxl_component_create_dvsec(cxl_cstate, CXL2_TYPE3_DEVICE, + cxl_component_create_dvsec(cxl_cstate, type, GPF_DEVICE_DVSEC_LENGTH, GPF_DEVICE_DVSEC, GPF_DEVICE_DVSEC_REVID, dvsec); =20 @@ -539,7 +540,7 @@ static void build_dvsecs(CXLType3Dev *ct3d) .status =3D ct3d->flitmode ? 0x6 : 0x26, /* same = */ .rcvd_mod_ts_data_phase1 =3D 0xef, /* WTF? */ }; - cxl_component_create_dvsec(cxl_cstate, CXL2_TYPE3_DEVICE, + cxl_component_create_dvsec(cxl_cstate, type, PCIE_CXL3_FLEXBUS_PORT_DVSEC_LENGTH, PCIE_FLEXBUS_PORT_DVSEC, PCIE_CXL3_FLEXBUS_PORT_DVSEC_REVID, dvsec); @@ -969,6 +970,11 @@ static bool cxl_setup_memory(CXLType3Dev *ct3d, Error = **errp) return false; } =20 + if (!ct3d->flitmode && ct3d->hdmdb) { + error_setg(errp, "hdm-db requires operating in 256b flit"); + return false; + } + if (ct3d->hostvmem) { MemoryRegion *vmr; char *v_name; diff --git a/include/hw/cxl/cxl_component.h b/include/hw/cxl/cxl_component.h index cd92cb02532a..acec76152ad0 100644 --- a/include/hw/cxl/cxl_component.h +++ b/include/hw/cxl/cxl_component.h @@ -29,6 +29,7 @@ enum reg_type { CXL2_UPSTREAM_PORT, CXL2_DOWNSTREAM_PORT, CXL3_SWITCH_MAILBOX_CCI, + CXL3_TYPE3_DEVICE, /* hdm-db */ }; =20 /* @@ -67,6 +68,8 @@ CXLx_CAPABILITY_HEADER(LINK, 2) CXLx_CAPABILITY_HEADER(HDM, 3) CXLx_CAPABILITY_HEADER(EXTSEC, 4) CXLx_CAPABILITY_HEADER(SNOOP, 5) +CXLx_CAPABILITY_HEADER(BI_RT, 6) +CXLx_CAPABILITY_HEADER(BI_DECODER, 7) =20 /* * Capability structures contain the actual registers that the CXL compone= nt @@ -211,10 +214,56 @@ HDM_DECODER_INIT(3); (CXL_IDE_REGISTERS_OFFSET + CXL_IDE_REGISTERS_SIZE) #define CXL_SNOOP_REGISTERS_SIZE 0x8 =20 -QEMU_BUILD_BUG_MSG((CXL_SNOOP_REGISTERS_OFFSET + - CXL_SNOOP_REGISTERS_SIZE) >=3D 0x1000, +#define CXL_BI_RT_CAP_VERSION 1 +#define CXL_BI_RT_REGISTERS_OFFSET \ + (CXL_SNOOP_REGISTERS_OFFSET + CXL_SNOOP_REGISTERS_SIZE) +#define CXL_BI_RT_REGISTERS_SIZE 0xC + +REG32(CXL_BI_RT_CAPABILITY, CXL_BI_RT_REGISTERS_OFFSET) + FIELD(CXL_BI_RT_CAPABILITY, EXPLICIT_COMMIT, 0, 1) +REG32(CXL_BI_RT_CTRL, CXL_BI_RT_REGISTERS_OFFSET + 0x4) + FIELD(CXL_BI_RT_CTRL, COMMIT, 0, 1) +REG32(CXL_BI_RT_STATUS, CXL_BI_RT_REGISTERS_OFFSET + 0x8) + FIELD(CXL_BI_RT_STATUS, COMMITTED, 0, 1) + FIELD(CXL_BI_RT_STATUS, ERR_NOT_COMMITTED, 1, 1) + FIELD(CXL_BI_RT_STATUS, COMMIT_TMO_SCALE, 8, 4) + FIELD(CXL_BI_RT_STATUS, COMMIT_TMO_BASE, 12, 4) + +/* CXL r3.2 8.2.4.27 - CXL BI Decoder Capability Structure */ +#define CXL_BI_DECODER_CAP_VERSION 1 +#define CXL_BI_DECODER_REGISTERS_OFFSET \ + (CXL_BI_RT_REGISTERS_OFFSET + CXL_BI_RT_REGISTERS_SIZE) +#define CXL_BI_DECODER_REGISTERS_SIZE 0xC + +REG32(CXL_BI_DECODER_CAPABILITY, CXL_BI_DECODER_REGISTERS_OFFSET) + FIELD(CXL_BI_DECODER_CAPABILITY, HDM_D, 0, 1) + FIELD(CXL_BI_DECODER_CAPABILITY, EXPLICIT_COMMIT, 1, 1) +REG32(CXL_BI_DECODER_CTRL, CXL_BI_DECODER_REGISTERS_OFFSET + 0x4) + FIELD(CXL_BI_DECODER_CTRL, BI_FW, 0, 1) + FIELD(CXL_BI_DECODER_CTRL, BI_ENABLE, 1, 1) + FIELD(CXL_BI_DECODER_CTRL, COMMIT, 2, 1) +REG32(CXL_BI_DECODER_STATUS, CXL_BI_DECODER_REGISTERS_OFFSET + 0x8) + FIELD(CXL_BI_DECODER_STATUS, COMMITTED, 0, 1) + FIELD(CXL_BI_DECODER_STATUS, ERR_NOT_COMMITTED, 1, 1) + FIELD(CXL_BI_DECODER_STATUS, COMMIT_TMO_SCALE, 8, 4) + FIELD(CXL_BI_DECODER_STATUS, COMMIT_TMO_BASE, 12, 4) + +QEMU_BUILD_BUG_MSG((CXL_BI_DECODER_REGISTERS_OFFSET + + CXL_BI_DECODER_REGISTERS_SIZE) >=3D 0x1000, "No space for registers"); =20 +/* to track BI explicit commit handling */ +enum { + CXL_BISTATE_RT =3D 0, /* switch usp */ + CXL_BISTATE_DECODER, /* switch dsp */ + CXL_BISTATE_MAX +}; + +typedef struct bi_state { + /* last 0->1 transition */ + uint64_t last_commit; +} BIState; + typedef struct component_registers { /* * Main memory region to be registered with QEMU core. @@ -260,6 +309,7 @@ typedef struct cxl_component { =20 CDATObject cdat; CXLCompObject compliance; + BIState bi_state[CXL_BISTATE_MAX]; } CXLComponentState; =20 void cxl_component_register_block_init(Object *obj, diff --git a/include/hw/cxl/cxl_device.h b/include/hw/cxl/cxl_device.h index 0abfd678b875..75603b8180b5 100644 --- a/include/hw/cxl/cxl_device.h +++ b/include/hw/cxl/cxl_device.h @@ -841,6 +841,9 @@ struct CXLType3Dev { CXLMemSparingReadAttrs rank_sparing_attrs; CXLMemSparingWriteAttrs rank_sparing_wr_attrs; =20 + /* BI flows */ + bool hdmdb; + struct dynamic_capacity { HostMemoryBackend *host_dc; AddressSpace host_dc_as; --=20 2.39.5