From nobody Sat May 30 19:21:09 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1777493158; cv=none; d=zohomail.com; s=zohoarc; b=Z177HCR1SN/iVqy7egITVIg+nxB1LNImD8LJ4yFglnweyuSSjFLpqSjOwd+d2p72EI2p7Hnl/43JiWAMpufe5F7pQXqGMMpaVZ1Fy2aJ3g3LEsOzUbm+7xpnsRXGP5F1XqM8aTFUrH+L1B9vh99BWeMuroDoqeOfhP/j3RiFd4M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1777493158; 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=hCHtycy4An6frL027okw83jsdSBE9b+29TxohlVbQig=; b=ATSquvlv2UiP2Buv4PDa3VzwTohPQsA3H3wpCh5Mho+xfHmsAX48EhdWFx1cB6ifd2YSRo1fPGq2csQO49G0LxL8COgyUvrzWP764nILqoADrQUIyDaBtODEp/Hy6y3yh3O83C95Orw1mkdwKoKRBQAjLenfJyBI5s4Vj2p6xxM= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1777493158707910.2526200939675; Wed, 29 Apr 2026 13:05:58 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wIB7v-0003Vm-Qk; Wed, 29 Apr 2026 16:03:19 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wI5QP-00083v-GF for qemu-devel@nongnu.org; Wed, 29 Apr 2026 09:58:01 -0400 Received: from mail-wr1-x42b.google.com ([2a00:1450:4864:20::42b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wI5QM-0007gU-P2 for qemu-devel@nongnu.org; Wed, 29 Apr 2026 09:58:00 -0400 Received: by mail-wr1-x42b.google.com with SMTP id ffacd0b85a97d-43d73422431so11721511f8f.2 for ; Wed, 29 Apr 2026 06:57:57 -0700 (PDT) Received: from node1.manccluster.local (revolution.cs.man.ac.uk. [130.88.198.135]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-447b3d48517sm5205950f8f.5.2026.04.29.06.57.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Apr 2026 06:57:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777471076; x=1778075876; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=hCHtycy4An6frL027okw83jsdSBE9b+29TxohlVbQig=; b=pu3gZXaRDjkF8MnZTK8zHq0cBdaQbcJ5YsqztboPj0YSY0W7Vp+0Ecz2436OCHfOww 8GBhTyfXKPsEr0d373lXoTBEPvwWmCavdsRdq7PZxR4PBo0swqj8CholdLN0yp52UzQu aAEch4UzCobG1ptNcVKa9eK6m8ZVhwncRlUtRZjG9GzkWqeibaU/xAluQPsyMcyau3T3 8YzCrSgBN8kBJLD84bankUI2z++FLHr7BBumSJi+EkTKSOmhDNUr8PmuulH1jTclkgiG iMPU1TxiGxDXS2NA7G82Yv9GHe7Z0Lvt3+EquL6U5mxnLTfdA27O4An70kqFR3MDnt9p xdhQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777471076; x=1778075876; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=hCHtycy4An6frL027okw83jsdSBE9b+29TxohlVbQig=; b=fM+LGX8aAxft59OS0XaJ+7KM54nfILe4MtAajziQOto+6+jShuvDH3rks8Uc7mWqpd N6YO1di/aU6kyLSeGXyCAAE67nGIbUkLXhIxRGP19e95Lek+jmY9+fzC6EplV5n06nQ3 X8qNQFxvCzv6YZwXznjCM3P5Rp5Zh1F7qN5BS0SqqlZhj9Ub0WwCDxQV2/+mMs9KZBW0 ph/S0NB4j/NNXcfMWU0GklR7fNR9yOxuaPIsJME8pThMWWhRv25cnQGDSlF7YkEkGliW CmUT/fP8qoXCayJlfCuqsRAiRn/f9fWN6qtKrYBUVsy1vfyAZf9OD1hRg5DvGDeup/gT SefA== X-Gm-Message-State: AOJu0YzvX9nYc+axBEtwsna0lbGOjMhBQots+oL4lPMnnrEvoNAfg1Ji STvZnI7SuEqDCAmtld0ZZz3HB4UjXzqN2c+eZvTGfUURXvjtwy2vkRVB X-Gm-Gg: AeBDietW4TbpFA5+Cna7Oh4RHQIy/nvyHhsls7mRzaSIgYNQChLmZUQlP7oBr5G0wm7 cjGDBP1S7OCVmM6RMLNJUL8xVNSrtL32DUsS4WnJqRrgxGYdnGUIPn0zBnZ7eZ/CLfrN28PE7Bm sr6SnyI2jmuvqrsootLnlf0U4/+CrdK1BfKo+JNHUK6efO/zP8yQlnS7hzPe+PGGvNNwiYeDmrE 9Rpkg/3kE/+RdL4qpPkCe6EjqTZlMz7KRbD/M0r4zdDvV9MqoOSghN0YyWc21OGEmBqhKNedhvd 1H/10xWC3VxKCSka87Ecmgv8aPxY7X/Ap1HVs5crfpNfhisrY2PIRBTrQ/SxJh4d041TNxFJyQ8 qOg1LUiXfnNH0u5DWSsY4ZX6+y1EKq0Dp1ZEnqK8NIZzWiB6kPN0lctnmqqJC9fFAvgBVRfYYpq 8diYWvTY8I9gVVIEsdQXSJw1xJ1rYAroikZ/eeUTiokvVLyG9tKvXE3T6YTQxr5fCub0X4t3WS X-Received: by 2002:a05:6000:1843:b0:439:b8b2:fad0 with SMTP id ffacd0b85a97d-4478e6b3b9cmr7209099f8f.5.1777471075822; Wed, 29 Apr 2026 06:57:55 -0700 (PDT) From: Joshua Lant To: linux-cxl@vger.kernel.org Cc: qemu-devel@nongnu.org, Jonathan.Cameron@huawei.com, arpit1.kumar@samsung.com, Joshua Lant Subject: [RFC QEMU PATCH 01/10] docs: Add documentation for cxl-vcs-switch Date: Wed, 29 Apr 2026 14:48:35 +0100 Message-ID: <20260429135717.3048713-2-joshualant@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260429135717.3048713-1-joshualant@gmail.com> References: <20260429135717.3048713-1-joshualant@gmail.com> 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=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::42b; envelope-from=joshualant@gmail.com; helo=mail-wr1-x42b.google.com 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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 29 Apr 2026 16:03:14 -0400 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @gmail.com) X-ZM-MESSAGEID: 1777493160882154100 Content-Type: text/plain; charset="utf-8" Signed-off-by: Joshua Lant --- docs/system/devices/cxl.rst | 90 ++++++++++++++++++++++++++++++++++--- 1 file changed, 85 insertions(+), 5 deletions(-) diff --git a/docs/system/devices/cxl.rst b/docs/system/devices/cxl.rst index 32b1b5d773..9e8452e576 100644 --- a/docs/system/devices/cxl.rst +++ b/docs/system/devices/cxl.rst @@ -119,11 +119,11 @@ and associated component register access via PCI bars. CXL Switch ~~~~~~~~~~ Here we consider a simple CXL switch with only a single -virtual hierarchy. Whilst more complex devices exist, their -visibility to a particular host is generally the same as for -a simple switch design. Hosts often have no awareness -of complex rerouting and device pooling, they simply see -devices being hot added or hot removed. +virtual hierarchy. Whilst more complex devices exist (see VCS +Switching below), their visibility to a particular host is +generally the same as for a simple switch design. Hosts often +have no awareness of complex rerouting and device pooling, +they simply see devices being hot added or hot removed. =20 A CXL switch has a similar architecture to those in PCIe, with a single upstream port, internal PCI bus and multiple @@ -467,6 +467,86 @@ Example configuration: Guest OS communication with the MCTP CCI can then be established using sta= ndard MCTP configuration tools. =20 +CXL Multi-VCS Switching +----------------------- + +The cxl-vcs-switch object allows for a Fabric Manager to dynamically recon= figure +the switching within a multi-upstream port CXL/PCIe topology, This moves b= eyond +the static switching configuration described above. The use of vcs=3DX on = an +endpoint device indicates that it should be hidden from guests at boot. Ea= ch +upstream port with vcs=3DX set will conceptually become an upstream PPB. A= ny +downstream port that is connected to an upstream port with vcs=3DX set will +automatically become a vPPB for that VCS. The overall cxl-virtual-switch h= as a +single CCI mailbox used for config/status of all ports within the switch. +Setting local-fm=3Dtrue indicates that this QEMU instance has the CCI mail= box +attached. Setting it false will create listeners for commands from a remote +QEMU process (yet to be implemented). + +An example of how the topology is described on the CLI is shown below: + + -object cxl-vcs-switch,id=3Dvcs0,usp-ppbs=3D2,dsp-ppbs=3D4,local-fm=3Dtr= ue \ + -device pxb-cxl,bus_nr=3D12,bus=3Dpcie.0,id=3Dcxl.0,hdm_for_passthrough= =3Dtrue \ + -device cxl-rp,port=3D0,bus=3Dcxl.0,id=3Droot_port1,chassis=3D0,slot=3D1= \ + -device pxb-cxl,bus_nr=3D22,bus=3Dpcie.0,id=3Dcxl.1,hdm_for_passthrough= =3Dtrue \ + -device cxl-rp,port=3D0,bus=3Dcxl.1,id=3Droot_port2,chassis=3D1,slot=3D1= \ + -device cxl-upstream,port=3D0,sn=3D1234,bus=3Droot_port1,id=3Dus0,addr= =3D0.0,multifunction=3Don,vcs=3Dvcs0,usppb=3D0 \ + -device cxl-upstream,port=3D0,sn=3D5678,bus=3Droot_port2,id=3Dus1,addr= =3D0.0,multifunction=3Don,vcs=3Dvcs0,usppb=3D1 \ + -device cxl-switch-mailbox-cci,bus=3Droot_port1,addr=3D0.3,target=3Dvcs0= \ + -device usb-cxl-mctp,bus=3Dehci.0,id=3Dusb0,target=3Dvcs0 \ + -device cxl-downstream,port=3D0,bus=3Dus0,id=3Ddsp0,slot=3D3 \ + -device cxl-downstream,port=3D1,bus=3Dus0,id=3Ddsp1,slot=3D4 \ + -device cxl-downstream,port=3D0,bus=3Dus1,id=3Ddsp2,slot=3D7 \ + -device cxl-downstream,port=3D1,bus=3Dus1,id=3Ddsp3,slot=3D8 \ + -device cxl-type3,persistent-memdev=3Dcxl-mem1,id=3Dcxl-ep1,lsa=3Dcxl-ls= a1,sn=3D99,vcs=3Dvcs0,dsppb=3D0 \ + -device cxl-type3,persistent-memdev=3Dcxl-mem2,id=3Dcxl-ep2,lsa=3Dcxl-ls= a2,sn=3D100,vcs=3Dvcs0,dsppb=3D1 \ + -device cxl-type3,persistent-memdev=3Dcxl-mem3,id=3Dcxl-ep3,lsa=3Dcxl-ls= a3,sn=3D101,vcs=3Dvcs0,dsppb=3D2 \ + -device cxl-type3,persistent-memdev=3Dcxl-mem4,id=3Dcxl-ep4,lsa=3Dcxl-ls= a4,sn=3D102,vcs=3Dvcs0,dsppb=3D3 \ + -machine cxl-fmw.0.targets.0=3Dcxl.0,cxl-fmw.0.size=3D8G,cxl-fmw.1.targe= ts.0=3Dcxl.1,cxl-fmw.1.size=3D8G + +Example topology involving VCS switching:: + + +--------------------+ +--------------------+ + | Host Bridge 0 | | Host Bridge 1 | + +----------+---------+ +----------+---------+ + +-------+ | | + | MCTP | | | + | USB/ | +----------+---------+ +----------+---------+ + | I2C | | Root Port 0 | | Root Port 1 | + +-----+-+ +----------+---------+ +----------+---------+ + | | | + | | | + +------|---------------+-----------------------+-----------------------+ + | +-+--------+ | cxl-vcs-switch (vcs0)| | + | +--| CCI MBOX |---* | | | + | | +----------+ | | | + | | +-----------------+--------+ +-------+------------------+ | + | +--+ | VCS0 | *---+ | VCS1 | | + | | +---------------+------+ | | +-----+----------------+ | | + | | | | | | | | | | + | | | USP 0 | | | | USP 1 | | | + | | | | | | | | | | + | | +----+------------+----+ | | +----+------------+----+ | | + | | | | | | | | | | + | | +----+----+ +----+----+ | | +----+----+ +----+----+ | | + | | | DSP 0 | | DSP 1 | | | | DSP 2 | | DSP 3 | | | + | | |(vPPB 0) | |(vPPB 1) | | | |(vPPB 0) | |(vPPB 1) | | | + | | | | | | | | | | | | | | + | | +---------+ +---------+ | | +---------+ +----+----+ | | + | +--------------------------+ +-------------------+------+ | + | | | + | +----------------------------------------------+ | + | | | + | | - - - | + +-----------|------------|--------------------|------------|-----------+ + | | | | + +---------+ +---------+ +---------+ +---------+ + |CXL/PCIe | |CXL/PCIe | |CXL/PCIe | |CXL/PCIe | + | EP 0 | | EP 1 | | EP 2 | | EP 3 | + | (PPB0) | | (PPB1) | | (PPB2) | | (PPB3) | + +---------+ +---------+ +---------+ +---------+ + PPB0 Bound to VCS1, vPPB1. Others unbound... + + References ---------- =20 --=20 2.47.3 From nobody Sat May 30 19:21:09 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1777493165; cv=none; d=zohomail.com; s=zohoarc; b=Ozk5+eciOefZgaPCK93psKRbvSg2XOVMcaG3GFGZ5jQQOeFgoyQArmcKAbFkvmU70vyoEyG63RU1T4yOKVydlXczscgOg9PO+x4tz71ie7ZkpeVxVRh7s+MezHd+fKHV75p1cDFEKhmXdMCnjnjhG4dGD0vaOeygr4+x5INOmhE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1777493165; 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=i55Tulez84uC6S30BzMAZAX+g+KufDCaRfey8FY/Ij4=; b=BOJ8SmLZxZRPKcpNxEd+A+ofH5GE80q4T3MWDkrrZENnkdvynDJ9uyTODId1BLigZUmWvntjw8VGPpxlFbtiOI2RtSYS2mZWgplZWn++xWg9ocX4KC2ApYP2M2XxlRLkh8kthD/zDxxxFANYMN7EfEY/EBVNDPN6SQpn5eUGUz8= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1777493165150914.98674267146; Wed, 29 Apr 2026 13:06:05 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wIB7t-0003V0-PN; Wed, 29 Apr 2026 16:03:17 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wI5QR-00087h-8u for qemu-devel@nongnu.org; Wed, 29 Apr 2026 09:58:03 -0400 Received: from mail-wr1-x42d.google.com ([2a00:1450:4864:20::42d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wI5QN-0007gs-VQ for qemu-devel@nongnu.org; Wed, 29 Apr 2026 09:58:02 -0400 Received: by mail-wr1-x42d.google.com with SMTP id ffacd0b85a97d-43cfd1f9fd1so7861526f8f.3 for ; Wed, 29 Apr 2026 06:57:59 -0700 (PDT) Received: from node1.manccluster.local (revolution.cs.man.ac.uk. [130.88.198.135]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-447b3d48517sm5205950f8f.5.2026.04.29.06.57.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Apr 2026 06:57:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777471078; x=1778075878; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=i55Tulez84uC6S30BzMAZAX+g+KufDCaRfey8FY/Ij4=; b=AjgfJkzQuv9875UMnxr7oiePC2iOaA3LUlWzD5QQfhtMPtxPewMd96Tnv6kjc+6stn ougsQUUQ9ZoulwOOlUtgBdrm0R1qlDyQUGdqu3XLnXghjA4eJaa8BOIKK3KxHIldbCsF QCaMQLUYZFUZN5euRl8trySjS6bUow4DUZjHz5x2eekKSYbKwzyzI61RX3Nz7utRC8in I2qSeJG2MqOtTfcL+aOfXwt6DBHEOAt+P4Hulsu7N3VdpcEHQGGCJjwiW3wMTAbmqiPO iNGXCltdHLdijCSMSGzmBnmtOnWbdK0UabSwW3++wHhOVEK5JhQpH1jtag0NbfKhOVGD RzSQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777471078; x=1778075878; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=i55Tulez84uC6S30BzMAZAX+g+KufDCaRfey8FY/Ij4=; b=qFguAHw5vKgjxIPOPf1VTsKlvdGVxPdh47voKQoBmneCbIoutvQacIxYqfNxl3a7gv 3KBsnyK7xUDbblbMeg6/KtbASOp8Jf6HUJZhEwyiJ6/OSsb7EC9rEW2ZzQT+52jM0T+a XwzaIZeMg5nOwIQWDd0JwElPv3+h6w1TAk1uPK9lahP2ku4B5DkFmzOoHamPyR8/hKBO TRgIOFbY00zXikOLsI2fRGZvOih8TzpGu0OtjSlImsPlncMVeiqocAAkn9YLuBke7mvs HtSenEbKJYYYmEBoe8ESyJEipqhJPl5hZHrWXXaP/HzY5Qu0j81DoxAbd2qQ1gUpNOjj aAaw== X-Gm-Message-State: AOJu0Yyaan91Ai+LHaz67AR7MklXhG3X7byG1XqLJ0k/6OZAQ2LpXjfV D2/OedbL2wyn5pM3qSq1rz/LHaLB8eCjYlnrPib/qgcuQqafWhXuWGnGNz3fzmBg X-Gm-Gg: AeBDieuDLIYp33Do3T41kjln/whi30Px6hOLCXWbOlFW/akcpmHlNPY3Dtg1w5LP/HD OLdFnmhXvq1UpTmalJC96hnjPN1gstnLnk3kpScjMeh3I1X+EItDo6qrnzdV372TASuKCq8b6pY Flux34acy3HaUOY1kAtfuF+27sc2yUm4uEZ8NeOJnfbBcQoT+4V/MeamaXm8sD1qdbGfrbuAn5X M2Du2C2G6oKz/Mb6yl4ZKdeTJ7dNFBDKh8hrAcWgjzYkEgfNfSBUu4Bdyp5TtGYA6Da7/z0qUho QMpZe9WZKMwrSwbirrXm6lPtvqO7XKE7TfyNI1AGHqOTMg2GKL4O6kf7konNq4JScnJcDoO0dYi +U/u8V9o76t9CSrPVw4JuBTgtjSBB7kbevA8DcU7OyGpt8WTmOdtRrpzNLEaL96sTz5TqTT40J8 d7lv6+lr51NJl9/DaJysfv8ZqNYqmZ+OHW244kSIDffD2OgFXXWQ0gSARHO4/VUmzAze6+SMbt X-Received: by 2002:a05:6000:2304:b0:43d:75ec:26f7 with SMTP id ffacd0b85a97d-4464aced724mr14325698f8f.29.1777471077272; Wed, 29 Apr 2026 06:57:57 -0700 (PDT) From: Joshua Lant To: linux-cxl@vger.kernel.org Cc: qemu-devel@nongnu.org, Jonathan.Cameron@huawei.com, arpit1.kumar@samsung.com, Joshua Lant Subject: [RFC QEMU PATCH 02/10] qdev/qbus: Allow hidden devices to be busless on QEMU startup Date: Wed, 29 Apr 2026 14:48:36 +0100 Message-ID: <20260429135717.3048713-3-joshualant@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260429135717.3048713-1-joshualant@gmail.com> References: <20260429135717.3048713-1-joshualant@gmail.com> 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=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::42d; envelope-from=joshualant@gmail.com; helo=mail-wr1-x42d.google.com 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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 29 Apr 2026 16:03:14 -0400 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @gmail.com) X-ZM-MESSAGEID: 1777493167231154100 Content-Type: text/plain; charset="utf-8" Extend the capability for hiding devices, introduced for virtio-net device in: commit f3a8505656935cde32e28c1c6317f725084da1e0 Author: Jens Freimann Date: Tue Oct 29 12:48:55 2019 +0100 qdev/qbus: add hidden device support Currently only endpoint devices can be hidden with a primary device and failover (known static configuration). However, looking at future composable systems, we see a need for hidden devices which have no associat= ed bus upon boot. Move the check for hidden devices to before the bus search, and if it is hidden ignore the case where the device was described on the CLI without the "bus=3D" field. This is motivated by a specific use-case: implementing the VCS command set, part of the CXL specification (CXL r3.2 Section 7.1.3). In this scenario a switch controlled by a Fabric Manager is able to change the virtual hierarchy of devices seen by a guest within a fixed physical system topology. The connecting bus is not known until runtime when a bind command is issued by the Fabric Manager. Signed-off-by: Joshua Lant --- system/qdev-monitor.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/system/qdev-monitor.c b/system/qdev-monitor.c index f2aa400a77..b51dfe0645 100644 --- a/system/qdev-monitor.c +++ b/system/qdev-monitor.c @@ -650,6 +650,7 @@ DeviceState *qdev_device_add_from_qdict(const QDict *op= ts, DeviceState *dev; BusState *bus =3D NULL; QDict *properties; + bool hide_device; =20 driver =3D qdict_get_try_str(opts, "driver"); if (!driver) { @@ -663,6 +664,11 @@ DeviceState *qdev_device_add_from_qdict(const QDict *o= pts, return NULL; } =20 + /* Is the device hidden from the guest? + * If yes, no need to find a default bus if none given... + * Bus could be provided at runtime (i.e. in a switch)*/ + hide_device =3D qdev_should_hide_device(opts, from_json, errp); + /* find bus */ path =3D qdict_get_try_str(opts, "bus"); if (path !=3D NULL) { @@ -675,14 +681,14 @@ DeviceState *qdev_device_add_from_qdict(const QDict *= opts, driver, object_get_typename(OBJECT(bus))); return NULL; } - } else if (dc->bus_type !=3D NULL) { + } else if (dc->bus_type !=3D NULL && !hide_device) { bus =3D qdev_find_default_bus(dc, errp); if (!bus) { return NULL; } } =20 - if (qdev_should_hide_device(opts, from_json, errp)) { + if (hide_device) { if (bus && !qbus_is_hotpluggable(bus)) { error_setg(errp, "Bus '%s' does not support hotplugging", bus->name); --=20 2.47.3 From nobody Sat May 30 19:21:09 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1777493208; cv=none; d=zohomail.com; s=zohoarc; b=gNGWWLCHdch0VhUmd5Un3GOHz1DNCmYp7mGcG6fIbAEQAdti+r3oBVgSUv0MCsQKttdVxrIO11zLWZRT6Pmnw6dj+3cX48eOMBhLAaVMKWPk0+B+uP0cdt2e2Wj6CGfExToDQo+YCO66PRfkiBkHlp5LW/NH3lgP0MPZcw3odjE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1777493208; 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=6CTSBzsBgkNvhDnVz+9h4ZL7e9PYIu5uJhtdDT/D+nI=; b=gzc1xQdTLadQr2v/VLDNByy9gjyda4hIWM/ADI3MFvxbZba9Ys30J/l46wUTs3xF0tawaBRd/NRBD9W9LAB78iITCvmL/VBxRKYlgVnD1mnoY7Qvb10a9rFMbAxdyHFFR+ug/yb+VWPa17ZeeAbI7BV1wSYgwE5/AHSud/SXmxw= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1777493208249162.87415778247544; Wed, 29 Apr 2026 13:06:48 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wIB7t-0003VA-VN; Wed, 29 Apr 2026 16:03:18 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wI5QR-00087f-82 for qemu-devel@nongnu.org; Wed, 29 Apr 2026 09:58:03 -0400 Received: from mail-wm1-x336.google.com ([2a00:1450:4864:20::336]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wI5QP-0007h4-7G for qemu-devel@nongnu.org; Wed, 29 Apr 2026 09:58:02 -0400 Received: by mail-wm1-x336.google.com with SMTP id 5b1f17b1804b1-488b0046078so113902205e9.1 for ; Wed, 29 Apr 2026 06:58:00 -0700 (PDT) Received: from node1.manccluster.local (revolution.cs.man.ac.uk. [130.88.198.135]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-447b3d48517sm5205950f8f.5.2026.04.29.06.57.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Apr 2026 06:57:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777471079; x=1778075879; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=6CTSBzsBgkNvhDnVz+9h4ZL7e9PYIu5uJhtdDT/D+nI=; b=UwEqwGh2PYO4Gre5r7ocHwshvBFK4kVDivUiqWB8cOSpkA+bSilWJk7rWDdx5dcazT xpvJ9WdyCTrF4l4VJBNKJJ1SFN6o8xJajZkQa3nuEUK67JOHbKWqU9CkMsGA2+NoSKsB +UEjzOIFW+HNxlpIYIewF2m7bBP0khBLNZ2hXatTu+3l4b0eKD28eTU37ljm9xFRPsMZ loaM8rdlp2EIxKi0QMiBPo4syP1e/04kljBAsoP668qV3pzaICYJ3SzrxRZwWGVkoG7U DLiVucsfGkunMxE8ephG61jjIW/MjT3/JKgtdX2OAtsMYqcreVRqGp6exCc94bblRSiq mpfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777471079; x=1778075879; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=6CTSBzsBgkNvhDnVz+9h4ZL7e9PYIu5uJhtdDT/D+nI=; b=DOyXxu7PDL3qzzYo+EUN2PGVZYi8qtolWgFEn5iTfpRu+ubyP/DHiGfLL9YGn4O8u5 YCTHHDGIYcRqSquwWI8ucL8rPeDU5IWeae6tjcKjXqbkR2NGCcxi3f2U2aLkpOjUZq5g kZHaKfTAB6bsGfQxw6Iv+8ic1+lOYatM7p2hD92WVnHtgQdv7nG029aWcwEBIT1gQzel Sir1YFDJ3IdY3GZbFGQEeZyTkXutmg86voPH7piut2vHBEgi/eDnTz8UrdVPwR1p4raS b1LSi1upLCmfxCNRkIg/9Mlr6d8oGvgMKh2AEODY1+/pqIRRCeKk0IOdO9bfsobg+nrf 09Gg== X-Gm-Message-State: AOJu0YwSKEszMOkHD6uP/gyXZQa5X/lNMepKpkNS928rv16NIL1u2SbQ EDrk9X2kn4xnS86wQ4VIv5Q2YeTbOUc8U/8NeMyM40QEyGPBeM4Fsqk4 X-Gm-Gg: AeBDiesSjhu9swlteLn77igY37+D0GZXEWrcv58g8gDRVlY6h3UxPgAshQ2hHgfcerU mCZfASWYkbtIXbVpoRhZLmLErjfEeHmjAAPzNO9MDEM6QZhqGTglmwpxGmAHbv/WSeXHrgRCNAi cEsqcq4V1vKlN5KJ/xEDDfDVW8YWc7ddX4wUix3dyRA7kcn2BLGoV+hS/yHXt53dfVV84bUlUzQ fjE6vVvLp+e2PfZsrOIPRNeVDrWVGmBZb3NSPY421HDA7+sQDQNXyP1u/Zz0cZTRVdKSsdPxqGi XwvFlLiuo1p6II9Bx/qJtOZEpx3R8kGOMn1dlxNoKcaj4ALzVaLWHFIcKoVWJB60nUQ+wk49eg9 0Qmf9V2xivq91c7ggZI+GLNpmVzxnIvPzB9dBlYYxSD6tSdW1g3cXerKrq8RX2Vq8O+8Zy0jOdE V+JdN5qgCpbYWoj/rwOX1bAI++fyP4NA6AA0BL8cR9G6SqPalgk5pQhYill8MKftY7+FyLVKu3 X-Received: by 2002:a5d:5d0f:0:b0:43d:7b90:fa23 with SMTP id ffacd0b85a97d-4464a447024mr14262935f8f.29.1777471079173; Wed, 29 Apr 2026 06:57:59 -0700 (PDT) From: Joshua Lant To: linux-cxl@vger.kernel.org Cc: qemu-devel@nongnu.org, Jonathan.Cameron@huawei.com, arpit1.kumar@samsung.com, Joshua Lant Subject: [RFC QEMU PATCH 03/10] cxl-type3: Properly unmap the memory-backend on device exit Date: Wed, 29 Apr 2026 14:48:37 +0100 Message-ID: <20260429135717.3048713-4-joshualant@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260429135717.3048713-1-joshualant@gmail.com> References: <20260429135717.3048713-1-joshualant@gmail.com> 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=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::336; envelope-from=joshualant@gmail.com; helo=mail-wm1-x336.google.com X-Spam_score_int: -10 X-Spam_score: -1.1 X-Spam_bar: - X-Spam_report: (-1.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, FORGED_GMAIL_RCVD=1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 29 Apr 2026 16:03:14 -0400 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @gmail.com) X-ZM-MESSAGEID: 1777493209604158501 Content-Type: text/plain; charset="utf-8" Currently the backend remains mapped, meaning that if the device owning the backend is hot-removed, it cannot be readded in the same QEMU instance. Signed-off-by: Joshua Lant --- hw/mem/cxl_type3.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hw/mem/cxl_type3.c b/hw/mem/cxl_type3.c index 68cd04b7d9..414c776028 100644 --- a/hw/mem/cxl_type3.c +++ b/hw/mem/cxl_type3.c @@ -1072,12 +1072,15 @@ static void ct3_exit(PCIDevice *pci_dev) cxl_destroy_cci(&ct3d->cci); if (ct3d->dc.host_dc) { cxl_destroy_dc_regions(ct3d); + host_memory_backend_set_mapped(ct3d->dc.host_dc, false); address_space_destroy(&ct3d->dc.host_dc_as); } if (ct3d->hostpmem) { + host_memory_backend_set_mapped(ct3d->hostpmem, false); address_space_destroy(&ct3d->hostpmem_as); } if (ct3d->hostvmem) { + host_memory_backend_set_mapped(ct3d->hostvmem, false); address_space_destroy(&ct3d->hostvmem_as); } } --=20 2.47.3 From nobody Sat May 30 19:21:09 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1777493166; cv=none; d=zohomail.com; s=zohoarc; b=MDy853RYk0WWlip1Z+Q8LUX6XOOdIhdHGGdb7P9nJe6XTemvLvBJvUB+h9gy6gTUNmdLSq8tHI9xQD8ygRHt+YFT8ClqWS7VpHoTOeP78MjkEq3s3M7l0eqgGIidAopEvLenNUOAZvubNS8uFdWbiRhqPAmfnvHtDyT+WOndsMQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1777493166; 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=4CbYkDBPpXawZZfXwyECFDKJfotfIOnbxLhrwBo3n24=; b=N3smp4NWOC2JOWpPFoE/c8Xu0vsiiLPEvozb1LcbWpNxLUFuXXRjq6kzmO5etOQlww75p9EjWr86b9WUFKqlXK7MWAaWsbIccDnGKqsLgs9miUx6WigqTEo0vbl8WJBUm8jklokldR0b1KeHjnWG+luVdPAAOL6741LkNBRtMP0= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1777493166130989.7827459327574; Wed, 29 Apr 2026 13:06:06 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wIB7u-0003VV-Oo; Wed, 29 Apr 2026 16:03:18 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wI5QS-0008CD-Fa for qemu-devel@nongnu.org; Wed, 29 Apr 2026 09:58:04 -0400 Received: from mail-wm1-x32b.google.com ([2a00:1450:4864:20::32b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wI5QQ-0007hQ-U6 for qemu-devel@nongnu.org; Wed, 29 Apr 2026 09:58:04 -0400 Received: by mail-wm1-x32b.google.com with SMTP id 5b1f17b1804b1-48334ee0aeaso128829745e9.1 for ; Wed, 29 Apr 2026 06:58:01 -0700 (PDT) Received: from node1.manccluster.local (revolution.cs.man.ac.uk. [130.88.198.135]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-447b3d48517sm5205950f8f.5.2026.04.29.06.57.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Apr 2026 06:57:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777471081; x=1778075881; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=4CbYkDBPpXawZZfXwyECFDKJfotfIOnbxLhrwBo3n24=; b=r6MZzKzs/RFZzPVTtiwcovxiyBxme8QU1tjIPt0vKTzNIYPuV/R2KpSaJ7M+bIQrca NUPA2JYPKEXu1MQ0oeD9tV6M9KTnTbNaDk7twc0ZkClFwfrtLf63UM8FM4q1ak0Usxzl 57074sOyed5a0vMWlztOmAqpgGUfIdBUAc0lMB7/MSGk+/7oadriztTwfC+e2F0HTeJW nVMx0irq+ThowISym/THWJUSVvMpsoDv3oWJ3RGZnVQvsviYgn6Ju0sSknuA2GvS/OUR WEMIB/EGPxevl+7IzRVFP4ta3FK3MQbtQ4DgwIhFvgbeEgPBMoEKRL5w24BpEjFrpoVc pgQQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777471081; x=1778075881; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=4CbYkDBPpXawZZfXwyECFDKJfotfIOnbxLhrwBo3n24=; b=LiOwFcdbMIbtr8xcNfX/aZPAYCQlQm8ZSJmTvPfEjyOHm3EB0A6cycxGwqbAR7prYI Gvwgl+G+aeC8xkwFGkmtqgXc1kSHfLBE01KL8S2Bf1vR/5vOlEvC0flA3G6EF/EUw2p+ NH0iBllavkK/+uFC/oFEZUmQfsoXF5rX0hMDrmmZkFWFrBhwFt2R+6FmUeOrOzexTqmU aQ4BIRkB47rjFV8PJNd8ehjmg7I6SF+suZiSxMXkizfkgf5DMf5HNgmAoDvo7vqecHLM DAKWCQNHG1foH1y58RAC9j0DJdI4fR9sipwffNaMdHVHaIn8RiWeAkPUyIsxYjjO1EHV VYCA== X-Gm-Message-State: AOJu0Yx5IIFynnspEmqZptoLps6a1zOjbZgR7SD5yxC7i7iObx/5dLLD H6UEzE60B63OIUa2gFmF7UWjRhc2zFznRtLDWNO+7u8fW2ZoXTmbVN/h X-Gm-Gg: AeBDiesAG14OvQHrwrH4fxbWLRabju0+zKMbQo/zCAcAj0DafxN5fHvND3uAsVrKptT 9OB7E6fRThOeuHxpMbMa0KavAXLk2PKBjOgyxQ8boBwfQU3QjxrcaqOdxbN9lzZiyxosyg0OYP0 FwY7n0mTxWjZKwzGx6YHJa8b5Ce0V4GMJJxiGxi3FGC6QgkBNnit/kK7rupZ8RCOuf315zJHW6P VzIzGz+3doxFIXQk722hvjQPMCaRbeWDboHnLDzDayZ2CSo5fQkFR4OjkvS2pesCuKCFIpX9/NH 0ZeS3BM3JQDZ+9g7qhV3KEKoVqd/YG/94fHjwY0q3CH/kP+TnVLzRHdThgNl4d0y1CFu1VmBhZU GyJ9fayxryP4VrN0POQ5WXroo011JV8TmjbP481//ZCpOYX0zeoZR3LSvJdX8wBzAEHqm4MrATK /OSZuATO4evMwOrFuJirmuLFrjMxWE0+EjWngot/pA1zL+sY1hYNmangWnlzagcebQpJz6uaiZ X-Received: by 2002:a05:600c:528d:b0:480:69b6:dfed with SMTP id 5b1f17b1804b1-48a7b546b7dmr72438825e9.24.1777471080538; Wed, 29 Apr 2026 06:58:00 -0700 (PDT) From: Joshua Lant To: linux-cxl@vger.kernel.org Cc: qemu-devel@nongnu.org, Jonathan.Cameron@huawei.com, arpit1.kumar@samsung.com, Joshua Lant Subject: [RFC QEMU PATCH 04/10] cxl_downstream: enable power controller present capability. Date: Wed, 29 Apr 2026 14:48:38 +0100 Message-ID: <20260429135717.3048713-5-joshualant@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260429135717.3048713-1-joshualant@gmail.com> References: <20260429135717.3048713-1-joshualant@gmail.com> 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=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::32b; envelope-from=joshualant@gmail.com; helo=mail-wm1-x32b.google.com 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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 29 Apr 2026 16:03:14 -0400 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @gmail.com) X-ZM-MESSAGEID: 1777493167456158500 Content-Type: text/plain; charset="utf-8" PCI_EXP_SLTCAP_PCP (Power Controller Present) must be set in the DSP's slot capabilities for PCIe managed hot-remove to complete. Without this notification from the guest of removal cannot be sent back to the device, so device listeners for unrealizing will not fire. Signed-off-by: Joshua Lant --- hw/pci-bridge/cxl_downstream.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hw/pci-bridge/cxl_downstream.c b/hw/pci-bridge/cxl_downstream.c index 91c5e6a605..5322c46900 100644 --- a/hw/pci-bridge/cxl_downstream.c +++ b/hw/pci-bridge/cxl_downstream.c @@ -228,6 +228,8 @@ static const Property cxl_dsp_props[] =3D { DEFINE_PROP_PCIE_LINK_WIDTH("x-width", PCIESlot, width, PCIE_LINK_WIDTH_16), DEFINE_PROP_BOOL("x-256b-flit", PCIESlot, flitmode, true), + DEFINE_PROP_BIT(COMPAT_PROP_PCP, PCIDevice, cap_present, + QEMU_PCIE_SLTCAP_PCP_BITNR, true), }; =20 static void cxl_dsp_class_init(ObjectClass *oc, const void *data) --=20 2.47.3 From nobody Sat May 30 19:21:09 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1777493045; cv=none; d=zohomail.com; s=zohoarc; b=DSNrmIjryyR1ApPUKN5q1LuP/jEwpIrT2OlphUQrHodq9toOGYKDbLXvXgKMIoGuycORfuWakLSXKws4lUfAsCJ4pDJOMOrA4zfZPNrd0yawRP902QfhEbPT17GamYBJZ5JE+ir+QK1wcdGBJMHZhQw/lSO/oP50Ks/nqbm5VNQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1777493045; h=Content-Type: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=mwHA3nK3tLpyQIT1y1aThj/ymGzWpwwSiiTYweRTIgw=; b=XC4LNEETe3uCZzfImL9Gn0DmsLHUbJeTPFy58W7CHK5Gr96cxAKrj7AfCeXeBTRqhrBMlPSLAhA0DRvJq/4Cgr/DOTFlpmyJ6f9k7e1GwT0qUOMKIkGnwPKDMn35gXJZwBGicM5Z2aNeDdipHgvHqko1UqK/AB4nD9Q9tsPJjcQ= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1777493045534720.5055384589327; Wed, 29 Apr 2026 13:04:05 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wIB7v-0003Vj-N9; Wed, 29 Apr 2026 16:03:19 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wI5QV-0008Jl-R7 for qemu-devel@nongnu.org; Wed, 29 Apr 2026 09:58:08 -0400 Received: from mail-wm1-x331.google.com ([2a00:1450:4864:20::331]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wI5QR-0007hs-R3 for qemu-devel@nongnu.org; Wed, 29 Apr 2026 09:58:06 -0400 Received: by mail-wm1-x331.google.com with SMTP id 5b1f17b1804b1-48334ee0aeaso128830005e9.1 for ; Wed, 29 Apr 2026 06:58:03 -0700 (PDT) Received: from node1.manccluster.local (revolution.cs.man.ac.uk. [130.88.198.135]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-447b3d48517sm5205950f8f.5.2026.04.29.06.58.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Apr 2026 06:58:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777471082; x=1778075882; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=mwHA3nK3tLpyQIT1y1aThj/ymGzWpwwSiiTYweRTIgw=; b=jYV3YnpjAahmWAP75TP9MJLT9r94bhW+9vIb1nqfNn+QplexstLdeQ/jBShvluXh5C iAR4thWIvedYhMo7WvT6E4akEf32sZ8xGFxXDJAM0i0Do/CpdbERXjOXbd+QToTfdvXD ufjUDVs3rEnhhJ0Zo3ztplXCF/VNUqcr9NgT7st9HFUOYvFgh7CVb4SRJkwSEpuKVSzM t+g07AkqDCCqBkpVEixA0/8us2U57Ns62Lz+tDR3kmrNWDr2fn0ZUSLn6RtfqN/VGB62 XdSBSDwdKznCuFq/2eObDYYhfQaPsav0o0RgcLz8URaeJvJcrBsdbpqvt+FooZhxu6fq O+8A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777471082; x=1778075882; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=mwHA3nK3tLpyQIT1y1aThj/ymGzWpwwSiiTYweRTIgw=; b=meUwZlgUmDvzAozFry/068V0cUkJpbrcnmmRi5D04ia431aCrAxtsStsEGLJz2P9zh O0/+jslVgwzVvIu7byQtIqoTgcuFFELAzvTPZ21zplOpeDIFPnefXFUJz1uFmRRqEWcn 2PQTDcSHl+9+tVhu6hL1j4XLq8xFsH2U9AC1O9FRR6z3tuiVZ7NpRnM/7JcM97Rm+Tsl Cm894mSj0aq3HSPIMAELSZXKn1iJPYVfW2WuTIsjcP94LKLefzBgH5QKYKol2tC5OL3+ Ca5u1MAgKkixkCgJ7H+TG77yFQP2GiuqMUP6cwiGN78SIPBwJliwI53CkDYhPJc3qjqb UbNQ== X-Gm-Message-State: AOJu0YztjVDItzRUB+hB2qf6WOgCHf46oZu4cckUH6Dnidz43s/+Pn7h XWbfUM9+3os+3fHXEfhnbz6349oKuq0fXLA2jwQfj0mwWY/PkiORSW19PxCERVIK X-Gm-Gg: AeBDievbVkxcM5OARxQC+MoR2HfeLymkiJ3J7SBNh+6IrdOG37KpcLR8i/74clmN06s lBX7mYhNSkF5LtbGg4MGE0L12HD3wuHk6siShWDVNg1gbZWVO+QpY6Uy++a8w9fdtmRyKIo9ixY 5YKt+oNGEL0SPPoVo+Ng33xKb7/b8BzrJj8ftC/Fun9WquwQqd/MzzqKyvL64d5yXlxgMMgS9s2 2nbEa87+FroTUw30/+vUVDnARwrfXWrBPLseZZYCa0IclZIHCqa66915WTc0Y3skuHGMj8giuhV EuErus1F9EaJIlppBbTcfRlnL3wl4kaTmQVqtvjoQdkh9i8iLYF7qVJMloh6ZoNft2D3D0m6ytv sYEptpU9yN41fTbXwBONOIa3s56by1NFRnNeL9R8E7YpIDS6WugokmSyc3QYoZGDKpAXIHh4uPr 7uPZsCEId6cm0kebhcXZZIF2b+kB5XBbny1ahCPKWkGGGYCx8IHwulpR09F35PjHufFbR0Bj9L X-Received: by 2002:a05:600c:3f18:b0:485:35d3:ce59 with SMTP id 5b1f17b1804b1-48a7b51beebmr72235865e9.10.1777471082058; Wed, 29 Apr 2026 06:58:02 -0700 (PDT) From: Joshua Lant To: linux-cxl@vger.kernel.org Cc: qemu-devel@nongnu.org, Jonathan.Cameron@huawei.com, arpit1.kumar@samsung.com, Joshua Lant Subject: [RFC QEMU PATCH 05/10] cxl-vcs-switch: Initial support for CXL VCS. Date: Wed, 29 Apr 2026 14:48:39 +0100 Message-ID: <20260429135717.3048713-6-joshualant@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260429135717.3048713-1-joshualant@gmail.com> References: <20260429135717.3048713-1-joshualant@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::331; envelope-from=joshualant@gmail.com; helo=mail-wm1-x331.google.com 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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 29 Apr 2026 16:03:16 -0400 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @gmail.com) X-ZM-MESSAGEID: 1777493047110158500 Add initial support for VCS (multi-USP/multi-logic-device) switch emulation in CXL. Currently the object only supports the identify/bind/unbi= nd commands (0x5200/0x5201/0x5202), as well as support for device hiding listeners. This enables preliminary testing of the VCS capability, but will not allow for complete emulated flow as described in spec (CXL v3.2, 7.2.3). Nor will it allow for multiple USP's to be disributed over multiple QEMU instances. Signed-off-by: Joshua Lant --- hw/cxl/cxl-vcs-switch.c | 524 ++++++++++++++++++++++++++++++++ hw/cxl/meson.build | 1 + include/hw/cxl/cxl_vcs_switch.h | 134 ++++++++ qapi/qom.json | 19 ++ 4 files changed, 678 insertions(+) create mode 100644 hw/cxl/cxl-vcs-switch.c create mode 100644 include/hw/cxl/cxl_vcs_switch.h diff --git a/hw/cxl/cxl-vcs-switch.c b/hw/cxl/cxl-vcs-switch.c new file mode 100644 index 0000000000..9a492330cc --- /dev/null +++ b/hw/cxl/cxl-vcs-switch.c @@ -0,0 +1,524 @@ +/* + * CXL VCS Capable Switch Object + * + * Copyright(C) 2026 University of Manchester. + * Author: Joshua Lant . + * + * This work is licensed under the terms of the GNU GPL, version 2. See the + * COPYING file in the top-level directory. + * + * SPDX-License-Identifier: GPL-v2-only + */ +#include "hw/cxl/cxl_vcs_switch.h" +#include "qobject/qdict.h" +#include "monitor/qdev.h" + +/* Primary FM here is used when the FM is local to the QEMU instance. Sett= ing + * local-fm=3Dfalse in cli results in instantiation of remote listener for= FM + * commands (TODO: to be implemented) */ +static bool cxl_vcs_get_local_fm(Object *obj, Error **errp) +{ + CXLVCSSwitch *vcs =3D CXL_VCS_SWITCH(obj); + return vcs->local_fm; +} +static void cxl_vcs_set_local_fm(Object *obj, bool value, Error **errp) +{ + CXLVCSSwitch *vcs =3D CXL_VCS_SWITCH(obj); + vcs->local_fm =3D value; +} + +/* Binds an already realized MLD to a VPPB in the switch */ +static CXLRetCode cxl_vcs_bind_realized_vppb(CXLVCSSwitch *sw, uint8_t vcs= _id, + uint8_t vppb_id, uint8_t dsp_ppb_id, uint8_t ld_id) +{ + /* TODO: Implement... Required for handling MLD devices... */ + return CXL_MBOX_UNSUPPORTED; +} + +/* Binds a hidden device (simple SLD) to a VPPB in the switch */ +static CXLRetCode cxl_vcs_bind_qdict_vppb(CXLVCSSwitch *sw, uint8_t vcs_id, + uint8_t vppb_id, uint8_t dsp_ppb_id, uint8_t ld_id) +{ + Error *local_err =3D NULL; + CXLVPPBInfo *vppb; + CXLDownstreamPPB *dspppb; + QDict *bind_opts; + DeviceState *dev; + + // Upstream to bind + if(!sw->usp_ppbs[vcs_id]) { + return CXL_MBOX_INVALID_INPUT; + } + vppb =3D sw->usp_ppbs[vcs_id]->info->vppbs[vppb_id]; + if(!vppb) { + return CXL_MBOX_INVALID_INPUT; + } + PCIDevice *vppb_dev =3D PCI_DEVICE(vppb->dsp); + + //Downstream to bind + dspppb =3D sw->dsp_ppbs[dsp_ppb_id]; + if(!dspppb) { + return CXL_MBOX_INVALID_INPUT; + } + + // Get DSP bus id from qdev + bind_opts =3D qdict_clone_shallow(dspppb->opts); + qdict_put_str(bind_opts, "bus", vppb_dev->qdev.id); + qdict_del(bind_opts, "vcs"); + qdict_del(bind_opts, "dsppb"); + + uint8_t prev_binding_status =3D vppb->binding_status; + vppb->binding_status =3D CXL_VPPB_BINDING_STATUS_IN_PROGRESS; + dev =3D qdev_device_add_from_qdict(bind_opts, dspppb->from_json, &loca= l_err); + if(!dev || local_err) { + vppb->binding_status =3D prev_binding_status; + return CXL_MBOX_INTERNAL_ERROR; + } + + vppb->bound_port_id =3D dsp_ppb_id; + vppb->bound_ld_id =3D CXL_INVALID_BOUND_LD_ID; // TODO: support MLDs. + vppb->binding_status =3D CXL_VPPB_BINDING_STATUS_BOUND_PORT; + dspppb->dev =3D dev; + dspppb->is_bound =3D true; + dspppb->bound_vcs_id =3D vcs_id; + dspppb->bound_vppb_id =3D vppb_id; + qobject_unref(bind_opts); + + return CXL_MBOX_SUCCESS; +} + +CXLRetCode cxl_vcs_bind_vppb(CXLVCSSwitch *sw, uint8_t vcs_id, uint8_t vpp= b_id, + uint8_t dsp_ppb_id, uint16_t ld_id) +{ + if(cxl_vcs_get_local_fm(OBJECT(sw), NULL)) { + if(ld_id =3D=3D CXL_UNSUPPORTED_LD_ID) { + return cxl_vcs_bind_qdict_vppb(sw, vcs_id, vppb_id, + dsp_ppb_id, ld_id); + } else { + // TODO: Connect up already realized device + // (needed for MLD support). + return cxl_vcs_bind_realized_vppb(sw, vcs_id, vppb_id, + dsp_ppb_id, ld_id); + } + } + else { + // TODO: Send bind command to remote QEMU process... + return CXL_MBOX_UNSUPPORTED; + } +} + +static CXLRetCode cxl_vcs_unbind_qdict_vppb(CXLVCSSwitch *sw, uint8_t vcs_= id, + uint8_t vppb_id, uint8_t options) +{ + Error *local_err =3D NULL; + CXLVPPBInfo *vppb_info; + CXLDownstreamPPB *dspppb =3D NULL; + + if(!sw->usp_ppbs[vcs_id]) { + return CXL_MBOX_INVALID_INPUT; + } + + vppb_info =3D sw->usp_ppbs[vcs_id]->info->vppbs[vppb_id]; + if (!vppb_info || + (vppb_info->binding_status =3D=3D CXL_VPPB_BINDING_STATUS_UNBOUND)= || + (vppb_info->binding_status =3D=3D CXL_VPPB_BINDING_STATUS_IN_PROGR= ESS)) { + return CXL_MBOX_INVALID_INPUT; + } + + for (int i =3D 0; i < sw->num_dsp_ppbs; i++) { + if (sw->dsp_ppbs[i] && + sw->dsp_ppbs[i]->is_bound && + sw->dsp_ppbs[i]->bound_vcs_id =3D=3D vcs_id && + sw->dsp_ppbs[i]->bound_vppb_id =3D=3D vppb_id) { + dspppb =3D sw->dsp_ppbs[i]; + break; + } + } + + if (!dspppb) { + return CXL_MBOX_INVALID_INPUT; + } + + if (!dspppb->dev) { + return CXL_MBOX_INVALID_INPUT; + } + + /* Options from cxl v3.2 (Table 7-34), Bits[3:0]. + =E2=80=94 0h =3D Wait for port Link Down before unbinding + =E2=80=94 1h =3D Simulate Managed Hot-Remove + =E2=80=94 2h =3D Simulate Surprise Hot-Remove */ + options =3D options & 0x0F; + if (options =3D=3D CXL_VPPB_UNBIND_WAIT_FOR_LINK_DOWN) { + // TODO: implement + return CXL_MBOX_INVALID_INPUT; + } + else if(options =3D=3D CXL_VPPB_UNBIND_MANAGED_HOT_REMOVE) { + // unrealize listener will fire once guest notifies the port... + qdev_unplug(dspppb->dev, &local_err); + vppb_info->binding_status =3D CXL_VPPB_BINDING_STATUS_IN_PROGRESS; + if (local_err) { + return CXL_MBOX_INTERNAL_ERROR; + } + return CXL_MBOX_SUCCESS; + } + else if (options =3D=3D CXL_VPPB_UNBIND_SURPRISE_HOT_REMOVE) { + // TODO: implement, This isn't a true surprise removal... + qdev_unplug(dspppb->dev, &local_err); + if (local_err) { + return CXL_MBOX_INTERNAL_ERROR; + } + object_unparent(OBJECT(dspppb->dev)); + dspppb->is_bound =3D false; + dspppb->bound_vcs_id =3D 0; + dspppb->bound_vppb_id =3D 0; + + /* Clear VPPB binding state so Get Virtual Switch Info reflects un= bound */ + vppb_info->binding_status =3D CXL_VPPB_BINDING_STATUS_UNBOUND; + vppb_info->bound_port_id =3D 0; + vppb_info->bound_ld_id =3D CXL_INVALID_BOUND_LD_ID; + dspppb->dev =3D NULL; + /* TODO: Generate Virtual CXL Switch Event Record per CXL spec + * section 7.6.6.6 */ + return CXL_MBOX_SUCCESS; + } + else { + return CXL_MBOX_INVALID_INPUT; + } + +} + +CXLRetCode cxl_vcs_unbind_vppb(CXLVCSSwitch *sw, uint8_t vcs_id, + uint8_t vppb_id, uint16_t option) +{ + /*TODO: Only currently unbinding an unrealizing whole device. + * Implement for MLD partial unbinding of single extents etc. + * */ + return cxl_vcs_unbind_qdict_vppb(sw, vcs_id, vppb_id, option); +} + +void cxl_vcs_identify_switch_device(CXLVCSSwitch *sw) +{ + //TODO: implement +} +void cxl_vcs_get_physical_port_state(CXLVCSSwitch *sw) +{ + //TODO: implement +} +void cxl_vcs_physical_port_control(CXLVCSSwitch *sw) +{ + //TODO: implement +} +void cxl_vcs_get_virtual_switch_info(CXLVCSSwitch *sw) +{ + //TODO: implement +} + +void cxl_vcs_register_usp(CXLVCSSwitch *sw, CXLUpstreamPort *usp, + Error **errp) +{ + uint8_t ppb =3D usp->ppb; + + if(strcmp(object_get_canonical_path_component(OBJECT(sw)), usp->vcs_na= me)) { + error_setg(errp, "VCS id for USP and switch do not match...\n"); + } + + if (ppb >=3D sw->num_usp_ppbs) { + error_setg(errp, "vcs '%s': ppb %u >=3D usp-ppbs %u", + object_get_canonical_path_component(OBJECT(sw)), + ppb, sw->num_usp_ppbs); + return; + } + if (sw->usp_ppbs[ppb]) { + error_setg(errp, "vcs '%s': USP slot %u already registered", + object_get_canonical_path_component(OBJECT(sw)), ppb); + return; + } + + sw->usp_ppbs[ppb] =3D g_new0(CXLUpstreamPPB, 1); + sw->usp_ppbs[ppb]->usp =3D usp; + sw->usp_ppbs[ppb]->info =3D g_new0(CXLVCSInfoBlock, 1); + sw->usp_ppbs[ppb]->info->vcs_id =3D ppb; + sw->usp_ppbs[ppb]->info->usp_id =3D ppb; + sw->usp_ppbs[ppb]->info->num_vppbs =3D 0; + sw->usp_ppbs[ppb]->info->vcs_state =3D CXL_VCS_STATE_ENABLED; + usp->swcci.vcs =3D sw; +} + +void cxl_vcs_register_vppb(CXLVCSSwitch *sw, CXLUpstreamPort *usp, + CXLDownstreamPort *dsp, Error **errp) +{ + CXLUpstreamPPB *vcs; + + for(int i =3D 0; i < CXL_MAX_VCS_PORTS; i++) { + if(sw->usp_ppbs[i]) { + if(usp =3D=3D sw->usp_ppbs[i]->usp) { + vcs =3D sw->usp_ppbs[i]; + break; + } + } else { + error_setg(errp, "The USP was not found in the VCS list..."); + return; + } + } + + for(int i =3D 0; i < CXL_MAX_VPPB_PER_VCS; i++) { + if(!vcs->info->vppbs[i]) { + // Free vppb slot.. lets allocate and populate it... + CXLVPPBInfo *vppb =3D g_new0(CXLVPPBInfo, 1); + vppb->dsp =3D PCI_DEVICE(dsp); + vppb->binding_status =3D CXL_VPPB_BINDING_STATUS_UNBOUND; + vcs->info->vppbs[i] =3D vppb; + vcs->info->num_vppbs =3D vcs->info->num_vppbs + 1; + return; + } + } + + error_setg(errp, "No free VPPB slots in the VCS..."); + return; +} + +void cxl_vcs_register_qdict_dsppb(CXLVCSSwitch *sw, const QDict *opts, + bool from_json, Error **errp) +{ + QDict *dev_opts; + int ppb; + const char *ppb_str =3D qdict_get_try_str(opts, "dsppb"); + ppb =3D atoi(ppb_str); + if(ppb =3D=3D -1) { + error_setg(errp, "No ppb id given in cli."); + return; + } + + if (ppb >=3D sw->num_dsp_ppbs) { + error_setg(errp, "vcs '%s': dsppb %u >=3D dsp-ppbs %u", + object_get_canonical_path_component(OBJECT(sw)), + ppb, sw->num_dsp_ppbs); + return; + } + if (sw->dsp_ppbs[ppb]) { + error_setg(errp, "vcs '%s': DSP PPB slot %u already occupied", + object_get_canonical_path_component(OBJECT(sw)), ppb); + return; + } + + dev_opts =3D qdict_clone_shallow(opts); + qdict_del(dev_opts, "vcs"); + qdict_del(dev_opts, "dsppb"); + qdict_del(dev_opts, "bus"); + + sw->dsp_ppbs[ppb] =3D g_new0(CXLDownstreamPPB, 1); + sw->dsp_ppbs[ppb]->opts =3D dev_opts; + sw->dsp_ppbs[ppb]->from_json =3D from_json; + sw->dsp_ppbs[ppb]->is_bound =3D false; +} + +void cxl_vcs_register_dsppb(CXLVCSSwitch *sw, const QDict *opts, + bool from_json, Error **errp) +{ + + DeviceState *dev =3D qdev_new(qdict_get_str(opts, "driver")); + qdev_set_id(dev, g_strdup(qdict_get_try_str(opts, "id")), errp); + int ppb; + const char *ppb_str =3D qdict_get_try_str(opts, "dsppb"); + ppb =3D atoi(ppb_str); + if(ppb =3D=3D -1) { + error_setg(errp, "No ppb id given in cli."); + return; + } + + QDict *dev_opts =3D qdict_clone_shallow(opts); + qdict_del(dev_opts, "driver"); + qdict_del(dev_opts, "bus"); + qdict_del(dev_opts, "id"); + qdict_del(dev_opts, "vcs"); + qdict_del(dev_opts, "dsppb"); + object_set_properties_from_keyval(OBJECT(dev), dev_opts, from_json, er= rp); + qobject_unref(dev_opts); + // store, don't realize + sw->dsp_ppbs[ppb]->dev =3D dev; +} + +static bool cxl_vcs_switch_can_be_deleted(UserCreatable *uc) +{ + return false; +} + +/* When a device is instantiated downstream of a VCS's PPB, we + * store the qdicts from the CLI, to realize the device at a + * future time. + */ +bool cxl_vcs_hide_device_listener(DeviceListener *listener, const QDict *o= pts, + bool from_json, Error **errp) +{ + CXLVCSSwitch *vcs =3D container_of(listener, CXLVCSSwitch, listener); + const char *vcs_id_str =3D qdict_get_try_str(opts, "vcs"); + const char *ppb_str =3D qdict_get_try_str(opts, "dsppb"); + int ppb; + + /* Not our device =E2=80=94 don't claim it */ + if (!vcs_id_str || !ppb_str) { + return false; + } + if(vcs_id_str) { + if(strcmp(vcs_id_str, + object_get_canonical_path_component(OBJECT(vcs)))) { + return false; + } + } + if(ppb_str) { + ppb =3D atoi(ppb_str); + if(vcs->dsp_ppbs[ppb]) { + error_setg(errp, + "The ppb %s is already populated by another device.", ppb_= str); + return false; + } + } + + cxl_vcs_register_qdict_dsppb(vcs, opts, from_json, errp); + + return true; +} + +/* + * Listener is added for unbinding. When a device is unbound using the + * Fabric Manager with 'managed' hot-remove option, a notificaiton is + * sent to the guest, which should perform a graceful teardown and notify + * the port of completion. At this point this listener unrealizes the devi= ce. + */ +static void cxl_vcs_ppb_unrealize_listener(DeviceListener *listener, + DeviceState *dev) +{ + CXLVCSSwitch *sw =3D container_of(listener, CXLVCSSwitch, listener); + CXLDownstreamPPB *dspppb; + CXLVPPBInfo *vppb_info; + + for (int i =3D 0; i < sw->num_dsp_ppbs; i++) { + if (sw->dsp_ppbs[i] && (sw->dsp_ppbs[i]->dev =3D=3D dev)) { + dspppb =3D sw->dsp_ppbs[i]; + break; + } + } + if(!dspppb) { + return; + } + + vppb_info =3D + sw->usp_ppbs[dspppb->bound_vcs_id]->info->vppbs[dspppb->bound_vppb= _id]; + object_unparent(OBJECT(dspppb->dev)); + dspppb->dev =3D NULL; + dspppb->is_bound =3D false; + dspppb->bound_vcs_id =3D 0; + dspppb->bound_vppb_id =3D 0; + vppb_info->binding_status =3D CXL_VPPB_BINDING_STATUS_UNBOUND; + vppb_info->bound_port_id =3D 0; + vppb_info->bound_ld_id =3D CXL_INVALID_BOUND_LD_ID; + /* TODO: generate Virtual CXL Switch Event Record */ +} + +static void cxl_vcs_switch_complete(UserCreatable *uc, Error **errp) +{ + CXLVCSSwitch *sw =3D CXL_VCS_SWITCH(uc); + sw->listener.hide_device =3D cxl_vcs_hide_device_listener; + sw->listener.unrealize =3D cxl_vcs_ppb_unrealize_listener; + device_listener_register(&sw->listener); +} + +static void vcs_get_usp_ppbs(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + CXLVCSSwitch *vcs =3D CXL_VCS_SWITCH(obj); + uint8_t val =3D vcs->num_usp_ppbs; + visit_type_uint8(v, name, &val, errp); +} + +static void vcs_set_usp_ppbs(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + CXLVCSSwitch *vcs =3D CXL_VCS_SWITCH(obj); + uint8_t val; + if (!visit_type_uint8(v, name, &val, errp)) { + return; + } + vcs->num_usp_ppbs =3D val; +} +static void vcs_get_dsp_ppbs(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + CXLVCSSwitch *vcs =3D CXL_VCS_SWITCH(obj); + uint8_t val =3D vcs->num_dsp_ppbs; + visit_type_uint8(v, name, &val, errp); +} + +static void vcs_set_dsp_ppbs(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + CXLVCSSwitch *vcs =3D CXL_VCS_SWITCH(obj); + uint8_t val; + if (!visit_type_uint8(v, name, &val, errp)) { + return; + } + vcs->num_dsp_ppbs =3D val; +} + +static void cxl_vcs_class_init(ObjectClass *oc, const void *data) +{ + CXLVCSSwitchClass *cc =3D CXL_VCS_SWITCH_CLASS(oc); + UserCreatableClass *ucc =3D USER_CREATABLE_CLASS(oc); + ucc->complete =3D cxl_vcs_switch_complete; + ucc->can_be_deleted =3D cxl_vcs_switch_can_be_deleted; + cc->identify_switch_device =3D cxl_vcs_identify_switch_device; + cc->get_physical_port_state =3D cxl_vcs_get_physical_port_state; + cc->physical_port_control =3D cxl_vcs_physical_port_control; + cc->get_virtual_switch_info =3D cxl_vcs_get_virtual_switch_info; + cc->bind_vppb =3D cxl_vcs_bind_vppb; + cc->unbind_vppb =3D cxl_vcs_unbind_vppb; + + object_class_property_add_bool(oc, "local-fm", + cxl_vcs_get_local_fm, cxl_vcs_set_local_fm); + object_class_property_set_description(oc, "local-fm", + "true =3D FM authority (mctp connected guest), \ + false =3D slave listener (IPC)"); + object_class_property_add(oc, "usp-ppbs", "uint8", + vcs_get_usp_ppbs, vcs_set_usp_ppbs, + NULL, NULL); + object_class_property_set_description(oc, "usp-ppbs", + "Number of upstream ports in the switch"); + object_class_property_add(oc, "dsp-ppbs", "uint8", + vcs_get_dsp_ppbs, vcs_set_dsp_ppbs, + NULL, NULL); + object_class_property_set_description(oc, "dsp-ppbs", + "Number of downstream ports in the switch"); +} + +static void cxl_vcs_instance_init(Object *obj) +{ + // TODO: Nothing here yet... +} + +static void cxl_vcs_instance_finalize(Object *obj) +{ + // TODO: Nothing here yet... +} + +static const InterfaceInfo cxl_vcs_interfaces[] =3D { + { TYPE_USER_CREATABLE }, + { } +}; + +static const TypeInfo cxl_vcs_info =3D { + .name =3D TYPE_CXL_VCS_SWITCH, + .parent =3D TYPE_OBJECT, + .instance_size =3D sizeof(CXLVCSSwitch), + .class_size =3D sizeof(CXLVCSSwitchClass), + .class_init =3D cxl_vcs_class_init, + .instance_init =3D cxl_vcs_instance_init, + .instance_finalize =3D cxl_vcs_instance_finalize, + .interfaces =3D cxl_vcs_interfaces, +}; + +static void cxl_vcs_register(void) +{ + type_register_static(&cxl_vcs_info); +} + +type_init(cxl_vcs_register) diff --git a/hw/cxl/meson.build b/hw/cxl/meson.build index ccad565c5c..c37563cd05 100644 --- a/hw/cxl/meson.build +++ b/hw/cxl/meson.build @@ -7,6 +7,7 @@ system_ss.add(when: 'CONFIG_CXL', 'cxl-cdat.c', 'cxl-events.c', 'switch-mailbox-cci.c', + 'cxl-vcs-switch.c', ), if_false: files( 'cxl-host-stubs.c', diff --git a/include/hw/cxl/cxl_vcs_switch.h b/include/hw/cxl/cxl_vcs_switc= h.h new file mode 100644 index 0000000000..6576870bf3 --- /dev/null +++ b/include/hw/cxl/cxl_vcs_switch.h @@ -0,0 +1,134 @@ +/* + * CXL VCS Capable Switch Object Header + * + * Copyright(C) 2026 University of Manchester + * Author: Joshua Lant . + * + * This work is licensed under the terms of the GNU GPL, version 2. See the + * COPYING file in the top-level directory. + * + * SPDX-License-Identifier: GPL-v2-only + */ + +#ifndef CXL_VCS_SWITCH_H +#define CXL_VCS_SWITCH_H + +#include "qemu/osdep.h" +#include "qapi/error.h" +#include "qom/object.h" +#include "qom/object_interfaces.h" +#include "hw/pci-bridge/cxl_upstream_port.h" +#include "hw/pci-bridge/cxl_downstream_port.h" +#include "include/hw/cxl/cxl_device.h" + +#define TYPE_CXL_VCS_SWITCH "cxl-vcs-switch" +OBJECT_DECLARE_TYPE(CXLVCSSwitch, CXLVCSSwitchClass, CXL_VCS_SWITCH); + +#define CXL_VPPB_BINDING_STATUS_UNBOUND 0x00 +#define CXL_VPPB_BINDING_STATUS_IN_PROGRESS 0x01 +#define CXL_VPPB_BINDING_STATUS_BOUND_PORT 0x02 +#define CXL_VPPB_BINDING_STATUS_BOUND_LD 0x03 +#define CXL_VPPB_BINDING_STATUS_BOUND_PID 0x04 + +#define CXL_VPPB_UNBIND_WAIT_FOR_LINK_DOWN 0x0 +#define CXL_VPPB_UNBIND_MANAGED_HOT_REMOVE 0x1 +#define CXL_VPPB_UNBIND_SURPRISE_HOT_REMOVE 0x2 + +#define CXL_UNSUPPORTED_LD_ID 0xFFFF +#define CXL_INVALID_BOUND_LD_ID 0xFF + +#define CXL_VCS_STATE_INVALID_ID 0xFF +#define CXL_VCS_STATE_DISABLED 0x0 +#define CXL_VCS_STATE_ENABLED 0x1 + +#define CXL_MAX_VCS_PORTS 0x8 +#define CXL_MAX_VPPB_PER_VCS 0x8 +#define CXL_MAX_USP_PPBS CXL_MAX_VCS_PORTS +#define CXL_MAX_DSP_PPBS CXL_MAX_VPPB_PER_VCS + +#define CXL_MAX_PPBS (CXL_MAX_USP_PPBS + CXL_MAX_DSP_PPBS) +#define VPPB_LIST_LIMIT 8 + +struct CXLVCSSwitchClass { + ObjectClass parent_class; + void (*identify_switch_device)(CXLVCSSwitch *sw); + void (*get_physical_port_state)(CXLVCSSwitch *sw); + void (*physical_port_control)(CXLVCSSwitch *sw); + void (*get_virtual_switch_info)(CXLVCSSwitch *sw); + CXLRetCode (*bind_vppb)(CXLVCSSwitch *sw, uint8_t vcs_id, uint8_t vppb= _id, + uint8_t dsppb_id, uint16_t ld_id); + CXLRetCode (*unbind_vppb)(CXLVCSSwitch *sw, uint8_t vcs_id, uint8_t vp= pb_id, + uint16_t option); +}; + +/* CXL r3.2 Table 7-32: Get Virtual CXL Switch Info VCS Info Block Format = */ +typedef struct CXLVPPBInfo { + PCIDevice *dsp; + uint8_t binding_status; + uint8_t bound_port_id; + uint8_t bound_ld_id; + uint8_t rsv1; +} CXLVPPBInfo; + +typedef struct CXLVCSInfoBlock { + uint8_t vcs_id; + uint8_t vcs_state; + uint8_t usp_id; + uint8_t num_vppbs; + struct CXLVPPBInfo *vppbs[CXL_MAX_VPPB_PER_VCS]; +} CXLVCSInfoBlock; + +/* Physical Upstream and Downstream PCI-PCI Bridge (PPBs) structs */ +typedef struct CXLUpstreamPPB { + CXLUpstreamPort *usp; + struct CXLVCSInfoBlock *info; +} CXLUpstreamPPB; + +typedef struct CXLDownstreamPPB { + DeviceState *dev; + PCIDevice *pdev; + // store opts and json in case of simple device hiding. + QDict *opts; + bool from_json; + bool is_bound; + uint8_t bound_vcs_id; + uint8_t bound_vppb_id; +} CXLDownstreamPPB; + +typedef struct CXLVCSSwitch { + Object parent; + uint8_t num_usp_ppbs; + uint8_t num_dsp_ppbs; + uint8_t num_vppbs_per_vcs; + CXLCCI swcci; + CXLCCI mctpcci; + DeviceListener listener; + CXLUpstreamPPB *usp_ppbs[CXL_MAX_USP_PPBS]; + CXLDownstreamPPB *dsp_ppbs[CXL_MAX_DSP_PPBS]; + // true if FM is in this guest, false if remote FM. + bool local_fm; +} CXLVCSSwitch; + +// Called by USP/DSP/EP CXL devices to build the VCS structures. +void cxl_vcs_register_usp(CXLVCSSwitch *sw, CXLUpstreamPort *usp, Error **= errp); +void cxl_vcs_register_vppb(CXLVCSSwitch *sw, CXLUpstreamPort *usp, + CXLDownstreamPort *dsp, Error **errp); +void cxl_vcs_register_dsppb(CXLVCSSwitch *sw, const QDict *opts, + bool from_json, Error **errp); +void cxl_vcs_register_qdict_dsppb(CXLVCSSwitch *sw, const QDict *opts, + bool from_json, Error **errp); +bool cxl_vcs_hide_device_listener(DeviceListener *listener, + const QDict *device_opts, bool from_json, Error **errp); + + +// Called by the CCI mailbox utils for FMAPI control of VCS. +CXLRetCode cxl_vcs_bind_vppb(CXLVCSSwitch *sw, uint8_t vcs_id, uint8_t vpp= b_id, + uint8_t dsppb_id, uint16_t ld_id); +CXLRetCode cxl_vcs_unbind_vppb(CXLVCSSwitch *sw, uint8_t vcs_id, + uint8_t vppb_id, uint16_t option); +void cxl_vcs_identify_switch_device(CXLVCSSwitch *sw); +void cxl_vcs_get_physical_port_state(CXLVCSSwitch *sw); +void cxl_vcs_physical_port_control(CXLVCSSwitch *sw); +void cxl_vcs_get_virtual_switch_info(CXLVCSSwitch *sw); + +#endif /* CXL_VCS_SWITCH_H */ diff --git a/qapi/qom.json b/qapi/qom.json index 6f5c9de0f0..f66ef6b68b 100644 --- a/qapi/qom.json +++ b/qapi/qom.json @@ -357,6 +357,23 @@ 'data': { 'chardev': 'str' }, 'if': 'CONFIG_VHOST_CRYPTO' } =20 +## +# @CXLVCSSwitchProperties: +# +# Properties for cxl-vcs-switch objects. +# +# @usp-ppbs: number of physical upstream PPBs in the switch +# @dsp-ppbs: number of physical downstream PPBs in the switch +# @local-fm: true if this instance of qemu contains the MCTP device +# (FM capabilities), false if vcs will listen for incoming traffic +# from the remote FM. +## +{ 'struct': 'CXLVCSSwitchProperties', + 'data': { + '*usp-ppbs': 'uint8', + '*dsp-ppbs': 'uint8', + '*local-fm': 'bool'} } + ## # @DBusVMStateProperties: # @@ -1194,6 +1211,7 @@ 'cryptodev-backend-lkcf', { 'name': 'cryptodev-vhost-user', 'if': 'CONFIG_VHOST_CRYPTO' }, + 'cxl-vcs-switch', 'dbus-vmstate', 'filter-buffer', 'filter-dump', @@ -1272,6 +1290,7 @@ 'cryptodev-backend-lkcf': 'CryptodevBackendProperties', 'cryptodev-vhost-user': { 'type': 'CryptodevVhostUserPropertie= s', 'if': 'CONFIG_VHOST_CRYPTO' }, + 'cxl-vcs-switch': 'CXLVCSSwitchProperties', 'dbus-vmstate': 'DBusVMStateProperties', 'filter-buffer': 'FilterBufferProperties', 'filter-dump': 'FilterDumpProperties', --=20 2.47.3 From nobody Sat May 30 19:21:09 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1777493045; cv=none; d=zohomail.com; s=zohoarc; b=R7vQ8hZLcZec4VGIoLvn8UAurWOqh2mc9vlibeRN3E5j+YdNDf3wxdlHEbnBzaRwOjnfQUJJrZF7ilExxj3Jmmaytek7iiW9lLd4c1sG9kyhW045c0qp1ePjWoKEeDHpL++j72uL6OPhjQFTRyzaLInGWDxP2XZpPQQCqKfEOug= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1777493045; 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=gfj+OEin87giEu8kZpIKXoKArfkMj1N2Z6jKqDhBiuE=; b=PWZCCl5SRKk49KWHF6P+6T7frJMRYaUEyIqaQ5VIdmWNQMBYB/5/CGHwic6mGiGa6/pmfFB7HEe+LGlrufTSdS/0kX5oC5n7TkHNs6ZmNOFAwmmLUkJBejpTA5D5jPgbeQhnrNKJMvrEK/VT6Q8btTKoKW1ndbammzp+rkzz9R0= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1777493045303436.5292037505735; Wed, 29 Apr 2026 13:04:05 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wIB7w-0003XH-Vg; Wed, 29 Apr 2026 16:03:21 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wI5QX-0008KG-DO for qemu-devel@nongnu.org; Wed, 29 Apr 2026 09:58:12 -0400 Received: from mail-wr1-x433.google.com ([2a00:1450:4864:20::433]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wI5QT-0007iG-3e for qemu-devel@nongnu.org; Wed, 29 Apr 2026 09:58:08 -0400 Received: by mail-wr1-x433.google.com with SMTP id ffacd0b85a97d-441209fb77eso584483f8f.1 for ; Wed, 29 Apr 2026 06:58:04 -0700 (PDT) Received: from node1.manccluster.local (revolution.cs.man.ac.uk. [130.88.198.135]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-447b3d48517sm5205950f8f.5.2026.04.29.06.58.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Apr 2026 06:58:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777471083; x=1778075883; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=gfj+OEin87giEu8kZpIKXoKArfkMj1N2Z6jKqDhBiuE=; b=gbj3zRB4KWrjceG1CsmwwOK66pctwjHIAvR2BEVhkPPO74yzhsZ82uvCEhI1C203Ix AzbrX++Zj1XqzkGJG6qlf0+H9aKeA9uKkOR4ARPNnrZvybO3RPd1ATQ/2lq4hkxLdhTl eOIHydu/4Ia9l+Lg2hxqZlsjUP7gDvIvNrV3f+lzjVDBiQvqD6iurvS4X9IjY0eG01ew 5ltvAQtjm+21j5uiG1aT298CHI7luRiuNhV2/G0xgVzSWNOZpEzr2zEZpthfzpPA3r0P xwhVYbMR77Sm2wlMFGk5fgsDHT3RLq4f08EpNHpnVGGe42iWBvBTSjyMNJ3gO+S3Zsm5 LntQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777471083; x=1778075883; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=gfj+OEin87giEu8kZpIKXoKArfkMj1N2Z6jKqDhBiuE=; b=XgU6dWFTikbm4mXrmulytdOVt2M0CxQfo6g1qsDQXDdL2sYGeUGegzJqhCmorMmBDg iWltddScB21zpUXLSY7uXLXLPrekys2Bl/OjUbWrxQITCV088QtVAWl0SWQ9AFvtPAAH 57qa2Lwjq4m7H2HSTzFBKHBT4Lx5Ca+2iIOf3bW2cI6uT7zJxZjWt23XnJqBcQcFKRuL vbibuoyZSL4aX5oqLu90EKJLvIdlwnSTp264aR4EYkM5Nm/5IsE3/yCRCgBJZrmBtytg la7eK4U04tt7JVYDkd2uWRk4OWR940bXOTh8SX22jNNReJYKuO7VHr6S1AjBKTeHbA4h g+5w== X-Gm-Message-State: AOJu0YzT1OtQHOhE266a6IXvoHyUaBcNO9ueLlrbvYkOBWwcuxlAvob6 aou6LI28Mv8wKfCJHNhq3Arbc7sWC2SZVm+ScE8UEUCozmixzqOOJOmQ X-Gm-Gg: AeBDieusOcHUeSNiJ7O1KeKsxK0tzudieQdKFMwj+p1MmkBikDedYFG5NPcvIAs92P1 jlrFaMXKcKreth5mEbh1tt99tXnv0OGHEQugFgw/WWPkgY3yk1/QxeXJ2KjI1sEKw0dyz+TmSMr eW/wURMnULAoS3jpoE9UaPMgUnsgCjre1QY1MBmBcXM+XVjfdPnEHVYkGB70D/pO57d6vAZmOk2 ojrnqgyNE52a63y8NWfmbvj2MuaKTIo7zMw4EiFAyOarIxUy2K/vuRaf/C6ziPbHb4mPZsm853Q 57lsRsQX2HVScGlD/56uj16cBW68haeXaGZ9Mp/un6rj6FblhXiSprFclpRwcStZviMu2U3DN8i WJ6YNPgVG5wiPmYrQ6jl4gdkuSUXBMfvv71+jp9kVk2gt0GbJbUKZ1dCzMJNuDtknqrO3NIsqSj SKq8s7l3ixRNiaGQlVfA8e0spzFBcQQu1q9MppokQbMFEo+7Is1CRIbPWhf++9V5jJ74fEyK3R X-Received: by 2002:a05:6000:2102:b0:445:7f70:70d3 with SMTP id ffacd0b85a97d-447a3421972mr4063484f8f.5.1777471083406; Wed, 29 Apr 2026 06:58:03 -0700 (PDT) From: Joshua Lant To: linux-cxl@vger.kernel.org Cc: qemu-devel@nongnu.org, Jonathan.Cameron@huawei.com, arpit1.kumar@samsung.com, Joshua Lant Subject: [RFC QEMU PATCH 06/10] cxl-upstream-port: Add support for targeting a VCS switch Date: Wed, 29 Apr 2026 14:48:40 +0100 Message-ID: <20260429135717.3048713-7-joshualant@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260429135717.3048713-1-joshualant@gmail.com> References: <20260429135717.3048713-1-joshualant@gmail.com> 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=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::433; envelope-from=joshualant@gmail.com; helo=mail-wr1-x433.google.com 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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 29 Apr 2026 16:03:14 -0400 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @gmail.com) X-ZM-MESSAGEID: 1777493047023158500 Content-Type: text/plain; charset="utf-8" Allows an upstream port to be registered on the CLI as a VCS within a cxl-vcs-switch. A VCS is defined as an upstream pci-pci bridge, and a set of downstream virtual pci-pci bridges VPPBs, which form a single Virtual Hierarchy within the switch. Signed-off-by: Joshua Lant --- hw/pci-bridge/cxl_upstream.c | 20 ++++++++++++++++++++ include/hw/pci-bridge/cxl_upstream_port.h | 2 ++ 2 files changed, 22 insertions(+) diff --git a/hw/pci-bridge/cxl_upstream.c b/hw/pci-bridge/cxl_upstream.c index 3fcfc2cde6..a91f721c9e 100644 --- a/hw/pci-bridge/cxl_upstream.c +++ b/hw/pci-bridge/cxl_upstream.c @@ -16,6 +16,8 @@ #include "hw/pci/pcie.h" #include "hw/pci/pcie_port.h" #include "hw/pci-bridge/cxl_upstream_port.h" +#include "hw/cxl/cxl_vcs_switch.h" + /* * Null value of all Fs suggested by IEEE RA guidelines for use of * EU, OUI and CID @@ -346,6 +348,22 @@ static void cxl_usp_realize(PCIDevice *d, Error **errp) goto err_cap; } =20 + if (usp->vcs_name && usp->ppb !=3D UINT8_MAX) { + Object *obj =3D object_resolve_path_component( + object_get_objects_root(), usp->vcs_name); + if (!obj) { + error_setg(errp, "vcs '%s' not found", usp->vcs_name); + goto err_cap; + } + if (!object_dynamic_cast(obj, TYPE_CXL_VCS_SWITCH)) { + error_setg(errp, "'%s' is not a cxl-vcs-switch", usp->vcs_name= ); + goto err_cap; + } + cxl_vcs_register_usp(CXL_VCS_SWITCH(obj), usp, errp); + if (*errp)=20 + goto err_cap; + } + return; =20 err_cap: @@ -372,6 +390,8 @@ static const Property cxl_upstream_props[] =3D { DEFINE_PROP_PCIE_LINK_WIDTH("x-width", CXLUpstreamPort, width, PCIE_LINK_WIDTH_16), DEFINE_PROP_BOOL("x-256b-flit", CXLUpstreamPort, flitmode, false), + DEFINE_PROP_STRING("vcs", CXLUpstreamPort, vcs_name), + DEFINE_PROP_UINT8("usppb", CXLUpstreamPort, ppb, UINT8_MAX), }; =20 static void cxl_upstream_class_init(ObjectClass *oc, const void *data) diff --git a/include/hw/pci-bridge/cxl_upstream_port.h b/include/hw/pci-bri= dge/cxl_upstream_port.h index ce248f3dca..05632286db 100644 --- a/include/hw/pci-bridge/cxl_upstream_port.h +++ b/include/hw/pci-bridge/cxl_upstream_port.h @@ -22,6 +22,8 @@ typedef struct CXLUpstreamPort { =20 DOECap doe_cdat; uint64_t sn; + char *vcs_name; + uint8_t ppb; } CXLUpstreamPort; =20 #endif /* CXL_SUP_H */ --=20 2.47.3 From nobody Sat May 30 19:21:09 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1777493224; cv=none; d=zohomail.com; s=zohoarc; b=aoa9cCpMbLhMAwGsIZpcbhsSDY/qWT+kKUBb2azZDM8WjSJHVvHByq6RpYC++S4jRQWXJIWvFIllH+8IC4tLLfjcls6A7DiR8yRd6DQY9cx8O6NJHNS0QjOI0oNNZv7kVwUobopnjSDtvLZk29+FfTA1iw4XVa8OyGAyVTpmJBw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1777493224; 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=dPS8B/0ftELxPYBJPOi/Jw2N6PyAu4qwVtoZHd48FII=; b=NWrOYFanDeMoyilmODTxjfl8aIpbP8kaImcHKzYQg5s3dezJUBNHtrIC+0c8hnCpXlr4qRYnuwIX3R4rnEhN2RUt82Xz0hLv2dtZluyzHnQNUUxpE2BrJlDOigmd5oXAFPmKfFCutm4siE78y3kE4i4gLMIz9X77Gs79i+BNahQ= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1777493223779486.98673361546753; Wed, 29 Apr 2026 13:07:03 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wIB7w-0003WU-CT; Wed, 29 Apr 2026 16:03:20 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wI5QX-0008KF-DE for qemu-devel@nongnu.org; Wed, 29 Apr 2026 09:58:12 -0400 Received: from mail-wm1-x335.google.com ([2a00:1450:4864:20::335]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wI5QU-0007iW-EQ for qemu-devel@nongnu.org; Wed, 29 Apr 2026 09:58:08 -0400 Received: by mail-wm1-x335.google.com with SMTP id 5b1f17b1804b1-48334ee0aeaso128830365e9.1 for ; Wed, 29 Apr 2026 06:58:05 -0700 (PDT) Received: from node1.manccluster.local (revolution.cs.man.ac.uk. [130.88.198.135]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-447b3d48517sm5205950f8f.5.2026.04.29.06.58.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Apr 2026 06:58:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777471084; x=1778075884; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=dPS8B/0ftELxPYBJPOi/Jw2N6PyAu4qwVtoZHd48FII=; b=jsKAgWblGo17yKNZPtv6njNOEEO1oQbqEahzK8KLNZs/W38NLxT5Q7LYTylPMQqn/w mRKVR9F7e/gQAx+hdHDH+IX32ZlVDMzJUi7AzLiLkK1FkkLmCDXCg72Yp1/kJN9ooZ+b 6GoK6jfzUO15SZQsyZ7jd+dPI6HLU6b/q8ISoz4ZSbxBKSVzX/A555QOMIc9w4kXFJs+ MzltzdLsTgZuanKJ4jox4a5wXuF6MZm3NJnOu0cMlbWHucQcKQZ77sWpTJf8Sxz/6KsE C9kcCJmOuvjQLXN+PuGQtIOM6Hyt9UwYfQIN09tL7bhko7fR5gkDdppOIP4KsoVAYtvp MVOQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777471084; x=1778075884; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=dPS8B/0ftELxPYBJPOi/Jw2N6PyAu4qwVtoZHd48FII=; b=jPJMHyZq4dIZJToPN/b9uLu643kf5YUtngxFgOexarUBMvFzxXch1Wv6l6ppaa1zpx ZoznHsVEja176tniC2Yvm1dpH5v5GE+Osy9DPz164eRZO+8mgXnJueSzLTH+RnyvSsep FmtE9lD/ySYgXJ4C1Lm0iLLgBDn4mk/Mf12lC3C8+k5ZsNbbFFy6r66zGpUs+ko+IhsR AvOJY86eQ/dE6cfGso3OkzeL0R+PEW3qFxXid2o0wTKgdwzPvqfc4Zv13Kn3tphFuSdE dkbr585eYbKI56ONa/ThWARDiYyQ5wpJ+8PR9Mdcsm17j4khFZqqvcHb9MEiTuIm3dQ8 TvfA== X-Gm-Message-State: AOJu0Yy5kfkklPG/TPr0LRQxEi8vCL1Oii5qHR/b+k7QIGOvj1ziECuQ i7vwZP6m0we8L4QjaLBSNb9vFs9xScjDn3qxuQ2/0t70+sG4ho7pLaxY X-Gm-Gg: AeBDieukf8ZDui0sX2Nkg0UXum4BzS0ftVDqLkgCV3oYM9HTAw+gNAHTX+nCWbzWUAk S+xzG9BwOgg1vEJWrtJaHWJvKVbehLElG+Jz8ppQJeVE2CYy3gW1j7SHCLHOUgbUxBwMHPgBKZj +FEKHEGQTQyGMnGW2Yvg+BqXbGOfPdQMnnnUW7maXmgv1MAdFzCDmXgBRi1abxZklDfGEGohsvA q3bLGs/riLXfx5UTKsPWTEJyPlqMfzm+CGjC0R9NGf/QPHEU8qlfihBfRey77Js41DspWL+GbX8 VrhM74t9OTEj2udps+EdRUsiXy11ChABS2M8iKgXo16yM8+gLJbc9oqqYtLty4EjIulYits9oQy rcFhySbVTsV00Y/6NV9Duqun2v8sQR47kmmmLWPTMEamfvklo1nzc3DH7VqeNkJr5RQH8g0Ovh7 rDWpEJYVBgJo86RGjBRt241eNFv0QUNZB9u1IVcGMEaxWrmFdfU6mbrTuEnrMth7C6qu2Q9q2i X-Received: by 2002:a05:600c:c4a3:b0:488:fd7e:1063 with SMTP id 5b1f17b1804b1-48a7b54eb83mr71355305e9.29.1777471084202; Wed, 29 Apr 2026 06:58:04 -0700 (PDT) From: Joshua Lant To: linux-cxl@vger.kernel.org Cc: qemu-devel@nongnu.org, Jonathan.Cameron@huawei.com, arpit1.kumar@samsung.com, Joshua Lant Subject: [RFC QEMU PATCH 07/10] cxl-downstream-port: Add support for VCS switching Date: Wed, 29 Apr 2026 14:48:41 +0100 Message-ID: <20260429135717.3048713-8-joshualant@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260429135717.3048713-1-joshualant@gmail.com> References: <20260429135717.3048713-1-joshualant@gmail.com> 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=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::335; envelope-from=joshualant@gmail.com; helo=mail-wm1-x335.google.com 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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 29 Apr 2026 16:03:16 -0400 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @gmail.com) X-ZM-MESSAGEID: 1777493225808154100 Content-Type: text/plain; charset="utf-8" When a downstream port is connnected to an upstream port which is defined as a VCS within a cxl-vcs-switch, the port will automatically be instantiated as a VPPB within that VCS. This downstream port will then appear normally to the guest, but can be connected to a real downstream PPB at runtime when the switch is issued a bind command by the Fabric Manager. Signed-off-by: Joshua Lant --- hw/pci-bridge/cxl_downstream.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/hw/pci-bridge/cxl_downstream.c b/hw/pci-bridge/cxl_downstream.c index 5322c46900..5e7ce6410d 100644 --- a/hw/pci-bridge/cxl_downstream.c +++ b/hw/pci-bridge/cxl_downstream.c @@ -14,11 +14,14 @@ #include "hw/pci/pcie.h" #include "hw/pci/pcie_port.h" #include "hw/pci-bridge/cxl_downstream_port.h" +#include "hw/pci-bridge/cxl_upstream_port.h" #include "hw/qdev-properties.h" #include "hw/qdev-properties-system.h" #include "hw/cxl/cxl.h" #include "hw/cxl/cxl_port.h" #include "qapi/error.h" +#include "hw/cxl/cxl_vcs_switch.h" + =20 typedef struct CXLDownstreamPort { /*< private >*/ @@ -199,6 +202,14 @@ static void cxl_dsp_realize(PCIDevice *d, Error **errp) PCI_BASE_ADDRESS_MEM_TYPE_64, component_bar); =20 + PCIDevice *parent =3D pci_bridge_get_device(pci_get_bus(PCI_DEVICE(d))= ); + if (parent && object_dynamic_cast(OBJECT(parent), TYPE_CXL_USP)) { + CXLUpstreamPort *usp =3D CXL_USP(parent); + if (usp->vcs_name) { + cxl_vcs_register_vppb(usp->swcci.vcs, usp, dsp, errp); + } + } + return; =20 err_chassis: --=20 2.47.3 From nobody Sat May 30 19:21:09 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1777493198; cv=none; d=zohomail.com; s=zohoarc; b=FZ4eOj7qtBZlANFOcfYp1Gs39DRo7qPHmmanMkml1My5l6KbPRf1FQ5HQlz+z48o3p+LK4IDWXt3iJwIjLD4Iq4UFNoqcDR6Tuc1Tv0cpMHBMB78/FoDl3VXAtr5cNcslRp8m2okZyUmsX3eI3HcX/FbEcJkMYUuoNd6kwFUxyY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1777493198; 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=dISlLOgELyvKWF7YlFcG2dTrk3AD7+Q7q5PPE/Lrnp4=; b=VPUzHRqUYzzHpZyLgVzMxdjKlYqjgkxielmgSlpGkY7jj5IjOBD/Ci08UIpx/l/vEdRhzPDUqov9FXbJ/NubZsZJUgF6IxNemQbpAKRUdFcAT6AmvLfted6Uw/WZ1R9LhTlBuBRNj+12f+o+ZQSR3a6o/klmWGEDtI8uRoTmHe4= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1777493198070702.1837820163657; Wed, 29 Apr 2026 13:06:38 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wIB7w-0003WQ-Bj; Wed, 29 Apr 2026 16:03:20 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wI5QX-0008KH-Py for qemu-devel@nongnu.org; Wed, 29 Apr 2026 09:58:12 -0400 Received: from mail-wr1-x435.google.com ([2a00:1450:4864:20::435]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wI5QV-0007if-Bp for qemu-devel@nongnu.org; Wed, 29 Apr 2026 09:58:09 -0400 Received: by mail-wr1-x435.google.com with SMTP id ffacd0b85a97d-43cfd832155so9244876f8f.1 for ; Wed, 29 Apr 2026 06:58:06 -0700 (PDT) Received: from node1.manccluster.local (revolution.cs.man.ac.uk. [130.88.198.135]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-447b3d48517sm5205950f8f.5.2026.04.29.06.58.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Apr 2026 06:58:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777471085; x=1778075885; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=dISlLOgELyvKWF7YlFcG2dTrk3AD7+Q7q5PPE/Lrnp4=; b=AY1XTYdY7q6ngV4c/WA1GN6v1TNY8SZUOuypAlo/qOH1dARMzQcJhL1adKyeULerQf hImhofaznjYfd9GYENlHHAHCE6mazZR3DN33PNMxqUeBaa+FbgPTeEB3YQNI+cTKuXXd xOQnOu9X8lUKxwnafiJYR4Hs1FV7OCSdnDKN36Edo7A0mndYYp7p4E7rFObEF4ey8jJ0 fVuPSPCQmNdhbCnRQ5GKYHAzy1S71ER/OtdDUGBkmyzLBxZE+kZr4MXswxiZlnuE1aMb 3zVm0luerjVFvEvmGbrSUWguVMyPMhlK8uMtRt4pUUnnmxtnXMA/esGvkbbBGWeKZsIC VjSg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777471085; x=1778075885; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=dISlLOgELyvKWF7YlFcG2dTrk3AD7+Q7q5PPE/Lrnp4=; b=LuOug9YPl72J6Q4ikTvvDL2lZ21khIYgMAWJK4oqUn2j8+wn4O6nfDqAbBKk9y/32v Lf39oPbbHXuEM0/xXlQztgBC0CeAiDZy6h2iRhRFBuTymNDcXFUBxErbmzvjcBiANSs5 qGF/zSJIawdA+HIEF+PdNiPkAMAzZ1yogfHIBr9FRMUayl578tQcYa1QyS7u8OnlC/JY cAbi4ui8QoXGAImhpT4+DyYoOL+PCtopXvER4iTHhAQ02uugOb1tv9xgBxu7TWaZ8Cmv +oSpUZY66D4+XzZg+5hL42SL3ygHGukMCPA9QB4SjR/QNUy0pVuf10xtbUCH3pjyfIXr ePiw== X-Gm-Message-State: AOJu0YxNZ9/xvYGtqp6KHtMOEvIoIfIztYRGUvn83/zhDxUihaQ14UQh d/3qf2nvYAVdcTQUdXk+k3Ysy7qpIElekV6QICTaJk79PPekPRHjB06U X-Gm-Gg: AeBDiestvrpmztxWSzJoYpiJJlJ5qj19nb0WMYzwGquDUVbew9M6e+QdTiLl7u0DAks 94YR9XT+Xi+pZaRq18YjXs1LAcK0rVmnWKDum/CQPG9WvudQHUiPTMPBULBCDgVvHzJxnloeSd5 EFmqbLE9x7XrwgFbJE77BMqmXHv0dRB+MLuqP/uxE4wbJ80Rzrkb7MMmXUwOTIrKu6IfpEYxmp6 A3sfZ7i7eNPESgUk6LLIturFhCvAaoayHmrjVxto7DjCefqAwfsV9MIAXSoy9T+6pzhm/s3W6Wm xVfOeIzCSIJTyN0eVM15mpS64+ymRieAkvSBN2ZSjX2VeTrBNXgSkY+K63eLoeHWe4w7SEbY3c6 PFB4daZ9lrDfvXCgujAdD5LTlikARl2QTl3kFX7NrKE6FDNKlzXGPDK9Lgfd2EM1N6AWzzeDssK zewe6GVRIcKoA/Fng0HfjrOGooc6nzfK/2xa7yBUUSJAAR8Q3uFT13q/GsoKTzPHMy2nyS2EdL8 AL/IS5VDXk= X-Received: by 2002:a5d:5848:0:b0:441:2473:c30a with SMTP id ffacd0b85a97d-446496d79aemr13966246f8f.31.1777471085059; Wed, 29 Apr 2026 06:58:05 -0700 (PDT) From: Joshua Lant To: linux-cxl@vger.kernel.org Cc: qemu-devel@nongnu.org, Jonathan.Cameron@huawei.com, arpit1.kumar@samsung.com, Joshua Lant Subject: [RFC QEMU PATCH 08/10] cxl-cci-mailbox: Add support for targeting a VCS switch Date: Wed, 29 Apr 2026 14:48:42 +0100 Message-ID: <20260429135717.3048713-9-joshualant@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260429135717.3048713-1-joshualant@gmail.com> References: <20260429135717.3048713-1-joshualant@gmail.com> 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=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::435; envelope-from=joshualant@gmail.com; helo=mail-wr1-x435.google.com X-Spam_score_int: -10 X-Spam_score: -1.1 X-Spam_bar: - X-Spam_report: (-1.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, FORGED_GMAIL_RCVD=1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 29 Apr 2026 16:03:14 -0400 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @gmail.com) X-ZM-MESSAGEID: 1777493199656158500 Content-Type: text/plain; charset="utf-8" Allows a cci mailbox and mctp device to target a cxl-vcs-switch. The target needs to be changed from a PCIDevice to a more generic Object, since the target can now also be a cxl-vcs-switch, as well as USP or type3 device. The VCS is an object which is composed of many PCI devices, but cannot be classed as one itself (since it is busless). Signed-off-by: Joshua Lant --- hw/cxl/cxl-mailbox-utils.c | 44 +++++++++++++++++++++++-------------- hw/cxl/switch-mailbox-cci.c | 33 ++++++++++++++++++++++------ hw/usb/dev-mctp.c | 23 ++++++++++++++++--- include/hw/cxl/cxl_device.h | 10 ++++++++- 4 files changed, 83 insertions(+), 27 deletions(-) diff --git a/hw/cxl/cxl-mailbox-utils.c b/hw/cxl/cxl-mailbox-utils.c index f12e42a648..779138cdc8 100644 --- a/hw/cxl/cxl-mailbox-utils.c +++ b/hw/cxl/cxl-mailbox-utils.c @@ -4600,22 +4600,24 @@ int cxl_process_cci_message(CXLCCI *cci, uint8_t se= t, uint8_t cmd, } =20 /* forbid any selected commands while the media is disabled */ - if (object_dynamic_cast(OBJECT(cci->d), TYPE_CXL_TYPE3)) { - cxl_dstate =3D &CXL_TYPE3(cci->d)->cxl_dstate; - - if (cxl_dev_media_disabled(cxl_dstate)) { - if (h =3D=3D cmd_events_get_records || - h =3D=3D cmd_ccls_get_partition_info || - h =3D=3D cmd_ccls_set_lsa || - h =3D=3D cmd_ccls_get_lsa || - h =3D=3D cmd_logs_get_log || - h =3D=3D cmd_media_get_poison_list || - h =3D=3D cmd_media_inject_poison || - h =3D=3D cmd_media_clear_poison || - h =3D=3D cmd_sanitize_overwrite || - h =3D=3D cmd_firmware_update_transfer || - h =3D=3D cmd_firmware_update_activate) { - return CXL_MBOX_MEDIA_DISABLED; + if(cci->d) { + if (object_dynamic_cast(OBJECT(cci->d), TYPE_CXL_TYPE3)) { + cxl_dstate =3D &CXL_TYPE3(cci->d)->cxl_dstate; + + if (cxl_dev_media_disabled(cxl_dstate)) { + if (h =3D=3D cmd_events_get_records || + h =3D=3D cmd_ccls_get_partition_info || + h =3D=3D cmd_ccls_set_lsa || + h =3D=3D cmd_ccls_get_lsa || + h =3D=3D cmd_logs_get_log || + h =3D=3D cmd_media_get_poison_list || + h =3D=3D cmd_media_inject_poison || + h =3D=3D cmd_media_clear_poison || + h =3D=3D cmd_sanitize_overwrite || + h =3D=3D cmd_firmware_update_transfer || + h =3D=3D cmd_firmware_update_activate) { + return CXL_MBOX_MEDIA_DISABLED; + } } } } @@ -4909,3 +4911,13 @@ void cxl_initialize_usp_mctpcci(CXLCCI *cci, DeviceS= tate *d, DeviceState *intf, cci->intf =3D intf; cxl_init_cci(cci, payload_max); } + +void cxl_initialize_vcs_mctpcci(CXLCCI *cci, CXLVCSSwitch *vcs, DeviceStat= e *d, + DeviceState *intf, size_t payload_max) +{ + cxl_copy_cci_commands(cci, cxl_cmd_set_usp_mctp); + cci->vcs =3D vcs; + cci->d =3D d; + cci->intf =3D intf; + cxl_init_cci(cci, payload_max); +} diff --git a/hw/cxl/switch-mailbox-cci.c b/hw/cxl/switch-mailbox-cci.c index 223f220433..73f76484cc 100644 --- a/hw/cxl/switch-mailbox-cci.c +++ b/hw/cxl/switch-mailbox-cci.c @@ -16,6 +16,7 @@ #include "qemu/module.h" #include "hw/qdev-properties.h" #include "hw/cxl/cxl.h" +#include "include/hw/cxl/cxl_vcs_switch.h" =20 #define CXL_SWCCI_MSIX_MBOX 3 =20 @@ -32,17 +33,26 @@ static void cswbcci_realize(PCIDevice *pci_dev, Error *= *errp) CXLDeviceState *cxl_dstate =3D &cswmb->cxl_dstate; CXLDVSECRegisterLocator *regloc_dvsec; CXLUpstreamPort *usp; + CXLVCSSwitch *vcs =3D 0; =20 if (!cswmb->target) { - error_setg(errp, "Target not set"); + error_setg(errp, "No target or vcs has been set..."); return; } - usp =3D CXL_USP(cswmb->target); =20 pcie_endpoint_cap_init(pci_dev, 0x80); cxl_cstate->dvsec_offset =3D 0x100; cxl_cstate->pdev =3D pci_dev; - cswmb->cci =3D &usp->swcci; + if (object_dynamic_cast(cswmb->target, TYPE_CXL_VCS_SWITCH)) { + vcs =3D CXL_VCS_SWITCH(cswmb->target); + cswmb->cci =3D &vcs->swcci; + } else if (object_dynamic_cast(cswmb->target, TYPE_CXL_USP)) { + usp =3D CXL_USP(cswmb->target); + cswmb->cci =3D &usp->swcci; + } else { + error_setg(errp, "Target must be a VCS switch or USP"); + return; + } cxl_device_register_block_init(OBJECT(pci_dev), cxl_dstate, cswmb->cci= ); pci_register_bar(pci_dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY | @@ -57,9 +67,18 @@ static void cswbcci_realize(PCIDevice *pci_dev, Error **= errp) REG_LOC_DVSEC_LENGTH, REG_LOC_DVSEC, REG_LOC_DVSEC_REVID, (uint8_t *)regloc_dvse= c); =20 - cxl_initialize_mailbox_swcci(cswmb->cci, DEVICE(pci_dev), - DEVICE(cswmb->target), - CXL_MAILBOX_MAX_PAYLOAD_SIZE); + if(vcs) { + if(vcs->usp_ppbs[0]) { + cxl_initialize_vcs_mctpcci(cswmb->cci, + vcs, DEVICE(vcs->usp_ppbs[0]->usp), DEVICE(pci_dev), CXL_MAILBOX_MAX_PAY= LOAD_SIZE); + } else { + error_setg(errp, "The VCS requires a master USP..."); + } + } else { + cxl_initialize_mailbox_swcci(cswmb->cci, DEVICE(pci_dev), + DEVICE(CXL_USP(cswmb->target)), + CXL_MAILBOX_MAX_PAYLOAD_SIZE); + } } =20 static void cswmbcci_exit(PCIDevice *pci_dev) @@ -69,7 +88,7 @@ static void cswmbcci_exit(PCIDevice *pci_dev) =20 static const Property cxl_switch_cci_props[] =3D { DEFINE_PROP_LINK("target", CSWMBCCIDev, - target, TYPE_CXL_USP, PCIDevice *), + target, TYPE_OBJECT, Object *), }; =20 static void cswmbcci_class_init(ObjectClass *oc, const void *data) diff --git a/hw/usb/dev-mctp.c b/hw/usb/dev-mctp.c index aafb9e7e96..792a375245 100644 --- a/hw/usb/dev-mctp.c +++ b/hw/usb/dev-mctp.c @@ -25,6 +25,7 @@ #include "hw/usb.h" #include "hw/usb/desc.h" #include "net/mctp.h" +#include "include/hw/cxl/cxl_vcs_switch.h" =20 /* TODO: Move to header */ =20 @@ -77,7 +78,7 @@ enum cxl_dev_type { =20 typedef struct USBCXLMCTPState { USBDevice dev; - PCIDevice *target; + Object *target; CXLCCI *cci; enum cxl_dev_type type; USBPacket *cached_tohost; @@ -600,12 +601,28 @@ static void usb_cxl_mctp_realize(USBDevice *dev, Erro= r **errp) return; } =20 + if (object_dynamic_cast(OBJECT(s->target), TYPE_CXL_VCS_SWITCH)) { + CXLVCSSwitch *sw =3D CXL_VCS_SWITCH(s->target); + + s->type =3D cxl_switch; + s->cci =3D &sw->mctpcci; + s->cci->vcs =3D sw; + + if(sw->usp_ppbs[0]) { + cxl_initialize_vcs_mctpcci(s->cci, CXL_VCS_SWITCH(s->target), + DEVICE(sw->usp_ppbs[0]->usp), DEVICE(dev), MCTP_CXL_MAILBOX_BYTES); + } else { + error_setg(errp, "No master USP associated with the VCS"); + } + return; + } + error_setg(errp, "Unhandled target type for CXL MCTP EP"); } =20 static const Property usb_cxl_mctp_properties[] =3D { - DEFINE_PROP_LINK("target", USBCXLMCTPState, target, TYPE_PCI_DEVICE, - PCIDevice *), + DEFINE_PROP_LINK("target", USBCXLMCTPState, target, TYPE_OBJECT, + Object *), }; =20 static void usb_cxl_mctp_class_initfn(ObjectClass *klass, const void *data) diff --git a/include/hw/cxl/cxl_device.h b/include/hw/cxl/cxl_device.h index 6158560e6c..5d9f537a03 100644 --- a/include/hw/cxl/cxl_device.h +++ b/include/hw/cxl/cxl_device.h @@ -143,6 +143,7 @@ typedef enum { } CXLDSMASFlags; =20 typedef struct CXLCCI CXLCCI; +typedef struct CXLVCSSwitch CXLVCSSwitch; typedef struct cxl_device_state CXLDeviceState; struct cxl_cmd; typedef CXLRetCode (*opcode_handler)(const struct cxl_cmd *cmd, @@ -212,6 +213,8 @@ typedef struct CXLCCI { DeviceState *d; /* Pointer to the device hosting the protocol conversion */ DeviceState *intf; + /* Pointer to the vcs hosting the CCI (if used) */ + CXLVCSSwitch *vcs; bool initialized; } CXLCCI; =20 @@ -349,6 +352,10 @@ void cxl_initialize_t3_ld_cci(CXLCCI *cci, DeviceState= *d, void cxl_initialize_usp_mctpcci(CXLCCI *cci, DeviceState *d, DeviceState *= intf, size_t payload_max); =20 +void cxl_initialize_vcs_mctpcci(CXLCCI *cci, CXLVCSSwitch *vcs, + DeviceState *d, DeviceState *intf, size_t payload_max); + + #define cxl_device_cap_init(dstate, reg, cap_id, ver) = \ do { = \ uint32_t *cap_hdrs =3D dstate->caps_reg_state32; = \ @@ -820,9 +827,10 @@ struct CXLType3Class { uint8_t *data); }; =20 + struct CSWMBCCIDev { PCIDevice parent_obj; - PCIDevice *target; + Object *target; CXLComponentState cxl_cstate; CXLDeviceState cxl_dstate; CXLCCI *cci; --=20 2.47.3 From nobody Sat May 30 19:21:09 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1777493063; cv=none; d=zohomail.com; s=zohoarc; b=Eh2agYqkPJQPcqgtpk95flvHIWC7uaXMtLz1rqE/+141rDM1pryme1UL2V5rGytsWof4xBehpVYX36WMKhsOL0Am/IEkxyF+LKyMqDeCWgUIviGw98C4e7tOV3USKUIu5KrKsOsVbOIcn3Ah+SMVHP2xPjiPtOHYItXEgER3cfw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1777493063; 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=M+pbmHQ9yiYCeLpJXoN1CgDASSe1tTJT9TMuxTLM8RU=; b=TBN72uxcIGuyXQX5daw74UGctFWtRTF+KDXroj7X3Ub/kqAuFNrnYH5lm5T32xlj8d9cXWJ8WmANxH0t7mLB9QPCg+ljt6CBxm8VQm19NQOSiphPgY+dtlFg3gcfV47BdSaPSk1tuNypd8W14LTEC0NjoUh9t6x8qzuK52q/SPI= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1777493063557985.1744743091303; Wed, 29 Apr 2026 13:04:23 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wIB89-0003d3-P4; Wed, 29 Apr 2026 16:03:33 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wI5QX-0008KI-Vz for qemu-devel@nongnu.org; Wed, 29 Apr 2026 09:58:12 -0400 Received: from mail-wm1-x335.google.com ([2a00:1450:4864:20::335]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wI5QV-0007io-Es for qemu-devel@nongnu.org; Wed, 29 Apr 2026 09:58:09 -0400 Received: by mail-wm1-x335.google.com with SMTP id 5b1f17b1804b1-488b8bc6bc9so90525495e9.3 for ; Wed, 29 Apr 2026 06:58:07 -0700 (PDT) Received: from node1.manccluster.local (revolution.cs.man.ac.uk. [130.88.198.135]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-447b3d48517sm5205950f8f.5.2026.04.29.06.58.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Apr 2026 06:58:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777471086; x=1778075886; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=M+pbmHQ9yiYCeLpJXoN1CgDASSe1tTJT9TMuxTLM8RU=; b=CWDU7Co4dX115W/qDdEILDnKCpnDwRIXHHXd6IVpOh5l/c6O8jcVs4UogBS/sp7Z6o urQkCfuXdA82uSBd29HU7hoHjTnofl6UnBqU5HKrK1/jhQP9Pbo86ia12SDyDP55N9ft 55SaHugRyuQLtsGux71cONydeCsx/ws/HUTa4PrxwtxdzJ+ZRn4Tj1gZp976XjODE5/8 eCfKHzvaMsBci858Wzhuzbv+xiFFKVGevUMt84b4sxZHYgDAR+HgOxgIXKL8dD70jT0u ppNsUt3ec/tbS0hj6x+bkRZ69mCualyDydvAH2vBCLkR7vaHDWJEsebDDSGvE1/Eoy4/ cJBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777471086; x=1778075886; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=M+pbmHQ9yiYCeLpJXoN1CgDASSe1tTJT9TMuxTLM8RU=; b=qmiqlyS9wOfJYKo6x/8UHwpszo8ePO8XHavrDrcSXrFkMEGinRTteMZ2EcMCL25BHD 0XZv6f6BJtnkapI9R6n1YVn0ELV8swWm+fJyjtTyJg17Tt4ISr/KwT5mxGoV7Svd0jHM IYnfJkLLSxNuZuyyXuvwsve7G3RY46Yx8teXA99QIRrklbMIp+g9v+zuXx0Xmp8uTuaQ SgE8KvtDnD2OrmSukuVOphp8dN+dOsRYUFLkHGA3pB32GbnWmbkuu3cHAfTJchuVdzMG 5KuXAJRMOZYWjKxwzBM3HGfMroqstVZFUQmHnY6jSWvCRTrEk/mL80GAm1Zlxmp+CGz9 mt7w== X-Gm-Message-State: AOJu0YyrZgI36cqDLdr4udqGF6s70TPyCdIb6zWzDc7pR++JqJ+llh7Z lUcHFhks4W9EgST00zCW/VYH6nm6PyEDQT2v7zPiwKtS/ZEgU5Cx1gXsvCEpkN2J X-Gm-Gg: AeBDieu0ygOZ+5XKCqdOQqL3LrTlO8lcGx778QMqzyufMzcAwTH3JSHv+aOHum34Ilc KprNZHSPXK3g6CvUsHaU8nlupPtcjdoxxwByPqvtIbhaEfGMBhr98C9HGfg7//d8ZdQ4x9w6Dwj 67NRNw/AGL79E1R8jxQHVCCknCqGhFeQtrFLUqKdGob8Su/fy96n+3rO7UbojXwsmC24C0Blauf z2y0t2hoHVWdAsf1fl48rLm1CYqc4+27tLteBtUGHzLLV3lEFhrjC2SA44BxVDf/meFdwekE+Ti u1yoHbCs3ywPx1YERA02xpNgJ+i4fMBiUNBlS5v7X1RVahyLEWi+QYFk2O6ts0mpN3NM7kDCzZH JVdfRD3AILpJ1T5hYyKLBAP424MznwszKeCTOyYXUioNEeix51mmxl/hN4F0GmY2E7qLV05R4js /aq2OeaU9G88IfpvDc1uDp1MJg/mq2MsXFk+7tJxWSKOYppjvHGQAzdE6wwwAXOPxQeu5swDd7 X-Received: by 2002:a05:600c:630a:b0:486:fbd1:9dc0 with SMTP id 5b1f17b1804b1-48a77b19d7dmr144546745e9.22.1777471085901; Wed, 29 Apr 2026 06:58:05 -0700 (PDT) From: Joshua Lant To: linux-cxl@vger.kernel.org Cc: qemu-devel@nongnu.org, Jonathan.Cameron@huawei.com, arpit1.kumar@samsung.com, Joshua Lant Subject: [RFC QEMU PATCH 09/10] cxl-mailbox-utils: Add support for VCS bind/unbind commands. Date: Wed, 29 Apr 2026 14:48:43 +0100 Message-ID: <20260429135717.3048713-10-joshualant@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260429135717.3048713-1-joshualant@gmail.com> References: <20260429135717.3048713-1-joshualant@gmail.com> 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=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::335; envelope-from=joshualant@gmail.com; helo=mail-wm1-x335.google.com 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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 29 Apr 2026 16:03:14 -0400 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @gmail.com) X-ZM-MESSAGEID: 1777493065504154100 Content-Type: text/plain; charset="utf-8" Adds support for FMAPI commands 0x5201 and 0x5202, for more information see CXL Specification v3.2 (7.6.7.2.2 and 7.6.7.2.3). Signed-off-by: Joshua Lant --- hw/cxl/cxl-mailbox-utils.c | 81 +++++++++++++++++++++++++++++++++++++- 1 file changed, 80 insertions(+), 1 deletion(-) diff --git a/hw/cxl/cxl-mailbox-utils.c b/hw/cxl/cxl-mailbox-utils.c index 779138cdc8..cf6cb65eb6 100644 --- a/hw/cxl/cxl-mailbox-utils.c +++ b/hw/cxl/cxl-mailbox-utils.c @@ -27,6 +27,7 @@ #include "system/hostmem.h" #include "qemu/range.h" #include "qapi/qapi-types-cxl.h" +#include "hw/cxl/cxl_vcs_switch.h" =20 #define CXL_CAPACITY_MULTIPLIER (256 * MiB) #define CXL_DC_EVENT_LOG_SIZE 8 @@ -121,6 +122,9 @@ enum { #define IDENTIFY_SWITCH_DEVICE 0x0 #define GET_PHYSICAL_PORT_STATE 0x1 #define PHYSICAL_PORT_CONTROL 0x2 + VIRTUAL_SWITCH =3D 0x52, + #define BIND_VPPB 0x1 + #define UNBIND_VPPB 0x2 TUNNEL =3D 0x53, #define MANAGEMENT_COMMAND 0x0 FMAPI_DCD_MGMT =3D 0x56, @@ -821,6 +825,51 @@ static CXLRetCode cmd_physical_port_control(const stru= ct cxl_cmd *cmd, } } =20 +/* CXL r3.2 Section 7.6.7.2.2: Bind vPPB (Opcode 5201h) */ +static CXLRetCode cmd_bind_vppb(const struct cxl_cmd *cmd, + uint8_t *payload_in, + size_t len_in, + uint8_t *payload_out, + size_t *len_out, + CXLCCI *cci) +{ + struct cxl_fmapi_bind_vppb_req_pl { + uint8_t vcs_id; + uint8_t vppb_id; + uint8_t physp_id; + uint8_t rsvd; + uint16_t ld_id; + } QEMU_PACKED *in =3D (void *)payload_in; + if(!cci->vcs) { + return CXL_MBOX_UNSUPPORTED; + } + // Multi-logical device currently not supported (force 0xFFFF). + if(in->ld_id !=3D CXL_UNSUPPORTED_LD_ID) { + return CXL_MBOX_INVALID_INPUT; + } + return cxl_vcs_bind_vppb(cci->vcs, in->vcs_id, in->vppb_id, + in->physp_id, CXL_UNSUPPORTED_LD_ID); +} + +/* CXL r3.2 Section 7.6.7.2.3: Unbind vPPB (Opcode 5202h) */ +static CXLRetCode cmd_unbind_vppb(const struct cxl_cmd *cmd, + uint8_t *payload_in, + size_t len_in, + uint8_t *payload_out, + size_t *len_out, + CXLCCI *cci) +{ + struct cxl_fmapi_bind_vppb_req_pl { + uint8_t vcs_id; + uint8_t vppb_id; + uint16_t option; + } QEMU_PACKED *in =3D (void *)payload_in; + if(!cci->vcs) { + return CXL_MBOX_UNSUPPORTED; + } + return cxl_vcs_unbind_vppb(cci->vcs, in->vcs_id, in->vppb_id, in->opti= on); +} + /* CXL r3.1 Section 8.2.9.1.2: Background Operation Status (Opcode 0002h) = */ static CXLRetCode cmd_infostat_bg_op_sts(const struct cxl_cmd *cmd, uint8_t *payload_in, @@ -4903,6 +4952,36 @@ static const struct cxl_cmd cxl_cmd_set_usp_mctp[256= ][256] =3D { cmd_tunnel_management_cmd, ~0, 0 }, }; =20 +static const struct cxl_cmd cxl_cmd_set_vcs_mctp[256][256] =3D { + [INFOSTAT][IS_IDENTIFY] =3D { "IDENTIFY", cmd_infostat_identify, 0, 0 = }, + [INFOSTAT][GET_RESPONSE_MSG_LIMIT] =3D { "GET_RESPONSE_MSG_LIMIT", + cmd_get_response_msg_limit, 0, = 0 }, + [INFOSTAT][SET_RESPONSE_MSG_LIMIT] =3D { "SET_RESPONSE_MSG_LIMIT", + cmd_set_response_msg_limit, 1, = 0 }, + [INFOSTAT][BACKGROUND_OPERATION_STATUS] =3D { "BACKGROUND_OPERATION_ST= ATUS", + cmd_infostat_bg_op_sts, 0, 0 }, + [INFOSTAT][BACKGROUND_OPERATION_ABORT] =3D { "BACKGROUND_OPERATION_ABO= RT", + cmd_infostat_bg_op_abort, 0, 0 }, + [TIMESTAMP][GET] =3D { "TIMESTAMP_GET", cmd_timestamp_get, 0, 0 }, + [TIMESTAMP][SET] =3D { "TIMESTAMP_SET", cmd_timestamp_set, 8, + CXL_MBOX_IMMEDIATE_POLICY_CHANGE }, + [LOGS][GET_SUPPORTED] =3D { "LOGS_GET_SUPPORTED", cmd_logs_get_support= ed, + 0, 0 }, + [LOGS][GET_LOG] =3D { "LOGS_GET_LOG", cmd_logs_get_log, 0x18, 0 }, + [PHYSICAL_SWITCH][IDENTIFY_SWITCH_DEVICE] =3D { "IDENTIFY_SWITCH_DEVIC= E", + cmd_identify_switch_device, 0, 0 }, + [PHYSICAL_SWITCH][GET_PHYSICAL_PORT_STATE] =3D { "SWITCH_PHYSICAL_PORT= _STATS", + cmd_get_physical_port_state, ~0, 0 }, + [PHYSICAL_SWITCH][PHYSICAL_PORT_CONTROL] =3D { "SWITCH_PHYSICAL_PORT_C= ONTROL", + cmd_physical_port_control, 2, 0 }, + [VIRTUAL_SWITCH][BIND_VPPB] =3D { "BIND_VPPB", + cmd_bind_vppb, ~0, 0 }, + [VIRTUAL_SWITCH][UNBIND_VPPB] =3D { "UNBIND_VPPB", + cmd_unbind_vppb, ~0, 0 }, + [TUNNEL][MANAGEMENT_COMMAND] =3D { "TUNNEL_MANAGEMENT_COMMAND", + cmd_tunnel_management_cmd, ~0, 0 }, +}; + void cxl_initialize_usp_mctpcci(CXLCCI *cci, DeviceState *d, DeviceState *= intf, size_t payload_max) { @@ -4915,7 +4994,7 @@ void cxl_initialize_usp_mctpcci(CXLCCI *cci, DeviceSt= ate *d, DeviceState *intf, void cxl_initialize_vcs_mctpcci(CXLCCI *cci, CXLVCSSwitch *vcs, DeviceStat= e *d, DeviceState *intf, size_t payload_max) { - cxl_copy_cci_commands(cci, cxl_cmd_set_usp_mctp); + cxl_copy_cci_commands(cci, cxl_cmd_set_vcs_mctp); cci->vcs =3D vcs; cci->d =3D d; cci->intf =3D intf; --=20 2.47.3 From nobody Sat May 30 19:21:09 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; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1777493066; cv=none; d=zohomail.com; s=zohoarc; b=Nq9QJ9RNlcm5XF0Ucysb31u5X3FUiZ8fiprJmeZa72AcPtehtkbs+OfNmD2C89hHORhNEBA6BmGc6Ns5O1VOxySedbvaEx/Ad8A+vE2ZSrcImD5caMsKJrjKQMXcM0c7t6Va1cCOyxtaiKjl7klr+83D4PZLUDfAMFAE403kf+I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1777493066; 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=1GFfGXV4KJXeG6fIZzHANOu097akFBzGO6N4Zi5g/KA=; b=ZWRwlrHqdz5tGSC2MAvJ79rv+5H4UNZwTA3DOIiMuaXgxJ3avQQUc42lwPSI8bif+bzCfQ23bUt7tgiLY8IOQ8YF/wFZa3GxKqHpFmWplVHiLlhYNDd9YovyfXVYPLBQiVmSHww5cr1ajJd1Se3BX9Y25yDCyInKgukH02tGZH8= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1777493066362490.7951535762097; Wed, 29 Apr 2026 13:04:26 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wIB7w-0003Wx-MD; Wed, 29 Apr 2026 16:03:20 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wI5QZ-0008KW-79 for qemu-devel@nongnu.org; Wed, 29 Apr 2026 09:58:12 -0400 Received: from mail-wr1-x436.google.com ([2a00:1450:4864:20::436]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wI5QX-0007jS-5C for qemu-devel@nongnu.org; Wed, 29 Apr 2026 09:58:10 -0400 Received: by mail-wr1-x436.google.com with SMTP id ffacd0b85a97d-43eb05b1875so7317933f8f.3 for ; Wed, 29 Apr 2026 06:58:08 -0700 (PDT) Received: from node1.manccluster.local (revolution.cs.man.ac.uk. [130.88.198.135]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-447b3d48517sm5205950f8f.5.2026.04.29.06.58.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Apr 2026 06:58:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777471087; x=1778075887; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=1GFfGXV4KJXeG6fIZzHANOu097akFBzGO6N4Zi5g/KA=; b=S238nruiuceF4ySqlZ475ESie96grnoaWzat1yanfaV0p6dTLBnb3pGuvCgBH5kkdj /WMBhqK2D+XUAfPsb9ex/Dz+91+vZpWQFKQ3I8CZ3GUzrevYTXZ5rsKH+FKVNP/iijCo 7IiVqr1V9erlOgsI/UGJ703/1CGPyx01u+MS3ikbKnuGsBHDjCvX3tJA7qKSACpNjaKz rZkN/TuxkY0oqU1TWHZS2xzl4sMs0O5AklwXefvRRp6L/NYGa5dxtvIbyPvNkjThUVvn LRArkBWF+nJTgIWjbJ5MgdBfjR9w31kCCjar8aUMByZi72O0t2gZchHtrbwP87za779K 2DQw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777471087; x=1778075887; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=1GFfGXV4KJXeG6fIZzHANOu097akFBzGO6N4Zi5g/KA=; b=YoU7N48v0Fb/Hls2wrUiHak1n4VtQR8OeCHDLVzWjCKyr6mHHR+39Zd416s0avrbvx Hr8Q97qVdkaGIZf4EKjiE7JnsUtdQP/CLbu3nGyvbGqIKb966cs1y2y3yrTJonPFcmB4 MIbqMk6cTyI4jLVChrN22v3cZlcqX16cJ9DiRcmYTLx6dIphTsJsMB56VLQoTxMpZROS BPH7c2vW4WjGbq/QNjvLe6cWg830PbrgYnFLYLq+rry/hFQ1hBv0EDeTBiOfA9nNqLZu khdSlSOZjeQgqLA5k4ZEWZ/9nm2FH1xFHcJh8qvcKaVTSNghNCvd8Wfo/K7m4z+t5nXp MF7Q== X-Gm-Message-State: AOJu0Yzik8EqG4w+8WENdvDKZZguRXCwz2lfBlkW22Rq72XVIPMLBPn8 ksMXUZ1dl+BtttP+vC7dzdeAycpY9LEWQBJAHguVFveGDXVIFpZEzc1Y X-Gm-Gg: AeBDieuxQUviJuAb0nO2++HK63kehP1FlndZ7+ycCxuAjfF1UZUgIhfwgFiT966Br6B cOgJJTdGR0qanjbhyo2uXqcAsionBpBfblGJL9L2gZItjD8PSubCqD7PetxsX+NkuIsZtT2POTp 8Z29t1JZxVECWMnqTq3W+hfcS0eC76IuP2qhkezHNCk0xCOSG6FYn4Fb401gZwdZhEoJ5FzLMSr REkQ6kpQixW3xSPaMmFg8Jwg4LzgB8AREnrqai5yxA11UTAW0BTXDlpjjcELEy82viK9xIQdMgm kTOPvXCZGd9eqkWXrALQl/qqWkojahZoI/be41rmvGWOd0WwOWFv8nAnqU1d0YKFdgErysYqftN Ynktr7gXu0RCV8Ab4fcz78O9w3/HxBGxif0rB0mFLp54qsD/dyk7bbcidnbgvxr2S4TyT1oDWe3 3L/Aq5PJO7q32fNrqH2h1DvH0VanrV46UG3p5RU4aXxyILuCREbf9jCumFsNX1lkFRAfGYyK4Js yg9mSIRJRc= X-Received: by 2002:a05:6000:2584:b0:43c:ff58:35c2 with SMTP id ffacd0b85a97d-44648b511c6mr14263882f8f.20.1777471086695; Wed, 29 Apr 2026 06:58:06 -0700 (PDT) From: Joshua Lant To: linux-cxl@vger.kernel.org Cc: qemu-devel@nongnu.org, Jonathan.Cameron@huawei.com, arpit1.kumar@samsung.com, Joshua Lant Subject: [RFC QEMU PATCH 10/10] cxl-mailbox-utils: Add support for VCS Get Virtual CXL Switch Info command. Date: Wed, 29 Apr 2026 14:48:44 +0100 Message-ID: <20260429135717.3048713-11-joshualant@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260429135717.3048713-1-joshualant@gmail.com> References: <20260429135717.3048713-1-joshualant@gmail.com> 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=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::436; envelope-from=joshualant@gmail.com; helo=mail-wr1-x436.google.com 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, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 29 Apr 2026 16:03:16 -0400 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development 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 @gmail.com) X-ZM-MESSAGEID: 1777493066824158500 Content-Type: text/plain; charset="utf-8" Adds support for FMAPI command 0x5200, for more information see CXL Specification v3.2 (7.6.7.2.1). Signed-off-by: Joshua Lant --- hw/cxl/cxl-mailbox-utils.c | 84 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/hw/cxl/cxl-mailbox-utils.c b/hw/cxl/cxl-mailbox-utils.c index cf6cb65eb6..825ef35179 100644 --- a/hw/cxl/cxl-mailbox-utils.c +++ b/hw/cxl/cxl-mailbox-utils.c @@ -123,6 +123,7 @@ enum { #define GET_PHYSICAL_PORT_STATE 0x1 #define PHYSICAL_PORT_CONTROL 0x2 VIRTUAL_SWITCH =3D 0x52, + #define GET_VIRTUAL_SWITCH_INFO 0x0 #define BIND_VPPB 0x1 #define UNBIND_VPPB 0x2 TUNNEL =3D 0x53, @@ -825,6 +826,87 @@ static CXLRetCode cmd_physical_port_control(const stru= ct cxl_cmd *cmd, } } =20 +/* CXL r3.2 Section 7.6.7.2.1: Get Virtual CXL Switch Info (Opcode 5200h) = */ +static CXLRetCode cmd_get_virtual_switch_info(const struct cxl_cmd *cmd, + uint8_t *payload_in, + size_t len_in, + uint8_t *payload_out, + size_t *len_out, + CXLCCI *cci) +{ + struct cxl_fmapi_get_virtual_switch_info_req_pl { + uint8_t start_vppb; + uint8_t vppb_list_limit; + uint8_t number_of_vcs; + uint8_t vcs_id_list[]; + } QEMU_PACKED *in =3D (void *)payload_in; + struct vppb_info { + uint8_t binding_status; + uint8_t bound_port_id; + uint8_t bound_ld_id; + uint8_t rsv1; + } QEMU_PACKED; + struct vcs_info_block { + uint8_t vcs_id; + uint8_t vcs_state; + uint8_t usp_id; + uint8_t num_vppbs; + struct vppb_info vppbs[]; + } QEMU_PACKED; + struct cxl_fmapi_get_virtual_switch_info_rsp_pl { + uint8_t num_vcs; + uint8_t rsv1[3]; + struct vcs_info_block vcs_info_list[]; + } QEMU_PACKED *out =3D (void *)payload_out; + + uint8_t num_vcs_ret =3D cci->vcs->num_usp_ppbs; + uint8_t num_vppbs_ret; + ssize_t len_out_tmp =3D *len_out; + len_out_tmp =3D sizeof(struct cxl_fmapi_get_virtual_switch_info_rsp_pl= ) + + (num_vcs_ret * sizeof(*out->vcs_info_list)); + for(int i =3D 0; i < num_vcs_ret; i++) { + //num_vppbs_ret =3D get_num_vppbs_in_vcs(cci->d, i); + num_vppbs_ret =3D cci->vcs->usp_ppbs[i]->info->num_vppbs; + //vPPB List Entry Count=3Dmin(vPPB List Limit, Number of vPPBs). + len_out_tmp =3D (num_vppbs_ret <=3D VPPB_LIST_LIMIT) ? + len_out_tmp + (num_vppbs_ret * sizeof(struct vppb_info)) : + len_out_tmp + (VPPB_LIST_LIMIT * sizeof(struct vppb_info)); + } + *len_out =3D len_out_tmp; + + out->num_vcs =3D num_vcs_ret; + out->rsv1[0] =3D 0; + out->rsv1[1] =3D 0; + out->rsv1[2] =3D 0; + + uint8_t *ptr =3D (uint8_t *)out->vcs_info_list; + + for (int i =3D 0; i < num_vcs_ret; i++) { + CXLVCSInfoBlock *info =3D cci->vcs->usp_ppbs[i]->info; + uint8_t num_vppbs =3D info->num_vppbs; + uint8_t vppb_count =3D MIN(num_vppbs - in->start_vppb, + in->vppb_list_limit); + + /* write fixed vcs_info_block header (4 bytes) */ + *ptr++ =3D info->vcs_id; + *ptr++ =3D info->vcs_state; + *ptr++ =3D info->usp_id; + *ptr++ =3D num_vppbs; + + /* write vppb entries for current vcs */ + for (int j =3D in->start_vppb; j < in->start_vppb + vppb_count; j+= +) { + struct vppb_info *v =3D (struct vppb_info *)ptr; + v->binding_status =3D info->vppbs[j]->binding_status; + v->bound_port_id =3D info->vppbs[j]->bound_port_id; + v->bound_ld_id =3D info->vppbs[j]->bound_ld_id; + v->rsv1 =3D 0; + ptr +=3D sizeof(struct vppb_info); + } + } + + return CXL_MBOX_SUCCESS; +} + /* CXL r3.2 Section 7.6.7.2.2: Bind vPPB (Opcode 5201h) */ static CXLRetCode cmd_bind_vppb(const struct cxl_cmd *cmd, uint8_t *payload_in, @@ -4974,6 +5056,8 @@ static const struct cxl_cmd cxl_cmd_set_vcs_mctp[256]= [256] =3D { cmd_get_physical_port_state, ~0, 0 }, [PHYSICAL_SWITCH][PHYSICAL_PORT_CONTROL] =3D { "SWITCH_PHYSICAL_PORT_C= ONTROL", cmd_physical_port_control, 2, 0 }, + [VIRTUAL_SWITCH][GET_VIRTUAL_SWITCH_INFO] =3D { "GET_VIRTUAL_SWITCH_IN= FO", + cmd_get_virtual_switch_info, ~0, 0 }, [VIRTUAL_SWITCH][BIND_VPPB] =3D { "BIND_VPPB", cmd_bind_vppb, ~0, 0 }, [VIRTUAL_SWITCH][UNBIND_VPPB] =3D { "UNBIND_VPPB", --=20 2.47.3