From nobody Sun Dec 14 02:06:14 2025 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=1754459922; cv=pass; d=zohomail.com; s=zohoarc; b=HMyFoWAm11fOXGLic6I4Tl+37QDAyVY+bMh2m63xML3oJSXEuxHDsHerRZtbIl82CeCuQe/BL9capL/Bo6IeYyGKPTXAmiDMbLNOSvMJ+FGuidvhGx9rsSKqvpdBJ4bGNu9P4c/T2npJj+B3Ugq9jA+sBNSE3rkJtb+WpFWEVz0= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1754459922; 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=JXxgqZuGbutG28XkrBGlw+oxu1u/Ig8R+KhwSol6kCE=; b=bzSyN7RAlLlLKgqZB+cETGXfPxEkhhKRRiXfCy3ym3qs6VLQ9anZQ1NXkTm3MSp01wfRurAJmpl1+OSB+QQ48uci5HYiRQ1MZK9OSyQI5+l3vTDZDrp6MeQf2AoMH6owfl7T6Y3+dLF0ZwVLUulVZZQqnKGWXZu6TWiMQaK+HOM= 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 1754459922352308.42574649157893; Tue, 5 Aug 2025 22:58:42 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ujX9h-0003KK-7N; Wed, 06 Aug 2025 01:57:42 -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 1ujX9W-0003H9-8Z for qemu-devel@nongnu.org; Wed, 06 Aug 2025 01:57:33 -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 1ujX9T-00036d-36 for qemu-devel@nongnu.org; Wed, 06 Aug 2025 01:57:30 -0400 Received: from relay.mailchannels.net (localhost [127.0.0.1]) by relay.mailchannels.net (Postfix) with ESMTP id 7BFD02C48ED; Wed, 6 Aug 2025 05:57:23 +0000 (UTC) Received: from pdx1-sub0-mail-a291.dreamhost.com (trex-blue-1.trex.outbound.svc.cluster.local [100.96.40.151]) (Authenticated sender: dreamhost) by relay.mailchannels.net (Postfix) with ESMTPA id 1BD5F2C5666; Wed, 6 Aug 2025 05:57:23 +0000 (UTC) Received: from pdx1-sub0-mail-a291.dreamhost.com (pop.dreamhost.com [64.90.62.162]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384) by 100.96.40.151 (trex/7.1.3); Wed, 06 Aug 2025 05:57:23 +0000 Received: from localhost.localdomain (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-a291.dreamhost.com (Postfix) with ESMTPSA id 4bxfhL3XgMz55; Tue, 5 Aug 2025 22:57:22 -0700 (PDT) X-Sender-Id: dreamhost|x-authsender|dave@stgolabs.net ARC-Seal: i=1; s=arc-2022; d=mailchannels.net; t=1754459843; a=rsa-sha256; cv=none; b=qW/Uahz5Eo9Jzt1zRI6WtqB0smONXEjppP8YRf0fI7Q5L7Nad6U3KwRhcsNUeZWx6nDLik dPj69yoSG1IpYU9LB7ypCRrTU+jMmGkGom7aKvldqfWKIk3S8n+j6/S5pdp+99GBJp3SlN EUbPY0VFFMNJOddjbr3G4VD8fnhP++IQCOVImQie6np5dTKU66b9rka30DxYKd7nAQGt7B avzEN+Xut0x/GhSWIXdE/4vqXcQm544imaeu1Fy+duA6mJFHvOUKcOL2mLS2UrypL/HRqV Kjq13C4Qnb8AaKijdBYg71sJaNOkhXi/E/JCUtMWr2KYagihUr76hbQfE8d10A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=mailchannels.net; s=arc-2022; t=1754459843; 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=JXxgqZuGbutG28XkrBGlw+oxu1u/Ig8R+KhwSol6kCE=; b=Qk8V7QUTOVb4Pmo7w7wA8iBzR29Me95wssbOIp5sVke24Y/rUbLhsBYPC8wOwUHroiTqQE RDUNU7j9OphQsWgnId0b5+X2LR55Y60bagms5QhMHO9lMtPI5k68DjurIu0Gi0dsQBKDNA ZSD2HAESmrBRVIg6M+jlrQ69dEC4WZC2ol1uGkqjaJWePUHoyq2Ok7yipDGWigAxFh+0Yx 0x3/MExKSacwvBsa1tWAxj8qc05uKvShova8HGSCaMrjDxHHrprpp5nvJHt8vWX8NAJS2T 9+Lkcu7OAcxpO5j3uFkTtLfORKw89LEWw4Lqj5BhheMlQng7FGNtIOtc9smn0Q== ARC-Authentication-Results: i=1; rspamd-648c9d5b94-xdgrc; 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-Sponge-Little: 5a303bc45940b41d_1754459843386_2902602647 X-MC-Loop-Signature: 1754459843386:3947028736 X-MC-Ingress-Time: 1754459843386 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=stgolabs.net; s=dreamhost; t=1754459843; bh=JXxgqZuGbutG28XkrBGlw+oxu1u/Ig8R+KhwSol6kCE=; h=From:To:Cc:Subject:Date:Content-Transfer-Encoding; b=VQ4vAMsnMI5/kvg8/6ZnzJJC/kNl6cR2fUFcKqix0yoedRJ1LrBBb7qipREWoIkxz /OpLbzgpIJPbc3qadSGxqzzq34wSfejYdF6rXuc+ojx6Ow0bV4+khbTII3M9LN9iAc ovTeOHUDl8HQlExv8Lxx0ch9SDiIv5Ter04LFVsEhtbsiyvU/qCQeHpvF9RAa+XEwO RTkpF/pP37reSPN6Q7RmUAfkAnQPq/vftlgbjLO3ZGASxK9YioKH9D1oWRcjY+CLav P0zpqzeKg5dwtsx9CiIIG2bC2dL6u031J8LP+N14kFNScdAngMl2SeHaaue+HWuY7O ANJzLPEW+5QtQ== 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: Tue, 5 Aug 2025 22:57:05 -0700 Message-Id: <20250806055708.196851-2-dave@stgolabs.net> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250806055708.196851-1-dave@stgolabs.net> References: <20250806055708.196851-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.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_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: 1754459924864124100 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/core/qdev-properties-system.c | 11 +++++++++++ hw/mem/cxl_type3.c | 4 +++- hw/pci-bridge/cxl_downstream.c | 1 + hw/pci-bridge/cxl_root_port.c | 1 + hw/pci-bridge/cxl_upstream.c | 3 ++- hw/pci-bridge/gen_pcie_root_port.c | 1 + hw/pci/pcie.c | 13 +++++++++---- 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 + include/hw/qdev-properties-system.h | 3 +++ qapi/common.json | 14 ++++++++++++++ 13 files changed, 49 insertions(+), 7 deletions(-) diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-sys= tem.c index 24e145d87001..94a1b754ecdc 100644 --- a/hw/core/qdev-properties-system.c +++ b/hw/core/qdev-properties-system.c @@ -1172,6 +1172,17 @@ const PropertyInfo qdev_prop_pcie_link_width =3D { .set_default_value =3D qdev_propinfo_set_default_value_enum, }; =20 +/* --- Flit mode --- */ + +const PropertyInfo qdev_prop_pcie_link_flit =3D { + .type =3D "PCIELinkFlit", + .description =3D "off/on", + .enum_table =3D &PCIELinkFlit_lookup, + .get =3D qdev_propinfo_get_enum, + .set =3D qdev_propinfo_set_enum, + .set_default_value =3D qdev_propinfo_set_default_value_enum, +}; + /* --- UUID --- */ =20 static void get_uuid(Object *obj, Visitor *v, const char *name, void *opaq= ue, diff --git a/hw/mem/cxl_type3.c b/hw/mem/cxl_type3.c index c4658e0955d5..324cf62e8141 100644 --- a/hw/mem/cxl_type3.c +++ b/hw/mem/cxl_type3.c @@ -1501,7 +1501,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 +1541,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_PCIE_LINK_FLIT("256b-flit", CXLType3Dev, flitmode, 0), 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..82e6618b111c 100644 --- a/hw/pci-bridge/cxl_downstream.c +++ b/hw/pci-bridge/cxl_downstream.c @@ -257,6 +257,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_PCIE_LINK_FLIT("256b-flit", PCIESlot, flitmode, 1), }; =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..721dc3981fd2 100644 --- a/hw/pci-bridge/cxl_root_port.c +++ b/hw/pci-bridge/cxl_root_port.c @@ -235,6 +235,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_PCIE_LINK_FLIT("256b-flit", PCIESlot, flitmode, 1), }; =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..5e6d559a3215 100644 --- a/hw/pci-bridge/cxl_upstream.c +++ b/hw/pci-bridge/cxl_upstream.c @@ -147,7 +147,7 @@ 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 @@ -433,6 +433,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_PCIE_LINK_FLIT("256b-flit", CXLUpstreamPort, flitmode, 0), }; =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..c00be8147c2a 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_PCIE_LINK_FLIT("256b-flit", PCIESlot, flitmode, 0), }; =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..55e0f7110ae5 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, PCIELinkFlit 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, PCIELinkFlit flitmod= e) { 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, diff --git a/include/hw/cxl/cxl_device.h b/include/hw/cxl/cxl_device.h index 068c20d61ebc..4c9d2247cf02 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; + PCIELinkFlit 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..584e43c37291 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; + PCIELinkFlit flitmode; =20 DOECap doe_cdat; uint64_t sn; diff --git a/include/hw/pci/pcie.h b/include/hw/pci/pcie.h index ff6ce08e135a..82fcbc9f8823 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, PCIELinkFlit flitmod= e); =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..2f96fc685729 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; + PCIELinkFlit flitmode; =20 /* Disable ACS (really for a pcie_root_port) */ bool disable_acs; diff --git a/include/hw/qdev-properties-system.h b/include/hw/qdev-properti= es-system.h index b921392c5256..dd5dc4515ea7 100644 --- a/include/hw/qdev-properties-system.h +++ b/include/hw/qdev-properties-system.h @@ -28,6 +28,7 @@ extern const PropertyInfo qdev_prop_audiodev; extern const PropertyInfo qdev_prop_off_auto_pcibar; extern const PropertyInfo qdev_prop_pcie_link_speed; extern const PropertyInfo qdev_prop_pcie_link_width; +extern const PropertyInfo qdev_prop_pcie_link_flit; extern const PropertyInfo qdev_prop_cpus390entitlement; extern const PropertyInfo qdev_prop_iothread_vq_mapping_list; extern const PropertyInfo qdev_prop_endian_mode; @@ -80,6 +81,8 @@ extern const PropertyInfo qdev_prop_vmapple_virtio_blk_va= riant; #define DEFINE_PROP_PCIE_LINK_WIDTH(_n, _s, _f, _d) \ DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_pcie_link_width, \ PCIExpLinkWidth) +#define DEFINE_PROP_PCIE_LINK_FLIT(_n, _s, _f, _d) \ + DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_pcie_link_flit, PCIELinkF= lit) =20 #define DEFINE_PROP_UUID(_name, _state, _field) \ DEFINE_PROP(_name, _state, _field, qdev_prop_uuid, QemuUUID, \ diff --git a/qapi/common.json b/qapi/common.json index 0e3a0bbbfb0b..da047fbf874f 100644 --- a/qapi/common.json +++ b/qapi/common.json @@ -140,6 +140,20 @@ { 'enum': 'PCIELinkWidth', 'data': [ '1', '2', '4', '8', '12', '16', '32' ] } =20 +## +# @PCIELinkFlit: +# +# An enumeration of PCIe link FLIT mode +# +# @off: the link is not operating in FLIT mode +# +# @on: each FLIT is a fixed 256 bytes in size +# +# Since: 10.0 +## +{ 'enum': 'PCIELinkFlit', + 'data': [ 'off', 'on'] } + ## # @HostMemPolicy: # --=20 2.39.5 From nobody Sun Dec 14 02:06:14 2025 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=1754459926; cv=pass; d=zohomail.com; s=zohoarc; b=iya+a7ZiprOB6HVMzSQpEihYSqUlYSfEII542FEGLIDRk4l94lBsRYtgYc/QgtfrHXmsMXBBBX+GYFQVHNexwbmv6euVZ/hWFyV0USc6BTbEd0G+ab1jCDOA6WZPS221XxWg6SBBEwQ7eRjUw2x8gNNeUt9vmxgCS80SH6LnJkQ= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1754459926; 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=be+0PRxyKOJuj4JH9Kjwl0BkK6QMQNbHuhTxFRuFyNfxiXWT7aWTvQTmSyzNqt6+z724UZSrnRkhFYzZ8EFu2RKK+ZH+2BRVtHOvY3d99lmC5cAn1jqgmsIvZ0rtBzfMra7cnGoTLhxDPg+feWq4zFxcJzKp9ELsonuo9NTo4Uw= 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 1754459925959860.760218277118; Tue, 5 Aug 2025 22:58:45 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ujX9t-0003Rt-RB; Wed, 06 Aug 2025 01:57: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 1ujX9V-0003H5-Tn for qemu-devel@nongnu.org; Wed, 06 Aug 2025 01:57:32 -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 1ujX9T-00036k-3H for qemu-devel@nongnu.org; Wed, 06 Aug 2025 01:57:29 -0400 Received: from relay.mailchannels.net (localhost [127.0.0.1]) by relay.mailchannels.net (Postfix) with ESMTP id 18920165831; Wed, 6 Aug 2025 05:57:24 +0000 (UTC) Received: from pdx1-sub0-mail-a291.dreamhost.com (100-96-62-154.trex-nlb.outbound.svc.cluster.local [100.96.62.154]) (Authenticated sender: dreamhost) by relay.mailchannels.net (Postfix) with ESMTPA id B17611657E0; Wed, 6 Aug 2025 05:57:23 +0000 (UTC) Received: from pdx1-sub0-mail-a291.dreamhost.com (pop.dreamhost.com [64.90.62.162]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384) by 100.96.62.154 (trex/7.1.3); Wed, 06 Aug 2025 05:57:23 +0000 Received: from localhost.localdomain (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-a291.dreamhost.com (Postfix) with ESMTPSA id 4bxfhM0vkJzHr; Tue, 5 Aug 2025 22:57:23 -0700 (PDT) X-Sender-Id: dreamhost|x-authsender|dave@stgolabs.net ARC-Seal: i=1; s=arc-2022; d=mailchannels.net; t=1754459843; a=rsa-sha256; cv=none; b=fuTdRo/MCXPJCnAuSQ+gVsiYSFixe3p3cVSKELTuWJvBlUIz3mdqp+xzlllGggo8k+V9ZY vz2EXvNs0S2fSQb0LlGw/j40wU2KLkoJHZ+dB/Ao1ZlZVo2ZzSnLRXIP7cL5/SWD47yOwk rU9lGgGEYt7ZGITAyDX+IhaBAll5zJ0cdjBM70gbAY+nQ1xRG6DhV2ckc/gvbPJYiNoyt/ 73KBaFsdVxNM2jfvQDokrxXQRTehTwjwF3ZcQrKefVy6lwZpoRTALAEr26HwKxjJbkDMev WrDEkT5MZy/lkvzmgx+mJ9EDNLfLY2T7RNUrGo6N9jQzlPQyx7q9Q6+VO3oOmg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=mailchannels.net; s=arc-2022; t=1754459843; 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=lVAT+UZUWigSGZzsVHyB9EDlYLGhS2iZaz0kvcfNmHu83nDOYvygoMrkQRZ9wXEP9Ybso8 d6HuvcwZ6gT61vaRutY2THJ0KFXpJwLuawOhQ+ERtVWWHhiG/G1BGQvASQE8jiGuwI9j7q kOCP/WBnabgWffRqn7WocFDRvs63iVojbjCaAn8paY2f4cBXt5YlrZToy/qB7cidWIeo4I SQniLAYYU6vZf3AFNin/UZ01AAe4mzyd0J5HfsoYrlu9qDnc6k89pm7eghwPQ5F1VlaCxL YOHWViKsBLPrHwem3le9M3nMh64M5KWNQHy0L6TRfjmvGyDdLN7mzob3k1PXag== ARC-Authentication-Results: i=1; rspamd-648c9d5b94-9lmmc; 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-Gusty-Fumbling: 77520f7d7f002ed1_1754459843992_1064736097 X-MC-Loop-Signature: 1754459843992:2749806239 X-MC-Ingress-Time: 1754459843992 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=stgolabs.net; s=dreamhost; t=1754459843; bh=m3zmudrbJi3rUAWruVPmWJ/JHGSWiiguedxKVAHxwYo=; h=From:To:Cc:Subject:Date:Content-Transfer-Encoding; b=XUxmJwlYIeiF/AsymlWB+SDBYMfpB47+yANca9N+JYA6UiJf6eh8aAIX7ImbmABiy h2o0KJkGCrkGUAAN58OltcBcnGifj6rrsZePE+sWM0ff7nNKbt3hoBS83jhwM4HK3Y 7p7SRYE5uTXuj7jWx732yK8a9Ocdhkc1uAsz8ZmmDRRYoiP5+dmfqgUss73cA6klzZ 1lAdC75uL33rwPKoulLt0GFfQFxY8IvrEUkuvS2Z8lCGkZvibdoK7jsTHNEHq8YI5g KXsrDQiW6lm5cjfgpQvYwocniIY2fX/zIaheeH/+0GmhsL5PodZx43KGyQQU5jnzd0 7SKbW9tfwrSQg== 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: Tue, 5 Aug 2025 22:57:06 -0700 Message-Id: <20250806055708.196851-3-dave@stgolabs.net> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250806055708.196851-1-dave@stgolabs.net> References: <20250806055708.196851-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.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_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: 1754459928122116600 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 Sun Dec 14 02:06:14 2025 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=1754459915; cv=pass; d=zohomail.com; s=zohoarc; b=e2D+acf59XR8Xhe4auPLVmLFRye/1n/a3DDVyZUezBo6xazx5FknpQBt4sYrAZ/0auTl8Jcssna5PMeLNOGqJrJE/L7aOoqjEVwlDXOPoAAKTXLQc3OR+Abn1G2UNaFqwQrpZCQm1dtmt7nyehrYt/9DmmwsstNb2vMSKWzs9ds= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1754459915; 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=Mg4xOVl2HlHkcIXq+xCTdZDC3cs4yQ8nl9mbIyMKKCM=; b=jYx77YB/W1896y/96zwD1H7Z/dJqekbGuOw6jcigSzAD6YtOMNh620n/fgYJ2kHPeQVdd211oIMkWj+h+0f36oA+390+zeYauU8/pTvW3ELnnZS330VH80FzY0pf6kbmGuGccONkf1EAyz+FQkxseu/+1uOjzcvE4v9ULqSxWYQ= 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 1754459915666801.6398792144649; Tue, 5 Aug 2025 22:58:35 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ujX9j-0003Ki-5X; Wed, 06 Aug 2025 01:57:44 -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 1ujX9V-0003H2-3x for qemu-devel@nongnu.org; Wed, 06 Aug 2025 01:57:32 -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 1ujX9T-00036n-3A for qemu-devel@nongnu.org; Wed, 06 Aug 2025 01:57:28 -0400 Received: from relay.mailchannels.net (localhost [127.0.0.1]) by relay.mailchannels.net (Postfix) with ESMTP id 9D2198A4C55; Wed, 6 Aug 2025 05:57:24 +0000 (UTC) Received: from pdx1-sub0-mail-a291.dreamhost.com (100-96-62-154.trex-nlb.outbound.svc.cluster.local [100.96.62.154]) (Authenticated sender: dreamhost) by relay.mailchannels.net (Postfix) with ESMTPA id 443418A4E00; Wed, 6 Aug 2025 05:57:24 +0000 (UTC) Received: from pdx1-sub0-mail-a291.dreamhost.com (pop.dreamhost.com [64.90.62.162]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384) by 100.96.62.154 (trex/7.1.3); Wed, 06 Aug 2025 05:57:24 +0000 Received: from localhost.localdomain (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-a291.dreamhost.com (Postfix) with ESMTPSA id 4bxfhM5GY1z55; Tue, 5 Aug 2025 22:57:23 -0700 (PDT) X-Sender-Id: dreamhost|x-authsender|dave@stgolabs.net ARC-Seal: i=1; s=arc-2022; d=mailchannels.net; t=1754459844; a=rsa-sha256; cv=none; b=k9MUS5i5V9IdEA8nmwhvm3c0fCmzBv+Uio0AIM6Zp1qkqFSvtUbDSA/PydjwF1f4+n88LS iXh7QjT9HpDMopag7yQMgQqhs3kDmihFabK5rlsuU1SecEKvkyz71E330lL0RlgBNn0uYg yWBbC4JGprXCNuSNMJYoHa8fBXMSlpn9Dy3AqY6Nwb3rJ2axzMcE+wTWbnFl0vZ8HOyRD+ V9/gAG3y7hbjOfx78V3bnrwA0w3tQK1SVKM/A5RmOnni66Ugh5GowptwaYsqGNZmnqvVqH u3CZgQAqFqE4tyeBybWA44MqwWQ3odgaxIXpHhxDpNW5AL0tI3TC15g0/ukKSA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=mailchannels.net; s=arc-2022; t=1754459844; 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=Mg4xOVl2HlHkcIXq+xCTdZDC3cs4yQ8nl9mbIyMKKCM=; b=L2FUOSUo39OReVenZGsJo4NmAMh/M88Vli1XnrCnIcIMr4IJ7pZrqN3Do9TdYzqi+fHr7C leEeKQkwbg5G9FQojf+XbU3OQSJu4Et5fR51bo0d5JIG9FSj1tbRkOY/Gj7moFnXlSjhSz RwTwmVPuEhssrXHpKlzAAMv8njZFypHCGBLeGc6CL2EWtVeMUhjm2zy4H1i5l+jznWUyIG Ad+R6WoRLz3YrP+eBkWnhRiDl4Qo4p9j9DGhBQ/MUY4+bUD5eiCnSJgYcdLDElLvnD5/MM 2LhBPBA7n6Zv4sJ+cYDS5wwuSI2wtuWMWJ+9q46R1hBhr8XfMXLugcCGOTuqXA== ARC-Authentication-Results: i=1; rspamd-648c9d5b94-9lmmc; 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-Industry-Trail: 4bc6cb09212906db_1754459844531_947622207 X-MC-Loop-Signature: 1754459844531:2212034592 X-MC-Ingress-Time: 1754459844531 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=stgolabs.net; s=dreamhost; t=1754459844; bh=Mg4xOVl2HlHkcIXq+xCTdZDC3cs4yQ8nl9mbIyMKKCM=; h=From:To:Cc:Subject:Date:Content-Transfer-Encoding; b=TlwuneFBzty3urQk9QTPWDWHCa/CP8Hrd8uTVyGxX7hp6JavEkexDjiVaD2aYI//q Z8WTAtfbFX2JObthXME6oQdKH16rbCW2U+XmO+6RNhyYgGqGlB8C7jK8C2aG+cc0Hi FC3p8Y7kjZujBji/LYceXIkedDVQGEw5Ym+23Tm5lVGPcpLQ8Ooi0rkkyE9z24FZOV gp2B1Ec7KC2EoE1N0LwsDoWY6w2iO6JcfZzv67mUOUb9EXpygll0vtcHmM74gOXCyZ SrG1RHmIoX5ru/JGkfnSplmIMKYi12G1JMzyym5WJ0vrLzN89Qsk//pXYX+n/FueWw 7lBrEoleqbReg== 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: Tue, 5 Aug 2025 22:57:07 -0700 Message-Id: <20250806055708.196851-4-dave@stgolabs.net> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250806055708.196851-1-dave@stgolabs.net> References: <20250806055708.196851-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.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_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: 1754459918462124100 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..ef6072bd8b59 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 of restrictions of the CFMW. + Example: =20 :: --=20 2.39.5 From nobody Sun Dec 14 02:06:14 2025 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=1754459933; cv=pass; d=zohomail.com; s=zohoarc; b=jvu7GVTpYqyL6cs4WBy/6a5mHQuA0uycJsiMUJBhmtMViOVehZo96CqXrs/t45yLL75zOYPffzzNwooLKjHWVvAMQl+XMLG5/KFk1dDWS+MEvow/ohYKE/839Ntt6yBijUa0XqSAo6B+SadgfFJZc1z6qAvlhAqcQ3JXWyD7Aac= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1754459933; 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=VP06I0aEaJkYyltBjg8hN5Aj50JaCTDkGcOXrSs5yw0=; b=QmD9re9nbCGJBLo3KrH2qdu9HxyiTkXiXkxZnCVu/QFQOm2lrzq8PMS3L6oaBowsy5Haq3usdjIo9BHrT2C5rJ2Cx/EbClONl+R1srDOrd2gWDw15bdajJ4wgdJgrLBqYw90gFT6w2gL192CSxsJCZsBwYxpmBTrGLuDjj2KOkc= 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 175445993301053.29449445849889; Tue, 5 Aug 2025 22:58:53 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ujX9h-0003KD-6d; Wed, 06 Aug 2025 01:57:41 -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 1ujX9V-0003H7-VP for qemu-devel@nongnu.org; Wed, 06 Aug 2025 01:57:33 -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 1ujX9T-00036t-1d for qemu-devel@nongnu.org; Wed, 06 Aug 2025 01:57:29 -0400 Received: from relay.mailchannels.net (localhost [127.0.0.1]) by relay.mailchannels.net (Postfix) with ESMTP id 311158451BD; Wed, 6 Aug 2025 05:57:25 +0000 (UTC) Received: from pdx1-sub0-mail-a291.dreamhost.com (trex-blue-9.trex.outbound.svc.cluster.local [100.96.16.80]) (Authenticated sender: dreamhost) by relay.mailchannels.net (Postfix) with ESMTPA id D079A845282; Wed, 6 Aug 2025 05:57:24 +0000 (UTC) Received: from pdx1-sub0-mail-a291.dreamhost.com (pop.dreamhost.com [64.90.62.162]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384) by 100.96.16.80 (trex/7.1.3); Wed, 06 Aug 2025 05:57:25 +0000 Received: from localhost.localdomain (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-a291.dreamhost.com (Postfix) with ESMTPSA id 4bxfhN29DHzHr; Tue, 5 Aug 2025 22:57:24 -0700 (PDT) X-Sender-Id: dreamhost|x-authsender|dave@stgolabs.net ARC-Seal: i=1; s=arc-2022; d=mailchannels.net; t=1754459844; a=rsa-sha256; cv=none; b=Lek3AJSk2DYQgLwfyLpVevUPYMRJpEoAr2crJwePSxaNgbblyDZ71usvWzgIcQ0cQ1XhjS /Hp+VhkC/dk0QFPUZxe1HqHzvgSs0tHq+VuzsOc8uIVOTWdvIOK/L/xGQ8FyVVUlViOelJ B41ICDtOzSU3kS7o5z0v+LYpA/J5FLjLtfwRgkBZWEoBw/FdxrKtf3cda9x8QJ/tTDBSEL WCwp0Bb4im1SfXwlGWG+LlPdV+u182KpWLY8B+6sgW4Ub9vIJPnP2Zfp/uWglVUHjFMYck 5VGkqafTUBPX3z9gFE307e2e/I+eO7tgY9hlOjWbCgxfArZRRGFe3OleG+9mnA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=mailchannels.net; s=arc-2022; t=1754459844; 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=VP06I0aEaJkYyltBjg8hN5Aj50JaCTDkGcOXrSs5yw0=; b=rxlff8cND1HAl/xqq/ym5T+pva1Ms71soVEe2KZsKZ4kjOw4IxYKXoLWeInxk3gu8FZp1/ 3LpRKK0DY6b9wbjfAx/MVj19VRbZTjWLNJak0Bbse0gi3t0T0n35RHYVJHRJygWai/IQ9I PdVMlCh9fJny90LNVdLJmFgyk69rZNITuUQBDr08TzQWqqyD7q2gzf2PjriMbCamTpyhaz ILPxTvG5YsLyMpzRtfxd2GTmZ1U5nFE3tMs4T6Wb0XrUzYxsnuS9YysNVmN2xljKEZ+rnu 4DeVLwo7bWPVcGcl3l86GJw0J8kfTnlcFXGXxL/BACe3TLQlXto7iZtwG5a7SQ== ARC-Authentication-Results: i=1; rspamd-648c9d5b94-xdgrc; 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-Left-Callous: 6a3f2e1a04a288ed_1754459845134_3707595194 X-MC-Loop-Signature: 1754459845134:1141825104 X-MC-Ingress-Time: 1754459845134 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=stgolabs.net; s=dreamhost; t=1754459844; bh=VP06I0aEaJkYyltBjg8hN5Aj50JaCTDkGcOXrSs5yw0=; h=From:To:Cc:Subject:Date:Content-Transfer-Encoding; b=psHcJ8Ne0zLmqgBKEMuatm0tlOuIjZNbtaS6xtsh6SsdlVr16lbuM2na1RdkS3KHs HUEQ+uZQorkXIIo6AQPOOM3DHwFB6KGvJEjDHVCjYPPuppgZRA05AmGKYEfYLJ8+xs ysKjDFx1J2JqJQj3gZRLzu7LtCDy1g/L9AzGRf6drZW5qM5dFhms3A1/iP6ZUVXdB3 nCBVWjweM7/0+JBN69MGDcHFCWffW15hMWG+ERwVoYLoL+JRoEPiV8gTgp6otYOfnm PdolWokwYlfvah6wkyQFr3h5FMn8owygKjUstndmIvIowDLN6fKsqdKNWwoozdc9oo glMIiPU5LaSZQ== 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: Tue, 5 Aug 2025 22:57:08 -0700 Message-Id: <20250806055708.196851-5-dave@stgolabs.net> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250806055708.196851-1-dave@stgolabs.net> References: <20250806055708.196851-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.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_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: 1754459934345116600 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. Devices require enabling Flit mode. Signed-off-by: Davidlohr Bueso --- docs/system/devices/cxl.rst | 26 +++++++ hw/cxl/cxl-component-utils.c | 135 +++++++++++++++++++++++++++++++-- hw/mem/cxl_type3.c | 9 ++- include/hw/cxl/cxl_component.h | 54 ++++++++++++- include/hw/cxl/cxl_device.h | 3 + 5 files changed, 218 insertions(+), 9 deletions(-) diff --git a/docs/system/devices/cxl.rst b/docs/system/devices/cxl.rst index bf7908429af8..9a0c5a5cdac3 100644 --- a/docs/system/devices/cxl.rst +++ b/docs/system/devices/cxl.rst @@ -384,6 +384,32 @@ 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 +The same 4 Type3 devices under a switch, but two of them use HDM-DB for co= herence:: + + 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 \ + -object memory-backend-file,id=3Dcxl-lsa0,share=3Don,mem-path=3D/tmp/lsa= 0.raw,size=3D256M \ + -object memory-backend-file,id=3Dcxl-lsa1,share=3Don,mem-path=3D/tmp/lsa= 1.raw,size=3D256M \ + -object memory-backend-file,id=3Dcxl-lsa2,share=3Don,mem-path=3D/tmp/lsa= 2.raw,size=3D256M \ + -object memory-backend-file,id=3Dcxl-lsa3,share=3Don,mem-path=3D/tmp/lsa= 3.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,persistent-memdev=3Dcxl-mem0,lsa=3Dcxl-l= sa0,id=3Dcxl-pmem0,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,persistent-memdev=3Dcxl-mem1,lsa=3Dcxl-l= sa1,id=3Dcxl-pmem1,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,persistent-memdev=3Dcxl-mem2,lsa=3Dcxl-l= sa2,id=3Dcxl-pmem2,sn=3D0x3 \ + -device cxl-downstream,port=3D3,bus=3Dus0,id=3Dswport3,chassis=3D0,slot= =3D7 \ + -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 + 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 324cf62e8141..ce56126984f3 100644 --- a/hw/mem/cxl_type3.c +++ b/hw/mem/cxl_type3.c @@ -968,6 +968,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; @@ -1503,7 +1508,8 @@ void ct3d_reset(DeviceState *dev) =20 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_component_register_init_common(reg_state, write_msk, ct3d->hdmdb ? + CXL3_TYPE3_DEVICE : CXL2_TYPE3_DEVI= CE); cxl_device_register_init_t3(ct3d, CXL_T3_MSIX_MBOX); =20 /* @@ -1543,6 +1549,7 @@ static const Property ct3_props[] =3D { width, PCIE_LINK_WIDTH_16), DEFINE_PROP_PCIE_LINK_FLIT("256b-flit", CXLType3Dev, flitmode, 0), DEFINE_PROP_UINT16("chmu-port", CXLType3Dev, cxl_dstate.chmu[0].port, = 0), + DEFINE_PROP_BOOL("hdm-db", CXLType3Dev, hdmdb, 0), }; =20 static uint64_t get_lsa_size(CXLType3Dev *ct3d) diff --git a/include/hw/cxl/cxl_component.h b/include/hw/cxl/cxl_component.h index cd92cb02532a..4872ec5ead39 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]; /* for ups+dsp switches */ } 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 4c9d2247cf02..d0462671609f 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