From nobody Sat Sep 21 05:29:11 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=1689614733; cv=none; d=zohomail.com; s=zohoarc; b=RFno5XBTmooSNJ9+HaYbb01ZBUDe/Y1aggN5DKfYSoQWIa+iTLty/5RCJeD0GaGr1UFkeysr9qCdZLtgvEH0nUqEnYorr5ci7sl4Lezl6H8fOUv0F0dpLT/bbXfq0QZiU8ZRb6LXfYKq0Pualbhbhlq7oYm4sltlyXJHTjvhr3g= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1689614733; 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=S5wpJrgU8JoOhShX7wApqVb7e3iVnyb8IkIR1wj5V38=; b=NJ1n/9A9E8WADUBP2PsE2eE2TKhPHocKeT4mjMhsgmsStg84gau9SdLTs6SIWLQ3Cd8kPhtQjL6Aqwv86hOlSEcmWIFn/0zDHz6z2JgjMRiNr1Or/h5Ny68L0IXGOzrSkODeVKyQf00M7tJWVqhU5qCZvRnKXcc8DLla35ULeS0= 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 168961473358854.85527737794723; Mon, 17 Jul 2023 10:25:33 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qLRyB-0000Uf-88; Mon, 17 Jul 2023 13:25:11 -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 1qLRy0-0000Tv-Ci for qemu-devel@nongnu.org; Mon, 17 Jul 2023 13:25:04 -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 1qLRxw-0005jL-QK for qemu-devel@nongnu.org; Mon, 17 Jul 2023 13:24:58 -0400 Received: from lhrpeml500005.china.huawei.com (unknown [172.18.147.206]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4R4TRQ5NZqz6J6Bx; Tue, 18 Jul 2023 01:22:26 +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:24:54 +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 16/17] hw/cxl: Implement Physical Ports status retrieval Date: Mon, 17 Jul 2023 18:16:45 +0100 Message-ID: <20230717171646.8972-17-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: lhrpeml500004.china.huawei.com (7.191.163.9) 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: 1689614734053100001 Content-Type: text/plain; charset="utf-8" Signed-of-by: Jonathan Cameron --- hw/cxl/cxl-mailbox-utils.c | 87 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/hw/cxl/cxl-mailbox-utils.c b/hw/cxl/cxl-mailbox-utils.c index 9c1020d9ab..4cddd6eae1 100644 --- a/hw/cxl/cxl-mailbox-utils.c +++ b/hw/cxl/cxl-mailbox-utils.c @@ -73,6 +73,7 @@ enum { #define CLEAR_POISON 0x2 PHYSICAL_SWITCH =3D 0x51, #define IDENTIFY_SWITCH_DEVICE 0x0 + #define GET_PHYSICAL_PORT_STATE 0x1 }; =20 =20 @@ -318,6 +319,88 @@ static CXLRetCode cmd_identify_switch_device(const str= uct cxl_cmd *cmd, return CXL_MBOX_SUCCESS; } =20 +static CXLRetCode cmd_get_physical_port_state(const struct cxl_cmd *cmd, + uint8_t *payload_in, + size_t len_in, + uint8_t *payload_out, + size_t *len_out, + CXLCCI *cci) +{ + /* + * CXL r3.0 7.6.7.1.2 Get Physical Port State (Opcode 5101h) + */ + /* CXL r3.0 Table 7-18 Get Physical Port State Request Payload */ + struct cxl_fmapi_get_phys_port_state_req_pl { + uint8_t num_ports; /* CHECK. may get too large for MCTP message si= ze */ + uint8_t ports[]; + } QEMU_PACKED *in; + + /* CXL r3.0 Table 7-20 Get Physical Port State Port Information Block = Format */ + struct cxl_fmapi_port_state_info_block { + uint8_t port_id; + uint8_t config_state; + uint8_t connected_device_cxl_version; + uint8_t rsv1; + uint8_t connected_device_type; + uint8_t port_cxl_version_bitmask; + uint8_t max_link_width; + uint8_t negotiated_link_width; + uint8_t supported_link_speeds_vector; + uint8_t max_link_speed; + uint8_t current_link_speed; + uint8_t ltssm_state; + uint8_t first_lane_num; + uint16_t link_state; + uint8_t supported_ld_count; + } QEMU_PACKED; + + /* CXL r3.0 Table 7-19 Get Physical Port State Response Payload */ + struct cxl_fmapi_get_phys_port_state_resp_pl { + uint8_t num_ports; + uint8_t rsv1[3]; + struct cxl_fmapi_port_state_info_block ports[]; + } QEMU_PACKED *out; + PCIBus *bus =3D &PCI_BRIDGE(cci->d)->sec_bus; + int num_phys_ports =3D pcie_count_ds_ports(bus); + int i; + size_t pl_size; +=20 + in =3D (struct cxl_fmapi_get_phys_port_state_req_pl *)payload_in; + out =3D (struct cxl_fmapi_get_phys_port_state_resp_pl *)payload_out; + /* Not currently matching against requested */ + out->num_ports =3D num_phys_ports; + + for (i =3D 0; i < out->num_ports; i++) { + struct cxl_fmapi_port_state_info_block *port; + port =3D &out->ports[i]; + port->port_id =3D i; /* TODO: Right port number */ + if (port->port_id < 1) { /* 1 upstream ports */ + port->config_state =3D 4; + port->connected_device_type =3D 0; + } else { /* remainder downstream ports */ + port->config_state =3D 3; + port->connected_device_type =3D 4; /* TODO: Check. CXL type 3 = */ + port->supported_ld_count =3D 3; + } + port->connected_device_cxl_version =3D 2; + port->port_cxl_version_bitmask =3D 0x2; + port->max_link_width =3D 0x10; /* x16 */ + port->negotiated_link_width =3D 0x10; + port->supported_link_speeds_vector =3D 0x1c; /* 8, 16, 32 GT/s */ + port->max_link_speed =3D 5; + port->current_link_speed =3D 5; /* 32 */ + port->ltssm_state =3D 0x7; /* L2 */ + port->first_lane_num =3D 0; + port->link_state =3D 0; + } + + pl_size =3D sizeof(out) + sizeof(*out->ports) * in->num_ports; + + *len_out =3D pl_size; + + return CXL_MBOX_SUCCESS; +} + /* CXL r3.0 8.2.9.1.2 */ static CXLRetCode cmd_infostat_bg_op_sts(const struct cxl_cmd *cmd, uint8_t *payload_in, @@ -905,6 +988,8 @@ static const struct cxl_cmd cxl_cmd_set_sw[256][256] = =3D { [LOGS][GET_LOG] =3D { "LOGS_GET_LOG", cmd_logs_get_log, 0x18, 0 }, [PHYSICAL_SWITCH][IDENTIFY_SWITCH_DEVICE] =3D {"IDENTIFY_SWITCH_DEVICE= ", cmd_identify_switch_device, 0, 0x49 }, + [PHYSICAL_SWITCH][GET_PHYSICAL_PORT_STATE] =3D { "SWITCH_PHYSICAL_PORT= _STATS", + cmd_get_physical_port_state, ~0, ~0 }, }; =20 /* @@ -990,6 +1075,8 @@ static const struct cxl_cmd cxl_cmd_set_usp_mctp[256][= 256] =3D { [INFOSTAT][IS_IDENTIFY] =3D { "IDENTIFY", cmd_infostat_identify, 0, 18= }, [PHYSICAL_SWITCH][IDENTIFY_SWITCH_DEVICE] =3D {"IDENTIFY_SWITCH_DEVICE= ", cmd_identify_switch_device, 0, 0x49 }, + [PHYSICAL_SWITCH][GET_PHYSICAL_PORT_STATE] =3D { "SWITCH_PHYSICAL_PORT= _STATS", + cmd_get_physical_port_state, ~0, ~0 }, }; =20 void cxl_initialize_usp_mctpcci(CXLCCI *cci, DeviceState *d, DeviceState *= intf, size_t payload_max) --=20 2.39.2