From nobody Thu Nov 14 07:18:43 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; 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=nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1689614744; cv=none; d=zohomail.com; s=zohoarc; b=VFOg5NadmLiNmT0G9IPiKJx2DFWo7/9Q2R3ZwXIeUeY2qUmpX6BQIKc7yLrjtJqA9pQOv3CgyR3Lq5hoX8Bw/dcsXriPVDL0rkzElZuwhZXTxnwp8VVzCGcazMUhedzfeB+XEa4+gWeFnJcsnFgCT8/zujIe4dP6Gp6X7PpN+T8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1689614744; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=lNd5yBAGHu723UPYkJQiOreKUvoNwubvcxc88H+zhdQ=; b=gcMuCJFxxniwabwgeUTpVhu4VBMUcwIGoPHNvbsfJsgOVTJrRho6A0/d5Ij4egbSZaYz+78AIEk6U56PvEfwPyHrtMePOAbSyZXUMZt5UFRbP+3y9kRqQdEc1q6eJZOi/oo5YnrIW2i0kwzUYtQ49aFhoGPBktxJZgbT/EDVep4= ARC-Authentication-Results: i=1; mx.zohomail.com; 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1689614744669675.0102223160427; Mon, 17 Jul 2023 10:25:44 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qLRyU-0000cK-Ku; Mon, 17 Jul 2023 13:25:30 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qLRyT-0000c9-6r for qemu-devel@nongnu.org; Mon, 17 Jul 2023 13:25:29 -0400 Received: from frasgout.his.huawei.com ([185.176.79.56]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qLRyR-00065S-Cg for qemu-devel@nongnu.org; Mon, 17 Jul 2023 13:25:28 -0400 Received: from lhrpeml500005.china.huawei.com (unknown [172.18.147.207]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4R4TQK2z2cz682sK; Tue, 18 Jul 2023 01:21:29 +0800 (CST) Received: from SecurePC-101-06.china.huawei.com (10.122.247.231) by lhrpeml500005.china.huawei.com (7.191.163.240) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27; Mon, 17 Jul 2023 18:25:25 +0100 To: , Dan Williams , CC: , Alison Schofield , Ira Weiny , Dave Jiang , Davidlohr Bueso , Viacheslav Dubeyko , Shesha Bhushan Sreenivasamurthy , Fan Ni , Michael Tsirkin , Jonathan Zhang , Klaus Jensen Subject: [RFC PATCH 17/17] hw/cxl: Add tunneled command support to mailbox for switch cci. Date: Mon, 17 Jul 2023 18:16:46 +0100 Message-ID: <20230717171646.8972-18-Jonathan.Cameron@huawei.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230717171646.8972-1-Jonathan.Cameron@huawei.com> References: <20230717171646.8972-1-Jonathan.Cameron@huawei.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.122.247.231] X-ClientProxiedBy: lhrpeml100001.china.huawei.com (7.191.160.183) To lhrpeml500005.china.huawei.com (7.191.163.240) X-CFilter-Loop: Reflected Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=185.176.79.56; envelope-from=jonathan.cameron@huawei.com; helo=frasgout.his.huawei.com X-Spam_score_int: -41 X-Spam_score: -4.2 X-Spam_bar: ---- X-Spam_report: (-4.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-to: Jonathan Cameron From: Jonathan Cameron via Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1689614746391100001 Content-Type: text/plain; charset="utf-8" Allow a switch CCI to perform basic tunneling (which is transported in real hardware via PCIe VDM) to downstream devices. Signed-off-by: Jonathan Cameron --- include/hw/cxl/cxl_device.h | 1 + hw/cxl/cxl-mailbox-utils.c | 92 +++++++++++++++++++++++++++++++++++++ hw/mem/cxl_type3.c | 4 ++ 3 files changed, 97 insertions(+) diff --git a/include/hw/cxl/cxl_device.h b/include/hw/cxl/cxl_device.h index 215383ba37..4f8095847e 100644 --- a/include/hw/cxl/cxl_device.h +++ b/include/hw/cxl/cxl_device.h @@ -407,6 +407,7 @@ struct CXLType3Dev { CXLDeviceState cxl_dstate; CXLCCI cci; /* Primary PCI mailbox CCI */ CXLCCI oob_mctp_cci; /* Initialized only if targetted */ + CXLCCI vdm_mctp_cci; /* Always intialized as no way to know if a VDM m= ight show up */ =20 /* DOE */ DOECap doe_cdat; diff --git a/hw/cxl/cxl-mailbox-utils.c b/hw/cxl/cxl-mailbox-utils.c index 4cddd6eae1..33f7b9a9a5 100644 --- a/hw/cxl/cxl-mailbox-utils.c +++ b/hw/cxl/cxl-mailbox-utils.c @@ -74,8 +74,98 @@ enum { PHYSICAL_SWITCH =3D 0x51, #define IDENTIFY_SWITCH_DEVICE 0x0 #define GET_PHYSICAL_PORT_STATE 0x1 + TUNNEL =3D 0x53, + #define MANAGEMENT_COMMAND 0x0 }; =20 +/* CCI Message Format CXL r3.0 Figure 7-19 */ +typedef struct CXLCCIMessage { + uint8_t category; + uint8_t tag; + uint8_t resv1; + uint8_t command; + uint8_t command_set; + uint8_t pl_length[3]; + uint16_t vendor_specific; + uint16_t rc; + uint8_t payload[]; +} QEMU_PACKED CXLCCIMessage; + =20 +static CXLRetCode cmd_tunnel_management_cmd(const struct cxl_cmd *cmd, + uint8_t *payload_in, + size_t len_in, + uint8_t *payload_out, + size_t *len_out, + CXLCCI *cci) +{ + CXLUpstreamPort *usp =3D CXL_USP(cci->d); + PCIDevice *tunnel_target; + struct { + uint8_t port_or_ld_id; + uint8_t target_type; + uint16_t size; + CXLCCIMessage ccimessage; + } *in; + struct { + uint16_t resp_len; + uint8_t resv[2]; + CXLCCIMessage ccimessage; + } *out; + + if (cmd->in < sizeof(*in)) { + return CXL_MBOX_INVALID_INPUT; + } + in =3D (void *)payload_in; + out =3D (void*)payload_out; + =20 + if (cmd->in < sizeof(*in) + in->size) { + return CXL_MBOX_INVALID_INPUT; + } + if (in->size < 3 * sizeof(uint32_t)) { + return CXL_MBOX_INVALID_INPUT; + } + /* Need to find target CCI */ + //Lets assume simple tunnel to port - find that device. + if (in->target_type !=3D 0) { + printf("QEMU: sent to FM-LD which makes no sense yet\n"); + } + + tunnel_target =3D pcie_find_port_by_pn(&PCI_BRIDGE(usp)->sec_bus, in->= port_or_ld_id); + if (!tunnel_target) { + return CXL_MBOX_INVALID_INPUT; + } + + tunnel_target =3D pci_bridge_get_sec_bus(PCI_BRIDGE(tunnel_target))->d= evices[0]; + if (!tunnel_target) { + return CXL_MBOX_INVALID_INPUT; + } + + if (object_dynamic_cast(OBJECT(tunnel_target), TYPE_CXL_TYPE3)) { + CXLType3Dev *ct3d =3D CXL_TYPE3(tunnel_target); + size_t pl_length =3D in->ccimessage.pl_length[2] << 16 | + in->ccimessage.pl_length[1] << 8 | in->ccimessage.pl_length[0]; + size_t length_out; + bool bg_started; + int rc; + + rc =3D cxl_process_cci_message(&ct3d->vdm_mctp_cci, + in->ccimessage.command_set, + in->ccimessage.command, + pl_length, in->ccimessage.payload, + &length_out, out->ccimessage.payload, + &bg_started); + /* Payload should be in place.. But rest of CCI header and needs f= illing */ + out->resp_len =3D length_out + sizeof(CXLCCIMessage); /* CHECK */ + st24_le_p(out->ccimessage.pl_length, length_out); + out->ccimessage.rc =3D rc; + printf("len_out is %lu\n", length_out); + *len_out =3D length_out + sizeof(*out); + + return CXL_MBOX_SUCCESS; + } + + return CXL_MBOX_INVALID_INPUT; +} =20 static CXLRetCode cmd_events_get_records(const struct cxl_cmd *cmd, uint8_t *payload_in, size_t len_i= n, @@ -990,6 +1080,8 @@ static const struct cxl_cmd cxl_cmd_set_sw[256][256] = =3D { cmd_identify_switch_device, 0, 0x49 }, [PHYSICAL_SWITCH][GET_PHYSICAL_PORT_STATE] =3D { "SWITCH_PHYSICAL_PORT= _STATS", cmd_get_physical_port_state, ~0, ~0 }, + [TUNNEL][MANAGEMENT_COMMAND] =3D { "TUNNEL_MANAGEMENT_COMMAND", + cmd_tunnel_management_cmd, ~0, ~0 },=20 }; =20 /* diff --git a/hw/mem/cxl_type3.c b/hw/mem/cxl_type3.c index f479dc67e8..5714ea0c77 100644 --- a/hw/mem/cxl_type3.c +++ b/hw/mem/cxl_type3.c @@ -1042,6 +1042,10 @@ static void ct3d_reset(DeviceState *dev) =20 cxl_component_register_init_common(reg_state, write_msk, CXL2_TYPE3_DE= VICE); cxl_device_register_init_t3(ct3d); + + /* Bring up an endpoint to target with MCTP over VDM */ + cxl_initialize_usp_mctpcci(&ct3d->vdm_mctp_cci, DEVICE(ct3d), DEVICE(c= t3d), + 512); /* Max payload made up */ } =20 static Property ct3_props[] =3D { --=20 2.39.2