From nobody Sat Sep 26 21:35:41 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=1789488144; cv=none; d=zohomail.com; s=zohoarc; b=VnmylDM9fKSwA9eCCgNE3bgZhI3Pkh78OYTniuCdR4X3u67zU58faitgTn9ozdZq6psbSZFoaM6tgaEXWNtVvKw5drGPjPwN8Oncgj7j2/24plCfhF0By1oElc35i/LjSJd68xDhhFx2vfXljfgcknfD+3Vrh20PQAYuM6+E7Tc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789488144; 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=9T9DqjVoclJjAXs7joIA6JzcMftC3mdXuayXnuMYjRs=; b=C3fwftri6yv4HjPSJfy5ByWeLik/wLYYjW2sY65kNjNGxwVrbUiQcikoNrhDkl/AAYuWCUllFgwb+W4wZmDjY5udGX2MRH/ztEJ8q6/WxU9xcOQhGClMjq5ZtByXi0YzdDpL9fJlVR5jsog+Q61wCMRQ5Yclu4z5bPC9H4oFRp8= 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 1789488144665684.4768231597988; Tue, 15 Sep 2026 09:02:24 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x6Vat-0007NO-7C; Tue, 15 Sep 2026 12:01:15 -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 1x6Var-0007N2-Vu for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:14 -0400 Received: from mail-ej2-x10.google.com ([2a00:1450:4864:34::10]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1x6Vap-0003Mh-Qb for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:13 -0400 Received: by mail-ej2-x10.google.com with SMTP id a640c23a62f3a-c254f5603a0so77994466b.0 for ; Tue, 15 Sep 2026 09:01:11 -0700 (PDT) Received: from thinkpad-t470s.. (83-131-196-251.adsl.net.t-com.hr. [83.131.196.251]) by smtp.googlemail.com with ESMTPSA id a640c23a62f3a-c29ddd86344sm3235866b.0.2026.09.15.09.01.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 09:01:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789488070; x=1790092870; 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:content-type; bh=9T9DqjVoclJjAXs7joIA6JzcMftC3mdXuayXnuMYjRs=; b=ZUxVs717xB6JkBlDA85+0nMpnUqdX6OmifuCmB+/xOB9qg3VD8pW9LdXO3webFaJtX N7IUAXN5qGKVA5uTiciwj4B/PP2EbKi2ArjK9I1OE/p3BP/BJusE9ONBhu3Z5xkl6nSh ExKLmrH6pENcsvQhyxoBXVbAEvvq7ytTX6uLADdEB+iAkuyB9+sfzzBK5bYrq9+NIOEs 7kFqN3GPbEQa7RWZnQsfLx2aClry6pwCHvj1umbFCZukl0o7YbDMFk2jghWvuvkA0eIP xU4CsXMz1sVCpJE0QnyKOT2IKk/PP8BZeoOfArML0Wr7MSGagq9D6XOlHwdbGMhqFOgI iLmQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789488070; x=1790092870; 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:content-type; bh=9T9DqjVoclJjAXs7joIA6JzcMftC3mdXuayXnuMYjRs=; b=YxyIrhwJ11vJ/KWOzz/YyUXOdogTE/wDuYfoj2q7P6kRiSFEThZGnmelhWMCP/l7s8 38pZeWd40/Gvjdt0J7pPVoUD1gKN1NAUMNa4uGjV7ZHhqsmPIKvEpMI0MyqPHqEv1DrG qw0S8jsFIIL1nl82zkWEXt20NZqYhPrh5tGf7WxQ+8scPvRZwVy5PGnQ0rgPvip0AEPb /jKVIRjttwaEGh17aqlMFqdNxBKNdGxoxt0VEe55IWpuQ0MnTXWoK4r7163bRrF5sVkG wZJf5tjNciz+x/3XT2+QL3ALD0LEbpss3P7EFDojbGelM4+BeI0m8nyeTUmfclR+tHQQ 99Iw== X-Gm-Message-State: AFuF++kwfaYoV1cSytl2d7gZ/XTOMVgRwgMg9sUmx9aQi/lc4WLOxfkX pH/DmT504W+g9KMkkB6KPovv5GUTk/W1NRAn2SmVR4TYsbY2T2JzuPjaRwMrxQ== X-Gm-Gg: AYBFou02nCci1mu2gNZHCMuSgnDXANB7ADcEIOs3ssRZm6PBCrzLDGQERQJCGUDXgBn 6B6s0N/2eRPBk3QegDjSWGOnnQvjQCjKr7EFGCKY/PtNd0YEVEV7GtwiI3+xhlldrhzYPDIz3Yf vVOL+jnBQKB0+NNA7GdcQkgfu5hZSi2YEXyiRYq8l1Uhm5tE5ntyCFqrXGW5omccK/DMLwCihuB cu3mPNKUD2aWMboUzhnxyAbpIy4APRWoPbm/0oRDxSozTReh8m5CcbL7DQMKxhpbI14NYTb0BXO Iz1uooaG3kn3RuZz1M5WN/qKkrTz6vIG4mikcyju9gvrvCFydCMZqAGLmvE65ptU46aKC5fzrZn ObmAJP/CDy7dPvqHhsSc/AlN6R/aiMZwfZ0k5AW4quQxaqHqJVVUN9Y3u7S6omFMhMKOO/3uLcg ejt5TdIOPE32PW4Zt7ACqB2iv/FzrARCvdptdeMhKsq5P4ZVXrfQwvcTxafO1Zzxe5Eg2GSHK8m h+zXsbQ3SxAbg1I+rbRqTmwcBANJTmQYBsSbPTBqMIxUg== X-Received: by 2002:a17:907:9610:b0:c26:2da7:347f with SMTP id a640c23a62f3a-c29d734648dmr143017166b.0.1789488069835; Tue, 15 Sep 2026 09:01:09 -0700 (PDT) From: Ruslan Ruslichenko To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, artem_mygaiev@epam.com, volodymyr_babchuk@epam.com, peter.maydell@linaro.org, francisco.iglesias@amd.com, edgar.iglesias@gmail.com, berrange@redhat.com, eugene@nuvacore.ai, Ruslan_Ruslichenko@epam.com, takahiro.nakata.wr@renesas.com, "Edgar E . Iglesias" Subject: [PATCH v2 01/20] hw/core: Add Remote Port protocol packet definition Date: Tue, 15 Sep 2026 18:00:25 +0200 Message-ID: <20260915160044.345788-2-ruslichenko.r@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260915160044.345788-1-ruslichenko.r@gmail.com> References: <20260915160044.345788-1-ruslichenko.r@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:34::10; envelope-from=ruslichenko.r@gmail.com; helo=mail-ej2-x10.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-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: 1789488146645158501 Content-Type: text/plain; charset="utf-8" From: Ruslan Ruslichenko Introduce packet definition for Remote Port protocol. Remote Port is a socket based inter-simulation protocol designed to connect QEMU to external simulator (such as SystemC models, RTL simulators, etc) for hardware co- simulation. The protocol supports bidirectional communication for: - Connection setup, version negotiation (Hello/Cfg packets) - Memory and MMIO transactions (Read/Write packets) - Interrupts and GPIO signaling (Interrupt packets) - Time synchronization (Sync packets) The patch introduces header file with packet definition used by protocol. Preserved existing MIT license for include/hw/core/remote-port-proto.h. Signed-off-by: Edgar E. Iglesias Signed-off-by: Takahiro Nakata Signed-off-by: Ruslan Ruslichenko --- include/hw/core/remote-port-proto.h | 299 ++++++++++++++++++++++++++++ 1 file changed, 299 insertions(+) create mode 100644 include/hw/core/remote-port-proto.h diff --git a/include/hw/core/remote-port-proto.h b/include/hw/core/remote-p= ort-proto.h new file mode 100644 index 0000000000..16f3752877 --- /dev/null +++ b/include/hw/core/remote-port-proto.h @@ -0,0 +1,299 @@ +/* + * SPDX-License-Identifier: MIT + * + * QEMU remote port protocol parts. + * + * Copyright (c) 2013 Xilinx Inc + * Written by Edgar E. Iglesias + * + * Permission is hereby granted, free of charge, to any person obtaining a= copy + * of this software and associated documentation files (the "Software"), t= o deal + * in the Software without restriction, including without limitation the r= ights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or se= ll + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included= in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS= OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OT= HER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING= FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS = IN + * THE SOFTWARE. + */ +#ifndef REMOTE_PORT_PROTO_H__ +#define REMOTE_PORT_PROTO_H__ + +/* + * Remote-Port (RP) is an inter-simulator protocol. It assumes a reliable + * point to point communcation with the remote simulation environment. + * + * Setup + * In the SETUP phase a mandatory HELLO packet is exchanged with optional + * CFG packets following. HELLO packets are useful to ensure that both + * sides are speaking the same protocol and using compatible versions. + * + * CFG packets are used to negotiate configuration options. At the moment + * these remain unimplemented. + * + * Once the session is up, communication can start through various other + * commands. The list can be found further down this document. + * Commands are carried over RP packets. Every RP packet contains a header + * with length, flags and an ID to track potential responses. + * The header is followed by a packet specific payload. You'll find the + * details of the various commands packet layouts here. Some commands can + * carry data/blobs in their payload. + */ + + +#define RP_VERSION_MAJOR 4 +#define RP_VERSION_MINOR 3 + +/* Could be auto generated. */ +enum rp_cmd { + RP_CMD_nop =3D 0, + RP_CMD_hello =3D 1, + RP_CMD_cfg =3D 2, + RP_CMD_read =3D 3, + RP_CMD_write =3D 4, + RP_CMD_interrupt =3D 5, + RP_CMD_sync =3D 6, + RP_CMD_ats_req =3D 7, + RP_CMD_ats_inv =3D 8, + RP_CMD_max =3D 8 +}; + +enum { + RP_OPT_quantum =3D 0, +}; + +struct rp_cfg_state { + uint64_t quantum; +}; + +enum { + RP_PKT_FLAGS_optional =3D 1 << 0, + RP_PKT_FLAGS_response =3D 1 << 1, + + /* + * Posted hint. + * When set this means that the receiver is not required to respond to + * the message. Since it's just a hint, the sender must be prepared to + * drop responses. Note that since flags are echoed back in responses + * a response to a posted packet will be easy to identify early in the + * protocol stack. + */ + RP_PKT_FLAGS_posted =3D 1 << 2, +}; + +struct rp_pkt_hdr { + uint32_t cmd; + uint32_t len; + uint32_t id; + uint32_t flags; + uint32_t dev; +} QEMU_PACKED; + +struct rp_pkt_cfg { + struct rp_pkt_hdr hdr; + uint32_t opt; + uint8_t set; +} QEMU_PACKED; + +struct rp_version { + uint16_t major; + uint16_t minor; +} QEMU_PACKED; + +struct rp_capabilities { + /* Offset from start of packet. */ + uint32_t offset; + uint16_t len; + uint16_t reserved0; +} QEMU_PACKED; + +enum { + CAP_BUSACCESS_EXT_BASE =3D 1, /* New header layout. */ + CAP_BUSACCESS_EXT_BYTE_EN =3D 2, /* Support for Byte Enables. */ + + /* + * Originally, all interrupt/wire updates over remote-port were posted. + * This turned out to be a bad idea. To fix it without breaking backwa= rds + * compatibility, we add the WIRE Posted updates capability. + * + * If the peer supportes this, it will respect the RP_PKT_FLAGS_posted + * flag. If the peer doesn't support this capability, senders need to + * be aware that the peer will not respond to wire updates regardless + * of the posted header-flag. + */ + CAP_WIRE_POSTED_UPDATES =3D 3, + + CAP_ATS =3D 4, /* Address translation services */ +}; + +struct rp_pkt_hello { + struct rp_pkt_hdr hdr; + struct rp_version version; + struct rp_capabilities caps; +} QEMU_PACKED; + +enum { + /* Remote port responses. */ + RP_RESP_OK =3D 0x0, + RP_RESP_BUS_GENERIC_ERROR =3D 0x1, + RP_RESP_ADDR_ERROR =3D 0x2, + RP_RESP_MAX =3D 0xF, +}; + +enum { + RP_BUS_ATTR_EOP =3D (1 << 0), + RP_BUS_ATTR_SECURE =3D (1 << 1), + RP_BUS_ATTR_EXT_BASE =3D (1 << 2), + RP_BUS_ATTR_PHYS_ADDR =3D (1 << 3), + + /* + * The access targets the I/O address space. + */ + RP_BUS_ATTR_IO_ACCESS =3D (1 << 4), + + /* + * Bits [11:8] are allocated for storing transaction response codes. + * These new response codes are backward compatible as existing + * implementations will not set/read these bits. + * For existing implementations, these bits will be zero which is RESP= _OKAY. + */ + RP_BUS_RESP_SHIFT =3D 8, + RP_BUS_RESP_MASK =3D (RP_RESP_MAX << RP_BUS_RESP_SHIFT), +}; + +struct rp_pkt_busaccess { + struct rp_pkt_hdr hdr; + uint64_t timestamp; + uint64_t attributes; + uint64_t addr; + + /* Length in bytes. */ + uint32_t len; + + /* + * Width of each beat in bytes. Set to zero for unknown (let the remote + * side choose). + */ + uint32_t width; + + /* + * Width of streaming, must be a multiple of width. + * addr should repeat itself around this width. Set to same as len + * for incremental (normal) accesses. In bytes. + */ + uint32_t stream_width; + + /* Implementation specific source or master-id. */ + uint16_t master_id; +} QEMU_PACKED; + + +/* This is the new extended busaccess packet layout. */ +struct rp_pkt_busaccess_ext_base { + struct rp_pkt_hdr hdr; + uint64_t timestamp; + uint64_t attributes; + uint64_t addr; + + /* Length in bytes. */ + uint32_t len; + + /* + * Width of each beat in bytes. Set to zero for unknown (let the remote + * side choose). + */ + uint32_t width; + + /* + * Width of streaming, must be a multiple of width. + * addr should repeat itself around this width. Set to same as len + * for incremental (normal) accesses. In bytes. + */ + uint32_t stream_width; + + /* Implementation specific source or master-id. */ + uint16_t master_id; + /* ---- End of 4.0 base busaccess. ---- */ + + uint16_t master_id_31_16; /* MasterID bits [31:16]. */ + uint32_t master_id_63_32; /* MasterID bits [63:32]. */ + /* + * --------------------------------------------------- + * Since hdr is 5 x 32bit, we are now 64bit aligned. + */ + + uint32_t data_offset; /* Offset to data from start of pkt. */ + uint32_t next_offset; /* Offset to next extension. 0 if none. */ + + uint32_t byte_enable_offset; + uint32_t byte_enable_len; + + /* ---- End of CAP_BUSACCESS_EXT_BASE. ---- */ + + /* + * If new features are needed that may always occupy space + * in the header, then add a new capability and extend the + * this area with new fields. + * Will help receivers find data_offset and next offset, + * even those that don't know about extended fields. + */ +} QEMU_PACKED; + +struct rp_pkt_interrupt { + struct rp_pkt_hdr hdr; + uint64_t timestamp; + uint64_t vector; + uint32_t line; + uint8_t val; +} QEMU_PACKED; + +struct rp_pkt_sync { + struct rp_pkt_hdr hdr; + uint64_t timestamp; +} QEMU_PACKED; + +enum { + RP_ATS_ATTR_exec =3D 1 << 0, + RP_ATS_ATTR_read =3D 1 << 1, + RP_ATS_ATTR_write =3D 1 << 2, +}; + +enum { + RP_ATS_RESULT_ok =3D 0, + RP_ATS_RESULT_error =3D 1, +}; + +struct rp_pkt_ats { + struct rp_pkt_hdr hdr; + uint64_t timestamp; + uint64_t attributes; + uint64_t addr; + uint64_t len; + uint32_t result; + uint64_t reserved0; + uint64_t reserved1; + uint64_t reserved2; + uint64_t reserved3; +} QEMU_PACKED; + +struct rp_pkt { + union { + struct rp_pkt_hdr hdr; + struct rp_pkt_hello hello; + struct rp_pkt_busaccess busaccess; + struct rp_pkt_busaccess_ext_base busaccess_ext_base; + struct rp_pkt_interrupt interrupt; + struct rp_pkt_sync sync; + struct rp_pkt_ats ats; + }; +}; + +#endif --=20 2.43.0 From nobody Sat Sep 26 21:35:41 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=1789488340; cv=none; d=zohomail.com; s=zohoarc; b=QMg9mKIIgsT4atqUuO8b92oZCp9CnorBCgq2Fk4L7AsVKknsc8o3C0Uzuf/gnXl3AdHQ+1RMZS2rxm+hkYluVNKJhKRF1BwbF/OslPHmc6djw71Z8SbNS3bwP0h7GhA+G6vGjbZpyjygs7PeJaZZaKysl2L+zMiWDDTsmegSU7I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789488340; 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=kzY3C97Ry7/KN1BDc2Cc436tkZ6bbNabswQ4SxnVX1o=; b=afCgSyv+hai6d3PmmYS0tX7Nd2ga2KkvXa8vTCNCWNuMZwdyuUqMfgYUc01Klwj69RAPG8UjhlCh9bpN38U2Tgcm0+v2Z5pJMVnQ+DpfCElk4XrAJq/PK3asBRMJ0+CWBE2ajaveGInRkCyRgk35aww1ogyGa7fYyfeRwJBwf3k= 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 1789488340275402.08856720692484; Tue, 15 Sep 2026 09:05:40 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x6Vax-0007TU-Ec; Tue, 15 Sep 2026 12:01: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 1x6Vav-0007Ou-Du for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:17 -0400 Received: from mail-ej2-x10.google.com ([2a00:1450:4864:34::10]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1x6Vat-0003NF-Ev for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:16 -0400 Received: by mail-ej2-x10.google.com with SMTP id a640c23a62f3a-c254f55efe7so486436966b.3 for ; Tue, 15 Sep 2026 09:01:15 -0700 (PDT) Received: from thinkpad-t470s.. (83-131-196-251.adsl.net.t-com.hr. [83.131.196.251]) by smtp.googlemail.com with ESMTPSA id a640c23a62f3a-c29ddd86344sm3235866b.0.2026.09.15.09.01.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 09:01:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789488074; x=1790092874; 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:content-type; bh=kzY3C97Ry7/KN1BDc2Cc436tkZ6bbNabswQ4SxnVX1o=; b=H1Xl1SOY5k2qryqatXRiKIfEl1V8lMXZaeFDio0Wq/2i2Yop8n4HgRtZaCTypv7uuS jWU+HQ0IJj8wEij7mjFUCfCFK/g6ItrK9RKJxKp5Ox4BI5ZMify0eG1VBYjxsZUgyFHu yHxSpQISep3oQtALXAg/kV1pyWz2w7H69mCLiiiJwGGxEPV6eQlUsAWpf6vCxMZTrj71 pmzJoOzjwUTpdcZmHhKK7cLrj1353bCc2G2KULlZI110gGSdf/yqny6bBBs5cU/RxlVf CnEHq7HMOB6KtCMY42O0qbtU82TXfcF3Vr4sScoT2ds9hmHYYWYrWZCXu2MYhexmQkZc PA4g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789488074; x=1790092874; 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:content-type; bh=kzY3C97Ry7/KN1BDc2Cc436tkZ6bbNabswQ4SxnVX1o=; b=r99eVy3WrEj6D2tsFf8GJ1BzS6S6rfrzI65fH42Z99ftdmiMKoBvSAE0LgaEcTgKhG mGe3GZ3eplabrQWIIFYeHpHvajfklGffZQGj6mrv9bulQ6+EmpjoMwte+ixOY+eza9Gi pOc3BREA6JeQEZMFl3Waa5ToDr9BBULQKj/eQ9O4YKIntgZ/+YylaSrx0u4ljetWX3mP k45bB9lnBYblaBZ6HKQJvHvnM5oviOGDlnlTRCiBGAmniuRdHN8BMFeuE+HSameF36ju OFC81M/+0Wv9F+BPSs1NAFRC1NSOI2qFzmAd5l8xIljCqwcA7g/diZ/jCCmXrrkslCJS CoQQ== X-Gm-Message-State: AFuF++kFLhbxN3aai8vJij8XXBGzF5M2HXHrpF/IvQPZ5oDn6ISczHRb gsNuFrf6TFPV2kNL1TO9lUur83Tpm6D4wj22o3tPzf2X1YROIAFGbgc11/YCqg== X-Gm-Gg: AYBFou2cDnO2bZACJfhWDktUix6jrR2fbFT5VbCnTcqIZnYHLl22BGMnRdpFwSnmZ92 1qH45cqNf9qun35feO06abnA094oeXlaQFi2GDUR+CvzApiUMCSaoHq54Hau0B2UT5DElP7awjc qTrLfnQwTDv6TmWl43+RDHT4ynJNaJ+7ofRxT6RX/VAEoiddWYaTevd33eChsu/p+vQl2+Q8CG4 PTWs5wVxruPm0Xar3ji20/60b2RBfJAguoTpANTrJtIVwQ/HBWHYAJUjErOm+tgLthQCz2R7a9G q9p8GhudIWWbc5B45zhYKupKML8vfBCEUw9yHnu34SWWJEiAqb3hfq+38JWetdGhv3/o4uO/VNG L/s9XhfkDrjcI9OfF95dWSxJJ6ftzXosSzdEZtovjrM3/p91GEj81lRw6gNzmEHEvF/lKCz91+p PioR+TL9sKZUJryiBwde9HBSDYIuOHW36rirGCAJpYJA/YQKeKLe6Fl9RJpiHzv0ORNcznlyD27 CEc7LNWLhMMhoYCe4RJeus7D1pwnnQdMNNqO7M8vExokw== X-Received: by 2002:a17:906:6a23:b0:c16:66dc:3ab7 with SMTP id a640c23a62f3a-c29b84c99fbmr513031866b.10.1789488073831; Tue, 15 Sep 2026 09:01:13 -0700 (PDT) From: Ruslan Ruslichenko To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, artem_mygaiev@epam.com, volodymyr_babchuk@epam.com, peter.maydell@linaro.org, francisco.iglesias@amd.com, edgar.iglesias@gmail.com, berrange@redhat.com, eugene@nuvacore.ai, Ruslan_Ruslichenko@epam.com, takahiro.nakata.wr@renesas.com, "Edgar E . Iglesias" Subject: [PATCH v2 02/20] hw/core: Add Remote Port header helpers Date: Tue, 15 Sep 2026 18:00:26 +0200 Message-ID: <20260915160044.345788-3-ruslichenko.r@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260915160044.345788-1-ruslichenko.r@gmail.com> References: <20260915160044.345788-1-ruslichenko.r@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:34::10; envelope-from=ruslichenko.r@gmail.com; helo=mail-ej2-x10.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=unavailable autolearn_force=no X-Spam_action: no action 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: 1789488342351158500 Content-Type: text/plain; charset="utf-8" From: Ruslan Ruslichenko Introduce core packet handling logic for Remote Port protocol. This includes helpers for encoding and decoding packet headers and payload. Preserved existing MIT license for hw/core/remote-port-proto.c. Signed-off-by: Edgar E. Iglesias Signed-off-by: Takahiro Nakata Signed-off-by: Ruslan Ruslichenko --- hw/core/remote-port-proto.c | 83 +++++++++++++++++++++++++++++ include/hw/core/remote-port-proto.h | 8 +++ 2 files changed, 91 insertions(+) create mode 100644 hw/core/remote-port-proto.c diff --git a/hw/core/remote-port-proto.c b/hw/core/remote-port-proto.c new file mode 100644 index 0000000000..fed52a9734 --- /dev/null +++ b/hw/core/remote-port-proto.c @@ -0,0 +1,83 @@ +/* + * SPDX-License-Identifier: MIT + * + * Remote-port protocol + * + * Copyright (c) 2013 Xilinx Inc + * Written by Edgar E. Iglesias + * + * Permission is hereby granted, free of charge, to any person obtaining a= copy + * of this software and associated documentation files (the "Software"), t= o deal + * in the Software without restriction, including without limitation the r= ights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or se= ll + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included= in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS= OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OT= HER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING= FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS = IN + * THE SOFTWARE. + */ + +#include "qemu/osdep.h" +#include "qemu/bswap.h" +#include "hw/core/remote-port-proto.h" + +static const char *rp_cmd_names[RP_CMD_max + 1] =3D { + [RP_CMD_nop] =3D "nop", + [RP_CMD_hello] =3D "hello", + [RP_CMD_cfg] =3D "cfg", + [RP_CMD_read] =3D "read", + [RP_CMD_write] =3D "write", + [RP_CMD_interrupt] =3D "interrupt", + [RP_CMD_sync] =3D "sync", + [RP_CMD_ats_req] =3D "ats_request", + [RP_CMD_ats_inv] =3D "ats_invalidation", +}; + +const char *rp_cmd_to_string(enum rp_cmd cmd) +{ + assert(cmd <=3D RP_CMD_max); + return rp_cmd_names[cmd]; +} + +int rp_decode_hdr(struct rp_pkt *pkt) +{ + int used =3D 0; + + pkt->hdr.cmd =3D be32_to_cpu(pkt->hdr.cmd); + pkt->hdr.len =3D be32_to_cpu(pkt->hdr.len); + pkt->hdr.id =3D be32_to_cpu(pkt->hdr.id); + pkt->hdr.flags =3D be32_to_cpu(pkt->hdr.flags); + pkt->hdr.dev =3D be32_to_cpu(pkt->hdr.dev); + used +=3D sizeof pkt->hdr; + return used; +} + +int rp_decode_payload(struct rp_pkt *pkt) +{ + int used =3D 0; + + switch (pkt->hdr.cmd) { + /* TBD */ + default: + break; + } + return used; +} + +void rp_encode_hdr(struct rp_pkt_hdr *hdr, uint32_t cmd, uint32_t id, + uint32_t dev, uint32_t len, uint32_t flags) +{ + hdr->cmd =3D cpu_to_be32(cmd); + hdr->len =3D cpu_to_be32(len); + hdr->id =3D cpu_to_be32(id); + hdr->dev =3D cpu_to_be32(dev); + hdr->flags =3D cpu_to_be32(flags); +} diff --git a/include/hw/core/remote-port-proto.h b/include/hw/core/remote-p= ort-proto.h index 16f3752877..f7995ff430 100644 --- a/include/hw/core/remote-port-proto.h +++ b/include/hw/core/remote-port-proto.h @@ -296,4 +296,12 @@ struct rp_pkt { }; }; =20 +const char *rp_cmd_to_string(enum rp_cmd cmd); +int rp_decode_hdr(struct rp_pkt *pkt); +int rp_decode_payload(struct rp_pkt *pkt); + +void rp_encode_hdr(struct rp_pkt_hdr *hdr, + uint32_t cmd, uint32_t id, uint32_t dev, uint32_t len, + uint32_t flags); + #endif --=20 2.43.0 From nobody Sat Sep 26 21:35:41 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=1789488129; cv=none; d=zohomail.com; s=zohoarc; b=eTO9UM+3yZjBTEGngHUNcQecjj39KIJovyADYKZldAZQWvqIcWdXoLSwnFMDvYBsdfIrzGRUbCydodB+wVAH+e1bMXGch2yW3UhWyS3t7n8KUP/VeDAIrqZ5l4IdjKfY7lE0VzCY6/GCJZyUSw3qL6tZ+Bk2mrnKg0s6TwIFsCw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789488129; 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=7hwsJgss9404Uci4hoxF6xJ6Z+8MMJ+jq2FhSZDgPJU=; b=BCWSpt+aENJ1NKvAeV6l5BCTzTT1N89SqjsGukGzycnq4iorycv+8fiVWdTkc/UGfkhsO5JLei8RbxtRFTJl/Lauzw56UB5tYRaPInOaaF7JztKib6r+b7diH2hj8O8Bfvfpahy/5hYj6Dc/axVOFN7yO+g/eYL9g5PDCTsip3o= 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 1789488129834128.93036914257016; Tue, 15 Sep 2026 09:02:09 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x6Vb6-0007Zr-7e; Tue, 15 Sep 2026 12:01:28 -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 1x6Vb2-0007We-Jv for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:24 -0400 Received: from mail-ej2-x10.google.com ([2a00:1450:4864:34::10]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1x6Vax-0003Nj-9Q for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:24 -0400 Received: by mail-ej2-x10.google.com with SMTP id a640c23a62f3a-c254f705536so797214666b.1 for ; Tue, 15 Sep 2026 09:01:18 -0700 (PDT) Received: from thinkpad-t470s.. (83-131-196-251.adsl.net.t-com.hr. [83.131.196.251]) by smtp.googlemail.com with ESMTPSA id a640c23a62f3a-c29ddd86344sm3235866b.0.2026.09.15.09.01.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 09:01:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789488078; x=1790092878; 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:content-type; bh=7hwsJgss9404Uci4hoxF6xJ6Z+8MMJ+jq2FhSZDgPJU=; b=dZDyzH2oVHCAQXSX6w2CNv2QOfV0JbQdEtWOwVVPMjTMJGPoITeP+PYjGXXyEmgRBx f2jwtqDEDmTDqk4DbXHU+VJBtLLRgKOwNvcD/JVqOLYOzwwfbyD0BbsPv+Uj9/thkWCI TDtr/dsyDx3SC0dXdUZ7SygRQpVZhWi6KUV2XZyqfhTMdXC8AHAX36F/qXnHl/RIfv5S JI3F4kDgIWWWGjEizUBmNUamP4MIU80SUM07Qq32/7iLrwIvCSs7JC39xjGQYwjF+75m s9F75oMHh2fn5pKuZfKD/+f0+ca6IXMIj1+SySX63zzYE69FaIz7IxouadPYy+i7O7Sk 1ZXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789488078; x=1790092878; 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:content-type; bh=7hwsJgss9404Uci4hoxF6xJ6Z+8MMJ+jq2FhSZDgPJU=; b=M8faAoU5iCVStNenBGND/lO7XFgyhh4/GYPvAx19lz0b2DFulOItyteFeejlWTb8k3 8Df1jOn8ysxO3JjSK+too4TTlhlD+FutatwzYVgAriQuAd+oAnjKyWlopctjJZWjVMtf cVXrlbFg5iA+sysWUuNE15JSd5GzUtxDlXFMFdphV0YCEjoCCc0pHBG4KzcYuVcLZQJw +gofj6zPtMxUaTc53NNhB5inbMY4yAuuka95GvozVxqAd/pWPYmm1z8FNGLcIKBD/Opq YdBo6y2i8RfH+f87kqmXup7IHGm7Oyu5qq2VCaBbWw0je1pcK14IcX/duTspey+V0kl/ mVFw== X-Gm-Message-State: AFuF++mFoMEMewhn4FGItF7AIbG3smvJmcWnN5EfCdc0VXrVZsMb2KlE twG0XQiAlxDh/Rv7YCZ3nxCGfT30u9VOBGejWfh5z3YiojkdsEDsSuZzthKhVg== X-Gm-Gg: AYBFou3LK15p3CnhRjLOTgYWhk/EqhNryDj3ocAW5lF+6x2P7FotTJALi+Ceq+7aYL4 r23Du150o9R9oXImRJ6ylmqGkkzwDJYDR7ojOb4TlUhwxGNGWWSv1dkO/3ygIPbKzWE4n27dsGv L9yzB8LCfaXUrJDUAhgZjnnJgj6JcaCK7N/ROe4bvYv8+wf8VRo7sHNHVHTtLYuGs9EJv777H6x +L40Jw/qFN0twG2p0Zv/Qzo+iYRbF7cS57iHgbZbnQC+49Va3AMgf5b/7FDjqJNkegi2bMvnqtx XMDMJlGvRdllJb+BXSAFz304vCq+ngB9smFSHaetY71WX+fcReAV7669c+U0KONJRjSgK9KNLZV jClR605igr2aVuwip5HwU++FJ90RbM3rOKG1sEHTQeFelnDFH+lANj/KCxTIhwyfrmnIExXzHem 5fR1xiJhdFqij5H7n9XR/qJaw7GZ58jZ21K87DgS6TvZXKuUQRgg4+wOtlSTuUrI8CAt35XXYS7 DY10uhTZkIncH4wt9Vr1LuImjNlC7M1fdWwSy9XOA83vQ== X-Received: by 2002:a17:907:18c4:b0:c26:1648:a06e with SMTP id a640c23a62f3a-c29b87725e0mr500397766b.41.1789488077569; Tue, 15 Sep 2026 09:01:17 -0700 (PDT) From: Ruslan Ruslichenko To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, artem_mygaiev@epam.com, volodymyr_babchuk@epam.com, peter.maydell@linaro.org, francisco.iglesias@amd.com, edgar.iglesias@gmail.com, berrange@redhat.com, eugene@nuvacore.ai, Ruslan_Ruslichenko@epam.com, takahiro.nakata.wr@renesas.com, "Edgar E . Iglesias" Subject: [PATCH v2 03/20] hw/core: Add Remote Port session state and hello protocol Date: Tue, 15 Sep 2026 18:00:27 +0200 Message-ID: <20260915160044.345788-4-ruslichenko.r@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260915160044.345788-1-ruslichenko.r@gmail.com> References: <20260915160044.345788-1-ruslichenko.r@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:34::10; envelope-from=ruslichenko.r@gmail.com; helo=mail-ej2-x10.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-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: 1789488133258158500 Content-Type: text/plain; charset="utf-8" From: Ruslan Ruslichenko Implement the session management for Remote Port protocol. Key features implemented are following: - Hello packet handling and capabilities negotiation - Dynamic packet management routines - rp_peer_state struct definition to hold negotiated capabilities. Signed-off-by: Edgar E. Iglesias Signed-off-by: Takahiro Nakata Signed-off-by: Ruslan Ruslichenko --- hw/core/remote-port-proto.c | 134 +++++++++++++++++++++++++++- include/hw/core/remote-port-proto.h | 72 +++++++++++++++ 2 files changed, 205 insertions(+), 1 deletion(-) diff --git a/hw/core/remote-port-proto.c b/hw/core/remote-port-proto.c index fed52a9734..9439f4b119 100644 --- a/hw/core/remote-port-proto.c +++ b/hw/core/remote-port-proto.c @@ -65,7 +65,43 @@ int rp_decode_payload(struct rp_pkt *pkt) int used =3D 0; =20 switch (pkt->hdr.cmd) { - /* TBD */ + case RP_CMD_hello: + assert(pkt->hdr.len >=3D sizeof pkt->hello.version); + pkt->hello.version.major =3D be16_to_cpu(pkt->hello.version.major); + pkt->hello.version.minor =3D be16_to_cpu(pkt->hello.version.minor); + used +=3D sizeof pkt->hello.version; + + if ((pkt->hdr.len - used) >=3D sizeof pkt->hello.caps) { + void *offset; + int i; + + pkt->hello.caps.offset =3D be32_to_cpu(pkt->hello.caps.offset); + pkt->hello.caps.len =3D be16_to_cpu(pkt->hello.caps.len); + + offset =3D (char *)pkt + pkt->hello.caps.offset; + for (i =3D 0; i < pkt->hello.caps.len; i++) { + uint32_t cap; + + /* + * We don't know if offset is 32bit aligned so use + * memcpy to do the endian conversion. + */ + memcpy(&cap, offset + i * sizeof cap, sizeof cap); + cap =3D be32_to_cpu(cap); + memcpy(offset + i * sizeof cap, &cap, sizeof cap); + } + used +=3D sizeof pkt->hello.caps; + } else { + pkt->hello.caps.offset =3D 0; + pkt->hello.caps.len =3D 0; + } + + /* + * Consume everything ignoring additional headers we do not yet + * know about. + */ + used =3D pkt->hdr.len; + break; default: break; } @@ -81,3 +117,99 @@ void rp_encode_hdr(struct rp_pkt_hdr *hdr, uint32_t cmd= , uint32_t id, hdr->dev =3D cpu_to_be32(dev); hdr->flags =3D cpu_to_be32(flags); } + +size_t rp_encode_hello_caps(uint32_t id, uint32_t dev, struct rp_pkt_hello= *pkt, + uint16_t version_major, uint16_t version_minor, + uint32_t *caps, uint32_t *caps_out, + uint32_t caps_len) +{ + size_t psize =3D sizeof *pkt + sizeof caps[0] * caps_len; + unsigned int i; + + rp_encode_hdr(&pkt->hdr, RP_CMD_hello, id, dev, + psize - sizeof pkt->hdr, 0); + pkt->version.major =3D cpu_to_be16(version_major); + pkt->version.minor =3D cpu_to_be16(version_minor); + + /* Feature list is appeneded right after the hello packet. */ + pkt->caps.offset =3D cpu_to_be32(sizeof *pkt); + pkt->caps.len =3D cpu_to_be16(caps_len); + + for (i =3D 0; i < caps_len; i++) { + uint32_t cap; + + cap =3D caps[i]; + caps_out[i] =3D cpu_to_be32(cap); + } + return sizeof *pkt; +} + +void rp_process_caps(struct rp_peer_state *peer, + void *caps, size_t caps_len) +{ + int i; + + assert(peer->caps.busaccess_ext_base =3D=3D false); + + for (i =3D 0; i < caps_len; i++) { + uint32_t cap; + + memcpy(&cap, caps + i * sizeof cap, sizeof cap); + + switch (cap) { + case CAP_BUSACCESS_EXT_BASE: + peer->caps.busaccess_ext_base =3D true; + break; + case CAP_BUSACCESS_EXT_BYTE_EN: + peer->caps.busaccess_ext_byte_en =3D true; + break; + case CAP_WIRE_POSTED_UPDATES: + peer->caps.wire_posted_updates =3D true; + break; + case CAP_ATS: + peer->caps.ats =3D true; + break; + } + } +} + +void rp_dpkt_alloc(RemotePortDynPkt *dpkt, size_t size) +{ + if (dpkt->size < size) { + char *u8; + dpkt->pkt =3D realloc(dpkt->pkt, size); + u8 =3D (void *) dpkt->pkt; + memset(u8 + dpkt->size, 0, size - dpkt->size); + dpkt->size =3D size; + } +} + +void rp_dpkt_swap(RemotePortDynPkt *a, RemotePortDynPkt *b) +{ + struct rp_pkt *tmp_pkt; + size_t tmp_size; + + tmp_pkt =3D a->pkt; + tmp_size =3D a->size; + a->pkt =3D b->pkt; + a->size =3D b->size; + b->pkt =3D tmp_pkt; + b->size =3D tmp_size; +} + +bool rp_dpkt_is_valid(RemotePortDynPkt *dpkt) +{ + return dpkt->size > 0 && dpkt->pkt->hdr.len; +} + +void rp_dpkt_invalidate(RemotePortDynPkt *dpkt) +{ + assert(rp_dpkt_is_valid(dpkt)); + dpkt->pkt->hdr.len =3D 0; +} + +inline void rp_dpkt_free(RemotePortDynPkt *dpkt) +{ + dpkt->size =3D 0; + free(dpkt->pkt); +} diff --git a/include/hw/core/remote-port-proto.h b/include/hw/core/remote-p= ort-proto.h index f7995ff430..ac7b7a9b96 100644 --- a/include/hw/core/remote-port-proto.h +++ b/include/hw/core/remote-port-proto.h @@ -296,6 +296,28 @@ struct rp_pkt { }; }; =20 +struct rp_peer_state { + void *opaque; + + struct rp_pkt pkt; + bool hdr_used; + + struct rp_version version; + + struct { + bool busaccess_ext_base; + bool busaccess_ext_byte_en; + bool wire_posted_updates; + bool ats; + } caps; + + /* Used to normalize our clk. */ + int64_t clk_base; + + struct rp_cfg_state local_cfg; + struct rp_cfg_state peer_cfg; +}; + const char *rp_cmd_to_string(enum rp_cmd cmd); int rp_decode_hdr(struct rp_pkt *pkt); int rp_decode_payload(struct rp_pkt *pkt); @@ -304,4 +326,54 @@ void rp_encode_hdr(struct rp_pkt_hdr *hdr, uint32_t cmd, uint32_t id, uint32_t dev, uint32_t len, uint32_t flags); =20 +/* + * caps is a an array of supported capabilities by the implementor. + * caps_out is the encoded (network byte order) version of the + * same array. It should be sent to the peer after the hello packet. + */ +size_t rp_encode_hello_caps(uint32_t id, uint32_t dev, struct rp_pkt_hello= *pkt, + uint16_t version_major, uint16_t version_minor, + uint32_t *caps, uint32_t *features_out, + uint32_t features_len); + +/* rp_encode_hello is deprecated in favor of hello_caps. */ +static inline size_t __attribute__ ((deprecated)) +rp_encode_hello(uint32_t id, uint32_t dev, struct rp_pkt_hello *pkt, + uint16_t version_major, uint16_t version_minor) { + return rp_encode_hello_caps(id, dev, pkt, version_major, version_minor, + NULL, NULL, 0); +} + +void rp_process_caps(struct rp_peer_state *peer, + void *caps, size_t caps_len); + +/* Dynamically resizable remote port pkt. */ + +typedef struct RemotePortDynPkt { + struct rp_pkt *pkt; + size_t size; +} RemotePortDynPkt; + +/* + * Make sure dpkt is allocated and has enough room. + */ + +void rp_dpkt_alloc(RemotePortDynPkt *dpkt, size_t size); + +void rp_dpkt_swap(RemotePortDynPkt *a, RemotePortDynPkt *b); + +/* + * Check if the dpkt is valid. Used for debugging purposes. + */ + +bool rp_dpkt_is_valid(RemotePortDynPkt *dpkt); + +/* + * Invalidate the dpkt. Used for debugging purposes. + */ + +void rp_dpkt_invalidate(RemotePortDynPkt *dpkt); + +void rp_dpkt_free(RemotePortDynPkt *dpkt); + #endif --=20 2.43.0 From nobody Sat Sep 26 21:35:41 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=1789488138; cv=none; d=zohomail.com; s=zohoarc; b=fiRTQDkgWH5LhI8BhWw3syXjKf4R8YYyPt3ouj+YoYhO6ZKIe2Zp3Zk6dy0pQ3NfWX5LOdJ+7JqBIFwvV5M1TZyko0BmqDAeRMezdrzavZJ6F8jYXHWEfcM5MTIUaCplok1cdoS206drhICznpPp+N+U+mClbNg58tt8yRsKp70= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789488138; 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=94yLgCZJnXztgL+1gk8uCJyDC6aCfGWvrBiAVC0Bd04=; b=EUeqzp1r8hUpKTwEvLnE+3zqbUfe78wx5wuUXBTfIx9BfE89BypoYl3+UriFYlOTZiPydKsCCypEgdqSmmI64lVWlzeV5U5933OnEtvHDWM+f4wBNiYfZRylOwp0/mQypoLfbrVglSPLF7rZRNugnPqhgwGPoN8WAuXykOdhp1I= 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 1789488138103688.9150368616085; Tue, 15 Sep 2026 09:02:18 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x6Vb4-0007YJ-IQ; Tue, 15 Sep 2026 12:01:26 -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 1x6Vb2-0007XL-T2 for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:24 -0400 Received: from mail-ej2-x10.google.com ([2a00:1450:4864:34::10]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1x6Vay-0003O2-R0 for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:24 -0400 Received: by mail-ej2-x10.google.com with SMTP id a640c23a62f3a-c254f6c7a58so412152566b.2 for ; Tue, 15 Sep 2026 09:01:20 -0700 (PDT) Received: from thinkpad-t470s.. (83-131-196-251.adsl.net.t-com.hr. [83.131.196.251]) by smtp.googlemail.com with ESMTPSA id a640c23a62f3a-c29ddd86344sm3235866b.0.2026.09.15.09.01.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 09:01:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789488079; x=1790092879; 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:content-type; bh=94yLgCZJnXztgL+1gk8uCJyDC6aCfGWvrBiAVC0Bd04=; b=nkT4hykCQAg/7iWpvknzKwynrh4GwqTGkWtfMG8qy5jUfDUcRMgT7C6SUB+jwobg8n EfyGlbUJeWz8K5pEXTLOIGtukLBvf3ly0Vo6d4TwsI0CzB1Wd0v7cxQUbx4uEmPv5MPH ek1QuMYr60H9zY2RyjoT+ak7gamB3p5TNz1nE9yenrtKG/Z9TqVk89rZh3rKt3hbQD0L o2HIcpeLKyBZWY4Xn7dTAKmpCXVGBpxzTYJP2VzYXbawozPNTrE2GZJ0fTVY817oMfsE 9PO9h0cujf548LWROTdqL8TiZCsNj8Y04VKGEDc+pBD/6e6qwqepZSX9tI+qkZN6BnrZ EMmA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789488079; x=1790092879; 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:content-type; bh=94yLgCZJnXztgL+1gk8uCJyDC6aCfGWvrBiAVC0Bd04=; b=HF5tNzx/a+t6c7GOMq1EMRHTATFo8lr1wMXmdOuk7XecmND5FFOvXLUCSia6nc3q6r xOtwOk/zyfHAHBBxhY6sRka+pN50oBCIzmBhSLVhQHeH0s9uylc1U5eGvFCibFJ4Scmk g8yD9wYNWDlUZLsMyD74b8/8LwMdsAUFPMjA5DC12SCRk0fS6kTkBqAdK+qPBK2cf+oJ u9xHvCFH7zTcgooVZoDBkyTjHfkkghaO5gWqmH2EQT4DUGExVJldrY8zwV0WJ49tfZ+e 0avSkeKW+BsaEgVtmP82Psl/K/w7edPF0jK4mE5ZCmmrsKELGpCOqfYlp5xnBNbFq8ht YMAw== X-Gm-Message-State: AFuF++k3dZ3XBuHnDMNxWR5cmaU5CUTPwyzjJ5nJ1jqziwd79/YLFYNr J1j/2STc+lj4sG4aHE6oM539KHDPCMpVHBJsMUD83A9lLRlmjWcYUD4qpaVrbw== X-Gm-Gg: AYBFou0IjoqtlXw06A+91oOml4Bh7oYv3HuYahjQzgSnhqsv51oKbflc1U/ipkN++3a iwAy5+3v8nQL187aKtgn7hM4L+1onq/ZU2zdfYtBG4/EElwf3CLhwL+n25HSR0t45j4XqsmajLj 4vKnKmF4s6sFPw2zDIbfoOq0TqiFLlbxBMswoWvsyA0oGnnH2aHnF/kV7BDdnJTFX1cdlqEnBfG HNV6swvj5DuRY+lvhE6YcUtdKJ1agwtu4AYiYWkdJoHLs+eB0D5lYX2he//EkY1nKFSArKcx1IL fKrELlqNmaAeJ+PnZE13JMEmQmnmwIF5r8ch1BNATdRg0JliIHoraoxEC1wGF/yAoziTTamarDd gVY1tVydjCHvFGMDhQiKEx350yl6blAFsi6AobKpGr/Bw2peK53eSZVxerxxcQjG0sP2mTmpE/3 NaOcPkVxjdhJrNZPZD+5ZcP2tMD6eHtdck6/5nM3iukKkt7hLmaMC2dl6QqwgC4ulSPFUEY+DlK EVIPWNoLQI9b3q6OXhMW2eAK0KN+2yUkoy8uJ9Q5Z0lfG55qtGGxyWG X-Received: by 2002:a17:906:6a04:b0:c26:1649:47ab with SMTP id a640c23a62f3a-c29b87180afmr450840166b.33.1789488079117; Tue, 15 Sep 2026 09:01:19 -0700 (PDT) From: Ruslan Ruslichenko To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, artem_mygaiev@epam.com, volodymyr_babchuk@epam.com, peter.maydell@linaro.org, francisco.iglesias@amd.com, edgar.iglesias@gmail.com, berrange@redhat.com, eugene@nuvacore.ai, Ruslan_Ruslichenko@epam.com, takahiro.nakata.wr@renesas.com, "Edgar E . Iglesias" Subject: [PATCH v2 04/20] hw/core: Implement Remote Port bus access helpers Date: Tue, 15 Sep 2026 18:00:28 +0200 Message-ID: <20260915160044.345788-5-ruslichenko.r@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260915160044.345788-1-ruslichenko.r@gmail.com> References: <20260915160044.345788-1-ruslichenko.r@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:34::10; envelope-from=ruslichenko.r@gmail.com; helo=mail-ej2-x10.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-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: 1789488140472158500 Content-Type: text/plain; charset="utf-8" From: Ruslan Ruslichenko Add bus access logic for Remote Port memory transactions. The patch add support for read and write commands, which enables data communication via the protocol. This includes support for both legacy and extended packet formats (such as 64-bit Master IDs) based on peer's capabilities. Signed-off-by: Edgar E. Iglesias Signed-off-by: Takahiro Nakata Signed-off-by: Ruslan Ruslichenko --- hw/core/remote-port-proto.c | 152 ++++++++++++++++++++++++++++ include/hw/core/remote-port-proto.h | 133 ++++++++++++++++++++++++ 2 files changed, 285 insertions(+) diff --git a/hw/core/remote-port-proto.c b/hw/core/remote-port-proto.c index 9439f4b119..ddaefa7e36 100644 --- a/hw/core/remote-port-proto.c +++ b/hw/core/remote-port-proto.c @@ -63,6 +63,8 @@ int rp_decode_hdr(struct rp_pkt *pkt) int rp_decode_payload(struct rp_pkt *pkt) { int used =3D 0; + /* Master_id has an odd decoding due to historical reasons. */ + uint64_t master_id; =20 switch (pkt->hdr.cmd) { case RP_CMD_hello: @@ -102,6 +104,34 @@ int rp_decode_payload(struct rp_pkt *pkt) */ used =3D pkt->hdr.len; break; + case RP_CMD_write: + case RP_CMD_read: + assert(pkt->hdr.len >=3D sizeof pkt->busaccess - sizeof pkt->hdr); + pkt->busaccess.timestamp =3D be64_to_cpu(pkt->busaccess.timestamp); + pkt->busaccess.addr =3D be64_to_cpu(pkt->busaccess.addr); + pkt->busaccess.attributes =3D be64_to_cpu(pkt->busaccess.attribute= s); + pkt->busaccess.len =3D be32_to_cpu(pkt->busaccess.len); + pkt->busaccess.width =3D be32_to_cpu(pkt->busaccess.width); + pkt->busaccess.stream_width =3D be32_to_cpu(pkt->busaccess.stream_= width); + master_id =3D be16_to_cpu(pkt->busaccess.master_id); + + used +=3D sizeof pkt->busaccess - sizeof pkt->hdr; + + if (pkt->busaccess.attributes & RP_BUS_ATTR_EXT_BASE) { + struct rp_pkt_busaccess_ext_base *pext =3D &pkt->busaccess_ext= _base; + + assert(pkt->hdr.len >=3D sizeof *pext - sizeof pkt->hdr); + master_id |=3D (uint64_t)be16_to_cpu(pext->master_id_31_16) <<= 16; + master_id |=3D (uint64_t)be32_to_cpu(pext->master_id_63_32) <<= 32; + pext->data_offset =3D be32_to_cpu(pext->data_offset); + pext->next_offset =3D be32_to_cpu(pext->next_offset); + pext->byte_enable_offset =3D be32_to_cpu(pext->byte_enable_off= set); + pext->byte_enable_len =3D be32_to_cpu(pext->byte_enable_len); + + used +=3D sizeof *pext - sizeof pkt->busaccess; + } + pkt->busaccess.master_id =3D master_id; + break; default: break; } @@ -144,6 +174,127 @@ size_t rp_encode_hello_caps(uint32_t id, uint32_t dev= , struct rp_pkt_hello *pkt, return sizeof *pkt; } =20 +static void rp_encode_busaccess_common(struct rp_pkt_busaccess *pkt, + int64_t clk, uint16_t master_id, + uint64_t addr, uint64_t attr, uint32_t s= ize, + uint32_t width, uint32_t stream_width) +{ + pkt->timestamp =3D cpu_to_be64(clk); + pkt->master_id =3D cpu_to_be16(master_id); + pkt->addr =3D cpu_to_be64(addr); + pkt->attributes =3D cpu_to_be64(attr); + pkt->len =3D cpu_to_be32(size); + pkt->width =3D cpu_to_be32(width); + pkt->stream_width =3D cpu_to_be32(stream_width); +} + +size_t rp_encode_read(uint32_t id, uint32_t dev, + struct rp_pkt_busaccess *pkt, + int64_t clk, uint16_t master_id, + uint64_t addr, uint64_t attr, uint32_t size, + uint32_t width, uint32_t stream_width) +{ + rp_encode_hdr(&pkt->hdr, RP_CMD_read, id, dev, + sizeof *pkt - sizeof pkt->hdr, 0); + rp_encode_busaccess_common(pkt, clk, master_id, addr, attr, + size, width, stream_width); + return sizeof *pkt; +} + +size_t rp_encode_read_resp(uint32_t id, uint32_t dev, + struct rp_pkt_busaccess *pkt, + int64_t clk, uint16_t master_id, + uint64_t addr, uint64_t attr, uint32_t size, + uint32_t width, uint32_t stream_width) +{ + rp_encode_hdr(&pkt->hdr, RP_CMD_read, id, dev, + sizeof *pkt - sizeof pkt->hdr + size, RP_PKT_FLAGS_respo= nse); + rp_encode_busaccess_common(pkt, clk, master_id, addr, attr, + size, width, stream_width); + return sizeof *pkt + size; +} + +size_t rp_encode_write(uint32_t id, uint32_t dev, + struct rp_pkt_busaccess *pkt, + int64_t clk, uint16_t master_id, + uint64_t addr, uint64_t attr, uint32_t size, + uint32_t width, uint32_t stream_width) +{ + rp_encode_hdr(&pkt->hdr, RP_CMD_write, id, dev, + sizeof *pkt - sizeof pkt->hdr + size, 0); + rp_encode_busaccess_common(pkt, clk, master_id, addr, attr, + size, width, stream_width); + return sizeof *pkt; +} + +size_t rp_encode_write_resp(uint32_t id, uint32_t dev, + struct rp_pkt_busaccess *pkt, + int64_t clk, uint16_t master_id, + uint64_t addr, uint64_t attr, uint32_t size, + uint32_t width, uint32_t stream_width) +{ + rp_encode_hdr(&pkt->hdr, RP_CMD_write, id, dev, + sizeof *pkt - sizeof pkt->hdr, RP_PKT_FLAGS_response); + rp_encode_busaccess_common(pkt, clk, master_id, addr, attr, + size, width, stream_width); + return sizeof *pkt; +} + +/* New API for extended header. */ +size_t rp_encode_busaccess(struct rp_peer_state *peer, + struct rp_pkt_busaccess_ext_base *pkt, + struct rp_encode_busaccess_in *in) { + struct rp_pkt_busaccess *pkt_v4_0 =3D (void *) pkt; + uint32_t hsize =3D 0; + uint32_t ret_size =3D 0; + + /* Allocate packet space. */ + if (in->cmd =3D=3D RP_CMD_write && !(in->flags & RP_PKT_FLAGS_response= )) { + hsize =3D in->size; + } + if (in->cmd =3D=3D RP_CMD_read && (in->flags & RP_PKT_FLAGS_response))= { + hsize =3D in->size; + ret_size =3D in->size; + } + + /* + * If peer does not support the busaccess base extensions, use the + * old layout. For responses, what matters is if we're responding + * to a packet with the extensions. + */ + if (!peer->caps.busaccess_ext_base && !(in->attr & RP_BUS_ATTR_EXT_BAS= E)) { + /* Old layout. */ + assert(in->master_id < UINT16_MAX); + + rp_encode_hdr(&pkt->hdr, in->cmd, in->id, in->dev, + sizeof *pkt_v4_0 - sizeof pkt->hdr + hsize, in->flags); + rp_encode_busaccess_common(pkt_v4_0, in->clk, in->master_id, + in->addr, in->attr, + in->size, in->width, in->stream_width); + return sizeof *pkt_v4_0 + ret_size; + } + + /* Encode the extended fields. */ + pkt->master_id_31_16 =3D cpu_to_be16(in->master_id >> 16); + pkt->master_id_63_32 =3D cpu_to_be32(in->master_id >> 32); + + /* We always put data right after the header. */ + pkt->data_offset =3D cpu_to_be32(sizeof *pkt); + pkt->next_offset =3D 0; + + pkt->byte_enable_offset =3D cpu_to_be32(sizeof *pkt + hsize); + pkt->byte_enable_len =3D cpu_to_be32(in->byte_enable_len); + hsize +=3D in->byte_enable_len; + + rp_encode_hdr(&pkt->hdr, in->cmd, in->id, in->dev, + sizeof *pkt - sizeof pkt->hdr + hsize, in->flags); + rp_encode_busaccess_common(pkt_v4_0, in->clk, in->master_id, in->addr, + in->attr | RP_BUS_ATTR_EXT_BASE, + in->size, in->width, in->stream_width); + + return sizeof *pkt + ret_size; +} + void rp_process_caps(struct rp_peer_state *peer, void *caps, size_t caps_len) { @@ -173,6 +324,7 @@ void rp_process_caps(struct rp_peer_state *peer, } } =20 + void rp_dpkt_alloc(RemotePortDynPkt *dpkt, size_t size) { if (dpkt->size < size) { diff --git a/include/hw/core/remote-port-proto.h b/include/hw/core/remote-p= ort-proto.h index ac7b7a9b96..de67cd6501 100644 --- a/include/hw/core/remote-port-proto.h +++ b/include/hw/core/remote-port-proto.h @@ -344,6 +344,134 @@ rp_encode_hello(uint32_t id, uint32_t dev, struct rp_= pkt_hello *pkt, NULL, NULL, 0); } =20 +static inline void *__attribute__ ((deprecated)) +rp_busaccess_dataptr(struct rp_pkt_busaccess *pkt) +{ + /* Right after the packet. */ + return pkt + 1; +} + +/* + * rp_busaccess_rx_dataptr + * + * Predicts the dataptr for a packet to be transmitted. + * This should only be used if you are trying to keep + * the entire packet in a linear buffer. + */ +static inline unsigned char * +rp_busaccess_tx_dataptr(struct rp_peer_state *peer, + struct rp_pkt_busaccess_ext_base *pkt) +{ + unsigned char *p =3D (unsigned char *) pkt; + + if (peer->caps.busaccess_ext_base) { + /* We always put our data right after the header. */ + return p + sizeof *pkt; + } else { + /* Right after the old packet layout. */ + return p + sizeof(struct rp_pkt_busaccess); + } +} + +/* + * rp_busaccess_rx_dataptr + * + * Extracts the dataptr from a received packet. + */ +static inline unsigned char * +rp_busaccess_rx_dataptr(struct rp_peer_state *peer, + struct rp_pkt_busaccess_ext_base *pkt) +{ + unsigned char *p =3D (unsigned char *) pkt; + + if (pkt->attributes & RP_BUS_ATTR_EXT_BASE) { + return p + pkt->data_offset; + } else { + /* Right after the old packet layout. */ + return p + sizeof(struct rp_pkt_busaccess); + } +} + +static inline unsigned char * +rp_busaccess_byte_en_ptr(struct rp_peer_state *peer, + struct rp_pkt_busaccess_ext_base *pkt) +{ + unsigned char *p =3D (unsigned char *) pkt; + + if ((pkt->attributes & RP_BUS_ATTR_EXT_BASE) + && pkt->byte_enable_len) { + assert(pkt->byte_enable_offset >=3D sizeof *pkt); + assert(pkt->byte_enable_offset + pkt->byte_enable_len + <=3D pkt->hdr.len + sizeof pkt->hdr); + return p + pkt->byte_enable_offset; + } + return NULL; +} + +size_t __attribute__ ((deprecated)) +rp_encode_read(uint32_t id, uint32_t dev, + struct rp_pkt_busaccess *pkt, + int64_t clk, uint16_t master_id, + uint64_t addr, uint64_t attr, uint32_t size, + uint32_t width, uint32_t stream_width); + +size_t __attribute__ ((deprecated)) +rp_encode_read_resp(uint32_t id, uint32_t dev, + struct rp_pkt_busaccess *pkt, + int64_t clk, uint16_t master_id, + uint64_t addr, uint64_t attr, uint32_t size, + uint32_t width, uint32_t stream_width); + +size_t __attribute__ ((deprecated)) +rp_encode_write(uint32_t id, uint32_t dev, + struct rp_pkt_busaccess *pkt, + int64_t clk, uint16_t master_id, + uint64_t addr, uint64_t attr, uint32_t size, + uint32_t width, uint32_t stream_width); + +size_t __attribute__ ((deprecated)) +rp_encode_write_resp(uint32_t id, uint32_t dev, + struct rp_pkt_busaccess *pkt, + int64_t clk, uint16_t master_id, + uint64_t addr, uint64_t attr, uint32_t size, + uint32_t width, uint32_t stream_width); + +struct rp_encode_busaccess_in { + uint32_t cmd; + uint32_t id; + uint32_t flags; + uint32_t dev; + int64_t clk; + uint64_t master_id; + uint64_t addr; + uint64_t attr; + uint32_t size; + uint32_t width; + uint32_t stream_width; + uint32_t byte_enable_len; +}; + +/* Prepare encode_busaccess input parameters for a packet response. */ +static inline void +rp_encode_busaccess_in_rsp_init(struct rp_encode_busaccess_in *in, + struct rp_pkt *pkt) { + memset(in, 0, sizeof *in); + in->cmd =3D pkt->hdr.cmd; + in->id =3D pkt->hdr.id; + in->flags =3D pkt->hdr.flags | RP_PKT_FLAGS_response; + in->dev =3D pkt->hdr.dev; + /* FIXME: Propagate all master_id fields? */ + in->master_id =3D pkt->busaccess.master_id; + in->addr =3D pkt->busaccess.addr; + in->size =3D pkt->busaccess.len; + in->width =3D pkt->busaccess.width; + in->stream_width =3D pkt->busaccess.stream_width; + in->byte_enable_len =3D 0; +} +size_t rp_encode_busaccess(struct rp_peer_state *peer, + struct rp_pkt_busaccess_ext_base *pkt, + struct rp_encode_busaccess_in *in); + void rp_process_caps(struct rp_peer_state *peer, void *caps, size_t caps_len); =20 @@ -376,4 +504,9 @@ void rp_dpkt_invalidate(RemotePortDynPkt *dpkt); =20 void rp_dpkt_free(RemotePortDynPkt *dpkt); =20 +static inline int rp_get_busaccess_response(struct rp_pkt *pkt) +{ + return (pkt->busaccess_ext_base.attributes & RP_BUS_RESP_MASK) >> + RP_BUS_RESP_SH= IFT; +} #endif --=20 2.43.0 From nobody Sat Sep 26 21:35:41 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=1789488130; cv=none; d=zohomail.com; s=zohoarc; b=Xl5zqh2Y2LK5KhEbjb288jJNPpcCn38kLFcMOvb4IBrb6xXw6i17tDixrtYQFlDcMBKy/1u79m0eI/pQnCdXf2v67gBPycGUzkHBTpW6ZofzV5ux4UwWthr38Ql5vo3oP6McG0NqE5bfRpneeh67weixD0vqQ/ZcfSTRyMw3nbc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789488130; 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=1hqn5sYLybz9LYd9ThTYkVIvKptKJIS6KFBdy+ZatTw=; b=IN9mT1b/+vynObHWIaB1EuoRqZajuHnVpfBSrap0juAy/U7ZqPkdovLOr8YUmLYz0WVF4uxIXnEkJA7IPNtawaQcfQX8PBrjO8XFLD2MRY/EFF9Vsklf7hVq8y2UYEi4x1ZiL1wYfW4IZGhc/DPelcY/C5FLQeMrs6wVOwvbuek= 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 1789488130572656.4878191090745; Tue, 15 Sep 2026 09:02:10 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x6VbD-0007hC-N1; Tue, 15 Sep 2026 12:01:35 -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 1x6VbC-0007g3-3c for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:34 -0400 Received: from mail-ej2-x10.google.com ([2a00:1450:4864:34::10]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1x6VbA-0003OG-8K for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:33 -0400 Received: by mail-ej2-x10.google.com with SMTP id a640c23a62f3a-c254f6c7a56so509144266b.1 for ; Tue, 15 Sep 2026 09:01:21 -0700 (PDT) Received: from thinkpad-t470s.. (83-131-196-251.adsl.net.t-com.hr. [83.131.196.251]) by smtp.googlemail.com with ESMTPSA id a640c23a62f3a-c29ddd86344sm3235866b.0.2026.09.15.09.01.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 09:01:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789488081; x=1790092881; 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:content-type; bh=1hqn5sYLybz9LYd9ThTYkVIvKptKJIS6KFBdy+ZatTw=; b=f+2B82XGxkNS/UzPVWijgr8ZMf1B41qHvk/W5lvUAer4ZTnbhtNQ42Hv+D3oZnxmsW v1sUENaoNi2wcTM9qJAChKUoKm9eWXhvIp/A9+ezbGK7TAQ5Ju1QgB7qjZCAVooDgoo9 T9klwKniCPeA6sx5mPEHwhvUGDV4AQx6Ka1JQou2XJqlhX3uf3FZskuCjtUb3bz+NoHQ vg8eiVDiwV5Ss9tL6xPTI1+8e90l0YEUp2W9YmB3k/a2sbff6Tcr3U/t3wsglXAG5TFJ FePaqTkK5aGq6mjzs+HitA+jhCb120TEPKQRlrhLFhux1lSv7vIOHDtWW1I/WF6ja8eP iRdA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789488081; x=1790092881; 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:content-type; bh=1hqn5sYLybz9LYd9ThTYkVIvKptKJIS6KFBdy+ZatTw=; b=UW2opTx9P5O6Uubr/Gos0JFlNrFq462+A4gckmWdWVH5DqozXRq+13QO3f/itME62R HfUFRDvp6h721aI0z062rPp1ag3bxlPXsz6AlwTHGZtuTIDkZ0dZkZnjinQ446owNKSc pZfqe+YJzLtq/LgykFifgX5twNgWiiwRPMhdXkslbLy0SDupfF6sMO1OyK+wkKiNt5vK REqYuAeoLghWy+eBXaQ5Jrsu/+E+dYPKFi+0imld2JDS9XoEiRJEf1PQ5dv8NT7whkqK 48tE2rGmRBpW1P2GuH6H2V0TpuTFuFzq8eX4eAUU/EWhIwEXu/OnJp4yK7JfU8gSMIhx nJpg== X-Gm-Message-State: AFuF++kDr2TUzHEb5GLcxyKLH7jyvo74trzFXRUet4X8a4koklk4kZYl iyEumfgVzRUYD/WPmIUzVveeSkFUUh/cjQKBvM1EnKiD+hzglXs7jExjeZuo8w== X-Gm-Gg: AYBFou0T1e4KDLyBOCVyCjbzBcOqVRlr+e6AmhWZI2xsI/hDyfVfmE9zDRCtG/gGTVP y0gZI8yNJvAIAun7cqRC8D656x0So8dxQBPANpLUDN0+ZPGvFf9fuzWKEvI501/QnPlCxw9ZjP5 Ntt5MjpaHmHfje+wLsAPb8V1yIWuF/B/B3ZjVS/rgoFkrrzH3u4drsWId++4JGDdfPsRgcutZxN 4tpxkRA0PeauIRU1C+YrHzxOTPaMmTGZmvau33cD1+2gOs4HbLcfbDS2/bAi82CoDMbs6cqfFBK FfRqc2rvSS/YuIyrNQXlo355MIOcU9Yf6pvS/GmO1eMl+6j8lfFi7QoU6XXX92g2R7Bm33QYd2e /UeCwCkjblnlVAUyVstdAQ9aPjULAJU13TP2gh/07OtsanQyejzwLWDX7RgrJJU4TxMTnmfGGLI weWV0OjxaFWiMKPvnnf4B8XnsS+9eSg72L/U+Xo2uQ37Lk0X55WRsbJvaW3JWpngNgB1wt6pr+U o0FcpaXCplgGV4OJXUsX5cOUoA0t0P4uAgETRKtY8QkBA== X-Received: by 2002:a17:907:3f1b:b0:c29:62d8:68b8 with SMTP id a640c23a62f3a-c29b874c4d4mr496231866b.48.1789488080807; Tue, 15 Sep 2026 09:01:20 -0700 (PDT) From: Ruslan Ruslichenko To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, artem_mygaiev@epam.com, volodymyr_babchuk@epam.com, peter.maydell@linaro.org, francisco.iglesias@amd.com, edgar.iglesias@gmail.com, berrange@redhat.com, eugene@nuvacore.ai, Ruslan_Ruslichenko@epam.com, takahiro.nakata.wr@renesas.com, "Edgar E . Iglesias" Subject: [PATCH v2 05/20] hw/core: Implement Remote Port irq, sync and ATS helpers Date: Tue, 15 Sep 2026 18:00:29 +0200 Message-ID: <20260915160044.345788-6-ruslichenko.r@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260915160044.345788-1-ruslichenko.r@gmail.com> References: <20260915160044.345788-1-ruslichenko.r@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:34::10; envelope-from=ruslichenko.r@gmail.com; helo=mail-ej2-x10.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=unavailable autolearn_force=no X-Spam_action: no action 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: 1789488133145158500 Content-Type: text/plain; charset="utf-8" From: Ruslan Ruslichenko The patch add support for encoding and decoding of following commands: - RP_CMD_interrupt: propagate gpio and interrupt lines changes to external peers - RP_CMD_sync: support for synchronization between QEMU and the remote model - RP_CMD_ats_*: handling iommu transactoin request and invalidation accross the link. Signed-off-by: Edgar E. Iglesias Signed-off-by: Takahiro Nakata Signed-off-by: Ruslan Ruslichenko --- hw/core/remote-port-proto.c | 100 ++++++++++++++++++++++++++++ include/hw/core/remote-port-proto.h | 29 ++++++++ 2 files changed, 129 insertions(+) diff --git a/hw/core/remote-port-proto.c b/hw/core/remote-port-proto.c index ddaefa7e36..0c90ba8971 100644 --- a/hw/core/remote-port-proto.c +++ b/hw/core/remote-port-proto.c @@ -132,6 +132,24 @@ int rp_decode_payload(struct rp_pkt *pkt) } pkt->busaccess.master_id =3D master_id; break; + case RP_CMD_interrupt: + pkt->interrupt.timestamp =3D be64_to_cpu(pkt->interrupt.timestamp); + pkt->interrupt.vector =3D be64_to_cpu(pkt->interrupt.vector); + pkt->interrupt.line =3D be32_to_cpu(pkt->interrupt.line); + pkt->interrupt.val =3D pkt->interrupt.val; + used +=3D pkt->hdr.len; + break; + case RP_CMD_sync: + pkt->sync.timestamp =3D be64_to_cpu(pkt->interrupt.timestamp); + used +=3D pkt->hdr.len; + break; + case RP_CMD_ats_req: + case RP_CMD_ats_inv: + pkt->ats.attributes =3D be64_to_cpu(pkt->ats.attributes); + pkt->ats.addr =3D be64_to_cpu(pkt->ats.addr); + pkt->ats.len =3D be64_to_cpu(pkt->ats.len); + pkt->ats.result =3D be32_to_cpu(pkt->ats.result); + break; default: break; } @@ -295,6 +313,88 @@ size_t rp_encode_busaccess(struct rp_peer_state *peer, return sizeof *pkt + ret_size; } =20 +size_t rp_encode_interrupt_f(uint32_t id, uint32_t dev, + struct rp_pkt_interrupt *pkt, + int64_t clk, + uint32_t line, uint64_t vector, uint8_t val, + uint32_t flags) +{ + rp_encode_hdr(&pkt->hdr, RP_CMD_interrupt, id, dev, + sizeof *pkt - sizeof pkt->hdr, flags); + pkt->timestamp =3D cpu_to_be64(clk); + pkt->vector =3D cpu_to_be64(vector); + pkt->line =3D cpu_to_be32(line); + pkt->val =3D val; + return sizeof *pkt; +} + +size_t rp_encode_interrupt(uint32_t id, uint32_t dev, + struct rp_pkt_interrupt *pkt, + int64_t clk, + uint32_t line, uint64_t vector, uint8_t val) +{ + return rp_encode_interrupt_f(id, dev, pkt, clk, line, vector, val, 0); +} + +static size_t rp_encode_ats_common(uint32_t cmd, uint32_t id, uint32_t dev, + struct rp_pkt_ats *pkt, + int64_t clk, uint64_t attr, uint64_t addr, + uint64_t len, uint64_t result, uint32_t flags) +{ + rp_encode_hdr(&pkt->hdr, cmd, id, dev, + sizeof *pkt - sizeof pkt->hdr, flags); + pkt->timestamp =3D cpu_to_be64(clk); + pkt->attributes =3D cpu_to_be64(attr); + pkt->addr =3D cpu_to_be64(addr); + pkt->len =3D cpu_to_be64(len); + pkt->result =3D cpu_to_be32(result); + return sizeof *pkt; +} + +size_t rp_encode_ats_req(uint32_t id, uint32_t dev, + struct rp_pkt_ats *pkt, + int64_t clk, uint64_t attr, uint64_t addr, + uint64_t len, uint64_t result, uint32_t flags) +{ + return rp_encode_ats_common(RP_CMD_ats_req, id, dev, + pkt, clk, attr, + addr, len, result, flags); +} + +size_t rp_encode_ats_inv(uint32_t id, uint32_t dev, + struct rp_pkt_ats *pkt, + int64_t clk, uint64_t attr, uint64_t addr, + uint64_t len, uint64_t result, uint32_t flags) +{ + return rp_encode_ats_common(RP_CMD_ats_inv, id, dev, + pkt, clk, attr, + addr, len, result, flags); +} + +static size_t rp_encode_sync_common(uint32_t id, uint32_t dev, + struct rp_pkt_sync *pkt, + int64_t clk, uint32_t flags) +{ + rp_encode_hdr(&pkt->hdr, RP_CMD_sync, id, dev, + sizeof *pkt - sizeof pkt->hdr, flags); + pkt->timestamp =3D cpu_to_be64(clk); + return sizeof *pkt; +} + +size_t rp_encode_sync(uint32_t id, uint32_t dev, + struct rp_pkt_sync *pkt, + int64_t clk) +{ + return rp_encode_sync_common(id, dev, pkt, clk, 0); +} + +size_t rp_encode_sync_resp(uint32_t id, uint32_t dev, + struct rp_pkt_sync *pkt, + int64_t clk) +{ + return rp_encode_sync_common(id, dev, pkt, clk, RP_PKT_FLAGS_response); +} + void rp_process_caps(struct rp_peer_state *peer, void *caps, size_t caps_len) { diff --git a/include/hw/core/remote-port-proto.h b/include/hw/core/remote-p= ort-proto.h index de67cd6501..c86f0657d2 100644 --- a/include/hw/core/remote-port-proto.h +++ b/include/hw/core/remote-port-proto.h @@ -472,6 +472,35 @@ size_t rp_encode_busaccess(struct rp_peer_state *peer, struct rp_pkt_busaccess_ext_base *pkt, struct rp_encode_busaccess_in *in); =20 +size_t rp_encode_interrupt_f(uint32_t id, uint32_t dev, + struct rp_pkt_interrupt *pkt, + int64_t clk, + uint32_t line, uint64_t vector, uint8_t val, + uint32_t flags); + +size_t rp_encode_interrupt(uint32_t id, uint32_t dev, + struct rp_pkt_interrupt *pkt, + int64_t clk, + uint32_t line, uint64_t vector, uint8_t val); + +size_t rp_encode_sync(uint32_t id, uint32_t dev, + struct rp_pkt_sync *pkt, + int64_t clk); + +size_t rp_encode_sync_resp(uint32_t id, uint32_t dev, + struct rp_pkt_sync *pkt, + int64_t clk); + +size_t rp_encode_ats_req(uint32_t id, uint32_t dev, + struct rp_pkt_ats *pkt, + int64_t clk, uint64_t attr, uint64_t addr, + uint64_t size, uint64_t result, uint32_t flags); + +size_t rp_encode_ats_inv(uint32_t id, uint32_t dev, + struct rp_pkt_ats *pkt, + int64_t clk, uint64_t attr, uint64_t addr, + uint64_t size, uint64_t result, uint32_t flags); + void rp_process_caps(struct rp_peer_state *peer, void *caps, size_t caps_len); =20 --=20 2.43.0 From nobody Sat Sep 26 21:35:41 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=1789488134; cv=none; d=zohomail.com; s=zohoarc; b=WVuEHienycOuaBqXy78aH2O7hZwbaAMrlyyH8MzJW337AA/HhcmJTxzmdApM2qeNFDZsIMX7dRMvV3XRPY9Tc2HmmaZaKMdriJDiSYE22OV98WCJYy8jk8FBs7lOYCGChVYVVk3Umn37VjNCb4bLWcK0DwGFNB13dALdY1gKhCw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789488134; 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=t2kCTfMt9la3+TqyiXvTwsH4ffyBtacDVRw82Er1W/0=; b=GYjxycGb3EHrEAR9n+OIdkIMHZbkhAYKgZji++P7B8emU1RC8vleN3eDzWovtJqT9siB0im3wwB4vkJBLHBFjPFJPpobhKH/IThbKTi3NsWstkP3Y6YlBB+9O2DipXVM3zdctDxd+Yif8q0cfqtZPOCE0IoYNV0AmFFBN7r38Kg= 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 1789488134760152.37153167706765; Tue, 15 Sep 2026 09:02:14 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x6VbH-0007jo-Fu; Tue, 15 Sep 2026 12:01:39 -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 1x6VbG-0007iC-05 for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:38 -0400 Received: from mail-ej2-x10.google.com ([2a00:1450:4864:34::10]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1x6VbC-0003Ol-CD for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:37 -0400 Received: by mail-ej2-x10.google.com with SMTP id a640c23a62f3a-c2940ef15d3so507843866b.2 for ; Tue, 15 Sep 2026 09:01:23 -0700 (PDT) Received: from thinkpad-t470s.. (83-131-196-251.adsl.net.t-com.hr. [83.131.196.251]) by smtp.googlemail.com with ESMTPSA id a640c23a62f3a-c29ddd86344sm3235866b.0.2026.09.15.09.01.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 09:01:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789488083; x=1790092883; 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:content-type; bh=t2kCTfMt9la3+TqyiXvTwsH4ffyBtacDVRw82Er1W/0=; b=X2SmBxlq84MJXfxmiH1ex4YNWwe8jmoxgRh0/DJJJAIVAxwHhwLtNNH+oKvi9WiokU sv1VLF2MmTmE5bwZxnmh4Z/oGCZ1nljdidjAhEr7rAlENY8lgMc/w0CfXRbRvK5nen9V G6fkJZDLNlpiDd1r5Fh4G+fmIUxX4G7japNiIiHtQ78G4JJIWHDeMx8pDf1BQN16L7AM 51zugE5QOzsVu9qt9X0SqkrYnn13nA+YW4bQWH98t/p/EgwYFXGHJixLHnhwQFsCiASw EkUzc8BtVPM4K76p4WN0lqCFlBYeYhsAprVVnDIinDIDpys/piw1RQV4JirmRuifoODB gpnA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789488083; x=1790092883; 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:content-type; bh=t2kCTfMt9la3+TqyiXvTwsH4ffyBtacDVRw82Er1W/0=; b=SoHGR4nzVoMMQAc5+VeY5HGd+abMhVnSbcBLtOBChTjNHGj3rNFF7aVZ8ixcEYH00F jHyVTfNvTQvEdSpAe9r1XtQMIta20OGanfQ3nZ+j8jaAFrqMRWD50yshQ9N9nhUDvf+p OQVTMOox6IBPcRBBYTDjO77HeDWr+ZwgDzWYWsO+zsNfvxglnAdxZEtR5Dr3r63wVW7v bFyO21F2IaqHqwVz1OjhfIXNxN0+akwwxG48uEDhp6xve4d979zGG63URegqCggpHNX0 G4CfqzBnbgXTJDIeO9o0C1OANdwJ7owx3yhYJG4RIFnVzPBdEAvvSvPd73q4rukwo54s D1LA== X-Gm-Message-State: AFuF++m7PK7pECtWEUyTare/3/sq0RWZvOtnPUSvXe483fg5pTy6ox2H pvq+wbC2liIS/wkhuWpuhs8jMwbnTHnsxFIMaS1KVE439ia8hfSOGTlMzSwywQ== X-Gm-Gg: AYBFou0FlTrKPoXVK2CqW2ROEhJ6/5JfeXWKWB/7B9QGm8ZGx3Ic/4AtqCyLjgU44pa Hsy41iXAL+2PWsSWM2mZfDlJahnVkfklUROfvToWFY5G2W9sG3mSaMyMd6yKUibFOV0Cd+RJHyR duo3LMxYq2/o529twWRKS0Iug715emZKhDGrIKx5LJbfI4B4WTg1LOwYb3xVWYCsU8TdhTckZyu cNxU2vj51a1he69IEnF0L5A2bSGhLvx4UJH9c+Wj1pLKi0Xx5lJmB+i3IvLYnq5NTOza1wTPxqP suPRv0CuC3wbnHj6/PrKR1gNvgQdVbTQh8j0qsu9K/PONz+iE1nbSF/W4JAijwIZfK+jRTxMV5f MQNTb1PQXxygTUXOwrDnY1rcTNrQYsWRaw+AMYGoCaHuImEaP/JrowuX+Bj9gHX4qawRaWY+Qtn q4XPHSUuvQcLDRzqCjK4q1JlOnZ2eHhi6F/VQ/Za2XLFTldrOuCfY+pAF6Rcau31sXK3ra1UYOg 8YYMquKtS7DPcmflih3ynfmQCw2lB/RkZc30bCv8Qxr9g== X-Received: by 2002:a17:907:9623:b0:c29:37d7:75c0 with SMTP id a640c23a62f3a-c29b839a04cmr1104060666b.1.1789488082383; Tue, 15 Sep 2026 09:01:22 -0700 (PDT) From: Ruslan Ruslichenko To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, artem_mygaiev@epam.com, volodymyr_babchuk@epam.com, peter.maydell@linaro.org, francisco.iglesias@amd.com, edgar.iglesias@gmail.com, berrange@redhat.com, eugene@nuvacore.ai, Ruslan_Ruslichenko@epam.com, takahiro.nakata.wr@renesas.com, "Edgar E . Iglesias" Subject: [PATCH v2 06/20] hw/core: Add Remote Port object skeleton Date: Tue, 15 Sep 2026 18:00:30 +0200 Message-ID: <20260915160044.345788-7-ruslichenko.r@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260915160044.345788-1-ruslichenko.r@gmail.com> References: <20260915160044.345788-1-ruslichenko.r@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:34::10; envelope-from=ruslichenko.r@gmail.com; helo=mail-ej2-x10.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=unavailable autolearn_force=no X-Spam_action: no action 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: 1789488136531158500 Content-Type: text/plain; charset="utf-8" From: Ruslan Ruslichenko Introduce the QOM skeleton for the Remote Port subsystem. This patch adds main types required for co-simulation: - remote-port: An object that manages the lifecycle of the co-simulation session and handles the character device backend. - remote-port-device: An interface that allows other QEMU devices to be connected to the Remote Port. This infrastructure enables QEMU to be linked with external simulators (e.g. SystemC). Signed-off-by: Edgar E. Iglesias Signed-off-by: Takahiro Nakata Signed-off-by: Ruslan Ruslichenko --- hw/core/remote-port.c | 151 ++++++++++++++++++++++++++++++++++ include/hw/core/remote-port.h | 76 +++++++++++++++++ 2 files changed, 227 insertions(+) create mode 100644 hw/core/remote-port.c create mode 100644 include/hw/core/remote-port.h diff --git a/hw/core/remote-port.c b/hw/core/remote-port.c new file mode 100644 index 0000000000..6b40dca52d --- /dev/null +++ b/hw/core/remote-port.c @@ -0,0 +1,151 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * QEMU remote attach + * + * Copyright (c) 2013 Xilinx Inc + * Written by Edgar E. Iglesias + * + * This code is licensed under the GNU GPL. + */ + +#include "qemu/osdep.h" +#include "system/system.h" +#include "chardev/char.h" +#include "system/cpus.h" +#include "system/cpu-timers.h" +#include "system/reset.h" +#include "hw/core/sysbus.h" +#include "hw/core/hw-error.h" +#include "qemu/thread.h" +#include "qemu/log.h" +#include "qapi/error.h" +#include "qemu/error-report.h" +#include "migration/vmstate.h" +#include "hw/core/qdev-properties.h" +#include "hw/core/qdev-properties-system.h" +#include "qemu/cutils.h" + +#include "hw/core/remote-port-proto.h" +#include "hw/core/remote-port.h" + +#define REMOTE_PORT_CLASS(klass) \ + OBJECT_CLASS_CHECK(RemotePortClass, (klass), TYPE_REMOTE_PORT) + +static void rp_reset(DeviceState *dev) +{ + RemotePort *s =3D REMOTE_PORT(dev); + + if (s->reset_done) { + return; + } + + s->reset_done =3D true; +} + +static void rp_realize(DeviceState *dev, Error **errp) +{ + RemotePort *s =3D REMOTE_PORT(dev); + Chardev *chr =3D NULL; + + s->prefix =3D object_get_canonical_path(OBJECT(dev)); + + if (s->chrdev_id) { + chr =3D qemu_chr_find(s->chrdev_id); + } + + if (!chr) { + error_setg(errp, "Unable to connect to remote-port channel"); + return; + } + + if (!qemu_chr_fe_init(&s->chr, chr, errp)) { + return; + } + + s->chrdev =3D chr; + + +} + +static void rp_unrealize(DeviceState *dev) +{ + RemotePort *s =3D REMOTE_PORT(dev); + + s->finalizing =3D true; + + info_report("%s: Wait for remote-port to disconnect", s->prefix); + qemu_chr_fe_disconnect(&s->chr); + qemu_chr_fe_deinit(&s->chr, false); + + object_unparent(OBJECT(s->chrdev)); +} + +static const VMStateDescription vmstate_rp =3D { + .name =3D TYPE_REMOTE_PORT, + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (VMStateField[]) { + VMSTATE_END_OF_LIST(), + } +}; + +static Property rp_properties[] =3D { + DEFINE_PROP_STRING("chrdev-id", RemotePort, chrdev_id), +}; + +static void rp_prop_allow_set_link(const Object *obj, const char *name, + Object *val, Error **errp) +{ +} + +static void rp_init(Object *obj) +{ + RemotePort *s =3D REMOTE_PORT(obj); + int i; + + for (i =3D 0; i < REMOTE_PORT_MAX_DEVS; ++i) { + char *name =3D g_strdup_printf("remote-port-dev%d", i); + object_property_add_link(obj, name, TYPE_REMOTE_PORT_DEVICE, + (Object **)&s->devs[i], + rp_prop_allow_set_link, + OBJ_PROP_LINK_STRONG); + g_free(name); + } +} + +static void rp_class_init(ObjectClass *klass, const void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + + dc->legacy_reset =3D rp_reset; + dc->realize =3D rp_realize; + dc->unrealize =3D rp_unrealize; + dc->vmsd =3D &vmstate_rp; + device_class_set_props_n(dc, rp_properties, ARRAY_SIZE(rp_properties)); +} + +static const TypeInfo rp_info =3D { + .name =3D TYPE_REMOTE_PORT, + .parent =3D TYPE_DEVICE, + .instance_size =3D sizeof(RemotePort), + .instance_init =3D rp_init, + .class_init =3D rp_class_init, + .interfaces =3D (InterfaceInfo[]) { + { }, + }, +}; + +static const TypeInfo rp_device_info =3D { + .name =3D TYPE_REMOTE_PORT_DEVICE, + .parent =3D TYPE_INTERFACE, + .class_size =3D sizeof(RemotePortDeviceClass), +}; + +static void rp_register_types(void) +{ + type_register_static(&rp_info); + type_register_static(&rp_device_info); +} + +type_init(rp_register_types) diff --git a/include/hw/core/remote-port.h b/include/hw/core/remote-port.h new file mode 100644 index 0000000000..dde54a40d9 --- /dev/null +++ b/include/hw/core/remote-port.h @@ -0,0 +1,76 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * QEMU remote port. + * + * Copyright (c) 2013 Xilinx Inc + * Written by Edgar E. Iglesias + * + * This code is licensed under the GNU GPL. + */ +#ifndef REMOTE_PORT_H__ +#define REMOTE_PORT_H__ + +#include +#include "hw/core/remote-port-proto.h" +#include "chardev/char.h" +#include "chardev/char-fe.h" +#include "qobject/qdict.h" + +#define TYPE_REMOTE_PORT_DEVICE "remote-port-device" + +#define REMOTE_PORT_DEVICE_CLASS(klass) \ + OBJECT_CLASS_CHECK(RemotePortDeviceClass, (klass), TYPE_REMOTE_PORT_D= EVICE) +#define REMOTE_PORT_DEVICE_GET_CLASS(obj) \ + OBJECT_GET_CLASS(RemotePortDeviceClass, (obj), TYPE_REMOTE_PORT_DEVICE) +#define REMOTE_PORT_DEVICE(obj) \ + INTERFACE_CHECK(RemotePortDevice, (obj), TYPE_REMOTE_PORT_DEVICE) + +typedef struct RemotePort RemotePort; + +typedef struct RemotePortDevice { + /*< private >*/ + Object parent_obj; +} RemotePortDevice; + +typedef struct RemotePortDeviceClass { + /*< private >*/ + InterfaceClass parent_class; + + /*< public >*/ + /** + * ops - operations to perform when remote port packets are recieved f= or + * this device. Function N will be called for a remote port packet with + * cmd =3D=3D N in the header. + * + * @obj - Remote port device to recieve packet + * @pkt - remote port packets + */ + + void (*ops[RP_CMD_max + 1])(RemotePortDevice *obj, struct rp_pkt *pkt); + +} RemotePortDeviceClass; + +#define TYPE_REMOTE_PORT "remote-port" +#define REMOTE_PORT(obj) OBJECT_CHECK(RemotePort, (obj), TYPE_REMOTE_PORT) + +struct RemotePort { + DeviceState parent; + + Chardev *chrdev; + CharFrontend chr; + bool finalizing; + + char *chrdev_id; + + const char *prefix; + const char *remote_prefix; + + uint32_t current_id; + bool reset_done; + +#define REMOTE_PORT_MAX_DEVS 1024 + RemotePortDevice *devs[REMOTE_PORT_MAX_DEVS]; +}; + +#endif --=20 2.43.0 From nobody Sat Sep 26 21:35:41 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=1789488330; cv=none; d=zohomail.com; s=zohoarc; b=G4K6K/J+seBX+xFnrGZ+x7Gh/I8xBDsAYl9dyH9z1BPtzIKYTXV43LACqAVPfkcjs6OcNrJwP/hQ3yO/EF+3wiGqPzpGnrw8zyL+/EMSMq4bkuxTphH0YlmdS6EtnxAgJvj30YM7tEDBWBWstdlH/HLDkit+tDPOpRsZHQ7PRNY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789488330; 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=s87rPVbRxcHD+WW42I4Y9cf1mEIYsz0a2YMHIlkLiHI=; b=Q54G1nphbw/Qk4FQpLcDn7pkxWcPSxQVyP4ewia4wA+WUkVle+ZkyRY+rNGMVCcoCtABoL5IKyzI7UrCRY5eMY28D8GtX84lctY4ZByCGScudH2ihnKrxz/mC2ACL8VMBLF0R8h8DHp24oZkvZf9yR58unFuPdi2r6v0mEZOUIU= 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 1789488330051680.930155875008; Tue, 15 Sep 2026 09:05:30 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x6VbJ-0007li-C8; Tue, 15 Sep 2026 12:01:41 -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 1x6VbG-0007in-C0 for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:38 -0400 Received: from mail-ej2-x10.google.com ([2a00:1450:4864:34::10]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1x6VbD-0003Pz-Vg for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:38 -0400 Received: by mail-ej2-x10.google.com with SMTP id a640c23a62f3a-c254f9f7dbeso81515766b.0 for ; Tue, 15 Sep 2026 09:01:25 -0700 (PDT) Received: from thinkpad-t470s.. (83-131-196-251.adsl.net.t-com.hr. [83.131.196.251]) by smtp.googlemail.com with ESMTPSA id a640c23a62f3a-c29ddd86344sm3235866b.0.2026.09.15.09.01.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 09:01:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789488084; x=1790092884; 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:content-type; bh=s87rPVbRxcHD+WW42I4Y9cf1mEIYsz0a2YMHIlkLiHI=; b=dy/UH7RSrqITRhsgLuL03A2zLuaLg0yVOBWTKgxiz85VX2TqeDkiBvJNepWKQAFeUn /yvFV/0Z1q6ZzS8FGE6m0DlTZNHFi4VpIWU5ft8TB72ZcTrMNdJIrS1clBEyIc3Mh2Lj ZdHGngZ8YmxQbXFdhjm5ZUBK96gCP3w60m+Lu0/6oor8c0HhQ4j3QEML9YvFnnGsYv+z rgYMItygPS5gBpJRnQVZ1whiSIfcDs4I9ZZAigYS+UU0wSohf+PuN9TLIDHc/Oe5/6GM Nb2sKBIL8J3xT2LVilP0CRjByOfNxNQRd6nRWvSWQvvkoA+VlCn/vsY/UKYzYRiSXAVs CO3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789488084; x=1790092884; 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:content-type; bh=s87rPVbRxcHD+WW42I4Y9cf1mEIYsz0a2YMHIlkLiHI=; b=ZOoeV2skB063wOGMEa/QBf/kBl4dOvvXFWaZeY1MJKBvJmQ34hL+kAeFe6f2Mj285i kf7lQQUBlGuZW0TIX0ti76nK6CZnmdF89Chsd/ezS3B6/omi5vlfygEGZR28+ymt3rVp Mvg2hOT554AFW+NlLQ7OiK24Qwy2KXF9l1WaZtbqVOp6ZunBS3VqqMu++NYPFYR8yrsA smbqp8p2v9Q68Xtx8mX4PWORjejJwDAMZ3NrMfInKKr4yHB6+vktTe7uQGa2OkqVvtmk 120hSmC2W24YqyKLES+Bes2/uFEtFcg+tO8oyreoMJe+Q7V0O3wqt3Mgft8VRMEcq4Yp HSEQ== X-Gm-Message-State: AFuF++nOB85ppT7RyjyqIMjd6VAbfZFX/qsq3Sjkvheh3NYd13h2EYZU L+UdHYyK8NMywDeJhzCAFt8n5b43RXU3+V3d3D4KF6qHmmk7vZrGq0BvF46prQ== X-Gm-Gg: AYBFou3WCL8bDwoF1DjPI/tiGUqpGwNWY5iBjpGIyJg4fnFwH+/4M/DnKQFF2zq9HYX uWMhxPRurvrlZCf8/Pf9HTmwuSr4hYmirw9DCN9y7iHiViFwT18G+AJT4ZwcRYpf2oPjq9oQF83 BxClEIckVJLO2aPooHsZC0bLrMpYtUIqifxCqUVqX+3O58r1jgPswpts57LW0b16O94ux3e66mz D8x1xHxxseyAmkvYYwnDVYLZfB1gykgV2hDGoTNnFKSR3Pasdwth8Wc/67cYF0ZXYLAyFozKzKN cZKhUs08+taRt+LD/vT7UbYvXs1fFX7AcUu+p/iv/e85SOjsy2r+FA6+8i2lz59Er1w8zy/OlVY enI5Q2OeYWjjsvsGJVSko3tCITWFTjYFbIUk8U0/cco6rvNcb6nfZEqlTdvPSfHBKEbtKLHwrBE //QwSVQKN6OSCuSBpHaWsbfVCsxAW855bnOak5nJ4xtaqncwyewNWOAHn+M8cPxhBlwvPn+vZ/7 mCRGYH6X/Mzz4AlhG2xUJuJ/IlSx2ZaAtrZaRwVT38Uuw== X-Received: by 2002:a17:907:724a:b0:c15:f26a:3438 with SMTP id a640c23a62f3a-c29d78ec66bmr133940666b.24.1789488084070; Tue, 15 Sep 2026 09:01:24 -0700 (PDT) From: Ruslan Ruslichenko To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, artem_mygaiev@epam.com, volodymyr_babchuk@epam.com, peter.maydell@linaro.org, francisco.iglesias@amd.com, edgar.iglesias@gmail.com, berrange@redhat.com, eugene@nuvacore.ai, Ruslan_Ruslichenko@epam.com, takahiro.nakata.wr@renesas.com, "Edgar E . Iglesias" Subject: [PATCH v2 07/20] hw/core: Add Remote Port protocol thread and handshake Date: Tue, 15 Sep 2026 18:00:31 +0200 Message-ID: <20260915160044.345788-8-ruslichenko.r@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260915160044.345788-1-ruslichenko.r@gmail.com> References: <20260915160044.345788-1-ruslichenko.r@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:34::10; envelope-from=ruslichenko.r@gmail.com; helo=mail-ej2-x10.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-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: 1789488330548158500 Content-Type: text/plain; charset="utf-8" From: Ruslan Ruslichenko Introduce main execution loop for the Remote Port protocol. Creates a dedicated thread to manage the communication lifecycle. This includes logic to read packets and manage RX queue. Patch also implements handshake logic to verify protocol versions and negotiate capabilities with remote peer. Signed-off-by: Edgar E. Iglesias Signed-off-by: Takahiro Nakata Signed-off-by: Ruslan Ruslichenko --- hw/core/remote-port.c | 307 +++++++++++++++++++++++++++++++++- hw/core/trace-events | 5 + include/hw/core/remote-port.h | 29 ++++ 3 files changed, 340 insertions(+), 1 deletion(-) diff --git a/hw/core/remote-port.c b/hw/core/remote-port.c index 6b40dca52d..89f799493c 100644 --- a/hw/core/remote-port.c +++ b/hw/core/remote-port.c @@ -25,6 +25,7 @@ #include "hw/core/qdev-properties.h" #include "hw/core/qdev-properties-system.h" #include "qemu/cutils.h" +#include "trace.h" =20 #include "hw/core/remote-port-proto.h" #include "hw/core/remote-port.h" @@ -32,6 +33,286 @@ #define REMOTE_PORT_CLASS(klass) \ OBJECT_CLASS_CHECK(RemotePortClass, (klass), TYPE_REMOTE_PORT) =20 +static void rp_event_read_and_process(RemotePort *s); + +static void rp_fatal_error(RemotePort *s, const char *reason) +{ + error_report("%s: %s", s->prefix, reason); + exit(EXIT_FAILURE); +} + +static ssize_t rp_recv(RemotePort *s, void *buf, size_t count) +{ + ssize_t r; + + r =3D qemu_chr_fe_read_all(&s->chr, buf, count); + if (r <=3D 0) { + return r; + } + if (r !=3D count) { + error_report("%s: Bad read, expected %zd but got %zd", + s->prefix, count, r); + rp_fatal_error(s, "Bad read"); + } + + return r; +} + +ssize_t rp_write(RemotePort *s, const void *buf, size_t count) +{ + ssize_t r; + + qemu_mutex_lock(&s->write_mutex); + r =3D qemu_chr_fe_write_all(&s->chr, buf, count); + qemu_mutex_unlock(&s->write_mutex); + assert(r =3D=3D count); + if (r <=3D 0) { + error_report("%s: Disconnected r=3D%zd buf=3D%p count=3D%zd", + s->prefix, r, buf, count); + rp_fatal_error(s, "Bad write"); + } + return r; +} + +static unsigned int rp_has_work(RemotePort *s) +{ + unsigned int work =3D s->rx_queue.wpos - s->rx_queue.rpos; + return work; +} + +static void rp_cmd_hello(RemotePort *s, struct rp_pkt *pkt) +{ + s->peer.version =3D pkt->hello.version; + if (pkt->hello.version.major !=3D RP_VERSION_MAJOR) { + error_report("remote-port version missmatch remote=3D%d.%d local= =3D%d.%d", + pkt->hello.version.major, pkt->hello.version.minor, + RP_VERSION_MAJOR, RP_VERSION_MINOR); + rp_fatal_error(s, "Bad version"); + } + + if (pkt->hello.caps.len) { + void *caps =3D (char *) pkt + pkt->hello.caps.offset; + + rp_process_caps(&s->peer, caps, pkt->hello.caps.len); + } +} + +static void rp_say_hello(RemotePort *s) +{ + struct rp_pkt_hello pkt; + uint32_t caps[] =3D { + CAP_BUSACCESS_EXT_BASE, + CAP_BUSACCESS_EXT_BYTE_EN, + CAP_WIRE_POSTED_UPDATES, + CAP_ATS, + }; + size_t len; + + len =3D rp_encode_hello_caps(s->current_id++, 0, &pkt, RP_VERSION_MAJO= R, + RP_VERSION_MINOR, + caps, caps, sizeof caps / sizeof caps[0]); + rp_write(s, (void *) &pkt, len); + + if (sizeof caps) { + rp_write(s, caps, sizeof caps); + } +} + +void rp_process(RemotePort *s) +{ + while (true) { + struct rp_pkt *pkt; + unsigned int rpos; + bool actioned =3D false; + RemotePortDevice *dev; + RemotePortDeviceClass *rpdc; + + qemu_mutex_lock(&s->rsp_mutex); + if (!rp_has_work(s)) { + qemu_mutex_unlock(&s->rsp_mutex); + break; + } + rpos =3D s->rx_queue.rpos; + + pkt =3D s->rx_queue.pkt[rpos].pkt; + trace_rp_process(s->prefix, s->rx_queue.rpos, s->rx_queue.wpos, + pkt->hdr.cmd, pkt->hdr.dev); + + /* + * To handle recursiveness, we need to advance the index + * index before processing the packet. + */ + s->rx_queue.rpos++; + s->rx_queue.rpos %=3D ARRAY_SIZE(s->rx_queue.pkt); + qemu_mutex_unlock(&s->rsp_mutex); + + dev =3D s->devs[pkt->hdr.dev]; + if (dev) { + rpdc =3D REMOTE_PORT_DEVICE_GET_CLASS(dev); + if (rpdc->ops[pkt->hdr.cmd]) { + rpdc->ops[pkt->hdr.cmd](dev, pkt); + actioned =3D true; + } + } + + switch (pkt->hdr.cmd) { + /* TBD */ + default: + assert(actioned); + } + + s->rx_queue.inuse[rpos] =3D false; + qemu_sem_post(&s->rx_queue.sem); + } +} + +static void rp_event_read_and_process(RemotePort *s) +{ + event_notifier_test_and_clear(&s->event_notifier); + + rp_process(s); +} + +static void rp_event_read_cb(EventNotifier *n) +{ + RemotePort *s =3D container_of(n, RemotePort, event_notifier); + + rp_event_read_and_process(s); +} + +static void rp_event_notify(RemotePort *s) +{ + event_notifier_set(&s->event_notifier); +} + +/* Handover a pkt to CPU or IO-thread context. */ +static void rp_pt_handover_pkt(RemotePort *s, RemotePortDynPkt *dpkt) +{ + bool full; + + /* + * Take the rsp lock around the wpos update, otherwise + * rp_wait_resp will race with us. + */ + qemu_mutex_lock(&s->rsp_mutex); + s->rx_queue.wpos++; + s->rx_queue.wpos %=3D ARRAY_SIZE(s->rx_queue.pkt); + /* + * Ensure rx_queue index update is visible to consumer + * before signaling event, to prevent lost wakeup + */ + smp_mb(); + rp_event_notify(s); + qemu_cond_signal(&s->progress_cond); + qemu_mutex_unlock(&s->rsp_mutex); + + do { + full =3D s->rx_queue.inuse[s->rx_queue.wpos]; + if (full) { + trace_rp_pt_rx_queue_full(s->prefix, s->rx_queue.rpos, + s->rx_queue.wpos); + qemu_sem_timedwait(&s->rx_queue.sem, 2 * 1000); + } + } while (full); +} + +static bool rp_pt_process_pkt(RemotePort *s, RemotePortDynPkt *dpkt) +{ + struct rp_pkt *pkt =3D dpkt->pkt; + + trace_rp_pt_process_pkt(s->prefix, pkt->hdr.cmd, pkt->hdr.id, pkt->hdr= .dev); + + if (pkt->hdr.dev >=3D ARRAY_SIZE(s->devs)) { + /* FIXME: Respond with an error. */ + return true; + } + + switch (pkt->hdr.cmd) { + case RP_CMD_hello: + rp_cmd_hello(s, pkt); + break; + case RP_CMD_read: + case RP_CMD_write: + case RP_CMD_interrupt: + case RP_CMD_ats_req: + case RP_CMD_ats_inv: + rp_pt_handover_pkt(s, dpkt); + break; + default: + g_assert_not_reached(); + break; + } + return false; +} + +static int rp_read_pkt(RemotePort *s, RemotePortDynPkt *dpkt) +{ + struct rp_pkt *pkt =3D dpkt->pkt; + int used; + int r; + + r =3D rp_recv(s, pkt, sizeof pkt->hdr); + if (r <=3D 0) { + return r; + } + used =3D rp_decode_hdr((void *) &pkt->hdr); + assert(used =3D=3D sizeof pkt->hdr); + + if (pkt->hdr.len) { + rp_dpkt_alloc(dpkt, sizeof pkt->hdr + pkt->hdr.len); + /* pkt may move due to realloc. */ + pkt =3D dpkt->pkt; + r =3D rp_recv(s, &pkt->hdr + 1, pkt->hdr.len); + if (r <=3D 0) { + return r; + } + rp_decode_payload(pkt); + } + + return used + r; +} + +static void *rp_protocol_thread(void *arg) +{ + RemotePort *s =3D REMOTE_PORT(arg); + unsigned int i; + int r; + + /* Make sure we have a decent bufsize to start with. */ + rp_dpkt_alloc(&s->rsp, sizeof s->rsp.pkt->busaccess + 1024); + for (i =3D 0; i < ARRAY_SIZE(s->rx_queue.pkt); i++) { + rp_dpkt_alloc(&s->rx_queue.pkt[i], + sizeof s->rx_queue.pkt[i].pkt->busaccess + 1024); + s->rx_queue.inuse[i] =3D false; + } + + rp_say_hello(s); + + while (1) { + RemotePortDynPkt *dpkt; + unsigned int wpos =3D s->rx_queue.wpos; + bool handled; + + dpkt =3D &s->rx_queue.pkt[wpos]; + s->rx_queue.inuse[wpos] =3D true; + + r =3D rp_read_pkt(s, dpkt); + if (r <=3D 0) { + /* Disconnected. */ + break; + } + handled =3D rp_pt_process_pkt(s, dpkt); + if (handled) { + s->rx_queue.inuse[wpos] =3D false; + } + } + + if (!s->finalizing) { + rp_fatal_error(s, "Disconnected"); + } + return NULL; +} + static void rp_reset(DeviceState *dev) { RemotePort *s =3D REMOTE_PORT(dev); @@ -40,6 +321,9 @@ static void rp_reset(DeviceState *dev) return; } =20 + qemu_thread_create(&s->thread, "remote-port", rp_protocol_thread, s, + QEMU_THREAD_JOINABLE); + s->reset_done =3D true; } =20 @@ -48,6 +332,10 @@ static void rp_realize(DeviceState *dev, Error **errp) RemotePort *s =3D REMOTE_PORT(dev); Chardev *chr =3D NULL; =20 + qemu_mutex_init(&s->write_mutex); + qemu_mutex_init(&s->rsp_mutex); + qemu_cond_init(&s->progress_cond); + s->prefix =3D object_get_canonical_path(OBJECT(dev)); =20 if (s->chrdev_id) { @@ -65,7 +353,18 @@ static void rp_realize(DeviceState *dev, Error **errp) =20 s->chrdev =3D chr; =20 + if (event_notifier_init(&s->event_notifier, 0) < 0) { + error_setg(errp, + "Unable to initialize event notifier for remote port"); + return; + } =20 + aio_set_event_notifier(qemu_get_aio_context(), &s->event_notifier, + rp_event_read_cb, + NULL, NULL); + + + qemu_sem_init(&s->rx_queue.sem, ARRAY_SIZE(s->rx_queue.pkt) - 1); } =20 static void rp_unrealize(DeviceState *dev) @@ -74,11 +373,17 @@ static void rp_unrealize(DeviceState *dev) =20 s->finalizing =3D true; =20 + aio_set_event_notifier(qemu_get_aio_context(), &s->event_notifier, + NULL, NULL, NULL); + info_report("%s: Wait for remote-port to disconnect", s->prefix); qemu_chr_fe_disconnect(&s->chr); + if (s->reset_done) { + qemu_thread_join(&s->thread); + } qemu_chr_fe_deinit(&s->chr, false); =20 - object_unparent(OBJECT(s->chrdev)); + event_notifier_cleanup(&s->event_notifier); } =20 static const VMStateDescription vmstate_rp =3D { diff --git a/hw/core/trace-events b/hw/core/trace-events index 2cf085ac66..612d5730b9 100644 --- a/hw/core/trace-events +++ b/hw/core/trace-events @@ -32,3 +32,8 @@ clock_set_mul_div(const char *clk, uint32_t oldmul, uint3= 2_t mul, uint32_t olddi =20 # cpu-common.c cpu_reset(int cpu_index) "%d" + +# remote-port.c +rp_pt_process_pkt(const char *rp, uint32_t cmd, uint32_t id, uint32_t dev)= "%s: cmd=3D0x%"PRIx32" id=3D0x%"PRIx32" dev=3D0x%"PRIx32 +rp_process(const char *rp, unsigned int rpos, unsigned int wpos, uint32_t = cmd, uint32_t dev) "%s: io-thread rpos=3D%u wpos=3D%u cmd=3D0x%"PRIx32" dev= =3D0x%"PRIx32 +rp_pt_rx_queue_full(const char *rp, unsigned int rpos, unsigned int wpos) = "%s: rpos=3D%u wpos=3D%u" diff --git a/include/hw/core/remote-port.h b/include/hw/core/remote-port.h index dde54a40d9..2d8a191bce 100644 --- a/include/hw/core/remote-port.h +++ b/include/hw/core/remote-port.h @@ -16,6 +16,7 @@ #include "chardev/char.h" #include "chardev/char-fe.h" #include "qobject/qdict.h" +#include "qemu/event_notifier.h" =20 #define TYPE_REMOTE_PORT_DEVICE "remote-port-device" =20 @@ -57,11 +58,35 @@ typedef struct RemotePortDeviceClass { struct RemotePort { DeviceState parent; =20 + QemuThread thread; + EventNotifier event_notifier; Chardev *chrdev; CharFrontend chr; bool finalizing; + /* To serialize writes to fd. */ + QemuMutex write_mutex; =20 char *chrdev_id; + struct rp_peer_state peer; + + QemuMutex rsp_mutex; + QemuCond progress_cond; + +#define RX_QUEUE_SIZE 1024 + struct { + /* This array must be sized minimum 2 and always a power of 2. */ + RemotePortDynPkt pkt[RX_QUEUE_SIZE]; + bool inuse[RX_QUEUE_SIZE]; + QemuSemaphore sem; + unsigned int wpos; + unsigned int rpos; + } rx_queue; + + /* + * rsp holds responses for the remote side. + * Used by the slave. + */ + RemotePortDynPkt rsp; =20 const char *prefix; const char *remote_prefix; @@ -73,4 +98,8 @@ struct RemotePort { RemotePortDevice *devs[REMOTE_PORT_MAX_DEVS]; }; =20 +void rp_process(RemotePort *s); + +ssize_t rp_write(RemotePort *s, const void *buf, size_t count); + #endif --=20 2.43.0 From nobody Sat Sep 26 21:35:41 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=1789488317; cv=none; d=zohomail.com; s=zohoarc; b=Ym8rtSPnSIaJFVk/Jufi667rvKwaneLWwSWnSv1O+6MVyQN5K/w2pWfcnF8j8Fp9JDn4nXefB+AVfVMqDN4sUYihBPgW4DT6jwRLTbEf8ieoIbEbBX1XOfUsVcGb83IoP0glXNKPtDcIEEfNIBL28IN1JxvRR1k8mkRp8IcSZWs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789488317; 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=9YCy6DQ0BZQW71Ys8BPvP9f9laR4cAYvw0UQPtL7jF8=; b=aOTqpF0t5/Qw1MNMzVwbHiZ1nKgs00/kiLSVmQgGmoE5eJTfi3uaz5fYV3iADepWyf7igAYNa0JSY2gvqmzbAGq/mKsqHRXbtUL765M8tVT9u19WIRPKjT8B+YdkzSHWLr0lN4HOXmUR6w8mETnAKblZlAF/RvZj1Uu93VkNLLM= 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 1789488317879151.915592722709; Tue, 15 Sep 2026 09:05:17 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x6VbJ-0007m6-HJ; Tue, 15 Sep 2026 12:01:41 -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 1x6VbI-0007kr-8t for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:40 -0400 Received: from mail-ej2-x10.google.com ([2a00:1450:4864:34::10]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1x6VbF-0003Qb-9s for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:39 -0400 Received: by mail-ej2-x10.google.com with SMTP id a640c23a62f3a-c254fa663c1so466117966b.0 for ; Tue, 15 Sep 2026 09:01:26 -0700 (PDT) Received: from thinkpad-t470s.. (83-131-196-251.adsl.net.t-com.hr. [83.131.196.251]) by smtp.googlemail.com with ESMTPSA id a640c23a62f3a-c29ddd86344sm3235866b.0.2026.09.15.09.01.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 09:01:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789488086; x=1790092886; 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:content-type; bh=9YCy6DQ0BZQW71Ys8BPvP9f9laR4cAYvw0UQPtL7jF8=; b=LKZJ4rkUlIHzL3S0NOsDaCIoyrBr7M1qqSKDoFsOPkcXrFTGJ2b1eI3YjPKlGTPELt eWmDyV7toZQAL5FuOfBtDp7B2biOyArvFYOKMo73k+0rVSKXuUOVTKsDjN6D0vP5QTr4 z7nJyORVJcmk9PDIpVvjJXJx/1CC9EZ7tdQnWyA9wxVvwt7w0P6SLlENaGmBrjs1Tuur cvpp8huSdvy8CCDsY2+uXtzkaR7qUUY2FlvTdfgazHHRdY5DXViacYp02XdIsdi1N4e1 o75o7Xyo5bmdssBvcsneMmOsonrVTg9CmLDN/yNmx/0tyan25GFzvNBxTD8BH9Rpp9LA wmcQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789488086; x=1790092886; 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:content-type; bh=9YCy6DQ0BZQW71Ys8BPvP9f9laR4cAYvw0UQPtL7jF8=; b=a9QcjgY+yZwSEF9J+m+eA0eJK7qWgW7yeM92AITRLPgMnu4gPxATVmq/NXkgrnXxWx 4nQRRdqFPMaAmAn4M/dOXHx6Gfr2erJdgGlt4WSol0xbj2Dt4EQvauev/xUVjxOcv3iQ zPrMl+5XsUC2psyqEFN/Drol4KqX/q52hWkwZnArWY2beFBn3/de8dAYUGl5jkXmJTLU jgAlmHSpU5AGpCcGauKUoWnT2H0tzL2p+3veupqKKpJC0xEgBRvMZVAJzWolO1Z9lcWD yAto3jtHlOBHl00jCvQT8rpxksM1YBCpjOcP4vvvjJ8paA86gbkY4JD/pS/TMXJKQ6g4 e0uA== X-Gm-Message-State: AFuF++ljZisjdYTEO+uSDlYr+Pr78an2NKLxHGH+97HtcFnsDRpo7Efn 6ELW9baP6WkX6KKkwG4Z5iHSyb2m4/WaWQLURzkz/OklqeFe3gCuxYURbbesnA== X-Gm-Gg: AYBFou3v4ImG+CorT8dc2jFi9MJgHqEVtH714UdGhtmZU5ebF96k2Txda4ECEtKl7ct VMVxhOPku3O3izNSTrdpdJAN7KjMkV1IWPrP6wOaoCwy4zcCNiJBhybEjm5XXTe8G7DLSzp6z9U iyEthAUv51OiV081U8NJozo2rSfauGpOtgCAzSD2RmhKIi8Z1HAqIl07hb6lTgPSjC+grs9BAjU sIalpnN1MUDqg3MZjPjdte4UoDavhI8WVyyRefFYX5+H19C5OtxXdLftLARoEQgEQTxfTTuOi4b 68Xq101F29rV9iiC1y88zbm4Qh5eJKp7Kk31L9b5l+/P0Y/rSSRhG3OZ9s495s/+yuKDuDndirF 8YCZMnq7TWTiZqe8UBS2oREjx/hd0rj43Dcet9Dk/4UGjSiLZwna6FBDVHsAUc98CPCmP0wkkJM Q54bUlLJRDkJOAdUVV0j5uk1SOfWuU/N4VLCQQyOj0wVQOOy4q5bvpbngrOXJ7Xvja65xPSWTTu lZO3m+n6FTipOEw2J36TpQwz2Hf/CJ+hPNSrJ2wjLHCmg== X-Received: by 2002:a17:907:a089:b0:c25:c7a9:7b8a with SMTP id a640c23a62f3a-c29b86b80b0mr805978666b.12.1789488085815; Tue, 15 Sep 2026 09:01:25 -0700 (PDT) From: Ruslan Ruslichenko To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, artem_mygaiev@epam.com, volodymyr_babchuk@epam.com, peter.maydell@linaro.org, francisco.iglesias@amd.com, edgar.iglesias@gmail.com, berrange@redhat.com, eugene@nuvacore.ai, Ruslan_Ruslichenko@epam.com, takahiro.nakata.wr@renesas.com, "Edgar E . Iglesias" Subject: [PATCH v2 08/20] hw/core: Implement Remote Port response handling Date: Tue, 15 Sep 2026 18:00:32 +0200 Message-ID: <20260915160044.345788-9-ruslichenko.r@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260915160044.345788-1-ruslichenko.r@gmail.com> References: <20260915160044.345788-1-ruslichenko.r@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:34::10; envelope-from=ruslichenko.r@gmail.com; helo=mail-ej2-x10.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-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: 1789488320249158500 Content-Type: text/plain; charset="utf-8" From: Ruslan Ruslichenko Add infrastructure to handle transaction responses from remote peers. This patch enables QEMU to wait for replies when it initiates a memory access (Read/Write). It implements a mechanism to track outstanding transaction IDs and block the execution thread until the matching response is received. Signed-off-by: Edgar E. Iglesias Signed-off-by: Takahiro Nakata Signed-off-by: Ruslan Ruslichenko --- hw/core/remote-port.c | 133 +++++++++++++++++++++++++++++++++- hw/core/trace-events | 3 +- include/hw/core/remote-port.h | 29 ++++++++ 3 files changed, 163 insertions(+), 2 deletions(-) diff --git a/hw/core/remote-port.c b/hw/core/remote-port.c index 89f799493c..83515fc89c 100644 --- a/hw/core/remote-port.c +++ b/hw/core/remote-port.c @@ -35,6 +35,16 @@ =20 static void rp_event_read_and_process(RemotePort *s); =20 +void rp_rsp_mutex_lock(RemotePort *s) +{ + qemu_mutex_lock(&s->rsp_mutex); +} + +void rp_rsp_mutex_unlock(RemotePort *s) +{ + qemu_mutex_unlock(&s->rsp_mutex); +} + static void rp_fatal_error(RemotePort *s, const char *reason) { error_report("%s: %s", s->prefix, reason); @@ -80,6 +90,80 @@ static unsigned int rp_has_work(RemotePort *s) return work; } =20 +/* Response handling. */ +RemotePortRespSlot *rp_dev_timed_wait_resp(RemotePort *s, uint32_t dev, + uint32_t id, int timems) +{ + int i; + + assert(s->devs[dev]); + + /* Find a free slot. */ + for (i =3D 0; i < ARRAY_SIZE(s->dev_state[dev].rsp_queue); i++) { + if (s->dev_state[dev].rsp_queue[i].used =3D=3D false) { + break; + } + } + + if (i =3D=3D ARRAY_SIZE(s->dev_state[dev].rsp_queue) || + s->dev_state[dev].rsp_queue[i].used =3D=3D true) { + error_report("Number of outstanding transactions exceeded! %d", + RP_MAX_OUTSTANDING_TRANSACTIONS); + rp_fatal_error(s, "Internal error"); + } + + /* Got a slot, fill it in. */ + s->dev_state[dev].rsp_queue[i].id =3D id; + s->dev_state[dev].rsp_queue[i].valid =3D false; + s->dev_state[dev].rsp_queue[i].used =3D true; + + while (!s->dev_state[dev].rsp_queue[i].valid) { + rp_rsp_mutex_unlock(s); + rp_event_read_and_process(s); + rp_rsp_mutex_lock(s); + if (s->dev_state[dev].rsp_queue[i].valid) { + break; + } + if (!rp_has_work(s)) { + if (timems) { + if (!qemu_cond_timedwait(&s->progress_cond, &s->rsp_mutex, + timems)) { + /* + * TimeOut! + */ + break; + } + } else { + qemu_cond_wait(&s->progress_cond, &s->rsp_mutex); + } + } + } + return &s->dev_state[dev].rsp_queue[i]; +} + +RemotePortRespSlot *rp_dev_wait_resp(RemotePort *s, uint32_t dev, uint32_t= id) +{ + return rp_dev_timed_wait_resp(s, dev, id, 0); +} + +RemotePortDynPkt rp_wait_resp(RemotePort *s) +{ + while (!rp_dpkt_is_valid(&s->rspqueue)) { + rp_rsp_mutex_unlock(s); + rp_event_read_and_process(s); + rp_rsp_mutex_lock(s); + /* Need to recheck the condition with the rsp lock taken. */ + if (rp_dpkt_is_valid(&s->rspqueue)) { + break; + } + trace_rp_wait_resp(s->prefix); + if (!rp_has_work(s)) { + qemu_cond_wait(&s->progress_cond, &s->rsp_mutex); + } + } + return s->rspqueue; +} + static void rp_cmd_hello(RemotePort *s, struct rp_pkt *pkt) { s->peer.version =3D pkt->hello.version; @@ -220,13 +304,50 @@ static bool rp_pt_process_pkt(RemotePort *s, RemotePo= rtDynPkt *dpkt) { struct rp_pkt *pkt =3D dpkt->pkt; =20 - trace_rp_pt_process_pkt(s->prefix, pkt->hdr.cmd, pkt->hdr.id, pkt->hdr= .dev); + trace_rp_pt_process_pkt(s->prefix, pkt->hdr.cmd, pkt->hdr.id, pkt->hdr= .dev, + pkt->hdr.flags & RP_PKT_FLAGS_response); =20 if (pkt->hdr.dev >=3D ARRAY_SIZE(s->devs)) { /* FIXME: Respond with an error. */ return true; } =20 + if (pkt->hdr.flags & RP_PKT_FLAGS_response) { + uint32_t dev =3D pkt->hdr.dev; + uint32_t id =3D pkt->hdr.id; + int i; + + if (pkt->hdr.flags & RP_PKT_FLAGS_posted) { + return true; + } + + qemu_mutex_lock(&s->rsp_mutex); + + /* Try to find a per-device slot first. */ + for (i =3D 0; i < ARRAY_SIZE(s->dev_state[dev].rsp_queue); i++) { + if (s->devs[dev] && s->dev_state[dev].rsp_queue[i].used =3D=3D= true + && s->dev_state[dev].rsp_queue[i].id =3D=3D id) { + break; + } + } + + if (i < ARRAY_SIZE(s->dev_state[dev].rsp_queue)) { + /* Found a per device one. */ + assert(s->dev_state[dev].rsp_queue[i].valid =3D=3D false); + + rp_dpkt_swap(&s->dev_state[dev].rsp_queue[i].rsp, dpkt); + s->dev_state[dev].rsp_queue[i].valid =3D true; + + qemu_cond_signal(&s->progress_cond); + } else { + rp_dpkt_swap(&s->rspqueue, dpkt); + qemu_cond_signal(&s->progress_cond); + } + + qemu_mutex_unlock(&s->rsp_mutex); + return true; + } + switch (pkt->hdr.cmd) { case RP_CMD_hello: rp_cmd_hello(s, pkt); @@ -280,6 +401,7 @@ static void *rp_protocol_thread(void *arg) =20 /* Make sure we have a decent bufsize to start with. */ rp_dpkt_alloc(&s->rsp, sizeof s->rsp.pkt->busaccess + 1024); + rp_dpkt_alloc(&s->rspqueue, sizeof s->rspqueue.pkt->busaccess + 1024); for (i =3D 0; i < ARRAY_SIZE(s->rx_queue.pkt); i++) { rp_dpkt_alloc(&s->rx_queue.pkt[i], sizeof s->rx_queue.pkt[i].pkt->busaccess + 1024); @@ -407,6 +529,7 @@ static void rp_prop_allow_set_link(const Object *obj, c= onst char *name, static void rp_init(Object *obj) { RemotePort *s =3D REMOTE_PORT(obj); + int t; int i; =20 for (i =3D 0; i < REMOTE_PORT_MAX_DEVS; ++i) { @@ -416,6 +539,14 @@ static void rp_init(Object *obj) rp_prop_allow_set_link, OBJ_PROP_LINK_STRONG); g_free(name); + + + for (t =3D 0; t < RP_MAX_OUTSTANDING_TRANSACTIONS; t++) { + s->dev_state[i].rsp_queue[t].used =3D false; + s->dev_state[i].rsp_queue[t].valid =3D false; + rp_dpkt_alloc(&s->dev_state[i].rsp_queue[t].rsp, + sizeof s->dev_state[i].rsp_queue[t].rsp.pkt->busaccess + 10= 24); + } } } =20 diff --git a/hw/core/trace-events b/hw/core/trace-events index 612d5730b9..631cbb9c37 100644 --- a/hw/core/trace-events +++ b/hw/core/trace-events @@ -34,6 +34,7 @@ clock_set_mul_div(const char *clk, uint32_t oldmul, uint3= 2_t mul, uint32_t olddi cpu_reset(int cpu_index) "%d" =20 # remote-port.c -rp_pt_process_pkt(const char *rp, uint32_t cmd, uint32_t id, uint32_t dev)= "%s: cmd=3D0x%"PRIx32" id=3D0x%"PRIx32" dev=3D0x%"PRIx32 +rp_pt_process_pkt(const char *rp, uint32_t cmd, uint32_t id, uint32_t dev,= bool response) "%s: cmd=3D0x%"PRIx32" id=3D0x%"PRIx32" dev=3D0x%"PRIx32" r= sp=3D%d" rp_process(const char *rp, unsigned int rpos, unsigned int wpos, uint32_t = cmd, uint32_t dev) "%s: io-thread rpos=3D%u wpos=3D%u cmd=3D0x%"PRIx32" dev= =3D0x%"PRIx32 rp_pt_rx_queue_full(const char *rp, unsigned int rpos, unsigned int wpos) = "%s: rpos=3D%u wpos=3D%u" +rp_wait_resp(const char *rp) "'%s'" diff --git a/include/hw/core/remote-port.h b/include/hw/core/remote-port.h index 2d8a191bce..2cb070158f 100644 --- a/include/hw/core/remote-port.h +++ b/include/hw/core/remote-port.h @@ -55,6 +55,13 @@ typedef struct RemotePortDeviceClass { #define TYPE_REMOTE_PORT "remote-port" #define REMOTE_PORT(obj) OBJECT_CHECK(RemotePort, (obj), TYPE_REMOTE_PORT) =20 +typedef struct RemotePortRespSlot { + RemotePortDynPkt rsp; + uint32_t id; + bool used; + bool valid; +} RemotePortRespSlot; + struct RemotePort { DeviceState parent; =20 @@ -88,6 +95,13 @@ struct RemotePort { */ RemotePortDynPkt rsp; =20 + /* + * rspqueue holds received responses from the remote side. + * Only one for the moment but it might grow. + * Used by the master. + */ + RemotePortDynPkt rspqueue; + const char *prefix; const char *remote_prefix; =20 @@ -95,9 +109,24 @@ struct RemotePort { bool reset_done; =20 #define REMOTE_PORT_MAX_DEVS 1024 +#define RP_MAX_OUTSTANDING_TRANSACTIONS 32 + struct { + RemotePortRespSlot rsp_queue[RP_MAX_OUTSTANDING_TRANSACTIONS]; + } dev_state[REMOTE_PORT_MAX_DEVS]; + RemotePortDevice *devs[REMOTE_PORT_MAX_DEVS]; }; =20 + +void rp_rsp_mutex_lock(RemotePort *s); +void rp_rsp_mutex_unlock(RemotePort *s); + +RemotePortDynPkt rp_wait_resp(RemotePort *s); + +RemotePortRespSlot *rp_dev_wait_resp(RemotePort *s, uint32_t dev, uint32_t= id); +RemotePortRespSlot *rp_dev_timed_wait_resp(RemotePort *s, uint32_t dev, + uint32_t id, int timems); + void rp_process(RemotePort *s); =20 ssize_t rp_write(RemotePort *s, const void *buf, size_t count); --=20 2.43.0 From nobody Sat Sep 26 21:35:41 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=1789488343; cv=none; d=zohomail.com; s=zohoarc; b=k/CW61MzWq8JllELy8XbiaT1ZEyfFJ6Pc/bdqXh62VM3qgouQEnIgsM6KsuDxEYwlmJZNpWqFpUNyZQ8lgN1ICIa77G0cV4yrMqJI95SankluuxxOR4NUyu9QKkGgWWAJBfyhHi6N8lo0PX6RfmgQ5pyUPtn+L7Y3MKZCKduXUE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789488343; 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=zoG32e47nzyT1+1P/FMtjOhNvC0sbwGB9f+Z9JyESwI=; b=UtqH6aXGx/dFYPM/cSQY5dhM3Du8TjP8XyowsLkHHt0Tw+J6mWdq94StNLZmFX5O6OoddML4c71Snwt6fvdYBjhB+do63nTp5j1DRbEB53ukHLa3eWWPk4+WKV5Qf4pd7sDlXejBAa31pOweUFrKOrvnmnyOhIRNCACxCkZOLZU= 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 1789488343791334.18936920825035; Tue, 15 Sep 2026 09:05:43 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x6VbO-0007qg-AM; Tue, 15 Sep 2026 12:01:46 -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 1x6VbJ-0007mI-Sz for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:41 -0400 Received: from mail-ej2-x10.google.com ([2a00:1450:4864:34::10]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1x6VbH-0003Ql-1X for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:41 -0400 Received: by mail-ej2-x10.google.com with SMTP id a640c23a62f3a-c254fa663bfso656131566b.1 for ; Tue, 15 Sep 2026 09:01:28 -0700 (PDT) Received: from thinkpad-t470s.. (83-131-196-251.adsl.net.t-com.hr. [83.131.196.251]) by smtp.googlemail.com with ESMTPSA id a640c23a62f3a-c29ddd86344sm3235866b.0.2026.09.15.09.01.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 09:01:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789488088; x=1790092888; 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:content-type; bh=zoG32e47nzyT1+1P/FMtjOhNvC0sbwGB9f+Z9JyESwI=; b=KktQxsRp6BXGcR84NAMcy1yYmk0yUcaXbYzGbru/aZnFl2OM3PFiklYEBpRceVllT5 DhdHzmu29+RAHENKQh7DS0WOz9qVCRxxQnr5EFikqfuwKfBIuSbULwwVSJznJJ3wE5jT fDFwCYLD09pMH/+9K9luDbaM3iwNRBDfVwFt+veIL1PPZUVVkY3plAZlld9xqBnJGw7t UrnN/rEh6Ylh5ov6CSYBZ8qZjvDtoR/cYNK57uE5AKQrVLg6O3fRABjf3ISL2jDeIhRW IFCZkhlF/Es1CQ+RPw9SL1Wu0/uAAaR4dhr45bQh2Lc0zN0ySR57O6lHGtt/qqTO+b8z tdtQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789488088; x=1790092888; 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:content-type; bh=zoG32e47nzyT1+1P/FMtjOhNvC0sbwGB9f+Z9JyESwI=; b=XRSCx23VZPo0vOnA1mWB5YjIm6Yp9HN9KC3PrRd1s7mXvOgIRX1+EHUenIpBALpigV xSgBbOfa09A12u9qpHH41168VHHCgBtUZTUOjHa8QBK9pJlRIf7y0rCn2l5Gx/LG6yaF ejPqGpkldQf+hIbCF9b/Ai3lvvnhUxo+vsColwPIo7PRlz/UcpUVxsJN5oQGK9pTzXKW V9WZLhunebmXAgpiMzyrDNfMDYNdG/V2V05Zbpgw7+BHAPxvmZbtbcTfBCeUipj2P4Ry 2HZZR/tjPHM8poUQTJUVvgiV+d8nTCtBC4b8TLCqpLlblzoqT1rvl4ZsltqBNaqKeOHI /+1Q== X-Gm-Message-State: AFuF++kr+qVrdVmpiK/25GOTt4C/+zm726n844M8WnxtGQJ2zvz03MOd rB6ugzOFT0SpuIocCQ3TJY6B0XNEJ7AAT6Rt2EClm+dWpRs3z1e78gAAUzLTfA== X-Gm-Gg: AYBFou1psDaVkk1tLU5zYSFZUxnar7CJMQ1Wc+yeBRXzNRxwFsF1g/fQy3YW4uqtLVj u9sxBjSWZUUdU4gBZ4HnwrLjK0OhRSkULOsZKSRulzced0LeIe/bmGck5W5k0pTBgIN7Od1T8a/ ScrfrQRU0RKxM5b8O4can0e5Ix9rLV5cg2k2+uCY6i2gPXb8UKNyrKQWbIMfXEIHmxZCv67SKR/ Znj60LHo8ZsYMX10a3n1oZtCIZAiy4XNVoCKqKG99hGvVfLsbzS1f2Swet+wgCAfm1wWtXy70aL Xk4woh+28q9pIcxMKAW2OxxM6Ir7EueLKK2LwdpwC6kJEXNvUTTpL9Nhl6EFoT0BbNJlNwEv9kB k2qudrPiq7hLjGlwfqTCB86YkUrdOmV24te4R6GwPB9/+CN5uo1pIZbnR7TfNv1iXFAk5UUfdUC JITgfjULC/Of4w+7xj2UOq1jxCoqgFjvviwWxCV6r8jDz1DNuL54pcwW09McHhhgVjJHnRuUZMp q4Td2EhhsK3OmkO/vWM6b/EML34Vf9SmJf3qTcCdKmqsA== X-Received: by 2002:a17:907:9715:b0:c29:4357:2309 with SMTP id a640c23a62f3a-c29b8734d09mr968872466b.24.1789488087437; Tue, 15 Sep 2026 09:01:27 -0700 (PDT) From: Ruslan Ruslichenko To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, artem_mygaiev@epam.com, volodymyr_babchuk@epam.com, peter.maydell@linaro.org, francisco.iglesias@amd.com, edgar.iglesias@gmail.com, berrange@redhat.com, eugene@nuvacore.ai, Ruslan_Ruslichenko@epam.com, takahiro.nakata.wr@renesas.com, "Edgar E . Iglesias" Subject: [PATCH v2 09/20] hw/core: Implement Remote Port time synchronization Date: Tue, 15 Sep 2026 18:00:33 +0200 Message-ID: <20260915160044.345788-10-ruslichenko.r@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260915160044.345788-1-ruslichenko.r@gmail.com> References: <20260915160044.345788-1-ruslichenko.r@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:34::10; envelope-from=ruslichenko.r@gmail.com; helo=mail-ej2-x10.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-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: 1789488344420158500 Content-Type: text/plain; charset="utf-8" From: Ruslan Ruslichenko Add logic to synchronize QEMU's virtual time with the remote peer. The patch uses timers to periodically send sync requests to the peer and handle incoming sync requests to defer the response if the peer is ahead of QEMU's current time. This also adds the 'sync' and 'sync-quantum' QOM properties to configure this behavior. Signed-off-by: Edgar E. Iglesias Signed-off-by: Takahiro Nakata Signed-off-by: Ruslan Ruslichenko --- hw/core/remote-port.c | 175 +++++++++++++++++++++++++++++++++- include/hw/core/remote-port.h | 15 +++ 2 files changed, 188 insertions(+), 2 deletions(-) diff --git a/hw/core/remote-port.c b/hw/core/remote-port.c index 83515fc89c..4425ba1b08 100644 --- a/hw/core/remote-port.c +++ b/hw/core/remote-port.c @@ -14,6 +14,7 @@ #include "chardev/char.h" #include "system/cpus.h" #include "system/cpu-timers.h" +#include "exec/icount.h" #include "system/reset.h" #include "hw/core/sysbus.h" #include "hw/core/hw-error.h" @@ -35,6 +36,9 @@ =20 static void rp_event_read_and_process(RemotePort *s); =20 +static void sync_timer_hit(void *opaque); +static void syncresp_timer_hit(void *opaque); + void rp_rsp_mutex_lock(RemotePort *s) { qemu_mutex_lock(&s->rsp_mutex); @@ -45,9 +49,42 @@ void rp_rsp_mutex_unlock(RemotePort *s) qemu_mutex_unlock(&s->rsp_mutex); } =20 +int64_t rp_normalized_vmclk(RemotePort *s) +{ + int64_t clk; + + clk =3D qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); + clk -=3D s->peer.clk_base; + return clk; +} + +static void rp_restart_sync_timer_bare(RemotePort *s) +{ + if (!s->do_sync) { + return; + } + + if (s->sync.quantum) { + ptimer_stop(s->sync.ptimer); + ptimer_set_limit(s->sync.ptimer, s->sync.quantum, 1); + ptimer_run(s->sync.ptimer, 1); + } +} + +void rp_restart_sync_timer(RemotePort *s) +{ + if (s->doing_sync) { + return; + } + ptimer_transaction_begin(s->sync.ptimer); + rp_restart_sync_timer_bare(s); + ptimer_transaction_commit(s->sync.ptimer); +} + static void rp_fatal_error(RemotePort *s, const char *reason) { - error_report("%s: %s", s->prefix, reason); + int64_t clk =3D rp_normalized_vmclk(s); + error_report("%s: %s clk=3D%" PRIu64 " ns", s->prefix, reason, clk); exit(EXIT_FAILURE); } =20 @@ -181,6 +218,35 @@ static void rp_cmd_hello(RemotePort *s, struct rp_pkt = *pkt) } } =20 +static void rp_cmd_sync(RemotePort *s, struct rp_pkt *pkt) +{ + size_t enclen; + int64_t clk; + int64_t diff; + + assert(!(pkt->hdr.flags & RP_PKT_FLAGS_response)); + + clk =3D rp_normalized_vmclk(s); + diff =3D pkt->sync.timestamp - clk; + + enclen =3D rp_encode_sync_resp(pkt->hdr.id, pkt->hdr.dev, &s->sync.rsp= .sync, + pkt->sync.timestamp); + assert(enclen =3D=3D sizeof s->sync.rsp.sync); + + /* We have temporarily disabled blocking syncs into QEMU. */ + if (diff <=3D 0LL || true) { + /* We are already a head of time. Respond and issue a sync. */ + rp_write(s, (void *) &s->sync.rsp, enclen); + return; + } + + ptimer_transaction_begin(s->sync.ptimer_resp); + ptimer_set_limit(s->sync.ptimer_resp, diff, 1); + ptimer_run(s->sync.ptimer_resp, 1); + s->sync.resp_timer_enabled =3D true; + ptimer_transaction_commit(s->sync.ptimer_resp); +} + static void rp_say_hello(RemotePort *s) { struct rp_pkt_hello pkt; @@ -202,6 +268,52 @@ static void rp_say_hello(RemotePort *s) } } =20 +static void rp_say_sync(RemotePort *s, int64_t clk) +{ + struct rp_pkt_sync pkt; + size_t len; + + len =3D rp_encode_sync(s->current_id++, 0, &pkt, clk); + rp_write(s, (void *) &pkt, len); +} + +static void syncresp_timer_hit(void *opaque) +{ + RemotePort *s =3D REMOTE_PORT(opaque); + + s->sync.resp_timer_enabled =3D false; + rp_write(s, (void *) &s->sync.rsp, sizeof s->sync.rsp.sync); + memset(&s->sync.rsp, 0, sizeof s->sync.rsp); +} + +static void sync_timer_hit(void *opaque) +{ + RemotePort *s =3D REMOTE_PORT(opaque); + int64_t clk; + RemotePortDynPkt rsp; + + clk =3D rp_normalized_vmclk(s); + if (s->sync.resp_timer_enabled) { + s->sync.need_sync =3D true; + rp_restart_sync_timer_bare(s); + return; + } + + /* Sync. */ + s->doing_sync =3D true; + s->sync.need_sync =3D false; + qemu_mutex_lock(&s->rsp_mutex); + /* Send the sync. */ + rp_say_sync(s, clk); + + rsp =3D rp_wait_resp(s); + rp_dpkt_invalidate(&rsp); + qemu_mutex_unlock(&s->rsp_mutex); + s->doing_sync =3D false; + + rp_restart_sync_timer_bare(s); +} + void rp_process(RemotePort *s) { while (true) { @@ -240,7 +352,9 @@ void rp_process(RemotePort *s) } =20 switch (pkt->hdr.cmd) { - /* TBD */ + case RP_CMD_sync: + rp_cmd_sync(s, pkt); + break; default: assert(actioned); } @@ -300,6 +414,33 @@ static void rp_pt_handover_pkt(RemotePort *s, RemotePo= rtDynPkt *dpkt) } while (full); } =20 +static bool rp_pt_cmd_sync(RemotePort *s, struct rp_pkt *pkt) +{ + size_t enclen; + int64_t clk; + int64_t diff =3D 0; + struct rp_pkt rsp; + + assert(!(pkt->hdr.flags & RP_PKT_FLAGS_response)); + + if (use_icount) { + clk =3D rp_normalized_vmclk(s); + diff =3D pkt->sync.timestamp - clk; + } + enclen =3D rp_encode_sync_resp(pkt->hdr.id, pkt->hdr.dev, &rsp.sync, + pkt->sync.timestamp); + assert(enclen =3D=3D sizeof rsp.sync); + + if (!use_icount || diff < s->sync.quantum) { + /* We are still OK. */ + rp_write(s, (void *) &rsp, enclen); + return true; + } + + /* We need IO or CPU thread sync. */ + return false; +} + static bool rp_pt_process_pkt(RemotePort *s, RemotePortDynPkt *dpkt) { struct rp_pkt *pkt =3D dpkt->pkt; @@ -352,6 +493,11 @@ static bool rp_pt_process_pkt(RemotePort *s, RemotePor= tDynPkt *dpkt) case RP_CMD_hello: rp_cmd_hello(s, pkt); break; + case RP_CMD_sync: + if (rp_pt_cmd_sync(s, pkt)) { + return true; + } + /* Fall-through. */ case RP_CMD_read: case RP_CMD_write: case RP_CMD_interrupt: @@ -446,6 +592,7 @@ static void rp_reset(DeviceState *dev) qemu_thread_create(&s->thread, "remote-port", rp_protocol_thread, s, QEMU_THREAD_JOINABLE); =20 + rp_restart_sync_timer(s); s->reset_done =3D true; } =20 @@ -454,6 +601,8 @@ static void rp_realize(DeviceState *dev, Error **errp) RemotePort *s =3D REMOTE_PORT(dev); Chardev *chr =3D NULL; =20 + s->peer.clk_base =3D qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); + qemu_mutex_init(&s->write_mutex); qemu_mutex_init(&s->rsp_mutex); qemu_cond_init(&s->progress_cond); @@ -485,6 +634,25 @@ static void rp_realize(DeviceState *dev, Error **errp) rp_event_read_cb, NULL, NULL); =20 + /* + * Pick up the quantum from the local property setup. + * After config negotiation with the peer, sync.quantum value might + * change. + */ + s->sync.quantum =3D s->peer.local_cfg.quantum; + + s->sync.ptimer =3D ptimer_init(sync_timer_hit, s, PTIMER_POLICY_LEGACY= ); + s->sync.ptimer_resp =3D ptimer_init(syncresp_timer_hit, s, + PTIMER_POLICY_LEGACY); + + /* The Sync-quantum is expressed in nano-seconds. */ + ptimer_transaction_begin(s->sync.ptimer); + ptimer_set_freq(s->sync.ptimer, 1000 * 1000 * 1000); + ptimer_transaction_commit(s->sync.ptimer); + + ptimer_transaction_begin(s->sync.ptimer_resp); + ptimer_set_freq(s->sync.ptimer_resp, 1000 * 1000 * 1000); + ptimer_transaction_commit(s->sync.ptimer_resp); =20 qemu_sem_init(&s->rx_queue.sem, ARRAY_SIZE(s->rx_queue.pkt) - 1); } @@ -519,6 +687,9 @@ static const VMStateDescription vmstate_rp =3D { =20 static Property rp_properties[] =3D { DEFINE_PROP_STRING("chrdev-id", RemotePort, chrdev_id), + DEFINE_PROP_BOOL("sync", RemotePort, do_sync, false), + DEFINE_PROP_UINT64("sync-quantum", RemotePort, peer.local_cfg.quantum, + 1000000), }; =20 static void rp_prop_allow_set_link(const Object *obj, const char *name, diff --git a/include/hw/core/remote-port.h b/include/hw/core/remote-port.h index 2cb070158f..e16661af03 100644 --- a/include/hw/core/remote-port.h +++ b/include/hw/core/remote-port.h @@ -17,6 +17,7 @@ #include "chardev/char-fe.h" #include "qobject/qdict.h" #include "qemu/event_notifier.h" +#include "hw/core/ptimer.h" =20 #define TYPE_REMOTE_PORT_DEVICE "remote-port-device" =20 @@ -69,6 +70,8 @@ struct RemotePort { EventNotifier event_notifier; Chardev *chrdev; CharFrontend chr; + bool do_sync; + bool doing_sync; bool finalizing; /* To serialize writes to fd. */ QemuMutex write_mutex; @@ -76,6 +79,15 @@ struct RemotePort { char *chrdev_id; struct rp_peer_state peer; =20 + struct { + ptimer_state *ptimer; + ptimer_state *ptimer_resp; + bool resp_timer_enabled; + bool need_sync; + struct rp_pkt rsp; + uint64_t quantum; + } sync; + QemuMutex rsp_mutex; QemuCond progress_cond; =20 @@ -126,6 +138,9 @@ RemotePortDynPkt rp_wait_resp(RemotePort *s); RemotePortRespSlot *rp_dev_wait_resp(RemotePort *s, uint32_t dev, uint32_t= id); RemotePortRespSlot *rp_dev_timed_wait_resp(RemotePort *s, uint32_t dev, uint32_t id, int timems); +void rp_restart_sync_timer(RemotePort *s); + +int64_t rp_normalized_vmclk(RemotePort *s); =20 void rp_process(RemotePort *s); =20 --=20 2.43.0 From nobody Sat Sep 26 21:35:41 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=1789488169; cv=none; d=zohomail.com; s=zohoarc; b=QdQk65SS4UabmqLI7/FORAZKRFQn8oYYPQVXdYRrN+xJzm4cFJl1JAibZY65K89f2bQHhfH67TXxQAhYWZC7aGPsMGnlEDmNf2TD5tSdd0Bkk+N/rX3MuEnetQxENEjbCfbEW8rpcxrCyx3U3XdFny7ItWcds9uCLq43lNySSfw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789488169; 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=6Ix6Bz84rGwLrSJHlstEkxjqG1KUrjUEpiFi8wTHgT8=; b=gYdNUY6oYibjdrmtoCHWhWHhpU2VUfGQgwkgGSqqNIH5mSrysZe3BeesQzpUzfh0wUFq+iT7Knf0EKTrVuhCSJn0cyWPRM/c+zPAvBUSPn7QvzYaA7QbuG9fTox0y6lILviYAT+yomWxvyd/Boqq39kUgXB4Pxx6d5Edwm3Rp04= 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 1789488169501568.3246575448417; Tue, 15 Sep 2026 09:02:49 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x6VbN-0007pn-0L; Tue, 15 Sep 2026 12:01:45 -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 1x6VbL-0007oZ-UF for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:43 -0400 Received: from mail-ej2-x10.google.com ([2a00:1450:4864:34::10]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1x6VbI-0003R5-Q9 for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:43 -0400 Received: by mail-ej2-x10.google.com with SMTP id a640c23a62f3a-c29703cb470so633978466b.0 for ; Tue, 15 Sep 2026 09:01:30 -0700 (PDT) Received: from thinkpad-t470s.. (83-131-196-251.adsl.net.t-com.hr. [83.131.196.251]) by smtp.googlemail.com with ESMTPSA id a640c23a62f3a-c29ddd86344sm3235866b.0.2026.09.15.09.01.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 09:01:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789488089; x=1790092889; 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:content-type; bh=6Ix6Bz84rGwLrSJHlstEkxjqG1KUrjUEpiFi8wTHgT8=; b=lWxhlnXZYy0w2+uGKRKRTP9AWSvZUVX3CaBIcpkXsbQWYJScKZVhQN3yh2lGcZ6oQl DYiPwK3GzZ5PKZ1XYlNg3G+KCR++0afOYMkakZh9HIJ2/OsASo5Bck2/sCuE+ZEMVJmg +SYhxN8vkWwMxQ+2dPyN1YwJ970BBqY6YZMIH6gw/InCzoAt17x7fz0chsv5XEKvtQYd DHYQ+chmXvF7Q+ThanUxImp1dugxlMYpc+j5iGeih+LT+qY9slGfY3CMS+/Z4kGCvXrQ EyCDz2oBLzReQ23MaszRAOQ1Wc+ERR0VcfhJ2o+19ZF8O5yUxt7diOEDs13hX5M8Z/yt GUqA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789488089; x=1790092889; 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:content-type; bh=6Ix6Bz84rGwLrSJHlstEkxjqG1KUrjUEpiFi8wTHgT8=; b=Opt6Twxlc04mpIVhwmM13Yb2UIFbzDahty48efRefXoLkKJaMsFaAeQs6/Td6SbPDF hB6S5k8nMMYTNBWqdgNPGt+Iwfyo1pQxFQXx9VmGUddKvMa3IIfFHVXlj7RETyg8tGKe Xso3JHo5fQ25JVQSNlBjvFxEUfnQTYQb4tGIUSRdZxu2Au2v0X32PywXXwmcXZnv7kt+ ql4DoKzzUo2c5UvPlxnoRRK7Fds8XpwfHWmBm0Z6LNCX3VCdaRbRs5W0bwBLpQM1WYC6 aa1U1TuumHUnwdyKwslhdZVs6JB9iGlMa9/iBTzgcUa38BOjK3qmZGHVbUKnX1A1eCEW 1gww== X-Gm-Message-State: AFuF++k3VJxwaq+5DbwebeVI3g32iCoiI7/83jofpTtbks+CUYxnDvdv K82bfnU9Jqm/1/kUrA1TZbJMnmGAXSy+jcXXWv5Mqtw9acF6Ce/r4b6h2zPSYA== X-Gm-Gg: AYBFou3dNxW3aEj6HsVDNlervmw/rnOpLzshQZAUddS8C2I4mmatQVPpwSYxKgM98Tv bSQmna0wdFa1vkDgaYjjXl/KF+74ZoqDtKGG9xQohxcopn/ABMfLpH/R7etERbf6K2eNEzWTYHL ojCdvNvjFK581A5+VCjU6eEBap1FyVB26+o2O7vN2/fiT1z/HHak2bKX/qxmYvNEpWU/8ZxIoY/ 2YO2MuUdCJ688vdzDNMFrEZ5FRLyZj8YLm+prqNLnS4AX411mbqwUKXyTfrZUoa5oTobHUPTHEL 97y8GtGsg78ZfdXVY6JdAeYhNTNoTQe9WvRQXZ9YObPdbOan3eaRCL1bfd5IxmPvYvzmYHXoXJo /vsNrPpO48XzUaP4X4evEa7C/An7xrlLCgkyj/a7LhSI5FHl6Xi7/quL9lWRsw856NeMv4CGi/q 4JTACrZeUj372WKta2u0pjFPgg3okMfid93xqkzVX5yb/rk4f0lrqltNE84mLPhD99kxfNwSFnn E8eU6mvtJ4lBDzM1MuhvY+3Yo0iakqBDBQCqACOn75s5w== X-Received: by 2002:a17:907:3f22:b0:c29:4490:50c8 with SMTP id a640c23a62f3a-c29b8601f32mr1074764966b.8.1789488089244; Tue, 15 Sep 2026 09:01:29 -0700 (PDT) From: Ruslan Ruslichenko To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, artem_mygaiev@epam.com, volodymyr_babchuk@epam.com, peter.maydell@linaro.org, francisco.iglesias@amd.com, edgar.iglesias@gmail.com, berrange@redhat.com, eugene@nuvacore.ai, Ruslan_Ruslichenko@epam.com, takahiro.nakata.wr@renesas.com, "Edgar E . Iglesias" Subject: [PATCH v2 10/20] hw/core: Add Remote Port Memory Master object skeleton Date: Tue, 15 Sep 2026 18:00:34 +0200 Message-ID: <20260915160044.345788-11-ruslichenko.r@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260915160044.345788-1-ruslichenko.r@gmail.com> References: <20260915160044.345788-1-ruslichenko.r@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:34::10; envelope-from=ruslichenko.r@gmail.com; helo=mail-ej2-x10.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-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: 1789488170867158501 Content-Type: text/plain; charset="utf-8" From: Ruslan Ruslichenko Introduce 'remote-port-memory-master' device skeleton. This device exposes a MemoryRegion within QEMU that represents resources located in the external simulator. When implemented fully, read/write accesses to the region will be encapsulated into Remote Port packets and transmitted to the peer. This enables QEMU to map remote peripherals or memory into its own address space. Signed-off-by: Edgar E. Iglesias Signed-off-by: Takahiro Nakata Signed-off-by: Ruslan Ruslichenko --- hw/core/remote-port-memory-master.c | 152 ++++++++++++++++++++ hw/core/remote-port.c | 19 +++ include/hw/core/remote-port-memory-master.h | 81 +++++++++++ include/hw/core/remote-port.h | 4 + 4 files changed, 256 insertions(+) create mode 100644 hw/core/remote-port-memory-master.c create mode 100644 include/hw/core/remote-port-memory-master.h diff --git a/hw/core/remote-port-memory-master.c b/hw/core/remote-port-memo= ry-master.c new file mode 100644 index 0000000000..4b0283f9fe --- /dev/null +++ b/hw/core/remote-port-memory-master.c @@ -0,0 +1,152 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * QEMU remote port memory master. + * + * Copyright (c) 2014 Xilinx Inc + * Written by Edgar E. Iglesias + * + * This code is licensed under the GNU GPL. + */ + +#include "qemu/osdep.h" +#include "system/system.h" +#include "qemu/log.h" +#include "qapi/qmp/qerror.h" +#include "qapi/error.h" +#include "hw/core/sysbus.h" +#include "migration/vmstate.h" +#include "hw/core/qdev-properties.h" +#include "trace.h" + +#include "hw/core/remote-port-proto.h" +#include "hw/core/remote-port.h" +#include "hw/core/remote-port-memory-master.h" + +#define REMOTE_PORT_MEMORY_MASTER_PARENT_CLASS \ + object_class_get_parent( \ + object_class_by_name(TYPE_REMOTE_PORT_MEMORY_MASTER)) + +#define RP_MAX_ACCESS_SIZE 4096 + +static MemTxResult rp_mm_read(void *opaque, hwaddr addr, uint64_t *data, + unsigned size, MemTxAttrs attrs) +{ + /* TBD */ + return MEMTX_OK; +} + +static MemTxResult rp_mm_write(void *opaque, hwaddr addr, uint64_t data, + unsigned size, MemTxAttrs attrs) +{ + /* TBD */ + return MEMTX_OK; +} + +static const MemoryRegionOps rp_ops_template =3D { + .read_with_attrs =3D rp_mm_read, + .write_with_attrs =3D rp_mm_write, + .valid.max_access_size =3D RP_MAX_ACCESS_SIZE, + .valid.unaligned =3D true, + .impl.max_access_size =3D RP_MAX_ACCESS_SIZE, + .impl.unaligned =3D false, + .endianness =3D DEVICE_LITTLE_ENDIAN, +}; + +static void rp_memory_master_realize(DeviceState *dev, Error **errp) +{ + RemotePortMemoryMaster *s =3D REMOTE_PORT_MEMORY_MASTER(dev); + RemotePortDevice *rpd =3D REMOTE_PORT_DEVICE(dev); + int i; + + /* Sanity check max access size. */ + if (s->max_access_size > RP_MAX_ACCESS_SIZE) { + error_setg(errp, "%s: max-access-size %d too large! MAX is %d", + TYPE_REMOTE_PORT_MEMORY_MASTER, s->max_access_size, + RP_MAX_ACCESS_SIZE); + return; + } + + if (s->max_access_size < 4) { + error_setg(errp, "%s: max-access-size %d too small! MIN is 4", + TYPE_REMOTE_PORT_MEMORY_MASTER, s->max_access_size); + return; + } + + assert(s->rp); + + rp_register_dev(s->rp, rpd, s->rp_dev); + + s->peer =3D rp_get_peer(s->rp); + + /* Create a single static region if configuration says so. */ + if (s->map_num) { + /* Initialize rp_ops from template. */ + s->rp_ops =3D g_malloc(sizeof *s->rp_ops); + memcpy(s->rp_ops, &rp_ops_template, sizeof *s->rp_ops); + s->rp_ops->valid.max_access_size =3D s->max_access_size; + s->rp_ops->impl.max_access_size =3D s->max_access_size; + + s->mmaps =3D g_new0(typeof(*s->mmaps), s->map_num); + for (i =3D 0; i < s->map_num; ++i) { + char *name =3D g_strdup_printf("rp-%d", i); + + s->mmaps[i].offset =3D s->map_offset; + memory_region_init_io(&s->mmaps[i].iomem, OBJECT(dev), s->rp_o= ps, + &s->mmaps[i], name, s->map_size); + sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->mmaps[i].iomem); + s->mmaps[i].parent =3D s; + g_free(name); + } + } +} + +static void rp_prop_allow_set_link(const Object *obj, const char *name, + Object *val, Error **errp) +{ +} + +static void rp_memory_master_init(Object *obj) +{ + RemotePortMemoryMaster *rpms =3D REMOTE_PORT_MEMORY_MASTER(obj); + object_property_add_link(obj, "rp-adaptor0", "remote-port", + (Object **)&rpms->rp, + rp_prop_allow_set_link, + OBJ_PROP_LINK_STRONG); +} + +static Property rp_properties[] =3D { + DEFINE_PROP_UINT32("map-num", RemotePortMemoryMaster, map_num, 0), + DEFINE_PROP_UINT64("map-offset", RemotePortMemoryMaster, map_offset, 0= ), + DEFINE_PROP_UINT64("map-size", RemotePortMemoryMaster, map_size, 0), + DEFINE_PROP_UINT32("rp-chan0", RemotePortMemoryMaster, rp_dev, 0), + DEFINE_PROP_BOOL("relative", RemotePortMemoryMaster, relative, false), + DEFINE_PROP_UINT32("max-access-size", RemotePortMemoryMaster, + max_access_size, RP_MAX_ACCESS_SIZE), +}; + +static void rp_memory_master_class_init(ObjectClass *oc, const void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(oc); + device_class_set_props_n(dc, rp_properties, ARRAY_SIZE(rp_properties)); + dc->realize =3D rp_memory_master_realize; +} + +static const TypeInfo rp_info =3D { + .name =3D TYPE_REMOTE_PORT_MEMORY_MASTER, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(RemotePortMemoryMaster), + .instance_init =3D rp_memory_master_init, + .class_init =3D rp_memory_master_class_init, + .interfaces =3D (InterfaceInfo[]) { + { TYPE_REMOTE_PORT_DEVICE }, + { }, + }, +}; + +static void rp_register_types(void) +{ + type_register_static(&rp_info); +} + +type_init(rp_register_types) diff --git a/hw/core/remote-port.c b/hw/core/remote-port.c index 4425ba1b08..b4c9fa1528 100644 --- a/hw/core/remote-port.c +++ b/hw/core/remote-port.c @@ -81,6 +81,20 @@ void rp_restart_sync_timer(RemotePort *s) ptimer_transaction_commit(s->sync.ptimer); } =20 +void rp_register_dev(RemotePort *s, RemotePortDevice *dev, uint32_t chan) +{ + assert(chan < REMOTE_PORT_MAX_DEVS); + + /* Skip if device registered via 'remote-port-dev%d' property */ + if (s->devs[chan] =3D=3D dev) { + return; + } + + assert(!s->devs[chan]); + + s->devs[chan] =3D dev; +} + static void rp_fatal_error(RemotePort *s, const char *reason) { int64_t clk =3D rp_normalized_vmclk(s); @@ -721,6 +735,11 @@ static void rp_init(Object *obj) } } =20 +struct rp_peer_state *rp_get_peer(RemotePort *s) +{ + return &s->peer; +} + static void rp_class_init(ObjectClass *klass, const void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); diff --git a/include/hw/core/remote-port-memory-master.h b/include/hw/core/= remote-port-memory-master.h new file mode 100644 index 0000000000..011867f366 --- /dev/null +++ b/include/hw/core/remote-port-memory-master.h @@ -0,0 +1,81 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * QEMU remote port memory master. Read and write transactions + * recieved from QEMU are transmitted over remote-port. + * + * Copyright (c) 2020 Xilinx Inc + * Written by Edgar E. Iglesias + * + * This code is licensed under the GNU GPL. + */ +#ifndef REMOTE_PORT_MEMORY_MASTER_H +#define REMOTE_PORT_MEMORY_MASTER_H + +#include "hw/core/remote-port.h" + +#define TYPE_REMOTE_PORT_MEMORY_MASTER "remote-port-memory-master" +#define REMOTE_PORT_MEMORY_MASTER(obj) \ + OBJECT_CHECK(RemotePortMemoryMaster, (obj), \ + TYPE_REMOTE_PORT_MEMORY_MASTER) + +typedef struct RemotePortMemoryMaster RemotePortMemoryMaster; + +typedef struct RemotePortMap { + void *parent; + MemoryRegion iomem; + uint32_t rp_dev; + uint64_t offset; +} RemotePortMap; + +struct RemotePortMemoryMaster { + /* private */ + SysBusDevice parent; + + MemoryRegionOps *rp_ops; + RemotePortMap *mmaps; + + /* public */ + uint32_t map_num; + uint64_t map_offset; + uint64_t map_size; + uint32_t rp_dev; + bool relative; + uint32_t max_access_size; + struct RemotePort *rp; + struct rp_peer_state *peer; + int rp_timeout; +}; + +typedef struct RPMemoryTransaction { + union { + /* + * Data is passed by values up to 64bit sizes. Beyond + * that, a pointer is passed in p8. + * + * Note that p8 has no alignment restrictions. + */ + uint8_t *p8; + uint64_t u64; + uint32_t u32; + uint16_t u16; + uint8_t u8; + } data; + bool rw; + hwaddr addr; + unsigned int size; + MemTxAttrs attr; + void *opaque; +} RPMemoryTransaction; + +MemTxResult rp_mm_access(RemotePort *rp, uint32_t rp_dev, + struct rp_peer_state *peer, + RPMemoryTransaction *tr, + bool relative, uint64_t offset); + +MemTxResult rp_mm_access_with_def_attr(RemotePort *rp, uint32_t rp_dev, + struct rp_peer_state *peer, + RPMemoryTransaction *tr, + bool relative, uint64_t offset, + uint32_t def_attr); +#endif diff --git a/include/hw/core/remote-port.h b/include/hw/core/remote-port.h index e16661af03..cef7471a73 100644 --- a/include/hw/core/remote-port.h +++ b/include/hw/core/remote-port.h @@ -129,6 +129,8 @@ struct RemotePort { RemotePortDevice *devs[REMOTE_PORT_MAX_DEVS]; }; =20 +void rp_register_dev(RemotePort *s, RemotePortDevice *dev, uint32_t chan); + =20 void rp_rsp_mutex_lock(RemotePort *s); void rp_rsp_mutex_unlock(RemotePort *s); @@ -146,4 +148,6 @@ void rp_process(RemotePort *s); =20 ssize_t rp_write(RemotePort *s, const void *buf, size_t count); =20 +struct rp_peer_state *rp_get_peer(RemotePort *s); + #endif --=20 2.43.0 From nobody Sat Sep 26 21:35:41 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=1789488212; cv=none; d=zohomail.com; s=zohoarc; b=BIscjs2QWNfmBlkVVGC9RdemXv3MjOltTkJC4IPdJmWN68X8icF4eolfq3Nl3N0TFkdyaehG6IzKFo7/fvhUayTkpzfyj0RSKzYFkLgdJBQ+C//3mB9APcjRfnVbgNBi6WCU6GkXf2JYV5cdQEAmHdPbcIYcUxJ2yhNKePSebNM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789488212; 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=zwMKlS2VrjCsV9DFKblvAqWVEdyn/Vlz9Y/BIWWjlFo=; b=CQLCj8k2Fu4jqwG9s7ThvMjgAxxhHMs5mAbC+gaYFqMUWvcElyxu6FzMd0HjJo5OZ6rDDKN3q1zKx9qnTogh/zS0qYIOQvvfRq8knoUBtJdcMXUAtDIgSYMavO7JQgqTHt+MtlP5P+QNIpaet/JBMrS4yJ2Iev9MDPZ62ky+SY4= 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 1789488212852516.199444676663; Tue, 15 Sep 2026 09:03:32 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x6VbS-00086D-AI; Tue, 15 Sep 2026 12:01:50 -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 1x6VbP-0007rT-4r for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:47 -0400 Received: from mail-ej2-x10.google.com ([2a00:1450:4864:34::10]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1x6VbK-0003RI-Bv for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:46 -0400 Received: by mail-ej2-x10.google.com with SMTP id a640c23a62f3a-c254f9f7dbfso77504066b.2 for ; Tue, 15 Sep 2026 09:01:32 -0700 (PDT) Received: from thinkpad-t470s.. (83-131-196-251.adsl.net.t-com.hr. [83.131.196.251]) by smtp.googlemail.com with ESMTPSA id a640c23a62f3a-c29ddd86344sm3235866b.0.2026.09.15.09.01.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 09:01:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789488091; x=1790092891; 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:content-type; bh=zwMKlS2VrjCsV9DFKblvAqWVEdyn/Vlz9Y/BIWWjlFo=; b=LxlOX+FeALXWiGyEzwUywkNC5uUcrrXicasTNZHzxpUa0g+oGgid+fMortj2Fq80Wv yuHl3sWY89az2ncj9YLEWlxVL7TIuUa4ZSAEqgRyuWYz6zTwlh1XwND4p9vY83YPMnh7 Qr/N1yOVP1OK9Pez6L0xqk6t70IQ+pFn2SADZmbWZXyGfaG333zp+UrVwSWiIlHFAsk5 Svzs9iEbDhks5kxJT0xAkjxX7ifME9rZpup5NQhDzLBVF169qrvbT50Xt88KRDvrEJeE 4VXlr+lAGTP0wS35gzBwNkjoJ24pZgsacecTOf9eyWqrRkUBIBcLeTO7B+sjI3NfYhKg 0Jzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789488091; x=1790092891; 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:content-type; bh=zwMKlS2VrjCsV9DFKblvAqWVEdyn/Vlz9Y/BIWWjlFo=; b=C3gurkskdspZc4nT7uSdUOvTvIoquGia4hL0/l1jb6lKhHJ9e6YnM3PyF9fm0P0D1O Rrf+J8PAj0Wg5SpE4mgpWrKalsvxhbx8SwMkCE0w5yHVjHOoqzaWDH1UfqTrG3HbGZ+d 634Sxs0D9E/0Jm4N2kaZoHF2UEtSeolRpHafYaRSkVnDoJdr/mbrmNxAe/Uo1AS2d8nx xaZaH9F+k0c3cEFBFHOFgYuP9s5/Fr0MjpzpQ64PqPAbiD2J2+RHrYZG0louaaeasz3Q SYnmfUjFBix/otlkgqJPooCzDaKBiIxzsouz8xn7f3HX81MSrVVKo8X4eSKhWZCC74+R DW7A== X-Gm-Message-State: AFuF++kcx/biSrakgNnbiNDQPW/C18fTnohd+F18aYpfxOTCdqI4J1eY 7yGCeAxlO/wv7sc0wsJmiPbalFitmDiNUOIeaaYQ5Odo8lKt5/0TGoi3JflFBQ== X-Gm-Gg: AYBFou0zAlZ/MtCgqiscDp9eQ6CLUAV3Jex0xzrxPHR7zATLDXlOTU8sfELZwfRELXp Iz4f+rC6H6sXYH9+NwBCFRZ1I23VzvBCL1HhJlY7usJhFoc+5WqvqiXJCJ3WTcckIILk5Vn5wCg X0Nh6bbUPzO5cufdVS0TF3wkmVUAZHnjxe9fgB3wCS0Kfe1WaDJKrR/JdJ5oiRYp4uut6xTzFhR td96d/7xphybkjBc0bakYQKhZm0UrO2E9cpTk6+4Ueh/UX2BGqjYeLjKUNfAdkx4e4GoIbJVsmm UYocxkZfwJeItdBWHLbArnfvs4lLLDpur9H2B2ZfIjsq7D2qBVNTJSdPTB9eygvkewIwVqgueLI /C3XxW17YvtWofOVjh2PoPJbRwtdmIcEj4dgrBCso6HaWa12yjwA8uzOhjBE61Oe/28JjlU3ved 29+QcLkMSPHt+MbQpCREL5n9vFCSKc5PPCKmJHg+AXBld5HwRR7z2EKSF0Z16N2A0MVxIavw5h+ cjJ7H+qggANa89THUCXraadWxhZZ0Aurw+55T4E/LsHgjk= X-Received: by 2002:a17:907:3e29:b0:c26:19de:9ae1 with SMTP id a640c23a62f3a-c29d78ed54dmr127476566b.32.1789488090831; Tue, 15 Sep 2026 09:01:30 -0700 (PDT) From: Ruslan Ruslichenko To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, artem_mygaiev@epam.com, volodymyr_babchuk@epam.com, peter.maydell@linaro.org, francisco.iglesias@amd.com, edgar.iglesias@gmail.com, berrange@redhat.com, eugene@nuvacore.ai, Ruslan_Ruslichenko@epam.com, takahiro.nakata.wr@renesas.com, "Edgar E . Iglesias" Subject: [PATCH v2 11/20] hw/core: Implement Remote Port Memory Master bus transactions Date: Tue, 15 Sep 2026 18:00:35 +0200 Message-ID: <20260915160044.345788-12-ruslichenko.r@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260915160044.345788-1-ruslichenko.r@gmail.com> References: <20260915160044.345788-1-ruslichenko.r@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:34::10; envelope-from=ruslichenko.r@gmail.com; helo=mail-ej2-x10.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-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: 1789488215317158500 Content-Type: text/plain; charset="utf-8" From: Ruslan Ruslichenko Implement the core access handlers for the Remote Port Memory Master device, which enables QEMU to initiate memory-mapped transaction to remote peers. The patch adds support for: - Translation of QEMU memory region read/write into Remote Port read/write packets - Support for propagating of transaction attributes (Secure, MasterID) - Synchronous response waiting with optional timeout (timeout configuration to be added within later patches) - Add trace events for monitoring TX/RX bus transactions Signed-off-by: Edgar E. Iglesias Signed-off-by: Takahiro Nakata Signed-off-by: Ruslan Ruslichenko --- hw/core/remote-port-memory-master.c | 191 +++++++++++++++++++++++++++- hw/core/remote-port.c | 5 + hw/core/trace-events | 4 + include/hw/core/remote-port.h | 11 ++ 4 files changed, 207 insertions(+), 4 deletions(-) diff --git a/hw/core/remote-port-memory-master.c b/hw/core/remote-port-memo= ry-master.c index 4b0283f9fe..41ef1df518 100644 --- a/hw/core/remote-port-memory-master.c +++ b/hw/core/remote-port-memory-master.c @@ -29,18 +29,201 @@ =20 #define RP_MAX_ACCESS_SIZE 4096 =20 +static int rp_mm_get_timeout(RPMemoryTransaction *tr) +{ + RemotePortMap *map =3D tr->opaque; + RemotePortMemoryMaster *s; + + if (!map || !map->parent || + !object_dynamic_cast(OBJECT(map->parent), + TYPE_REMOTE_PORT_MEMORY_MASTER)) { + return 0; + } + s =3D REMOTE_PORT_MEMORY_MASTER(map->parent); + return s->rp_timeout; +} + +MemTxResult rp_mm_access_with_def_attr(RemotePort *rp, uint32_t rp_dev, + struct rp_peer_state *peer, + RPMemoryTransaction *tr, + bool relative, uint64_t offset, + uint32_t def_attr) +{ + uint64_t addr =3D tr->addr; + RemotePortRespSlot *rsp_slot; + RemotePortDynPkt *rsp; + struct { + struct rp_pkt_busaccess_ext_base pkt; + uint8_t reserved[RP_MAX_ACCESS_SIZE]; + } pay; + uint8_t *data =3D rp_busaccess_tx_dataptr(peer, &pay.pkt); + struct rp_encode_busaccess_in in =3D {0}; + int i; + int len; + int rp_timeout =3D rp_mm_get_timeout(tr); + MemTxResult ret; + + if (tr->rw) { + /* Data up to 8 bytes is passed as values. */ + if (tr->size <=3D 8) { + for (i =3D 0; i < tr->size; i++) { + data[i] =3D tr->data.u64 >> (i * 8); + } + } else { + memcpy(data, tr->data.p8, tr->size); + } + } + + addr +=3D relative ? 0 : offset; + + in.cmd =3D tr->rw ? RP_CMD_write : RP_CMD_read; + in.id =3D rp_new_id(rp); + in.dev =3D rp_dev; + in.clk =3D rp_normalized_vmclk(rp); + in.master_id =3D tr->attr.requester_id; + in.addr =3D addr; + in.attr =3D def_attr; + in.attr |=3D tr->attr.secure ? RP_BUS_ATTR_SECURE : 0; + in.size =3D tr->size; + in.stream_width =3D tr->size; + len =3D rp_encode_busaccess(peer, &pay.pkt, &in); + len +=3D tr->rw ? tr->size : 0; + + trace_remote_port_memory_master_tx_busaccess(rp_cmd_to_string(in.cmd), + in.id, in.flags, in.dev, in.addr, in.size, in.attr); + + rp_rsp_mutex_lock(rp); + rp_write(rp, (void *) &pay, len); + + if (!rp_timeout) { + rsp_slot =3D rp_dev_wait_resp(rp, in.dev, in.id); + } else { + rsp_slot =3D rp_dev_timed_wait_resp(rp, in.dev, in.id, rp_timeout); + if (rsp_slot->valid =3D=3D false) { + /* + * Timeout error + */ + rp_rsp_mutex_unlock(rp); + return MEMTX_ERROR; + } + } + rsp =3D &rsp_slot->rsp; + + /* We dont support out of order answers yet. */ + assert(rsp->pkt->hdr.id =3D=3D in.id); + + switch (rp_get_busaccess_response(rsp->pkt)) { + case RP_RESP_OK: + ret =3D MEMTX_OK; + break; + case RP_RESP_ADDR_ERROR: + ret =3D MEMTX_DECODE_ERROR; + break; + default: + ret =3D MEMTX_ERROR; + break; + } + + if (ret =3D=3D MEMTX_OK && !tr->rw) { + data =3D rp_busaccess_rx_dataptr(peer, &rsp->pkt->busaccess_ext_ba= se); + /* Data up to 8 bytes is return as values. */ + if (tr->size <=3D 8) { + for (i =3D 0; i < tr->size; i++) { + tr->data.u64 |=3D ((uint64_t) data[i]) << (i * 8); + } + } else { + memcpy(tr->data.p8, data, tr->size); + } + } + + trace_remote_port_memory_master_rx_busaccess( + rp_cmd_to_string(rsp->pkt->hdr.cmd), rsp->pkt->hdr.id, + rsp->pkt->hdr.flags, rsp->pkt->hdr.dev, rsp->pkt->busaccess.addr, + rsp->pkt->busaccess.len, rsp->pkt->busaccess.attributes); + + if (rp_timeout) { + for (i =3D 0; i < ARRAY_SIZE(rp->dev_state[rp_dev].rsp_queue); i++= ) { + if (rp->dev_state[rp_dev].rsp_queue[i].used && + rp->dev_state[rp_dev].rsp_queue[i].valid) { + rp_resp_slot_done(rp, &rp->dev_state[rp_dev].rsp_queue[i]); + } + } + } else { + rp_resp_slot_done(rp, rsp_slot); + } + rp_rsp_mutex_unlock(rp); + + /* + * For strongly ordered or transactions that don't allow Early Acking, + * we need to drain the pending RP processing queue here. This is + * because RP handles responses in parallel with normal requests so + * they may get reordered. This becomes visible for example with reads + * to read-to-clear registers that clear interrupts. Even though the + * lowering of the interrupt-wires arrives to us before the read-resp, + * we may handle the response before the wire update, resulting in + * spurious interrupts. + * + * This has some room for optimization but for now we use the big hamm= er + * and drain the entire qeueue. + */ + rp_process(rp); + + /* Reads are sync-points, roll the sync timer. */ + rp_restart_sync_timer(rp); + return ret; +} + +MemTxResult rp_mm_access(RemotePort *rp, uint32_t rp_dev, + struct rp_peer_state *peer, + RPMemoryTransaction *tr, + bool relative, uint64_t offset) +{ + return rp_mm_access_with_def_attr(rp, rp_dev, peer, tr, relative, offs= et, + 0); +} + static MemTxResult rp_mm_read(void *opaque, hwaddr addr, uint64_t *data, unsigned size, MemTxAttrs attrs) { - /* TBD */ - return MEMTX_OK; + MemTxResult ret; + RemotePortMap *map =3D opaque; + RemotePortMemoryMaster *s =3D map->parent; + + RPMemoryTransaction tr =3D {}; + + tr.opaque =3D map; + tr.rw =3D false; + tr.addr =3D addr; + tr.size =3D size; + tr.attr =3D attrs; + + ret =3D rp_mm_access(s->rp, s->rp_dev, s->peer, &tr, s->relative, + map->offset); + + if (ret =3D=3D MEMTX_OK) { + *data =3D tr.data.u64; + } + + return ret; } =20 static MemTxResult rp_mm_write(void *opaque, hwaddr addr, uint64_t data, unsigned size, MemTxAttrs attrs) { - /* TBD */ - return MEMTX_OK; + RemotePortMap *map =3D opaque; + RemotePortMemoryMaster *s =3D map->parent; + + RPMemoryTransaction tr =3D {}; + + tr.opaque =3D map; + tr.rw =3D true; + tr.addr =3D addr; + tr.size =3D size; + tr.attr =3D attrs; + tr.data.u64 =3D data; + + return rp_mm_access(s->rp, s->rp_dev, s->peer, &tr, s->relative, + map->offset); } =20 static const MemoryRegionOps rp_ops_template =3D { diff --git a/hw/core/remote-port.c b/hw/core/remote-port.c index b4c9fa1528..6a6effdd19 100644 --- a/hw/core/remote-port.c +++ b/hw/core/remote-port.c @@ -39,6 +39,11 @@ static void rp_event_read_and_process(RemotePort *s); static void sync_timer_hit(void *opaque); static void syncresp_timer_hit(void *opaque); =20 +uint32_t rp_new_id(RemotePort *s) +{ + return qatomic_fetch_inc(&s->current_id); +} + void rp_rsp_mutex_lock(RemotePort *s) { qemu_mutex_lock(&s->rsp_mutex); diff --git a/hw/core/trace-events b/hw/core/trace-events index 631cbb9c37..dc98745178 100644 --- a/hw/core/trace-events +++ b/hw/core/trace-events @@ -38,3 +38,7 @@ rp_pt_process_pkt(const char *rp, uint32_t cmd, uint32_t = id, uint32_t dev, bool rp_process(const char *rp, unsigned int rpos, unsigned int wpos, uint32_t = cmd, uint32_t dev) "%s: io-thread rpos=3D%u wpos=3D%u cmd=3D0x%"PRIx32" dev= =3D0x%"PRIx32 rp_pt_rx_queue_full(const char *rp, unsigned int rpos, unsigned int wpos) = "%s: rpos=3D%u wpos=3D%u" rp_wait_resp(const char *rp) "'%s'" + +# remote-port-memory-master.c +remote_port_memory_master_tx_busaccess(const char *cmd, uint32_t id, uint3= 2_t flags, uint32_t dev, uint64_t addr, uint32_t len, uint64_t attr) "cmd= =3D%s, id=3D0x%"PRIx32", flags=3D0x%"PRIx32", dev=3D0x%"PRIx32", addr=3D0x%= "PRIx64", len=3D0x%"PRIx32", attr=3D0x%"PRIx64 +remote_port_memory_master_rx_busaccess(const char *cmd, uint32_t id, uint3= 2_t flags, uint32_t dev, uint64_t addr, uint32_t len, uint64_t attr) "cmd= =3D%s, id=3D0x%"PRIx32", flags=3D0x%"PRIx32", dev=3D0x%"PRIx32", addr=3D0x%= "PRIx64", len=3D0x%"PRIx32", attr=3D0x%"PRIx64 diff --git a/include/hw/core/remote-port.h b/include/hw/core/remote-port.h index cef7471a73..7e3e022a20 100644 --- a/include/hw/core/remote-port.h +++ b/include/hw/core/remote-port.h @@ -150,4 +150,15 @@ ssize_t rp_write(RemotePort *s, const void *buf, size_= t count); =20 struct rp_peer_state *rp_get_peer(RemotePort *s); =20 +uint32_t rp_new_id(RemotePort *s); + +static inline void rp_resp_slot_done(RemotePort *s, + RemotePortRespSlot *rsp_slot) +{ + rp_dpkt_invalidate(&rsp_slot->rsp); + rsp_slot->id =3D ~0; + rsp_slot->used =3D false; + rsp_slot->valid =3D false; +} + #endif --=20 2.43.0 From nobody Sat Sep 26 21:35:41 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=1789488145; cv=none; d=zohomail.com; s=zohoarc; b=K2Otld6Bs6tk/Zjirr2qZR4GNJzCvXZQ/7tI62yxBi20Hu6JpRjX5tFhgkO0VaN031n3mI3Ifr13pB2uxKiFj4iGOS9HkITnorsdy9awK6Oqx+xVylhBF/uR0sskVH65YZaFnDy/adcqBST/VgqUgvmAztHt5LPfzMWmxtKJgT0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789488145; 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=U8J2Zk/8aJ3Q8e7LSaQ8fkxfDx2J3KURCgeZ1eKioqc=; b=hHLyteiES5UYShdLW2Whsvhzq/ELFSsEy4GOVzOc698jhmFU+k+NegVI4aUxAXgomQzS7vVM6r4dFZaTGbJfSalIoNf7CdZ33ez6NXPDNXMkaVxPVRwBi/r13u6i7lSuA7PcF2KAf1GXWJysSDAQfKuxP1NflPnKZkh1IPNHynM= 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 178948814562738.648314283665286; Tue, 15 Sep 2026 09:02:25 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x6VbQ-0007yV-Jb; Tue, 15 Sep 2026 12:01:48 -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 1x6VbO-0007qk-9p for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:46 -0400 Received: from mail-ej2-x10.google.com ([2a00:1450:4864:34::10]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1x6VbM-0003RT-A6 for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:45 -0400 Received: by mail-ej2-x10.google.com with SMTP id a640c23a62f3a-c254f6c7a4aso404496766b.0 for ; Tue, 15 Sep 2026 09:01:33 -0700 (PDT) Received: from thinkpad-t470s.. (83-131-196-251.adsl.net.t-com.hr. [83.131.196.251]) by smtp.googlemail.com with ESMTPSA id a640c23a62f3a-c29ddd86344sm3235866b.0.2026.09.15.09.01.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 09:01:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789488093; x=1790092893; 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:content-type; bh=U8J2Zk/8aJ3Q8e7LSaQ8fkxfDx2J3KURCgeZ1eKioqc=; b=UDZnB7hmYw7h2eYNzzMRfMtTYJPNrnsJ0xVD6tTp7H/BrN71tmH0t+4j8VkqTFSPvY 0J4TV5vlWYsZLM7B4x0lotGvDNS6TJEcSU4LRdia+7vN6hRKD7T9UOZC6yjh9sptI+0q X4teNXlt0+bP01CZm7kGFRpi0t7T4ejP2reH7J7l5mb4xeO241qdFoZ8freVNYngeB6F iIB9H52OF7+BtAp7vnme3ayoNWV3xyJLEZv/tCDsH64H3kaw02vm4VKl6IHn5cXrtr1Z 7V4IeHpqtqQuuyfBfngNTY3I9uMYxVPa5K/ZPEFfk7nBZ2GdvuHehjtkMM7q7ISvFhhx Bopg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789488093; x=1790092893; 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:content-type; bh=U8J2Zk/8aJ3Q8e7LSaQ8fkxfDx2J3KURCgeZ1eKioqc=; b=GglOVisDB8NMA4Gl73qZCxQb7is1Yhet31IwZsJ6NtwBlxwkUEAohYD9/lQMti/cSP +DZcj58y1QSxkB6sVGzkjmQmPmpT2iVtW6ghwCpfivci/KNNDDQEzsxAy6dwbt6S6NMi kTseTlPPX6P3+qLwc1htB4crZJOR/As1OXsNYdp/C1oB0B1P4QaWHK/s6RLg7I43GP7w 8FOi1xLqlrPr3+CLhVQaFeyXf7vPBH97mUiuPH9yszonw8i/FFVzUfy+pQRFqL8c29MI wgKVVCMPTryxfprnRwS0i0Fn86OXVuoRYsvRdfJVooiPPUcT/ZgkTPar0//nEBHoWmyB L1OQ== X-Gm-Message-State: AFuF++lYDOAna7G+ZcwJFIEvQfrmRFtpds3ToT8oWkK82j06+CW6yj83 XdNE/l2CD3K3nkXj2OdeQTO52+APP4aYeO4Xq37efr//8wxZ27QFh35/cyjdcA== X-Gm-Gg: AYBFou0aMBKT/aC+3+cwgbzRYCds6ktTQ72uIkl1703dDQVFMR2OWCJeeD6SsYVl4sd vLrnhBCo/yEECkzpPTgZPk/eCjls70DIhcJjMjRlk3FyBJc6mvoL6BrIiRWBaX8Ta+dqfVSM9Ik dF4KQSrAfJlVLAheRfDMUjKgYn2rSALBsGOCkCKrv45BRDb5WmsKmJOHfUiZoDq5bufu7gTa+/A iNxmqQWcqGe3dt0EulvQEByCFFkdhq4gDJzpKKRCq8M/4YWXGSiLbXLj50/wc/iaJP5fe+yrA4c B/VmrNMrG3Kt648e+BoPelPIFtkWxG7r9kvu2/BdzyNF57uRKqsZCWgNbp3ctKRoi41HFuzxatK W5KcYOF+ml97fvYtDwOZedZrwl8+81QpjCFNpEzAWgOA+MyxVGpVZH+US7i9s/USRyT10xuBAG8 s7c6wz2HjNpsJTtdZYSxRRPshonqxEyCN+Njr/+soRFwDjXyOM3knYbuYowr5a4Xeup0Ihles0C B2c0OynyEqCdwbFs0eTzUbqsQEAcSxC7VNbxQi+jXIa2w== X-Received: by 2002:a17:907:1b24:b0:c26:1649:47aa with SMTP id a640c23a62f3a-c29b86f5e7dmr528260466b.32.1789488092806; Tue, 15 Sep 2026 09:01:32 -0700 (PDT) From: Ruslan Ruslichenko To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, artem_mygaiev@epam.com, volodymyr_babchuk@epam.com, peter.maydell@linaro.org, francisco.iglesias@amd.com, edgar.iglesias@gmail.com, berrange@redhat.com, eugene@nuvacore.ai, Ruslan_Ruslichenko@epam.com, takahiro.nakata.wr@renesas.com, Paolo Bonzini , Peter Xu , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , "Edgar E . Iglesias" Subject: [PATCH v2 12/20] system/physmem: Add ats_do_translate helper Date: Tue, 15 Sep 2026 18:00:36 +0200 Message-ID: <20260915160044.345788-13-ruslichenko.r@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260915160044.345788-1-ruslichenko.r@gmail.com> References: <20260915160044.345788-1-ruslichenko.r@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:34::10; envelope-from=ruslichenko.r@gmail.com; helo=mail-ej2-x10.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=unavailable autolearn_force=no X-Spam_action: no action 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: 1789488146610158500 Content-Type: text/plain; charset="utf-8" From: Ruslan Ruslichenko Add 'ats_do_translate' method to enable manual IOMMU address translation. This allows the Remote Port subsystem to resolve guest virtual addresses to physical addresses by querying the QEMU IOMMU translation pipeline. This is required for the Remote Port subsystem to support translation requests from external masters in a co-simulation environment. Signed-off-by: Edgar E. Iglesias Signed-off-by: Takahiro Nakata Signed-off-by: Ruslan Ruslichenko --- include/system/memory.h | 8 +++++++ system/physmem.c | 53 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/include/system/memory.h b/include/system/memory.h index a7e03fc3e7..2032d3028d 100644 --- a/include/system/memory.h +++ b/include/system/memory.h @@ -2583,6 +2583,14 @@ static inline MemoryRegion *address_space_translate(= AddressSpace *as, addr, xlat, len, is_write, attrs); } =20 +MemoryRegion *ats_do_translate(AddressSpace *as, + hwaddr addr, + hwaddr *xlat, + hwaddr *plen_out, + AddressSpace **target_as, + int *prot, + MemTxAttrs attrs); + /* address_space_access_valid: check for validity of accessing an address * space range * diff --git a/system/physmem.c b/system/physmem.c index a4a6a4710c..1acda22ede 100644 --- a/system/physmem.c +++ b/system/physmem.c @@ -525,6 +525,59 @@ static MemoryRegionSection flatview_do_translate(FlatV= iew *fv, return *section; } =20 +/* This function is called from RCU critical section */ +MemoryRegion *ats_do_translate(AddressSpace *as, + hwaddr addr, + hwaddr *xlat, + hwaddr *plen_out, + AddressSpace **target_as, + int *prot, + MemTxAttrs attrs) +{ + MemoryRegionSection *section; + IOMMUMemoryRegion *iommu_mr; + hwaddr plen =3D (hwaddr)(-1); + FlatView *fv =3D address_space_to_flatview(as); + IOMMUMemoryRegionClass *imrc; + IOMMUTLBEntry iotlb; + int iommu_idx =3D 0; + + if (!plen_out) { + plen_out =3D &plen; + } + + /* This can be MMIO, so setup MMIO bit. */ + section =3D address_space_translate_internal( + flatview_to_dispatch(fv), addr, xlat, + plen_out, true); + + /* Illegal translation */ + if (section->mr =3D=3D &io_mem_unassigned) { + return NULL; + } + + iommu_mr =3D memory_region_get_iommu(section->mr); + if (!iommu_mr) { + return NULL; + } + + imrc =3D memory_region_get_iommu_class_nocheck(iommu_mr); + + if (imrc->attrs_to_index) { + iommu_idx =3D imrc->attrs_to_index(iommu_mr, attrs); + } + + iotlb =3D imrc->translate(iommu_mr, addr, IOMMU_RO, iommu_idx); + + *xlat =3D ((iotlb.translated_addr & ~iotlb.addr_mask) + | (addr & iotlb.addr_mask)); + *plen_out =3D MIN(*plen_out, (addr | iotlb.addr_mask) - addr + 1); + *prot =3D iotlb.perm; + *target_as =3D iotlb.target_as; + + return section->mr; +} + /* Called from RCU critical section */ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr, bool is_write, MemTxAttrs attr= s) --=20 2.43.0 From nobody Sat Sep 26 21:35:41 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=1789488134; cv=none; d=zohomail.com; s=zohoarc; b=QwVNw8Th4hmmjhqUgeqECpUAJUgh4Ucn/ke/hPaNta2vvGpvU8QMa+ezLjQkPQs4CvTFaMNkPf5TTnR8+UNnxQybTJY96o+Dm2dyr90zm9aNik2vgH/HLkr4mpV27Bogp0x1iHopJmSW1dcnoV6cIh26Emu8rv7JbwdMjPBTZ8s= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789488134; 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=1UWLhGiru03iCBAYq6e7CUFMG/HcvDmu3qHp9LhwQeI=; b=nVP4F7ebtHA2Q19+xMKlVywsF520ld19IEOpp86tGY0ckTXIJCA3EBdN2Bmnwr1rD0OZgWVaNJSBLY8sJOkNFEA7S88uo02DJxKhM3EVWi7ERqt3HZFMhBvR6yhZ/C0bNyOT5DZyIInX2qTqOxAmIKnVWhh51BvweQGHIXM+uZI= 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 1789488134668892.4350915703358; Tue, 15 Sep 2026 09:02:14 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x6VbM-0007ot-C0; Tue, 15 Sep 2026 12:01:44 -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 1x6VbI-0007kq-95 for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:40 -0400 Received: from mail-ej1-x635.google.com ([2a00:1450:4864:20::635]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1x6VbE-0003SN-LG for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:39 -0400 Received: by mail-ej1-x635.google.com with SMTP id a640c23a62f3a-c294ad260fdso160578266b.1 for ; Tue, 15 Sep 2026 09:01:36 -0700 (PDT) Received: from thinkpad-t470s.. (83-131-196-251.adsl.net.t-com.hr. [83.131.196.251]) by smtp.googlemail.com with ESMTPSA id a640c23a62f3a-c29ddd86344sm3235866b.0.2026.09.15.09.01.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 09:01:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789488095; x=1790092895; 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:content-type; bh=1UWLhGiru03iCBAYq6e7CUFMG/HcvDmu3qHp9LhwQeI=; b=L9pOh0L7xc7xO+qxyWFZrv7jFneDbp6dUgkhJIJmJ+ccviLNseU/6VJZ/4yJK0HpnF 4CsOjnDaKIqUZS3a/lJSeHD3jTDP5fd4UBptWRAv4NR2aGDE4KSXJDxkn0k+vtSm7Qyy sqluer3hm+LoqvC5FLvmx27IE7d6VSDr8FyvXTswh2rR7E+Lu5g4TYATE6YNFym+0y32 Y5Yx9TlEeByd5ZhpIiEU7VQfZYQ0eW3cCN1X3btfxxhkKuZRCYWPo/Dl76n19Zub1YZB ffY7IDpA96cF7jq2FFP8N0ayU2qNCkM+AuHVvUD0zGa5L3nF4+rSZbmJBEhV8RxuPYaH Yiog== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789488095; x=1790092895; 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:content-type; bh=1UWLhGiru03iCBAYq6e7CUFMG/HcvDmu3qHp9LhwQeI=; b=KpiSmnX1TgXHymIAZ3Y7/y9eDyQ8oepv8MdhX0910i6I40OZ8O+ePgwopY4rYcI769 dC3FTttLqioCJ8fMSP/RI/ag2HJRGj+ppVmQb6Uy5CoIKGbM6g7lw/XbmVEjNNofQok7 8JBugR0IjfKrIPM9G+aqRmyl0q3/CDF4IdZtBi4s6c4hLF8qnfDgYXIRU5CXiz6BImzS HsKmzzX5ZdnCwusX9+l8cDV4Mo8TynCpa8Rq1cdoTiFafpjdhhAjdPp0eN7QxkOO3Jya n9G62yyp06QL5OszjlJ2jCsBjtFedHkjSAp8zxoGLFXtuEEbeBe/qYktXCj0Fb4EvlA7 9tsA== X-Gm-Message-State: AFuF++kd39wiBO1NTP3A8cg55DqUuo/o1ZzqxC+L+UvzXBuJW8FrsAI5 jVYPq6ozGGmSEUwDVnMWYTk3D7tTBuzBAvnMqBIm1DMAhJiOjTrCWLe8L77Z7Q== X-Gm-Gg: AYBFou3Li8abq+0p59tyu+Ovaf4KwKw4BSePR/yhkxrwKlKxXRKF5C+ts01SWerP9/p jQyG/TCZlqRpTCamIe0cWRsBaSJnZHF5IyKa0L7d+7sCYaYs/tQcilR1VaLHtHiZ5CwM2Q2GTf7 RGbN/jsZzmfjHaa9RrJL6iAvU0P3jkI6dhf+JvxNRptgIW7r4Cg9/T5r8Mh57rIahIugMpC7BvR KPooh1GYK1w/0lavalIJKmE3Af705R76mjRjPOY2BktCSTiGSqGXcWHTxyGmR4c0QLzYqGX23ks 9GJ1wwDZv3Szh8XiufEMJNdUExry/KoiYR/fOMQ96QNpTbejugzlJrTYocI6RPhj9a5grc1HwHH 4hlGSXBqtDuUTfcUQle2lLkHlZb7y2EK6u0EzQrBrjawREaPmNHHnSegf9uMffJfFK4O7L+so6J chaUHFvoFLaXbL2cdcFirIG2jiVuA/J85ARxqJ/nDCEJFH4v/E5cWZyRtiM/OyJv1UV4+YHPiRn b8jWdhBCYwcy3Fpxn042IziTwBPXfr+hSyVZ6ia/4hDWA== X-Received: by 2002:a17:907:da3:b0:c25:f7dc:2d9 with SMTP id a640c23a62f3a-c29c8bdb1ecmr343882866b.26.1789488094518; Tue, 15 Sep 2026 09:01:34 -0700 (PDT) From: Ruslan Ruslichenko To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, artem_mygaiev@epam.com, volodymyr_babchuk@epam.com, peter.maydell@linaro.org, francisco.iglesias@amd.com, edgar.iglesias@gmail.com, berrange@redhat.com, eugene@nuvacore.ai, Ruslan_Ruslichenko@epam.com, takahiro.nakata.wr@renesas.com, "Edgar E . Iglesias" Subject: [PATCH v2 13/20] hw/core: Add Remote Port ATS device skeleton Date: Tue, 15 Sep 2026 18:00:37 +0200 Message-ID: <20260915160044.345788-14-ruslichenko.r@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260915160044.345788-1-ruslichenko.r@gmail.com> References: <20260915160044.345788-1-ruslichenko.r@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::635; envelope-from=ruslichenko.r@gmail.com; helo=mail-ej1-x635.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-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: 1789488136689158500 Content-Type: text/plain; charset="utf-8" From: Ruslan Ruslichenko Inroduce the remote-port-ats device and remote-port-ats-cache interface. This patch provides the QOM definition and basic initialization logic required for Address Translation Services in Remote Port system. Preserved existing MIT license for remote-port-ats(.c,.h). Signed-off-by: Francisco Iglesias Signed-off-by: Edgar E. Iglesias Signed-off-by: Takahiro Nakata Signed-off-by: Ruslan Ruslichenko --- hw/core/remote-port-ats.c | 209 ++++++++++++++++++++++++++++++ include/hw/core/remote-port-ats.h | 76 +++++++++++ 2 files changed, 285 insertions(+) create mode 100644 hw/core/remote-port-ats.c create mode 100644 include/hw/core/remote-port-ats.h diff --git a/hw/core/remote-port-ats.c b/hw/core/remote-port-ats.c new file mode 100644 index 0000000000..793f9fc52d --- /dev/null +++ b/hw/core/remote-port-ats.c @@ -0,0 +1,209 @@ +/* + * SPDX-License-Identifier: MIT + * + * QEMU remote port ATS + * + * Copyright (c) 2021 Xilinx Inc + * Written by Francisco Iglesias + * + * Permission is hereby granted, free of charge, to any person obtaining a= copy + * of this software and associated documentation files (the "Software"), t= o deal + * in the Software without restriction, including without limitation the r= ights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or se= ll + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included= in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS= OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OT= HER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING= FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS = IN + * THE SOFTWARE. + */ +#include "qemu/osdep.h" +#include "system/system.h" +#include "system/dma.h" +#include "qemu/log.h" +#include "qapi/qmp/qerror.h" +#include "qapi/error.h" +#include "hw/core/sysbus.h" +#include "migration/vmstate.h" +#include "hw/core/qdev-properties.h" +#include "trace.h" + +#include "hw/core/remote-port-proto.h" +#include "hw/core/remote-port-ats.h" + +typedef struct ATSIOMMUNotifier { + IOMMUNotifier n; + MemoryRegion *mr; + RemotePortATS *rp_ats; + int iommu_idx; +} ATSIOMMUNotifier; + +IOMMUTLBEntry *rp_ats_cache_lookup_translation(RemotePortATSCache *cache, + hwaddr translated_addr, + hwaddr len) +{ + RemotePortATSCacheClass *c =3D REMOTE_PORT_ATS_CACHE_GET_CLASS(cache); + + return c->lookup_translation(cache, translated_addr, len); +} + +static IOMMUTLBEntry *rp_ats_lookup_translation(RemotePortATSCache *cache, + hwaddr translated_addr, + hwaddr len) +{ + /* TBD */ + return NULL; +} + +static bool ats_translate_address(RemotePortATS *s, struct rp_pkt *pkt, + hwaddr *phys_addr, hwaddr *phys_len) +{ + /* TBD */ + return true; +} + +static void rp_ats_req(RemotePortDevice *dev, struct rp_pkt *pkt) +{ + RemotePortATS *s =3D REMOTE_PORT_ATS(dev); + size_t pktlen =3D sizeof(struct rp_pkt_ats); + hwaddr phys_addr =3D 0; + hwaddr phys_len =3D (hwaddr)(-1); + uint64_t result; + size_t enclen; + int64_t delay; + int64_t clk; + + assert(!(pkt->hdr.flags & RP_PKT_FLAGS_response)); + + rp_dpkt_alloc(&s->rsp, pktlen); + + result =3D ats_translate_address(s, pkt, &phys_addr, &phys_len) ? + RP_ATS_RESULT_ok : RP_ATS_RESULT_error; + + /* + * delay here could be set to the annotated cost of doing issuing + * these accesses. QEMU doesn't support this kind of annotations + * at the moment. So we just clear the delay. + */ + delay =3D 0; + clk =3D pkt->ats.timestamp + delay; + + enclen =3D rp_encode_ats_req(pkt->hdr.id, pkt->hdr.dev, + &s->rsp.pkt->ats, + clk, + pkt->ats.attributes, + phys_addr, + phys_len, + result, + pkt->hdr.flags | RP_PKT_FLAGS_response); + assert(enclen =3D=3D pktlen); + + rp_write(s->rp, (void *)s->rsp.pkt, enclen); +} + +static void rp_ats_realize(DeviceState *dev, Error **errp) +{ + RemotePortATS *s =3D REMOTE_PORT_ATS(dev); + RemotePortDevice *rpd =3D REMOTE_PORT_DEVICE(dev); + + rp_register_dev(s->rp, rpd, s->rp_dev); + + s->peer =3D rp_get_peer(s->rp); + address_space_init(&s->as, s->mr ? s->mr : get_system_memory(), "ats-a= s"); + + s->iommu_notifiers =3D g_array_new(false, true, sizeof(ATSIOMMUNotifie= r *)); + s->cache =3D g_array_new(false, true, sizeof(IOMMUTLBEntry *)); +} + +static void rp_prop_allow_set_link(const Object *obj, const char *name, + Object *val, Error **errp) +{ +} + +static void rp_ats_init(Object *obj) +{ + RemotePortATS *s =3D REMOTE_PORT_ATS(obj); + + object_property_add_link(obj, "rp-adaptor0", "remote-port", + (Object **)&s->rp, + rp_prop_allow_set_link, + OBJ_PROP_LINK_STRONG); + object_property_add_link(obj, "mr", TYPE_MEMORY_REGION, + (Object **)&s->mr, + qdev_prop_allow_set_link_before_realize, + OBJ_PROP_LINK_STRONG); +} + +static void rp_ats_unrealize(DeviceState *dev) +{ + RemotePortATS *s =3D REMOTE_PORT_ATS(dev); + ATSIOMMUNotifier *notifier; + int i; + + for (i =3D 0; i < s->iommu_notifiers->len; i++) { + notifier =3D g_array_index(s->iommu_notifiers, ATSIOMMUNotifier *,= i); + memory_region_unregister_iommu_notifier(notifier->mr, ¬ifier->n= ); + g_free(notifier); + } + g_array_free(s->iommu_notifiers, true); + + address_space_destroy(&s->as); + + for (i =3D 0; i < s->cache->len; i++) { + IOMMUTLBEntry *tmp =3D g_array_index(s->cache, IOMMUTLBEntry *, i); + g_free(tmp); + } + g_array_free(s->cache, true); +} + +static Property rp_properties[] =3D { + DEFINE_PROP_UINT32("rp-chan0", RemotePortATS, rp_dev, 0), +}; + +static void rp_ats_class_init(ObjectClass *oc, const void *data) +{ + RemotePortDeviceClass *rpdc =3D REMOTE_PORT_DEVICE_CLASS(oc); + RemotePortATSCacheClass *atscc =3D REMOTE_PORT_ATS_CACHE_CLASS(oc); + DeviceClass *dc =3D DEVICE_CLASS(oc); + + device_class_set_props_n(dc, rp_properties, ARRAY_SIZE(rp_properties)); + + rpdc->ops[RP_CMD_ats_req] =3D rp_ats_req; + dc->realize =3D rp_ats_realize; + dc->unrealize =3D rp_ats_unrealize; + atscc->lookup_translation =3D rp_ats_lookup_translation; +} + +static const TypeInfo rp_ats_info =3D { + .name =3D TYPE_REMOTE_PORT_ATS, + .parent =3D TYPE_DEVICE, + .instance_size =3D sizeof(RemotePortATS), + .instance_init =3D rp_ats_init, + .class_init =3D rp_ats_class_init, + .interfaces =3D (InterfaceInfo[]) { + { TYPE_REMOTE_PORT_DEVICE }, + { TYPE_REMOTE_PORT_ATS_CACHE }, + { }, + }, +}; + +static const TypeInfo rp_ats_cache_info =3D { + .name =3D TYPE_REMOTE_PORT_ATS_CACHE, + .parent =3D TYPE_INTERFACE, + .class_size =3D sizeof(RemotePortATSCacheClass), +}; + +static void rp_register_types(void) +{ + type_register_static(&rp_ats_cache_info); + type_register_static(&rp_ats_info); +} + +type_init(rp_register_types) diff --git a/include/hw/core/remote-port-ats.h b/include/hw/core/remote-por= t-ats.h new file mode 100644 index 0000000000..ffe60539ac --- /dev/null +++ b/include/hw/core/remote-port-ats.h @@ -0,0 +1,76 @@ +/* + * SPDX-License-Identifier: MIT + * + * QEMU remote port ATS + * + * Copyright (c) 2021 Xilinx Inc + * Written by Francisco Iglesias + * + * Permission is hereby granted, free of charge, to any person obtaining a= copy + * of this software and associated documentation files (the "Software"), t= o deal + * in the Software without restriction, including without limitation the r= ights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or se= ll + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included= in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS= OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OT= HER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING= FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS = IN + * THE SOFTWARE. + */ +#ifndef REMOTE_PORT_ATS_H +#define REMOTE_PORT_ATS_H + +#include "hw/core/remote-port.h" + +#define TYPE_REMOTE_PORT_ATS "remote-port-ats" +#define REMOTE_PORT_ATS(obj) \ + OBJECT_CHECK(RemotePortATS, (obj), TYPE_REMOTE_PORT_ATS) + +typedef struct { + /* private */ + SysBusDevice parent; + + /* public */ + struct RemotePort *rp; + struct rp_peer_state *peer; + MemoryRegion *mr; + AddressSpace as; + RemotePortDynPkt rsp; + GArray *iommu_notifiers; + uint32_t rp_dev; + GArray *cache; /* Translation cache */ +} RemotePortATS; + +#define TYPE_REMOTE_PORT_ATS_CACHE "remote-port-ats-cache" + +#define REMOTE_PORT_ATS_CACHE_CLASS(klass) \ + OBJECT_CLASS_CHECK(RemotePortATSCacheClass, (klass), \ + TYPE_REMOTE_PORT_ATS_CACHE) +#define REMOTE_PORT_ATS_CACHE_GET_CLASS(obj) \ + OBJECT_GET_CLASS(RemotePortATSCacheClass, (obj), TYPE_REMOTE_PORT_ATS_= CACHE) +#define REMOTE_PORT_ATS_CACHE(obj) \ + INTERFACE_CHECK(RemotePortATSCache, (obj), TYPE_REMOTE_PORT_ATS_CACHE) + +typedef struct RemotePortATSCache { + Object Parent; +} RemotePortATSCache; + +typedef struct RemotePortATSCacheClass { + InterfaceClass parent; + + IOMMUTLBEntry *(*lookup_translation)(RemotePortATSCache *cache, + hwaddr translated_addr, + hwaddr len); +} RemotePortATSCacheClass; + +IOMMUTLBEntry *rp_ats_cache_lookup_translation(RemotePortATSCache *cache, + hwaddr translated_addr, + hwaddr len); +#endif --=20 2.43.0 From nobody Sat Sep 26 21:35:41 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=1789488357; cv=none; d=zohomail.com; s=zohoarc; b=l7tHO2quBa06YB8x6tr5Q7o8AKDbZZ9ZxaLyZlLK34XagJstEnyaSxhpSgjpqrwmC3PlSnKxIP2UiKJAfabCPp2P7BVHzIWsRgdhvyixf0khnwy+TQPzH2eHSlq4KwmPNfORCMb3uR48U+JIUY/aLvptSNKFQAAvT18dW5womNE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789488357; 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=JuywBTKM2C3b3mn1du8c5UdWRdVb6bhBO3Hc/Xe4RIM=; b=QGqOdw088SqYpBQtvsVCfjzH1AAQMY4AP1GwPI5BN80ObyotgU4444EeAt9Q90QCQSIyxVFlPeWE7vl0AZLOYSzkuB+Npe+sTrGrZptv7CkrMupod7+penFvJtUCtIXELhGWlsFNf+6Ynn/1HX8+Yyu5/Z5xj5FBNbhY2NRW9C8= 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 1789488357321268.88009700370276; Tue, 15 Sep 2026 09:05:57 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x6VbT-00089Q-F8; Tue, 15 Sep 2026 12:01:51 -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 1x6VbR-00084f-OR for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:50 -0400 Received: from mail-ej2-x10.google.com ([2a00:1450:4864:34::10]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1x6VbP-0003Si-Om for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:49 -0400 Received: by mail-ej2-x10.google.com with SMTP id a640c23a62f3a-c254f9f7db0so86662566b.3 for ; Tue, 15 Sep 2026 09:01:37 -0700 (PDT) Received: from thinkpad-t470s.. (83-131-196-251.adsl.net.t-com.hr. [83.131.196.251]) by smtp.googlemail.com with ESMTPSA id a640c23a62f3a-c29ddd86344sm3235866b.0.2026.09.15.09.01.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 09:01:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789488096; x=1790092896; 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:content-type; bh=JuywBTKM2C3b3mn1du8c5UdWRdVb6bhBO3Hc/Xe4RIM=; b=LzjTj1uWJSNjcKqwxSRyL5GoZWpScHIzTSeMq0uoc/AMgTb1UOPshSnyPnd6zpva8v zu3MA0lNvdZmNZgU4Aa4ijQKBzkZMOfOFKLNyGDaAPhmTVZO2VDCJVjq7vvjQt9CuBhb aUnACh+hxiHFJOyZLbg0UX74Hf2hcsu6UzMf7l71NreRds6QP4ciehrG4hAoSj72GxcZ WgLxmC2jqaHGTZwjiVHCOQNDlq7xYhXROLN+zebXUEkmcz8kgZK2bLwwFPXH5pQcGyuJ NvC5g9j05gIpcNM8VAOdySBFBJOcgZJmXjEfdwPBzJ1WnP7bXY/J2ca2crjgxqCrUIoQ SGag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789488096; x=1790092896; 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:content-type; bh=JuywBTKM2C3b3mn1du8c5UdWRdVb6bhBO3Hc/Xe4RIM=; b=xMYTA2nJ+Tn67h3HFCTiAeIbQTSoKsc6x0r3P38ev26HpnC12uN88UMVeIVs44Pbbb 6clvJ5dtpAxSUCO2429abop8Zth1B6Q+p6wPvP7mG0xC/h1PNKqkU4DNEF7dqjUUD7nT pHWl3B/SOWft0ovHiqBaf1A8GK1nkN9a4qFJFkVkus8ODQZjidxowJmTSzuZEMhhopfT ug40R5exmf3WFFKEr2ZLQCFenNoo5JIYBxd/ljIUs5rmYV6RyGO8V8NznottzOamzu3n WPjsbW0xZI1XU2nrZPkExJVvy9M8nLvTJ9I0Y+pXf+dXO6FWguHMusaTY2IePII0Tr7J Halw== X-Gm-Message-State: AFuF++mUavSZnRraJimUnAFvKoL+1CojJi8dWb83uyVzTG9WFJU+mjb6 SM2i/STFhgpCiGULJPblzgdr0g+DNhNzPdPXJWUb++yz3feUilNRouJCojJTRw== X-Gm-Gg: AYBFou3PVwJbObhOrxNlXEBK8m8RYB/me+IS4TB2plxzMYXuM3aywdnyYSQIAkLC9dm ch9nypMuSw91WTdzX8RiNyRMXr3JstQ7cp4kOijcRjKshkS5wO6qr9Y1VdZC6225h3T0FwXEH4T mGPz2LVy+McVPViHymFIQgnf6/Y4J6pnWbGRrtm9Q5bGNJmCnJ8BNdp3DIppYRC2dC+hV66Xlc9 JKp1prlM0NdvEcN7aHeNAEIsG7ckNGp/BGfGW9uAhu+qc3avumbPhmoUcj9t03UelZ/TrEXkriX tXKwAFUiyALTOc+u9xH9DW6iYTz6On6D57oJhk2iYaHJWVFoCpKITyIicRvi1JUMH4azm0udn4+ q0r1SDoa8IaWU81yJCzkrB1IRt5XDvfxunSJJYvF8rr56LmZR5XD+EI/HjKAwq3SY/Y/BraG95L swpZ4LFdq5h9czEbH4ZHnCJtX7FsDsLEMVpLUghd239ECEA0Os/WBT7srPMFj2XX37HtEIICzRY O3Iv5cLrqLtCaxhfLvH3yqO87dhfn40IMWLBqh0LUOIbw== X-Received: by 2002:a17:907:94ca:b0:c24:47b8:ae5b with SMTP id a640c23a62f3a-c29d780ce9cmr126218066b.22.1789488096170; Tue, 15 Sep 2026 09:01:36 -0700 (PDT) From: Ruslan Ruslichenko To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, artem_mygaiev@epam.com, volodymyr_babchuk@epam.com, peter.maydell@linaro.org, francisco.iglesias@amd.com, edgar.iglesias@gmail.com, berrange@redhat.com, eugene@nuvacore.ai, Ruslan_Ruslichenko@epam.com, takahiro.nakata.wr@renesas.com, "Edgar E . Iglesias" Subject: [PATCH v2 14/20] hw/core: Implement Remote Port ATS logic and cache management Date: Tue, 15 Sep 2026 18:00:38 +0200 Message-ID: <20260915160044.345788-15-ruslichenko.r@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260915160044.345788-1-ruslichenko.r@gmail.com> References: <20260915160044.345788-1-ruslichenko.r@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:34::10; envelope-from=ruslichenko.r@gmail.com; helo=mail-ej2-x10.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=unavailable autolearn_force=no X-Spam_action: no action 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: 1789488358574158500 Content-Type: text/plain; charset="utf-8" From: Ruslan Ruslichenko Complete the Remote Port ATS implementation by adding the translation and cache management logic. This patch implements: - The logic for ats_translate_address to resolve addresses via the QEMU IOMMU translation mechanism. - A local cache management system to store IOMMU entries for remote masters. - Integration with IOMMU notifiers to handle invalidation requests and maintain coherency with the peer. Signed-off-by: Francisco Iglesias Signed-off-by: Edgar E. Iglesias Signed-off-by: Takahiro Nakata Signed-off-by: Ruslan Ruslichenko --- hw/core/remote-port-ats.c | 207 +++++++++++++++++++++++++++++++++++++- 1 file changed, 205 insertions(+), 2 deletions(-) diff --git a/hw/core/remote-port-ats.c b/hw/core/remote-port-ats.c index 793f9fc52d..d3c1365c3e 100644 --- a/hw/core/remote-port-ats.c +++ b/hw/core/remote-port-ats.c @@ -58,14 +58,217 @@ static IOMMUTLBEntry *rp_ats_lookup_translation(Remote= PortATSCache *cache, hwaddr translated_addr, hwaddr len) { - /* TBD */ + RemotePortATS *s =3D REMOTE_PORT_ATS(cache); + + for (int i =3D 0; i < s->cache->len; i++) { + IOMMUTLBEntry *iotlb =3D g_array_index(s->cache, IOMMUTLBEntry *, = i); + hwaddr masked_start =3D (translated_addr & ~iotlb->addr_mask); + hwaddr masked_end =3D ((translated_addr + len - 1) & ~iotlb->addr_= mask); + + if (masked_start =3D=3D iotlb->translated_addr && + masked_end =3D=3D iotlb->translated_addr) { + return iotlb; + } + } + return NULL; } =20 +static void rp_ats_cache_remove(RemotePortATS *s, IOMMUTLBEntry *iotlb) +{ + for (int i =3D 0; i < s->cache->len; i++) { + IOMMUTLBEntry *tmp =3D g_array_index(s->cache, IOMMUTLBEntry *, i); + hwaddr masked_start =3D (tmp->iova & ~iotlb->addr_mask); + hwaddr masked_end =3D ((tmp->iova | tmp->addr_mask) & ~iotlb->addr= _mask); + + if (masked_start =3D=3D iotlb->iova || masked_end =3D=3D iotlb->io= va) { + g_array_remove_index_fast(s->cache, i); + } + } +} + +static void rp_ats_invalidate(RemotePortATS *s, IOMMUTLBEntry *iotlb) +{ + size_t pktlen =3D sizeof(struct rp_pkt_ats); + struct rp_pkt_ats pkt; + RemotePortRespSlot *rsp_slot; + RemotePortDynPkt *rsp; + size_t enclen; + int64_t clk; + uint32_t id; + hwaddr len =3D iotlb->addr_mask + 1; + + id =3D rp_new_id(s->rp); + clk =3D rp_normalized_vmclk(s->rp); + + enclen =3D rp_encode_ats_inv(id, s->rp_dev, + &pkt, + clk, + 0, + iotlb->iova, + len, + 0, + 0); + assert(enclen =3D=3D pktlen); + + rp_rsp_mutex_lock(s->rp); + rp_write(s->rp, (void *) &pkt, enclen); + + rsp_slot =3D rp_dev_wait_resp(s->rp, s->rp_dev, id); + rsp =3D &rsp_slot->rsp; + + /* We dont support out of order answers yet. */ + assert(rsp->pkt->hdr.id =3D=3D id); + + rp_resp_slot_done(s->rp, rsp_slot); + rp_rsp_mutex_unlock(s->rp); +} + +static void rp_ats_cache_insert(RemotePortATS *s, + hwaddr iova, + hwaddr translated_addr, + hwaddr mask, + AddressSpace *target_as) +{ + IOMMUTLBEntry *iotlb; + + /* + * Invalidate all current translations that collide with the new one a= nd + * does not have the same target_as. This means that translated_addres= ses + * towards the same addresses but in different target address spaces a= re + * not allowed. + */ + for (int i =3D 0; i < s->cache->len; i++) { + iotlb =3D g_array_index(s->cache, IOMMUTLBEntry *, i); + hwaddr masked_start =3D (translated_addr & ~iotlb->addr_mask); + hwaddr masked_end =3D ((translated_addr | mask) & ~iotlb->addr_mas= k); + bool spans_region =3D masked_start < iotlb->translated_addr && + masked_end > iotlb->translated_addr; + + if (masked_start =3D=3D iotlb->translated_addr || + masked_end =3D=3D iotlb->translated_addr || spans_region) { + hwaddr masked_iova_start; + hwaddr masked_iova_end; + + /* + * Invalidated & remove the mapping if the address range hit i= n the + * cache but the target_as is different. + */ + if (iotlb->target_as !=3D target_as) { + rp_ats_invalidate(s, iotlb); + g_array_remove_index_fast(s->cache, i); + continue; + } + + /* + * Remove duplicates with a smaller range length since the new + * mapping will span over it. + */ + masked_iova_start =3D (iova & ~iotlb->addr_mask); + masked_iova_end =3D ((iova | mask) & ~iotlb->addr_mask); + spans_region =3D masked_iova_start < iotlb->iova && + masked_iova_end > iotlb->iova; + + if (masked_iova_start =3D=3D iotlb->iova || + masked_iova_end =3D=3D iotlb->iova || spans_region) { + + if ((iotlb->addr_mask + 1) < (mask + 1)) { + g_array_remove_index_fast(s->cache, i); + } else { + /* + * The new mapping is smaller or equal in size and is = thus + * already cached. + */ + return; + } + } + } + } + + iotlb =3D g_new0(IOMMUTLBEntry, 1); + iotlb->iova =3D iova; + iotlb->translated_addr =3D translated_addr; + iotlb->addr_mask =3D mask; + iotlb->target_as =3D target_as; + g_array_append_val(s->cache, iotlb); +} + +static void rp_ats_iommu_unmap_notify(IOMMUNotifier *n, IOMMUTLBEntry *iot= lb) +{ + ATSIOMMUNotifier *notifier =3D container_of(n, ATSIOMMUNotifier, n); + RemotePortATS *s =3D notifier->rp_ats; + + rp_ats_invalidate(s, iotlb); + rp_ats_cache_remove(s, iotlb); +} + static bool ats_translate_address(RemotePortATS *s, struct rp_pkt *pkt, hwaddr *phys_addr, hwaddr *phys_len) { - /* TBD */ + MemTxAttrs attrs =3D MEMTXATTRS_UNSPECIFIED; + IOMMUMemoryRegion *iommu_mr; + AddressSpace *target_as; + MemoryRegion *mr; + int prot =3D 0; + + RCU_READ_LOCK_GUARD(); + + mr =3D ats_do_translate(&s->as, pkt->ats.addr, phys_addr, phys_len, + &target_as, &prot, attrs); + if (!mr) { + return false; + } + + iommu_mr =3D memory_region_get_iommu(mr); + if (iommu_mr) { + int iommu_idx =3D memory_region_iommu_attrs_to_index(iommu_mr, att= rs); + ATSIOMMUNotifier *notifier; + int i; + + for (i =3D 0; i < s->iommu_notifiers->len; i++) { + notifier =3D g_array_index(s->iommu_notifiers, ATSIOMMUNotifie= r *, i); + if (notifier->mr =3D=3D mr && notifier->iommu_idx =3D=3D iommu= _idx) { + break; + } + } + + /* Register a notifier if not found. */ + if (i =3D=3D s->iommu_notifiers->len) { + Error *err =3D NULL; + bool ret; + + s->iommu_notifiers =3D g_array_set_size(s->iommu_notifiers, i = + 1); + notifier =3D g_new0(ATSIOMMUNotifier, 1); + g_array_index(s->iommu_notifiers, ATSIOMMUNotifier *, i) =3D n= otifier; + + notifier->mr =3D mr; + notifier->iommu_idx =3D iommu_idx; + notifier->rp_ats =3D s; + + iommu_notifier_init(¬ifier->n, + rp_ats_iommu_unmap_notify, + IOMMU_NOTIFIER_UNMAP, + 0, + HWADDR_MAX, + iommu_idx); + + ret =3D memory_region_register_iommu_notifier(mr, ¬ifier->n= , &err); + if (ret) { + error_report_err(err); + exit(1); + } + } + } + + if (!(prot & IOMMU_RO)) { + pkt->ats.attributes &=3D ~(RP_ATS_ATTR_exec | RP_ATS_ATTR_read); + } + if (!(prot & IOMMU_WO)) { + pkt->ats.attributes &=3D ~(RP_ATS_ATTR_write); + } + + rp_ats_cache_insert(s, pkt->ats.addr, *phys_addr, *phys_len - 1, targe= t_as); + return true; } =20 --=20 2.43.0 From nobody Sat Sep 26 21:35:41 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=1789488353; cv=none; d=zohomail.com; s=zohoarc; b=NlupnzPgUiqvso392++5ls3QQqZi6BsKBhET8bxk4hXADu6fV8z7OPFtE+XBMDlitSZo5R/ZIruyGV9md29LqBfk22OI4s6UH2TrpfsDAxK21DOOIl83p60QEbquyOMhdTMNHVHMgQlklZG2oRqZvT4vVzvZyjcYddSOiI2JnLc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789488353; 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=YnS7wMKyffxvrOVSg0WDn2bH3rS0nQvZCbXWKNOcy80=; b=I9wK79PPGL91MFTCrx78KTrjU5xyPyEvl15y3b4Txf7+SsT9qX5vCIzaXlWc7RS2MN4uuKNrCNJGz+gQYvdDf5DKERDCmKXH29BIbZ4GoBF35PnbLThd0rg4LPeJvAoxi9aJuWJkH3CNmqwbOuYk7DPYgebMiOqT55z4Bx40SYg= 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 178948835343193.10545949789162; Tue, 15 Sep 2026 09:05:53 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x6VbQ-0007xs-Ie; Tue, 15 Sep 2026 12:01:48 -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 1x6VbK-0007ma-D9 for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:42 -0400 Received: from mail-ed1-x52d.google.com ([2a00:1450:4864:20::52d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1x6VbI-0003TJ-0y for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:42 -0400 Received: by mail-ed1-x52d.google.com with SMTP id 4fb4d7f45d1cf-6a5e971c970so1268173a12.0 for ; Tue, 15 Sep 2026 09:01:39 -0700 (PDT) Received: from thinkpad-t470s.. (83-131-196-251.adsl.net.t-com.hr. [83.131.196.251]) by smtp.googlemail.com with ESMTPSA id a640c23a62f3a-c29ddd86344sm3235866b.0.2026.09.15.09.01.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 09:01:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789488098; x=1790092898; 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:content-type; bh=YnS7wMKyffxvrOVSg0WDn2bH3rS0nQvZCbXWKNOcy80=; b=D9AaNjyTKWWj2KvG0emxbfAwFPc/U8vdulkD8uV3nYpBDwl+YrHHI+9jOeoYXNcreK qURN0W4gW0SkOdulgkdJ1+BF1lYJzG4PO/VGDlOgYATBDIzPWAS0z6dhMswwFdtXeq6E +Kd9K+8gbh8grZlNdqubVxHCbs3Qq0Eo8NtNZ90dZdEUFHJSvHabWouGSLtxlO2k0+G8 e7CE9/Cwl8rZ4GsY9MQxelMiOI2YhOr4HdbKujrw8+9llOhZ+CiXPCpt/OqfvxUvuTJd 8dx1rCvQ+lr8T4nNJmExnHisdUzaVsEfNW40jHz6ZcEIPtIh2QrmPDq7GvRp4KNGUVtL uuvw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789488098; x=1790092898; 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:content-type; bh=YnS7wMKyffxvrOVSg0WDn2bH3rS0nQvZCbXWKNOcy80=; b=xXaP3ehuEa1I+zO/9NACDlXzshhGHfu52CmK0bNRY7/40OMEDcXlBOrallCqygRmFm FKI1hSmKndx3Xy6znx6NcKNswsjemeRhwhIDx5RBHFMU3CxC1pqF9O0x+GMAs+epKe1q usNhlD9fDSzJQgPy7LXbMWzK8e5c1wlVIpdMGZLa+5zHz85yAdW8QPR2lT37ukxNC05d ZZq3wdWT4PGBIzeoIhmCHDUCNbRvXLPb4Ku+Lvq1ARa5SeytWEwx/2r29Moo3yCNzn9F C806wQGJIIBRXYRUMk8znLetJlXVfb7h2ghS2vMxz5jzam/SbViL+A+Zao03iFDweLlP MLwg== X-Gm-Message-State: AFuF++nYQ7NKeIu3ZCsjW+WfLKBcuETBIgqrFVAspuP/fF0RjW9OvYbh 46sqdgu/LaJ9wEyxHwfJBjeLuYXw/X27R1D22p5GROEtDcVHvE15dKPTsA78Dw== X-Gm-Gg: AYBFou2veFUS1JX6by7qVmCpTRIywyVz3ZJEOCrkQr5HLG77vFbnQgM1Y4JjFYVivXa MF2sMYbVEpJahq9kIcewBk+D2Lk8vf1/bca4Fq+UT6nHDyIL62ZLy6VxCCty8oQPewaa/9GJOMV +eqwPgqI4WiI4OgzsMfr5ipYs+jQ8xT9MHM6jk2XSvlQq1VrFlPe1dwERw2j71fOgsJSsfrMyHo LTDpU4XHzte9AU4LwOS2ESNmkgBmMDV3GIduQl8KW0z4F16mmXWwYlslWHwUhl6MqW6zce1sI7T BLg1+gOGM5GCpMUN0484cOBbsKml3PtJcsZ9ouH9fTw+21iAHLpTOz2rPIeYOTlEFQoK19uOhSk jI2uZfabi7nUJxaW0j75HFg9f6TlSRNt4i14JRR7JnpZJd80Ln5l5QoRtKxAEedaHHNZsm+2uvC r6sjBl8gVHep326Z3J1jwwaM1UiNDEcoTQDXicBVb5PH74v7Yiys8Uv6xJh9gCLrnog/2x9DAkC t35xfxOyTVRDsLHnobZkARIOfmTE4yXVmuG1VkPVCZnEHc= X-Received: by 2002:a17:907:1c0d:b0:c29:3909:6555 with SMTP id a640c23a62f3a-c29c896a5cemr322828266b.10.1789488097827; Tue, 15 Sep 2026 09:01:37 -0700 (PDT) From: Ruslan Ruslichenko To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, artem_mygaiev@epam.com, volodymyr_babchuk@epam.com, peter.maydell@linaro.org, francisco.iglesias@amd.com, edgar.iglesias@gmail.com, berrange@redhat.com, eugene@nuvacore.ai, Ruslan_Ruslichenko@epam.com, takahiro.nakata.wr@renesas.com, "Edgar E . Iglesias" Subject: [PATCH v2 15/20] hw/core: Add Remote Port memory slave device Date: Tue, 15 Sep 2026 18:00:39 +0200 Message-ID: <20260915160044.345788-16-ruslichenko.r@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260915160044.345788-1-ruslichenko.r@gmail.com> References: <20260915160044.345788-1-ruslichenko.r@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::52d; envelope-from=ruslichenko.r@gmail.com; helo=mail-ed1-x52d.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-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: 1789488354678158501 Content-Type: text/plain; charset="utf-8" From: Ruslan Ruslichenko Introduce the 'remote-port-memory-slave' device to allow remote peers to initiate memory transactions within QEMU. The patch implements the logic to receive Remote Port bus access commands, execute them within the QEMU Address Space, and return the appropriate response. Signed-off-by: Edgar E. Iglesias Signed-off-by: Takahiro Nakata Signed-off-by: Ruslan Ruslichenko --- hw/core/remote-port-memory-slave.c | 242 +++++++++++++++++++++ hw/core/trace-events | 4 + include/hw/core/remote-port-memory-slave.h | 35 +++ 3 files changed, 281 insertions(+) create mode 100644 hw/core/remote-port-memory-slave.c create mode 100644 include/hw/core/remote-port-memory-slave.h diff --git a/hw/core/remote-port-memory-slave.c b/hw/core/remote-port-memor= y-slave.c new file mode 100644 index 0000000000..ed161255c5 --- /dev/null +++ b/hw/core/remote-port-memory-slave.c @@ -0,0 +1,242 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * QEMU remote port memory slave. Read and write transactions + * recieved from the remote port are translated into an address space. + * + * Copyright (c) 2013 Xilinx Inc + * Written by Edgar E. Iglesias + * Written by Peter Crosthwaite + * + * This code is licensed under the GNU GPL. + */ + +#include "qemu/osdep.h" +#include "system/system.h" +#include "system/dma.h" +#include "qemu/log.h" +#include "qapi/qmp/qerror.h" +#include "qapi/error.h" +#include "hw/core/sysbus.h" +#include "migration/vmstate.h" +#include "hw/core/qdev-properties.h" +#include "qemu/error-report.h" +#include "trace.h" +#include "qemu/cutils.h" + +#include "hw/core/remote-port-proto.h" +#include "hw/core/remote-port-memory-slave.h" + +/* Slow path dealing with odd stuff like byte-enables. */ +static MemTxResult process_data_slow(RemotePortMemorySlave *s, + AddressSpace *as, + struct rp_pkt *pkt, + DMADirection dir, + uint8_t *data, uint8_t *byte_en) +{ + unsigned int i; + unsigned int byte_en_len =3D pkt->busaccess_ext_base.byte_enable_len; + unsigned int sw =3D pkt->busaccess.stream_width; + MemTxResult ret =3D MEMTX_OK; + + assert(sw); + + for (i =3D 0; i < pkt->busaccess.len; i++) { + if (byte_en && !byte_en[i % byte_en_len]) { + continue; + } + + ret =3D dma_memory_rw(as, pkt->busaccess.addr + i % sw, + data + i, 1, dir, s->attr); + + if (ret !=3D MEMTX_OK) { + break; + } + } + + return ret; +} + +static AddressSpace *get_as_for_phys_busaccess(RemotePortMemorySlave *s, + struct rp_pkt *pkt) +{ + if (s->ats_cache) { + IOMMUTLBEntry *iotlb =3D + rp_ats_cache_lookup_translation(s->ats_cache, + pkt->busaccess.addr, + pkt->busaccess.len); + if (iotlb) { + /* Return the matching address space found. */ + return iotlb->target_as; + } + } + /* Emit a warning on errors since this really should not happen. */ + warn_report("Physical address error detected (range address: 0x%" + HWADDR_PRIx ", len: 0x%" PRIx32 " contains untranslated " + "addresses)", pkt->busaccess.addr, pkt->busaccess.len); + return NULL; +} + +static void rp_cmd_rw(RemotePortMemorySlave *s, struct rp_pkt *pkt, + DMADirection dir) +{ + size_t pktlen =3D sizeof(struct rp_pkt_busaccess_ext_base); + struct rp_encode_busaccess_in in =3D {0}; + size_t enclen; + int64_t delay; + uint8_t *data =3D NULL; + uint8_t *byte_en; + MemTxResult ret; + AddressSpace *as; + + byte_en =3D rp_busaccess_byte_en_ptr(s->peer, &pkt->busaccess_ext_base= ); + + if (dir =3D=3D DMA_DIRECTION_TO_DEVICE) { + pktlen +=3D pkt->busaccess.len; + } else { + data =3D rp_busaccess_rx_dataptr(s->peer, &pkt->busaccess_ext_base= ); + } + + assert(pkt->busaccess.width =3D=3D 0); + assert(!(pkt->hdr.flags & RP_PKT_FLAGS_response)); + + rp_dpkt_alloc(&s->rsp, pktlen); + if (dir =3D=3D DMA_DIRECTION_TO_DEVICE) { + data =3D rp_busaccess_tx_dataptr(s->peer, + &s->rsp.pkt->busaccess_ext_base); + } + + trace_remote_port_memory_slave_rx_busaccess(rp_cmd_to_string(pkt->hdr.= cmd), + pkt->hdr.id, pkt->hdr.flags, pkt->hdr.dev, pkt->busaccess.addr, + pkt->busaccess.len, pkt->busaccess.attributes); + + s->attr.secure =3D !!(pkt->busaccess.attributes & RP_BUS_ATTR_SECURE); + s->attr.requester_id =3D pkt->busaccess.master_id; + + if (pkt->busaccess.attributes & RP_BUS_ATTR_PHYS_ADDR) { + as =3D get_as_for_phys_busaccess(s, pkt); + } else { + as =3D &s->as; + } + if (as) { + if (byte_en || pkt->busaccess.stream_width !=3D pkt->busaccess.len= ) { + ret =3D process_data_slow(s, as, pkt, dir, data, byte_en); + } else { + ret =3D dma_memory_rw(as, pkt->busaccess.addr, data, + pkt->busaccess.len, dir, s->attr); + } + } else { + ret =3D MEMTX_ERROR; + } + + /* + * delay here could be set to the annotated cost of doing issuing + * these accesses. QEMU doesn't support this kind of annotations + * at the moment. So we just clear the delay. + */ + delay =3D 0; + + rp_encode_busaccess_in_rsp_init(&in, pkt); + in.clk =3D pkt->busaccess.timestamp + delay; + + switch (ret) { + case MEMTX_ERROR: + in.attr |=3D RP_RESP_BUS_GENERIC_ERROR << RP_BUS_RESP_SHIFT; + break; + case MEMTX_DECODE_ERROR: + in.attr |=3D RP_RESP_ADDR_ERROR << RP_BUS_RESP_SHIFT; + break; + default: + /* MEMTX_OK maps to RP_RESP_OK. */ + break; + } + + enclen =3D rp_encode_busaccess(s->peer, &s->rsp.pkt->busaccess_ext_bas= e, + &in); + assert(enclen <=3D pktlen); + + trace_remote_port_memory_slave_tx_busaccess(rp_cmd_to_string(in.cmd), + in.id, in.flags, in.dev, in.addr, in.size, in.attr); + + rp_write(s->rp, (void *)s->rsp.pkt, enclen); +} + +static void rp_memory_slave_realize(DeviceState *dev, Error **errp) +{ + RemotePortMemorySlave *s =3D REMOTE_PORT_MEMORY_SLAVE(dev); + + s->peer =3D rp_get_peer(s->rp); + address_space_init(&s->as, s->mr ? s->mr : get_system_memory(), "dma"); +} + +static void rp_memory_slave_write(RemotePortDevice *s, struct rp_pkt *pkt) +{ + return rp_cmd_rw(REMOTE_PORT_MEMORY_SLAVE(s), pkt, + DMA_DIRECTION_FROM_DEVICE); +} + +static void rp_memory_slave_read(RemotePortDevice *s, struct rp_pkt *pkt) +{ + return rp_cmd_rw(REMOTE_PORT_MEMORY_SLAVE(s), pkt, + DMA_DIRECTION_TO_DEVICE); +} + +static void rp_prop_allow_set_link(const Object *obj, const char *name, + Object *val, Error **errp) +{ +} + +static void rp_memory_slave_init(Object *obj) +{ + RemotePortMemorySlave *rpms =3D REMOTE_PORT_MEMORY_SLAVE(obj); + + object_property_add_link(obj, "rp-adaptor0", "remote-port", + (Object **)&rpms->rp, + rp_prop_allow_set_link, + OBJ_PROP_LINK_STRONG); + object_property_add_link(obj, "mr", TYPE_MEMORY_REGION, + (Object **)&rpms->mr, + qdev_prop_allow_set_link_before_realize, + OBJ_PROP_LINK_STRONG); + object_property_add_link(obj, "rp-ats-cache", TYPE_REMOTE_PORT_ATS_CAC= HE, + (Object **)&rpms->ats_cache, + qdev_prop_allow_set_link_before_realize, + OBJ_PROP_LINK_STRONG); +} + +static void rp_memory_slave_unrealize(DeviceState *dev) +{ + RemotePortMemorySlave *s =3D REMOTE_PORT_MEMORY_SLAVE(dev); + + address_space_destroy(&s->as); +} + +static void rp_memory_slave_class_init(ObjectClass *oc, const void *data) +{ + RemotePortDeviceClass *rpdc =3D REMOTE_PORT_DEVICE_CLASS(oc); + DeviceClass *dc =3D DEVICE_CLASS(oc); + + rpdc->ops[RP_CMD_write] =3D rp_memory_slave_write; + rpdc->ops[RP_CMD_read] =3D rp_memory_slave_read; + dc->realize =3D rp_memory_slave_realize; + dc->unrealize =3D rp_memory_slave_unrealize; +} + +static const TypeInfo rp_info =3D { + .name =3D TYPE_REMOTE_PORT_MEMORY_SLAVE, + .parent =3D TYPE_DEVICE, + .instance_size =3D sizeof(RemotePortMemorySlave), + .instance_init =3D rp_memory_slave_init, + .class_init =3D rp_memory_slave_class_init, + .interfaces =3D (InterfaceInfo[]) { + { TYPE_REMOTE_PORT_DEVICE }, + { }, + }, +}; + +static void rp_register_types(void) +{ + type_register_static(&rp_info); +} + +type_init(rp_register_types) diff --git a/hw/core/trace-events b/hw/core/trace-events index dc98745178..475c8439ba 100644 --- a/hw/core/trace-events +++ b/hw/core/trace-events @@ -42,3 +42,7 @@ rp_wait_resp(const char *rp) "'%s'" # remote-port-memory-master.c remote_port_memory_master_tx_busaccess(const char *cmd, uint32_t id, uint3= 2_t flags, uint32_t dev, uint64_t addr, uint32_t len, uint64_t attr) "cmd= =3D%s, id=3D0x%"PRIx32", flags=3D0x%"PRIx32", dev=3D0x%"PRIx32", addr=3D0x%= "PRIx64", len=3D0x%"PRIx32", attr=3D0x%"PRIx64 remote_port_memory_master_rx_busaccess(const char *cmd, uint32_t id, uint3= 2_t flags, uint32_t dev, uint64_t addr, uint32_t len, uint64_t attr) "cmd= =3D%s, id=3D0x%"PRIx32", flags=3D0x%"PRIx32", dev=3D0x%"PRIx32", addr=3D0x%= "PRIx64", len=3D0x%"PRIx32", attr=3D0x%"PRIx64 + +# remote-port-memory-slave.c +remote_port_memory_slave_tx_busaccess(const char *cmd, uint32_t id, uint32= _t flags, uint32_t dev, uint64_t addr, uint32_t len, uint64_t attr) "cmd=3D= %s, id=3D0x%"PRIx32", flags=3D0x%"PRIx32", dev=3D0x%"PRIx32", addr=3D0x%"PR= Ix64", len=3D0x%"PRIx32", attr=3D0x%"PRIx64 +remote_port_memory_slave_rx_busaccess(const char *cmd, uint32_t id, uint32= _t flags, uint32_t dev, uint64_t addr, uint32_t len, uint64_t attr) "cmd=3D= %s, id=3D0x%"PRIx32", flags=3D0x%"PRIx32", dev=3D0x%"PRIx32", addr=3D0x%"PR= Ix64", len=3D0x%"PRIx32", attr=3D0x%"PRIx64 diff --git a/include/hw/core/remote-port-memory-slave.h b/include/hw/core/r= emote-port-memory-slave.h new file mode 100644 index 0000000000..ef264effc2 --- /dev/null +++ b/include/hw/core/remote-port-memory-slave.h @@ -0,0 +1,35 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * QEMU remote port memory slave. Read and write transactions + * recieved from the remote port are translated into an address space. + * + * Copyright (c) 2013 Xilinx Inc + * Written by Edgar E. Iglesias + * Written by Peter Crosthwaite + * + * This code is licensed under the GNU GPL. + */ +#ifndef REMOTE_PORT_MEMORY_SLAVE_H +#define REMOTE_PORT_MEMORY_SLAVE_H + +#include "hw/core/remote-port-ats.h" + +#define TYPE_REMOTE_PORT_MEMORY_SLAVE "remote-port-memory-slave" +#define REMOTE_PORT_MEMORY_SLAVE(obj) \ + OBJECT_CHECK(RemotePortMemorySlave, (obj), \ + TYPE_REMOTE_PORT_MEMORY_SLAVE) + +typedef struct RemotePortMemorySlave { + /* private */ + SysBusDevice parent; + /* public */ + struct RemotePort *rp; + struct rp_peer_state *peer; + MemoryRegion *mr; + AddressSpace as; + MemTxAttrs attr; + RemotePortDynPkt rsp; + RemotePortATSCache *ats_cache; +} RemotePortMemorySlave; +#endif --=20 2.43.0 From nobody Sat Sep 26 21:35:41 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=1789488181; cv=none; d=zohomail.com; s=zohoarc; b=HhbTiB2FhmohXUKDLCLNraaFXbnrVR/nTKuAVkd10kfvCAoMSdHUkg8P0iqt3p6mVy29WmqQs2tXrwFTqVoBzX5NVMGQgztpinKFroDD6MWcWq1vYMPssXWp14Xuo9bOq7LGk36vFggDaaA4/tc4N2Li94V7TzHy6e9A/korcjU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789488181; 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=njMZgtKOcfOkDZU0dZIjVX7Nek8P5EbfO9WaLdMtUVA=; b=gqoPow3LIvTrhwvovAThfIlDAxjg4K1VhdxB6UJQY/jbteFLgmhVk3+wx5gjxCo8AuIQJEoGnmyKlZ0Wwt3zEh9v0PP9AxN6jSNzYteQ/SgI+vqeOcnWGjmHFkcvETp4GJ7PGg7IVXHPsTsxOesEuX3Fr2y44D32hWePcK1YCYE= 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 1789488181758329.5210089595429; Tue, 15 Sep 2026 09:03:01 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x6Vbd-0008JT-26; Tue, 15 Sep 2026 12:02:01 -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 1x6VbV-0008Cz-1a for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:55 -0400 Received: from mail-ej2-x10.google.com ([2a00:1450:4864:34::10]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1x6VbT-0003Tu-23 for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:52 -0400 Received: by mail-ej2-x10.google.com with SMTP id a640c23a62f3a-c29703cb796so577315666b.2 for ; Tue, 15 Sep 2026 09:01:40 -0700 (PDT) Received: from thinkpad-t470s.. (83-131-196-251.adsl.net.t-com.hr. [83.131.196.251]) by smtp.googlemail.com with ESMTPSA id a640c23a62f3a-c29ddd86344sm3235866b.0.2026.09.15.09.01.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 09:01:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789488100; x=1790092900; 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:content-type; bh=njMZgtKOcfOkDZU0dZIjVX7Nek8P5EbfO9WaLdMtUVA=; b=WD1sk+SKEDkEqZEmnhbpkYcUak0elpfk4GXHGy5vJcPCIMNHl6qLXOe0mi/yV22fmx 27p40RfkBVfx4KOKIL7THFZFvvRD0UAq92DRiZs7qI6uWfm+yw7L+kavDt2uCoPEwj4m w9hfSvXlSW3rnmPPHGYz+f4D3B0p2/ma/rH0Z1SEz3pELdPv8z4blOVlbJ98B1acWz00 CvbHBDD5XjVVQY/d5ol0umyOh+g3npcXwFytnEfX2rU6Q2hVTT1ob34XWP7duaaMh7fl 1Mx349uFyenK0B1NzMFydKLwHxoSPXTANaHE1PiafQmzk7afh5Z/4QjPZRXjDxdMCYHB 8Uug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789488100; x=1790092900; 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:content-type; bh=njMZgtKOcfOkDZU0dZIjVX7Nek8P5EbfO9WaLdMtUVA=; b=U3M6pYgVG4ml4qhz9TPcACmEdG294xJ4wPmQCt/s0mOx5eKuoWf6c8kIIn18TzMMWg XnRnqlo6qbgO6QAmYycxcRhvEaed0NJ7br1hqAo8AICqotz5XCVHlbylzve/c7OCNXk7 fyLs2YTTYfpsPOoZYSkVrxuhNcss15yMOPT5NVnqN6YhGOz487DIuOZV5yUKnaONG878 DbJMC0hiSLL+5ofLb4k/A41YSx3wvEk/RNWysftp9wL7kbFrnKyY8EtsAaMkP91NRXWz ThE4vY80u4sOlfUG6SUBsUFRPxq+unGJlGaOKxHtmb5DuLPjgSeXXEZ9hj59IVYBlMUU Vj2A== X-Gm-Message-State: AFuF++n7GS5Bn6v/T+qCqbzwwHmmjJwSFFzDJmji21Fg/3so44fNuFJb Jm9RJkoGFhbB+cYlP1XqTTNWMmmhw8RmoLfKZWx6IrD1YkjNsJmSD9resgNsSA== X-Gm-Gg: AYBFou3A2fLFrUX1tZadRIFAZswvUIZpbeCMddfflr34gG1iU6WzfUg3C31ZMMXYYQf oUx0ylP6q6SMni704GmiJGi6i5TAN1e+0KyB+cIEO59wAjx0g99BrxLGUhR8DPc9DJfloRWqpGJ nnGSX02eB1e+zd/V4fzQyRXSP/o6ORbIYFcBbFGbC6ofsxtM/LUNWPKcBQNYQLWMghT35dJLA00 KZLZ1jRNRW0QatJdE1Y1sg2QVt6is+0quNT8rFWs2XjCFNGGgo6K4o6k4iKZYAAz2Y6JK1QLBUf uTZxV6FTjLMx+02xCeGA6gGeMKjo7qqINlyljrk/p919Sy0ZwGa4Ay2zXcD0ORLPWnMeDUJtayh 0+DzurR/jKaMiPez+0eINqN5Z6/4DmlrTKV5j9r5Zym+TGaUA3AuG5yEm0BuP+0ICWKOqt8bPPC 5wHKDzKGUQJiwwH9M52FNxk2+/r/AbNBvr5fDtvSDCX4bJQwrIBJ/GuL0j/jG/lHVZrFC1gQOCM DHQs1VZe8nIX2vvdey1AA1FfWkDNLpo8RGzhYuXWWwyuw== X-Received: by 2002:a17:907:dab:b0:c26:1648:a065 with SMTP id a640c23a62f3a-c29b87267demr527431266b.32.1789488099490; Tue, 15 Sep 2026 09:01:39 -0700 (PDT) From: Ruslan Ruslichenko To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, artem_mygaiev@epam.com, volodymyr_babchuk@epam.com, peter.maydell@linaro.org, francisco.iglesias@amd.com, edgar.iglesias@gmail.com, berrange@redhat.com, eugene@nuvacore.ai, Ruslan_Ruslichenko@epam.com, takahiro.nakata.wr@renesas.com, "Edgar E . Iglesias" Subject: [PATCH v2 16/20] hw/core: Add Remote Port GPIO/Interrupt bridge Date: Tue, 15 Sep 2026 18:00:40 +0200 Message-ID: <20260915160044.345788-17-ruslichenko.r@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260915160044.345788-1-ruslichenko.r@gmail.com> References: <20260915160044.345788-1-ruslichenko.r@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:34::10; envelope-from=ruslichenko.r@gmail.com; helo=mail-ej2-x10.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-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: 1789488182955158500 Content-Type: text/plain; charset="utf-8" From: Ruslan Ruslichenko This patch adds the `remote-port-gpio` device, which enables GPIO levels exchange between QEMU and the remote peer. It maps QEMU's `qemu_irq` lines (GPIOs) to Remote Port `RP_CMD_interrupt` packets, enabling the synchronization of interrupt lines and logic signals across the simulation. This is essential for wiring up interrupt controllers or discrete logic signals (reset lines, enable pins). Signed-off-by: Edgar E. Iglesias Signed-off-by: Takahiro Nakata Signed-off-by: Ruslan Ruslichenko --- hw/core/remote-port-gpio.c | 187 +++++++++++++++++++++++++++++ hw/core/trace-events | 4 + include/hw/core/remote-port-gpio.h | 34 ++++++ 3 files changed, 225 insertions(+) create mode 100644 hw/core/remote-port-gpio.c create mode 100644 include/hw/core/remote-port-gpio.h diff --git a/hw/core/remote-port-gpio.c b/hw/core/remote-port-gpio.c new file mode 100644 index 0000000000..43a40315c5 --- /dev/null +++ b/hw/core/remote-port-gpio.c @@ -0,0 +1,187 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * Copyright (c) 2013 Xilinx Inc + * Written by Edgar E. Iglesias + * Written by Peter Crosthwaite + * + * This code is licensed under the GNU GPL. + */ + +#include "qemu/osdep.h" +#include "hw/core/sysbus.h" +#include "system/system.h" +#include "system/dma.h" +#include "qemu/log.h" +#include "qapi/qmp/qerror.h" +#include "qapi/error.h" +#include "migration/vmstate.h" +#include "hw/core/qdev-properties.h" +#include "hw/core/irq.h" +#include "trace.h" + +#include "hw/core/remote-port.h" +#include "hw/core/remote-port-proto.h" +#include "hw/core/remote-port-gpio.h" + +#define CACHE_INVALID -1 + +static void rp_gpio_handler(void *opaque, int irq, int level) +{ + RemotePortGPIO *s =3D opaque; + struct rp_pkt pkt; + size_t len; + int64_t clk; + uint32_t id =3D rp_new_id(s->rp); + uint32_t flags =3D s->posted_updates ? RP_PKT_FLAGS_posted : 0; + + /* If we hit the cache, return early. */ + if (s->cache[irq] !=3D CACHE_INVALID && s->cache[irq] =3D=3D level) { + return; + } + /* Update the cache and update the remote peer. */ + s->cache[irq] =3D level; + + clk =3D rp_normalized_vmclk(s->rp); + len =3D rp_encode_interrupt_f(id, s->rp_dev, &pkt.interrupt, clk, + irq, 0, level, flags); + + trace_remote_port_gpio_tx_interrupt(id, flags, s->rp_dev, 0, irq, leve= l); + + if (s->peer->caps.wire_posted_updates && !s->posted_updates) { + rp_rsp_mutex_lock(s->rp); + } + + rp_write(s->rp, (void *)&pkt, len); + + /* + * If peer supports posted updates it will respect our flag and + * not respond. + */ + if (s->peer->caps.wire_posted_updates && !s->posted_updates) { + RemotePortRespSlot *rsp_slot; + struct rp_pkt_interrupt *intr; + + rsp_slot =3D rp_dev_wait_resp(s->rp, s->rp_dev, id); + assert(rsp_slot->rsp.pkt->hdr.id =3D=3D id); + + intr =3D &rsp_slot->rsp.pkt->interrupt; + trace_remote_port_gpio_rx_interrupt(intr->hdr.id, intr->hdr.flags, + intr->hdr.dev, intr->vector, intr->line, intr->val); + + rp_resp_slot_done(s->rp, rsp_slot); + rp_rsp_mutex_unlock(s->rp); + } +} + +static void rp_gpio_interrupt(RemotePortDevice *rpdev, struct rp_pkt *pkt) +{ + RemotePortGPIO *s =3D REMOTE_PORT_GPIO(rpdev); + + trace_remote_port_gpio_rx_interrupt(pkt->hdr.id, pkt->hdr.flags, + pkt->hdr.dev, pkt->interrupt.vector, pkt->interrupt.line, + pkt->interrupt.val); + + qemu_set_irq(s->gpio_out[pkt->interrupt.line], pkt->interrupt.val); + + if (s->peer->caps.wire_posted_updates + && !(pkt->hdr.flags & RP_PKT_FLAGS_posted)) { + RemotePortDynPkt rsp =3D {0}; + size_t len; + + /* Need to reply. */ + rp_dpkt_alloc(&rsp, sizeof(struct rp_pkt_interrupt)); + len =3D rp_encode_interrupt_f(pkt->hdr.id, pkt->hdr.dev, + &rsp.pkt->interrupt, + pkt->interrupt.timestamp, + pkt->interrupt.line, + pkt->interrupt.vector, + pkt->interrupt.val, + pkt->hdr.flags | RP_PKT_FLAGS_response= ); + + trace_remote_port_gpio_tx_interrupt(pkt->hdr.id, + pkt->hdr.flags | RP_PKT_FLAGS_response, pkt->hdr.dev, + pkt->interrupt.vector, pkt->interrupt.line, pkt->interrupt.val= ); + + rp_write(s->rp, (void *)rsp.pkt, len); + } +} + +static void rp_gpio_reset(DeviceState *dev) +{ + RemotePortGPIO *s =3D REMOTE_PORT_GPIO(dev); + + /* Mark as invalid. */ + memset(s->cache, CACHE_INVALID, s->num_gpios); +} + +static void rp_gpio_realize(DeviceState *dev, Error **errp) +{ + RemotePortGPIO *s =3D REMOTE_PORT_GPIO(dev); + RemotePortDevice *rpd =3D REMOTE_PORT_DEVICE(dev); + unsigned int i; + + rp_register_dev(s->rp, rpd, s->rp_dev); + + s->peer =3D rp_get_peer(s->rp); + + s->gpio_out =3D g_new0(qemu_irq, s->num_gpios); + qdev_init_gpio_out(dev, s->gpio_out, s->num_gpios); + qdev_init_gpio_in(dev, rp_gpio_handler, s->num_gpios); + + for (i =3D 0; i < s->num_gpios; i++) { + sysbus_init_irq(SYS_BUS_DEVICE(s), &s->gpio_out[i]); + } +} + +static void rp_prop_allow_set_link(const Object *obj, const char *name, + Object *val, Error **errp) +{ +} + +static void rp_gpio_init(Object *obj) +{ + RemotePortGPIO *rpms =3D REMOTE_PORT_GPIO(obj); + + object_property_add_link(obj, "rp-adaptor0", "remote-port", + (Object **)&rpms->rp, + rp_prop_allow_set_link, + OBJ_PROP_LINK_STRONG); +} + +static Property rp_properties[] =3D { + DEFINE_PROP_UINT32("rp-chan0", RemotePortGPIO, rp_dev, 0), + DEFINE_PROP_UINT32("num-gpios", RemotePortGPIO, num_gpios, 16), + DEFINE_PROP_UINT16("cell-offset-irq-num", RemotePortGPIO, + cell_offset_irq_num, 0), + DEFINE_PROP_BOOL("posted-updates", RemotePortGPIO, posted_updates, tru= e), +}; + +static void rp_gpio_class_init(ObjectClass *oc, const void *data) +{ + RemotePortDeviceClass *rpdc =3D REMOTE_PORT_DEVICE_CLASS(oc); + DeviceClass *dc =3D DEVICE_CLASS(oc); + rpdc->ops[RP_CMD_interrupt] =3D rp_gpio_interrupt; + dc->legacy_reset =3D rp_gpio_reset; + dc->realize =3D rp_gpio_realize; + device_class_set_props_n(dc, rp_properties, ARRAY_SIZE(rp_properties)); +} + +static const TypeInfo rp_info =3D { + .name =3D TYPE_REMOTE_PORT_GPIO, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(RemotePortGPIO), + .instance_init =3D rp_gpio_init, + .class_init =3D rp_gpio_class_init, + .interfaces =3D (InterfaceInfo[]) { + { TYPE_REMOTE_PORT_DEVICE }, + { }, + }, +}; + +static void rp_register_types(void) +{ + type_register_static(&rp_info); +} + +type_init(rp_register_types) diff --git a/hw/core/trace-events b/hw/core/trace-events index 475c8439ba..cbf8de6da3 100644 --- a/hw/core/trace-events +++ b/hw/core/trace-events @@ -46,3 +46,7 @@ remote_port_memory_master_rx_busaccess(const char *cmd, u= int32_t id, uint32_t fl # remote-port-memory-slave.c remote_port_memory_slave_tx_busaccess(const char *cmd, uint32_t id, uint32= _t flags, uint32_t dev, uint64_t addr, uint32_t len, uint64_t attr) "cmd=3D= %s, id=3D0x%"PRIx32", flags=3D0x%"PRIx32", dev=3D0x%"PRIx32", addr=3D0x%"PR= Ix64", len=3D0x%"PRIx32", attr=3D0x%"PRIx64 remote_port_memory_slave_rx_busaccess(const char *cmd, uint32_t id, uint32= _t flags, uint32_t dev, uint64_t addr, uint32_t len, uint64_t attr) "cmd=3D= %s, id=3D0x%"PRIx32", flags=3D0x%"PRIx32", dev=3D0x%"PRIx32", addr=3D0x%"PR= Ix64", len=3D0x%"PRIx32", attr=3D0x%"PRIx64 + +# remote-port-memory-gpio.c +remote_port_gpio_tx_interrupt(uint32_t id, uint32_t flags, uint32_t dev, u= int64_t vector, uint32_t irq, uint32_t val) "id=3D0x%"PRIx32", flags=3D0x%"= PRIx32", dev=3D0x%"PRIx32", vector=3D0x%"PRIx64", irq=3D0x%"PRIx32", level= =3D0x%"PRIx32 +remote_port_gpio_rx_interrupt(uint32_t id, uint32_t flags, uint32_t dev, u= int64_t vector, uint32_t irq, uint32_t val) "id=3D0x%"PRIx32", flags=3D0x%"= PRIx32", dev=3D0x%"PRIx32", vector=3D0x%"PRIx64", irq=3D0x%"PRIx32", level= =3D0x%"PRIx32 diff --git a/include/hw/core/remote-port-gpio.h b/include/hw/core/remote-po= rt-gpio.h new file mode 100644 index 0000000000..0079ebfc73 --- /dev/null +++ b/include/hw/core/remote-port-gpio.h @@ -0,0 +1,34 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * Copyright (c) 2013 Xilinx Inc + * Written by Edgar E. Iglesias + * Written by Peter Crosthwaite + * + * This code is licensed under the GNU GPL. + */ +#ifndef REMOTE_PORT_GPIO_H +#define REMOTE_PORT_GPIO_H + +#define TYPE_REMOTE_PORT_GPIO "remote-port-gpio" +#define REMOTE_PORT_GPIO(obj) \ + OBJECT_CHECK(RemotePortGPIO, (obj), TYPE_REMOTE_PORT_GPIO) + +#define MAX_GPIOS 960 + +typedef struct RemotePortGPIO { + /* private */ + SysBusDevice parent; + /* public */ + + int8_t cache[MAX_GPIOS]; + uint32_t num_gpios; + qemu_irq *gpio_out; + uint16_t cell_offset_irq_num; + + bool posted_updates; + uint32_t rp_dev; + struct RemotePort *rp; + struct rp_peer_state *peer; +} RemotePortGPIO; +#endif --=20 2.43.0 From nobody Sat Sep 26 21:35:41 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=1789488336; cv=none; d=zohomail.com; s=zohoarc; b=QIhJO4e5VxBtVvENmRDvvsxkFRvDjAgN7vVMmZSdrQ7QkDXjzUOfrVBTq3llyCNWQZ2DfSQRkMebsev10heMOT/8t8ALv22j7vPdW3WlTB6xF9SpDEnoY009FgDx6/+SiurIzBr4Wmgawo3L8umqhgcLywn1wAUK4jWhW/MFKwA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789488336; 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=TozMh1lROKr3/XUiFmSCqeeEpIoOvvzxaVYz8p46u1A=; b=TT62Tr1adTURkYvo3JpiTkvUS5Y3EPxsZoFkMHI+XXe70t7kQ6eT1+hJmeo7jD3z0ZwjwUu6ZJ2yUAQqHT5iwU1dQtFgoYgyir7uTNU7eWd6obaMa+wyRLmfwJw0SJh/LLplrYd9XwgACoQUH1SYyfY5Sp2RBy+uJP0Ei0+j5Kg= 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 1789488336193427.42061779369806; Tue, 15 Sep 2026 09:05:36 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x6Vbh-0008Mk-Fq; Tue, 15 Sep 2026 12:02:06 -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 1x6VbY-0008Gv-DE for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:56 -0400 Received: from mail-ej2-x10.google.com ([2a00:1450:4864:34::10]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1x6VbU-0003UY-Ng for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:55 -0400 Received: by mail-ej2-x10.google.com with SMTP id a640c23a62f3a-c264788fd58so553776666b.1 for ; Tue, 15 Sep 2026 09:01:42 -0700 (PDT) Received: from thinkpad-t470s.. (83-131-196-251.adsl.net.t-com.hr. [83.131.196.251]) by smtp.googlemail.com with ESMTPSA id a640c23a62f3a-c29ddd86344sm3235866b.0.2026.09.15.09.01.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 09:01:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789488101; x=1790092901; 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:content-type; bh=TozMh1lROKr3/XUiFmSCqeeEpIoOvvzxaVYz8p46u1A=; b=f9U5BQhFcnpEuJuX9FytIhHh8SeVLJ2/7fVRk7lIz6cwTyYZgYQLWvlIQTDq3hEeOv rVWsYP0TMrw9nn4DTBcZj2nntAYBBdfEGax/PDvSGEbDNk/yR11yv0kfEafbVK9rF/XY LdDnPLgVt+WIpSChwgF+XTkamAo0mmCM15lofvC9JmA+Zl4Exfsxo8hWVrl/jnSeBZ/T xfONpta+0u/HQW+NhEe+/8dZm/r2WqGO+ls9SBh0vcXVaSG8tLgABhOXTTFXrdLrJw11 x/WfW1KOrTbG4zQth63bFggvGLwyokB9NdkaV15T8VSgbUs/3XYd7nDGM59exM1VVwis BChg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789488101; x=1790092901; 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:content-type; bh=TozMh1lROKr3/XUiFmSCqeeEpIoOvvzxaVYz8p46u1A=; b=y4PJ/GKXzGjFO/5XEqEQtDYB2YGLBikoHQKvhTWz1TUxlbVzSIH7OAEFEbgJWcs6Nq c220vozVzCJLqSmkQPoLs1NVc9RuTECrTSDqXEAO79LIg7EKFwFB9s+mntkX6LQHHjVA nX2/F93PiLSlmB9TkkhdSHOp2y5P/HulumtcrZ49zCnSWH3vkUMZCSjucW0Hhqx6UGXi 7iC2JS2DENqEryvQC2EXmRNdxeEV27LTTU2w/B5VbLXdV27sMbWxkWy40lOcpnay81FM QzjMgLDjOW+VGxbAa/TXOZVOyG7n/foLJRzujnEUqb4dJS9vC7DdizMXsHkXEg1TXzVY 0+wA== X-Gm-Message-State: AFuF++mbrOpKgrg7MXeixKay9fZw0/JXyy2+r9Vva4FRCg3ObSqgZWeN XJRanOQpkd/KKLMNxKmroNl/KWIU4Fsxt5N7yIgUU/Fc7YWQiB/pynMSqkfqdA== X-Gm-Gg: AYBFou3PRD5OxDzNEGY80rLo6HPbqdMdOPLyIvBfJw+HsYK0AHdXpB796NMnxTiNm4S CuJpzFGppXeJyEgTFEJnVL+pRTzHbUE5nz2L/RAJ5iFLLCNO7vyyEH4J/LoW+Yln4wxrGK8l9Ju j/jHsm9U8izLTj7pMIbirSi5JbdEMzK1k7DUBfukpMlOy8zi3+gA3Ceb2+BcVNjeJ7o//7bmvm5 1GoRe5RTlyR9l9QkFwkeTW2c8ga/W1U/Ld/i4Nn0BbhxZSJjXXwfFYav1l31Zv9LML6bx1K+8Km fdJqbaj3DuAV/7sq70oIYYNog3RLKbFSQI+5kAu6DGvOZF2XmoCcN+cy+/1lzM9WNJ80eKlGC0G K4CeiBBCzlqQBjnuWuAl/O6Chxgr4ACQRAR63vkr9r0nl4hOXkO1swmQuSZtAobQn2djgBl8yyv 5smP1yVwsNdNmVVWqFjVBFNF/f3FVqf1oZSK17gGpqFsXKDJtULOiktZ5ysavJTNT3MGU0wNnJv fRc2Ca+zThb47DRpmHmt6wZVNDNbDziyripUqUD8sDzRw== X-Received: by 2002:a17:907:3e0b:b0:c25:c954:faf2 with SMTP id a640c23a62f3a-c29b863b0c4mr562937266b.21.1789488101148; Tue, 15 Sep 2026 09:01:41 -0700 (PDT) From: Ruslan Ruslichenko To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, artem_mygaiev@epam.com, volodymyr_babchuk@epam.com, peter.maydell@linaro.org, francisco.iglesias@amd.com, edgar.iglesias@gmail.com, berrange@redhat.com, eugene@nuvacore.ai, Ruslan_Ruslichenko@epam.com, takahiro.nakata.wr@renesas.com, "Edgar E . Iglesias" Subject: [PATCH v2 17/20] hw/core: Add Remote Port Stream device Date: Tue, 15 Sep 2026 18:00:41 +0200 Message-ID: <20260915160044.345788-18-ruslichenko.r@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260915160044.345788-1-ruslichenko.r@gmail.com> References: <20260915160044.345788-1-ruslichenko.r@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:34::10; envelope-from=ruslichenko.r@gmail.com; helo=mail-ej2-x10.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-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: 1789488338398158500 Content-Type: text/plain; charset="utf-8" From: Ruslan Ruslichenko Introduce the 'remote-port-stream' device to bridge QEMU StreamSink interfaces with the Remote Port protocol. The patch implements the logic to translate local stream push operations into Remote Port bus-access packets and vice-versa. This enables bi-directional data streaming between QEMU and external simulators. Preserved existing MIT license for hw/core/remote-port-stream.c. Signed-off-by: Edgar E. Iglesias Signed-off-by: Takahiro Nakata Signed-off-by: Ruslan Ruslichenko --- hw/core/remote-port-stream.c | 246 +++++++++++++++++++++++++++++++++++ hw/core/trace-events | 4 + 2 files changed, 250 insertions(+) create mode 100644 hw/core/remote-port-stream.c diff --git a/hw/core/remote-port-stream.c b/hw/core/remote-port-stream.c new file mode 100644 index 0000000000..c2896a55e7 --- /dev/null +++ b/hw/core/remote-port-stream.c @@ -0,0 +1,246 @@ +/* + * SPDX-License-Identifier: MIT + * + * Copyright (c) 2013 Xilinx Inc + * Copyright (c) 2013 Peter Crosthwaite + * Copyright (c) 2013 Edgar E. Iglesias + * + * Permission is hereby granted, free of charge, to any person obtaining a= copy + * of this software and associated documentation files (the "Software"), t= o deal + * in the Software without restriction, including without limitation the r= ights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or se= ll + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included= in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS= OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OT= HER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING= FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS = IN + * THE SOFTWARE. + */ + +#include "qemu/osdep.h" +#include "hw/core/sysbus.h" +#include "qemu/log.h" + +#include "qemu/bitops.h" +#include "qapi/qmp/qerror.h" +#include "hw/core/stream.h" +#include "qapi/error.h" +#include "migration/vmstate.h" +#include "hw/core/qdev-properties.h" +#include "hw/core/remote-port.h" +#include "trace.h" + +#define TYPE_REMOTE_PORT_STREAM "remote-port-stream" + +#define REMOTE_PORT_STREAM(obj) \ + OBJECT_CHECK(RemotePortStream, (obj), TYPE_REMOTE_PORT_STREAM) + +typedef struct RemotePortStream RemotePortStream; + +struct RemotePortStream { + DeviceState parent_obj; + + RemotePort *rp; + uint32_t rp_dev; + uint16_t stream_width; + + StreamSink *tx_dev; + + StreamCanPushNotifyFn notify; + void *notify_opaque; + + uint8_t *buf; + struct rp_pkt pkt; + + bool rsp_pending; + uint32_t current_id; +}; + +static void rp_stream_notify(void *opaque) +{ + RemotePortStream *s =3D REMOTE_PORT_STREAM(opaque); + + /* FIXME: This is completely bogus. */ + if (s->buf && stream_can_push(s->tx_dev, rp_stream_notify, s)) { + RemotePortDynPkt rsp; + struct rp_encode_busaccess_in in =3D {0}; + size_t pktlen =3D sizeof(struct rp_pkt_busaccess_ext_base); + size_t enclen; + int64_t delay =3D 0; /* FIXME - Implement */ + + size_t ret =3D stream_push(s->tx_dev, s->buf, 4, 0); + assert(ret =3D=3D 4); + s->buf =3D NULL; + + memset(&rsp, 0, sizeof(rsp)); + rp_dpkt_alloc(&rsp, pktlen); + rp_encode_busaccess_in_rsp_init(&in, &s->pkt); + in.clk =3D s->pkt.busaccess.timestamp + delay; + enclen =3D rp_encode_busaccess(rp_get_peer(s->rp), + &rsp.pkt->busaccess_ext_base, + &in); + assert(enclen <=3D pktlen); + trace_remote_port_stream_tx_busaccess(rp_cmd_to_string(in.cmd), + in.id, in.flags, in.dev, in.addr, in.size, in.attr); + + rp_write(s->rp, (void *)rsp.pkt, pktlen); + } +} + +static void rp_stream_write(RemotePortDevice *obj, struct rp_pkt *pkt) +{ + RemotePortStream *s =3D REMOTE_PORT_STREAM(obj); + + trace_remote_port_stream_rx_busaccess(rp_cmd_to_string(pkt->hdr.cmd), + pkt->hdr.id, pkt->hdr.flags, pkt->hdr.dev, pkt->busaccess.addr, + pkt->busaccess.len, pkt->busaccess.attributes); + + assert(pkt->busaccess.width =3D=3D 0); + assert(pkt->busaccess.stream_width =3D=3D pkt->busaccess.len); + assert(pkt->busaccess.addr =3D=3D 0); + + if (pkt->hdr.flags & RP_PKT_FLAGS_response) { + /* FXIME - probably need to do syncs and stuff */ + assert(s->rsp_pending); + s->rsp_pending =3D false; + if (s->notify) { + StreamCanPushNotifyFn notify =3D s->notify; + s->notify =3D NULL; + notify(s->notify_opaque); + } + } else { + assert(!s->buf); + s->buf =3D g_memdup2(pkt + 1, 4); + s->pkt =3D *pkt; + rp_stream_notify(s); + } +} + +static bool rp_stream_stream_can_push(StreamSink *obj, + StreamCanPushNotifyFn notify, + void *notify_opaque) +{ + RemotePortStream *s =3D REMOTE_PORT_STREAM(obj); + + if (s->rsp_pending) { + s->notify =3D notify; + s->notify_opaque =3D notify_opaque; + return false; + } + return true; +} + +static size_t rp_stream_stream_push(StreamSink *obj, uint8_t *buf, + size_t len, bool eop) +{ + RemotePortStream *s =3D REMOTE_PORT_STREAM(obj); + RemotePortDynPkt rsp; + struct rp_pkt_busaccess_ext_base pkt; + struct rp_encode_busaccess_in in =3D {0}; + uint64_t rp_attr =3D eop ? RP_BUS_ATTR_EOP : 0; + int64_t clk; + int enclen; + + clk =3D rp_normalized_vmclk(s->rp); + + in.cmd =3D RP_CMD_write; + in.id =3D rp_new_id(s->rp); + in.dev =3D s->rp_dev; + in.clk =3D clk; + in.attr =3D rp_attr; + in.size =3D len; + in.stream_width =3D s->stream_width; + enclen =3D rp_encode_busaccess(rp_get_peer(s->rp), &pkt, &in); + + trace_remote_port_stream_tx_busaccess(rp_cmd_to_string(in.cmd), + in.id, in.flags, in.dev, in.addr, in.size, in.attr); + + rp_rsp_mutex_lock(s->rp); + rp_write(s->rp, (void *) &pkt, enclen); + rp_write(s->rp, buf, len); + rsp =3D rp_wait_resp(s->rp); + assert(rsp.pkt->hdr.id =3D=3D be32_to_cpu(pkt.hdr.id)); + + trace_remote_port_stream_rx_busaccess( + rp_cmd_to_string(rsp.pkt->hdr.cmd), rsp.pkt->hdr.id, + rsp.pkt->hdr.flags, rsp.pkt->hdr.dev, rsp.pkt->busaccess.addr, + rsp.pkt->busaccess.len, rsp.pkt->busaccess.attributes); + + rp_dpkt_invalidate(&rsp); + rp_rsp_mutex_unlock(s->rp); + rp_restart_sync_timer(s->rp); + return len; +} + +static void rp_stream_realize(DeviceState *dev, Error **errp) +{ + RemotePortStream *s =3D REMOTE_PORT_STREAM(dev); + RemotePortDevice *rpd =3D REMOTE_PORT_DEVICE(dev); + + rp_register_dev(s->rp, rpd, s->rp_dev); +} + +static void rp_prop_allow_set_link(const Object *obj, const char *name, + Object *val, Error **errp) +{ +} + +static void rp_stream_init(Object *obj) +{ + RemotePortStream *s =3D REMOTE_PORT_STREAM(obj); + + object_property_add_link(obj, "axistream-connected", TYPE_STREAM_SINK, + (Object **)&s->tx_dev, + qdev_prop_allow_set_link_before_realize, + OBJ_PROP_LINK_STRONG); + object_property_add_link(obj, "rp-adaptor0", "remote-port", + (Object **)&s->rp, + rp_prop_allow_set_link, + OBJ_PROP_LINK_STRONG); +} + +static Property rp_properties[] =3D { + DEFINE_PROP_UINT32("rp-chan0", RemotePortStream, rp_dev, 0), + DEFINE_PROP_UINT16("stream-width", RemotePortStream, stream_width, 4), +}; + +static void rp_stream_class_init(ObjectClass *oc, const void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(oc); + StreamSinkClass *ssc =3D STREAM_SINK_CLASS(oc); + RemotePortDeviceClass *rpdc =3D REMOTE_PORT_DEVICE_CLASS(oc); + + ssc->push =3D rp_stream_stream_push; + ssc->can_push =3D rp_stream_stream_can_push; + device_class_set_props_n(dc, rp_properties, ARRAY_SIZE(rp_properties)); + rpdc->ops[RP_CMD_write] =3D rp_stream_write; + + dc->realize =3D rp_stream_realize; +} + +static const TypeInfo rp_stream_info =3D { + .name =3D TYPE_REMOTE_PORT_STREAM, + .parent =3D TYPE_DEVICE, + .instance_size =3D sizeof(RemotePortStream), + .class_init =3D rp_stream_class_init, + .instance_init =3D rp_stream_init, + .interfaces =3D (InterfaceInfo[]) { + { TYPE_STREAM_SINK }, + { TYPE_REMOTE_PORT_DEVICE }, + { }, + } +}; + +static void rp_stream_register_types(void) +{ + type_register_static(&rp_stream_info); +} + +type_init(rp_stream_register_types) diff --git a/hw/core/trace-events b/hw/core/trace-events index cbf8de6da3..b5f8fafc60 100644 --- a/hw/core/trace-events +++ b/hw/core/trace-events @@ -50,3 +50,7 @@ remote_port_memory_slave_rx_busaccess(const char *cmd, ui= nt32_t id, uint32_t fla # remote-port-memory-gpio.c remote_port_gpio_tx_interrupt(uint32_t id, uint32_t flags, uint32_t dev, u= int64_t vector, uint32_t irq, uint32_t val) "id=3D0x%"PRIx32", flags=3D0x%"= PRIx32", dev=3D0x%"PRIx32", vector=3D0x%"PRIx64", irq=3D0x%"PRIx32", level= =3D0x%"PRIx32 remote_port_gpio_rx_interrupt(uint32_t id, uint32_t flags, uint32_t dev, u= int64_t vector, uint32_t irq, uint32_t val) "id=3D0x%"PRIx32", flags=3D0x%"= PRIx32", dev=3D0x%"PRIx32", vector=3D0x%"PRIx64", irq=3D0x%"PRIx32", level= =3D0x%"PRIx32 + +# remote-port-stream.c +remote_port_stream_tx_busaccess(const char *cmd, uint32_t id, uint32_t fla= gs, uint32_t dev, uint64_t addr, uint32_t len, uint64_t attr) "cmd=3D%s, i= d=3D0x%"PRIx32", flags=3D0x%"PRIx32", dev=3D0x%"PRIx32", addr=3D0x%"PRIx64"= , len=3D0x%"PRIx32", attr=3D0x%"PRIx64 +remote_port_stream_rx_busaccess(const char *cmd, uint32_t id, uint32_t fla= gs, uint32_t dev, uint64_t addr, uint32_t len, uint64_t attr) "cmd=3D%s, i= d=3D0x%"PRIx32", flags=3D0x%"PRIx32", dev=3D0x%"PRIx32", addr=3D0x%"PRIx64"= , len=3D0x%"PRIx32", attr=3D0x%"PRIx64 --=20 2.43.0 From nobody Sat Sep 26 21:35:41 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=1789488212; cv=none; d=zohomail.com; s=zohoarc; b=U9yRz7RXeSoqPsUUukFUU/a+29KFIEZk4yb0MJgF52bxMuggobdB4eVrghhU38ChyA1awfuDnP2CY8vLUVzA9ZpQJcegsk9U5iuyuBneyaAAjl7i0lllzBkd5jsCj1s0q+pSleZje32OadEwLW6YrI7NAlswbjuoh+81A+/b0bI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789488212; 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=CbPrT7PLvBDymN3EeZkp0K9KuC7aLbOtM142o2glIGU=; b=ODMDcmFZOLau2+EpNviJLQyRi29Kh+0ggV+WGEuCgzjk/fMP7bGT0CJwDWVjyiJydobKlaer2J8eFvCEgnIXPScC7V3J/kvTarpBHkucR0ReOe0zKnwADAg4sokkC3NpgVHNMA8pgsOdSaUUYebU2l5+OqMRrXcqZRg7KpQKlJ0= 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 1789488212820915.6515648629273; Tue, 15 Sep 2026 09:03:32 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x6Vbk-0008T7-4z; Tue, 15 Sep 2026 12:02:08 -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 1x6VbZ-0008Hp-LM for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:57 -0400 Received: from mail-ej2-x10.google.com ([2a00:1450:4864:34::10]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1x6VbW-0003V3-Au for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:57 -0400 Received: by mail-ej2-x10.google.com with SMTP id a640c23a62f3a-c254f6c7a4aso404524566b.0 for ; Tue, 15 Sep 2026 09:01:43 -0700 (PDT) Received: from thinkpad-t470s.. (83-131-196-251.adsl.net.t-com.hr. [83.131.196.251]) by smtp.googlemail.com with ESMTPSA id a640c23a62f3a-c29ddd86344sm3235866b.0.2026.09.15.09.01.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 09:01:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789488103; x=1790092903; 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:content-type; bh=CbPrT7PLvBDymN3EeZkp0K9KuC7aLbOtM142o2glIGU=; b=GOcxTr8IckRPJK5EJ2LJxvDgzFr6uZTMTILlhPWEVIKSGVAeps9fg1RXZKwy+tY++V MFvenDVFZ71An7bu60CucXjLz5xklTBuadnun8zEHh4LjvTQikGCUcUsr6EQk6UqeCt6 uCWiCw/WjDOa7cD747nyC+ON8HaWPBkaWntFkI9vdZlzZ6pOwe0GQivXpOtojho1sEIf cpVfPwsRdsXcks1hY99qSkiEGQbRydQlz2sOM2BsW99LNfJhZc0xydsT8GrupFboygMA SArd5i0O/mb7QZF+ka5eTFpK27NoKSnLMltv8hJetjj1zYnl/fNtyUo8LLab6jSjseVb Y7Bw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789488103; x=1790092903; 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:content-type; bh=CbPrT7PLvBDymN3EeZkp0K9KuC7aLbOtM142o2glIGU=; b=V0oDRF8rXThawkBX65aL0we1au2As3II1YNN3zw7mDNnGre47Z7GNxh697qt+qedQI gnSCXzRT30Qf6dgsjh1ouZUViK/7rYnRk9LtN8RHc/ajlWonkJXfE0ECNaye3tpuYrL4 SSSpYO1EkIcdzCmz2dmvVITTabRAXX3utaE4JaMvmEpnplyXLaFIzGV4t9hsXCPcq7Jw 6D2W62Y413qwe9NVRjlJU4EVx1CpOOAtd4ZzZh3OtN6LUB0IS6veCRrdSJHL731667mz oYbxeCJWCvSV9pANEweKPPWtliKueDSDDXfu7HTIMQyPM3tMBOOl2fvi+g6r9wyiD2mV 4D+A== X-Gm-Message-State: AFuF++mvTV9z+teD1+pNi4YA/MqOqe01E7Yhr/9ZBHgp2oLv1AnxSLw3 cT2kNAthtbSeMnYXVywFOma/+flBXCnMZlImgspcKmWFNRiFGy6xD9McyQ/Iqw== X-Gm-Gg: AYBFou0oOOD3KWP2b7Y6BjVPFDbINah2sCqTwgdWH7hYKgvSA4NFyIBQ0T3xnmwcgQx mtOMM2HkCUHzoXzXGjwgA9wctbDUAmhMF1P68SulpOB7EOFrvvNcNDMxX8CK3W/SOS4lr3np/aw vIGfixpU8A1iCjxJoezNh6zSGMi1lKyBI1qA0k7d9dvog4Ok9QEeVA4/qeGyeqm1CBocQHPgpow h4uI87MZ9Nz2sLSh1bGvq/cDkt7LWNi3SWUW6yBMf+PGR3yxN5fttcNA2FZOy15jMfLgaBKs8rM PNynztlljiGlyRnEl0t1hyE6g84i+h00MCAtotIvVdldfRYgAj+dCnW5U5eSjN+wjGeIoUCxYlh FOxA1NBbs7q5GmIhPFMq6ILrtIksmfM63vZ5TVKvzSChrLuSUj66MXBlHR3fWzMRay3MXrfvDO/ fJ/hiA0fCbja2FxHkwu+dIrzIaDzZIYO6eyZo4gV1Zz0YDoGIE7JihWcpqGBzYpfiNPt7Lz4CSL zerHWf27kYUtNSIfOZ1st9PZqwRWz7mkMkpfN71eHQtUQ== X-Received: by 2002:a17:906:f597:b0:c25:541:fd3a with SMTP id a640c23a62f3a-c29b84d1bd1mr499723166b.7.1789488102788; Tue, 15 Sep 2026 09:01:42 -0700 (PDT) From: Ruslan Ruslichenko To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, artem_mygaiev@epam.com, volodymyr_babchuk@epam.com, peter.maydell@linaro.org, francisco.iglesias@amd.com, edgar.iglesias@gmail.com, berrange@redhat.com, eugene@nuvacore.ai, Ruslan_Ruslichenko@epam.com, takahiro.nakata.wr@renesas.com, "Edgar E . Iglesias" Subject: [PATCH v2 18/20] hw/core: Add Remote Port files to build Date: Tue, 15 Sep 2026 18:00:42 +0200 Message-ID: <20260915160044.345788-19-ruslichenko.r@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260915160044.345788-1-ruslichenko.r@gmail.com> References: <20260915160044.345788-1-ruslichenko.r@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:34::10; envelope-from=ruslichenko.r@gmail.com; helo=mail-ej2-x10.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-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: 1789488215217158501 Content-Type: text/plain; charset="utf-8" From: Ruslan Ruslichenko Add the Remote Port subsystem source files to the build system. These files are compiled when CONFIG_REMOTE_PORT is enabled. Signed-off-by: Edgar E. Iglesias Signed-off-by: Takahiro Nakata Signed-off-by: Ruslan Ruslichenko --- hw/core/Kconfig | 4 ++++ hw/core/meson.build | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/hw/core/Kconfig b/hw/core/Kconfig index d1bdf765ee..25f553e189 100644 --- a/hw/core/Kconfig +++ b/hw/core/Kconfig @@ -38,3 +38,7 @@ config SPLIT_IRQ config EIF bool depends on LIBCBOR && GNUTLS + +config REMOTE_PORT + bool + depends on PTIMER && XILINX_AXI diff --git a/hw/core/meson.build b/hw/core/meson.build index 8fe776d2c8..74021c5f6d 100644 --- a/hw/core/meson.build +++ b/hw/core/meson.build @@ -26,6 +26,16 @@ system_ss.add(when: 'CONFIG_SPLIT_IRQ', if_true: files('= split-irq.c')) system_ss.add(when: 'CONFIG_XILINX_AXI', if_true: files('stream.c')) system_ss.add(when: 'CONFIG_PLATFORM_BUS', if_true: files('sysbus-fdt.c')) system_ss.add(when: 'CONFIG_EIF', if_true: [files('eif.c'), zlib, libcbor,= gnutls]) +system_ss.add(when: 'CONFIG_REMOTE_PORT', if_true: files( + 'remote-port-proto.c', + 'remote-port.c', + 'remote-port-memory-master.c', + 'remote-port-memory-slave.c', + 'remote-port-gpio.c', + 'remote-port-stream.c', + 'remote-port-ats.c', +)) + system_ss.add(files( 'cpu-system.c', 'fw-path-provider.c', --=20 2.43.0 From nobody Sat Sep 26 21:35:41 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=1789488295; cv=none; d=zohomail.com; s=zohoarc; b=CMyTAHWUXpNRgHzY9Wsd45YCskVua2Ei2qc0oiw8kkLQnnnnzvfIisZWvlaZNOm8uy3CTjhFQiz7NegmbEHPXZyHgotpE3uzjJ9/KfYDZ9RqBWe9Td/kwTDoTuQ7rQsnDwBDnAXg0d8slJPzELqaA7VeYF1ZHWMFNsjifk+v3lM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789488295; 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=QeOKPFEA582PfRWcIcHhtyxEQbe8HlQaK11TI65dVMU=; b=bVcPbFYt9YutUKe4r5Sk0coOAiLk7wuONT+9a+clEY9TzsCiuVqA4U6GEdNw9s6fMxBdqxQgzxGvA9onzQ+syBTXMatnURlkU77q75JZ5hTNOxJL3Kc+LQ/q5xUb9TNyxkZSI/2rymdrWZG1qgWaSQSkxou+A1evyglt3jbvkZA= 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 1789488295575341.19674058239843; Tue, 15 Sep 2026 09:04:55 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x6Vbk-000061-VW; Tue, 15 Sep 2026 12:02:09 -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 1x6Vbb-0008KC-TR for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:02:00 -0400 Received: from mail-ej2-x10.google.com ([2a00:1450:4864:34::10]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1x6VbY-0003Vi-3e for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:01:58 -0400 Received: by mail-ej2-x10.google.com with SMTP id a640c23a62f3a-c254f55eff0so440462366b.0 for ; Tue, 15 Sep 2026 09:01:45 -0700 (PDT) Received: from thinkpad-t470s.. (83-131-196-251.adsl.net.t-com.hr. [83.131.196.251]) by smtp.googlemail.com with ESMTPSA id a640c23a62f3a-c29ddd86344sm3235866b.0.2026.09.15.09.01.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 09:01:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789488105; x=1790092905; 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:content-type; bh=QeOKPFEA582PfRWcIcHhtyxEQbe8HlQaK11TI65dVMU=; b=knsXiCAvWlS/nlWMcFwJ0/j0xewk/IYe50ameUaBqtA8BtF9YgLYbfFtdeRp+U9dkV 1fybthndqhenqI9EluLzpb2raTPM657yQEM/cGWygaVSCCF/rzEKtdkHzRtDKekbAXmp Hb6UmHUNefpIo2BxhTfoBuvT1AWKj0Sb3nBQNzpoi09pSeaKtiRrKK/7wNst03CfCbI7 ELKfrLd8SQBkaQ8NnG+Qi2xZUd0VQVGhbAWCicTdOA1V7zQYFfXifigOE7rPh0+ucZRc CppLAghN0RuEeyo1WuNPUwyx559OuFlAA46X1EUk4BlTCuAUjqRlEQ4MlI8SZokmEtCA ANDg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789488105; x=1790092905; 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:content-type; bh=QeOKPFEA582PfRWcIcHhtyxEQbe8HlQaK11TI65dVMU=; b=Yw+TTPdvMbf57xQyqwhgjY057e56O3yySJITvCR29cjqivWGYqGwErTRZZ+9+kKjRu /zhSbPzSA4Pt/pfA+re6YvgsW/GWjrgwahPUSEccerSPphqOl/iXn/EKff5kGNykwD+H Uer5nrueI2NYozbZjzBghrNvcnwgdqJBQv9HWhYcHoMBFceE/kcaT1QJAYG61VaH3Ttq /b8XVhhofT/UuCxQLTYlX/FmfD50bLUcT7dCPFOrmwFGAX9WOQiQ30wIFeSmp/P3CjYQ UncPLdyELxjjoaK/fLLMAjExTXw6I/TG1K+IbaqxgzbBX9zVerU9Oz/35o/7YkZxTygc aRmQ== X-Gm-Message-State: AFuF++kQYk1T9jpf0T7t98+slRXjaFclPi1PREwMHL8V5zhNR4RGXEuR Ns65XsR4Dl39ip3su6r//jcUzCAShoE0d/z0HH+Q5vSTAQtkRLjCQ621SZ/tRQ== X-Gm-Gg: AYBFou1qQsUN4DUKnxJu9DsaRpu8niEHPydwZ9vpP97DXJfDYG5EnNq+FjkXqqF9fTy DQoVgamma8k3qK3vl2pusRHSzmE6TUleygHyNwXf23+3qizFIexW78xBRWZDwTWIk9tMyF2wCR4 jcUSouKT/4xq2EPfD9Gfg2H/s7En7rqlX+NQAo8Z+tZFGwMc68g9+uQnKihgRA1HcCL6ljYgvzZ eGWvWhoaXydt6NDZYOB562WRDS1qc6vyk3nJB62/ahceM2uTaeSrIc6cMYpz7DaJ5ZkX7CXbZz8 wsi5hnuNXdA3zXjQVkq/uMNsZL7+OMjdj6mvN4btqTetqrRpjaxHB6oc+2jN/ThVGEqiHsoBh73 rNNCZQb9LXcgUEYQyi5Cr8nUdnO0qg+gHsEmEPFG9gj3y13Sku3y1+D0rGKVy1WYceKYcGzRHNn XYdSzD5pxHT7tnvASVKxA+3hmctC4PCfXYjIBp0cctnO1GNi3yAmZ6Z/X9SANbWVtMz3eHdCkUr hbaEXVLC+ssEvuLSzo5Lnd+5BPnyrcFtPqJSzVSWCFieA== X-Received: by 2002:a17:907:6d1f:b0:c25:5faf:b207 with SMTP id a640c23a62f3a-c29b84c9a48mr546735966b.3.1789488104484; Tue, 15 Sep 2026 09:01:44 -0700 (PDT) From: Ruslan Ruslichenko To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, artem_mygaiev@epam.com, volodymyr_babchuk@epam.com, peter.maydell@linaro.org, francisco.iglesias@amd.com, edgar.iglesias@gmail.com, berrange@redhat.com, eugene@nuvacore.ai, Ruslan_Ruslichenko@epam.com, takahiro.nakata.wr@renesas.com, "Edgar E . Iglesias" Subject: [PATCH v2 19/20] hw/core: Add FDT support to Remote Port GPIO Date: Tue, 15 Sep 2026 18:00:43 +0200 Message-ID: <20260915160044.345788-20-ruslichenko.r@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260915160044.345788-1-ruslichenko.r@gmail.com> References: <20260915160044.345788-1-ruslichenko.r@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:34::10; envelope-from=ruslichenko.r@gmail.com; helo=mail-ej2-x10.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=unavailable autolearn_force=no X-Spam_action: no action 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: 1789488295909158500 Content-Type: text/plain; charset="utf-8" From: Ruslan Ruslichenko Implement the FDTGenericIntc interface for the Remote Port GPIO device. This enables the device to be recognized as an interrupt controller when instantiated via the fdt-generic framework. It allows other devices defined in the Device Tree to connect their interrupt lines to this GPIO controller using standard FDT properties (e.g., 'interrupts' and 'interrupt-parent'). The implementation maps the interrupt specifier from the Device Tree cells to the corresponding internal GPIO input line based on the configured cell offset. Signed-off-by: Edgar E. Iglesias Signed-off-by: Takahiro Nakata Signed-off-by: Ruslan Ruslichenko --- hw/core/remote-port-gpio.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/hw/core/remote-port-gpio.c b/hw/core/remote-port-gpio.c index 43a40315c5..af7f3c6075 100644 --- a/hw/core/remote-port-gpio.c +++ b/hw/core/remote-port-gpio.c @@ -20,6 +20,8 @@ #include "hw/core/irq.h" #include "trace.h" =20 +#include "hw/core/fdt_generic_util.h" + #include "hw/core/remote-port.h" #include "hw/core/remote-port-proto.h" #include "hw/core/remote-port-gpio.h" @@ -157,14 +159,34 @@ static Property rp_properties[] =3D { DEFINE_PROP_BOOL("posted-updates", RemotePortGPIO, posted_updates, tru= e), }; =20 +static int rp_fdt_get_irq(FDTGenericIntc *obj, qemu_irq *irqs, + uint32_t *cells, int ncells, int max, + Error **errp) +{ + RemotePortGPIO *s =3D REMOTE_PORT_GPIO(obj); + + if (cells[s->cell_offset_irq_num] >=3D s->num_gpios) { + error_setg(errp, "RP-GPIO was setup for %u interrupts: index %" + PRIu32 " requested", s->num_gpios, + cells[s->cell_offset_irq_num]); + return 0; + } + + (*irqs) =3D qdev_get_gpio_in(DEVICE(obj), cells[s->cell_offset_irq_num= ]); + return 1; +}; + static void rp_gpio_class_init(ObjectClass *oc, const void *data) { RemotePortDeviceClass *rpdc =3D REMOTE_PORT_DEVICE_CLASS(oc); DeviceClass *dc =3D DEVICE_CLASS(oc); + FDTGenericIntcClass *fgic =3D FDT_GENERIC_INTC_CLASS(oc); + rpdc->ops[RP_CMD_interrupt] =3D rp_gpio_interrupt; dc->legacy_reset =3D rp_gpio_reset; dc->realize =3D rp_gpio_realize; device_class_set_props_n(dc, rp_properties, ARRAY_SIZE(rp_properties)); + fgic->get_irq =3D rp_fdt_get_irq; } =20 static const TypeInfo rp_info =3D { @@ -175,6 +197,7 @@ static const TypeInfo rp_info =3D { .class_init =3D rp_gpio_class_init, .interfaces =3D (InterfaceInfo[]) { { TYPE_REMOTE_PORT_DEVICE }, + { TYPE_FDT_GENERIC_INTC }, { }, }, }; --=20 2.43.0 From nobody Sat Sep 26 21:35:41 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=1789488400; cv=none; d=zohomail.com; s=zohoarc; b=m43Psfl43hv7FOCEADS3q8vmXxSyKXWG6ZWVf+OjO6w/vfyIKw29M+IpOWtVAkwdN0WKDpfDJFRdED3lbrqMizJPcaiZzArUp0BselitD9egHzk64IjAMDZ1qOGEIJNtOQYOq86SPNI4UKb/utp6kZXUkpiMi4lsXVigc7l6Xzo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1789488400; 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=nNXJeaqt2s8P6UfDSK6Y1FWRU8dNfhhOhkwokU9p+w0=; b=VRg2ZZv6hBqiRm/nI4xwchXbM5mpD2JP1cTsb+A6zEgG2oBNe0rizmEpdSBJ1IPKW6V9OtBLHindooq+2Do0dVO4XU9xMcV+Aw/N2CrLtb/ny9KAlnsybWbhejU80nmMqrP6aUvus6vp+CtgvUyUj7jeZVs3qkYRrhksWcbIKeE= 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 1789488400512650.9615862068947; Tue, 15 Sep 2026 09:06:40 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1x6Vbn-0000F0-En; Tue, 15 Sep 2026 12:02:11 -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 1x6Vbe-0008Oe-U6 for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:02:04 -0400 Received: from mail-ej2-x10.google.com ([2a00:1450:4864:34::10]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1x6Vba-0003W6-4N for qemu-devel@nongnu.org; Tue, 15 Sep 2026 12:02:01 -0400 Received: by mail-ej2-x10.google.com with SMTP id a640c23a62f3a-c254f560398so89508666b.1 for ; Tue, 15 Sep 2026 09:01:47 -0700 (PDT) Received: from thinkpad-t470s.. (83-131-196-251.adsl.net.t-com.hr. [83.131.196.251]) by smtp.googlemail.com with ESMTPSA id a640c23a62f3a-c29ddd86344sm3235866b.0.2026.09.15.09.01.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 09:01:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789488106; x=1790092906; 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:content-type; bh=nNXJeaqt2s8P6UfDSK6Y1FWRU8dNfhhOhkwokU9p+w0=; b=mWl2IyY4qzc10WA6G4EUrTB6L/V/+5T3WTMjmUP5ZomSzJl7zv8n9RhYQLT+dOWlY1 BvlJ/TCVZLLNy6+OIxURerM8Wqv13sbOPDRddUpzxnZ9vPgHjkyWVj/YdZ5nFwpSpohz G8yA/SQ/P3wX7HT/dAn1/BcY0Wuifyu/LvhVXmWMalfpzJdUhWnGTlCJN2dlJAMtMKfH ZJhueyasEyxLnDwa3V5OQkViAg8TvveKqTjI5PB/8CXVr9Mq5emivg+1QDumqHxx4f7O 6DR7tQxkvpY86tvDIc/wDkscyHFOLW5x9fPm4+btIv3qnCoIST5JCs9xI0UON4k4+JYE 7yTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789488106; x=1790092906; 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:content-type; bh=nNXJeaqt2s8P6UfDSK6Y1FWRU8dNfhhOhkwokU9p+w0=; b=ptlLna8dCkSVefFCAPvZjv6SQQ1nE8EM7pUTC2ys/Utm7a1ZGoxe5b7RSns0uRyfZG KajfLcnTPbU1w3MvbUyi3oWvC1uQb12drRxLr/oSW3mlhn9H7hIjWJMmJ/H6Dx46T0ZC xBaoq5s8PsrC2fxKZ0Djw+/wkJIg3jVwdqyQYO15iRf8wSfcVmigZK/rie9mSrUzSsvq Hr5MKBh/dQyu1sRs+F0klF+V9jh9V5naxMR/WrXlv9L6KtmNW36yDitAqFSi3ot+2EJY P4fGSnBqmRMzGQ9Tq/Yxcl/HQTNTu2Y+UYJfl25c3pTtfDYEwaMZqAHU3HSX56u21hB5 AcTw== X-Gm-Message-State: AFuF++n9u/PNnUedldESI6GAwVjtXDovQruPB65tDKkvqzTQR0u1fwdC WqQFc+fTpqIpLH+kv5LPohaCvWByZVC1HubVDwPeB7RVPTaFjS5NmscqkhUxeg== X-Gm-Gg: AYBFou1KKPhmOtUDkk7ppxJQOWE9GvrdXZ8L54xNHZ3FcuALDNSX6YI2lL4FtBW0qYz 78xshCb798T8AcL0ZMulc/EG5jwYR2spYbdMt/PJej6SvC/MmsiQh1q1EM7LQb7YkT5uwySHbY2 LHHQRbbx70Iof9TjioPvBSyBf9zqsaQHP4GwQsj8z7EDLOgIxOjagy62JLtV+K+aAWTEIBW0CoW WM3KNL8r6EbyXyOZoE7CmA5scPRj31XipFbEV4g0ywgiwIrPvSS84SxUWKNr4uH8oXgBxPnxepA yAg1qVNdoLH8HQeEBv1a1i/23lh3Nrv7ebXK3QAiqUpYGZ9Lv3GfPqUbHwsKaUxhslVM+5eOygr mZWhZ2gXwf2zaLv2HcQ1fzWRoZyr0en4juo76ShrAz7Iey2qI/Kbltt+pdRtkYdNlTpNJ7TUFdE g4aRuYlo3W2Cz3jW6uURERi0gfkM9OAgLtVrfXTXmqf6gZGyqahw6u89zOYr8iT+5RpZmLbL44r axZwEuuZYbbAmOw34yv4bsgkeN2MeoPv1LmVcByv+ibtQ== X-Received: by 2002:a17:907:d8b:b0:c29:3821:ae6c with SMTP id a640c23a62f3a-c29d7930b3bmr139194866b.37.1789488106085; Tue, 15 Sep 2026 09:01:46 -0700 (PDT) From: Ruslan Ruslichenko To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, artem_mygaiev@epam.com, volodymyr_babchuk@epam.com, peter.maydell@linaro.org, francisco.iglesias@amd.com, edgar.iglesias@gmail.com, berrange@redhat.com, eugene@nuvacore.ai, Ruslan_Ruslichenko@epam.com, takahiro.nakata.wr@renesas.com, "Edgar E . Iglesias" Subject: [PATCH v2 20/20] hw/core: Add FDT support to Remote Port memory master Date: Tue, 15 Sep 2026 18:00:44 +0200 Message-ID: <20260915160044.345788-21-ruslichenko.r@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260915160044.345788-1-ruslichenko.r@gmail.com> References: <20260915160044.345788-1-ruslichenko.r@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:34::10; envelope-from=ruslichenko.r@gmail.com; helo=mail-ej2-x10.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=unavailable autolearn_force=no X-Spam_action: no action 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: 1789488400853158500 Content-Type: text/plain; charset="utf-8" From: Ruslan Ruslichenko Implement the FDTGenericMMap interface for the Remote Port Memory Master. This enables the device to dynamically parse memory ranges defined in the Device Tree ('reg' property) and register them as system bus MMIO regions. Signed-off-by: Edgar E. Iglesias Signed-off-by: Takahiro Nakata Signed-off-by: Ruslan Ruslichenko --- hw/core/remote-port-memory-master.c | 34 +++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/hw/core/remote-port-memory-master.c b/hw/core/remote-port-memo= ry-master.c index 41ef1df518..4ef03c9599 100644 --- a/hw/core/remote-port-memory-master.c +++ b/hw/core/remote-port-memory-master.c @@ -23,6 +23,8 @@ #include "hw/core/remote-port.h" #include "hw/core/remote-port-memory-master.h" =20 +#include "hw/core/fdt_generic_util.h" + #define REMOTE_PORT_MEMORY_MASTER_PARENT_CLASS \ object_class_get_parent( \ object_class_by_name(TYPE_REMOTE_PORT_MEMORY_MASTER)) @@ -298,6 +300,35 @@ static void rp_memory_master_init(Object *obj) OBJ_PROP_LINK_STRONG); } =20 +static bool rp_parse_reg(FDTGenericMMap *obj, FDTGenericRegPropInfo reg, + Error **errp) +{ + RemotePortMemoryMaster *s =3D REMOTE_PORT_MEMORY_MASTER(obj); + FDTGenericMMapClass *parent_fmc =3D + FDT_GENERIC_MMAP_CLASS(REMOTE_PORT_MEMORY_MASTER_PARENT_CLASS); + int i; + + /* Initialize rp_ops from template. */ + s->rp_ops =3D g_malloc(sizeof *s->rp_ops); + memcpy(s->rp_ops, &rp_ops_template, sizeof *s->rp_ops); + s->rp_ops->valid.max_access_size =3D s->max_access_size; + s->rp_ops->impl.max_access_size =3D s->max_access_size; + + s->mmaps =3D g_new0(typeof(*s->mmaps), reg.n); + for (i =3D 0; i < reg.n; ++i) { + char *name =3D g_strdup_printf("rp-%d", i); + + s->mmaps[i].offset =3D reg.a[i]; + memory_region_init_io(&s->mmaps[i].iomem, OBJECT(obj), s->rp_ops, + &s->mmaps[i], name, reg.s[i]); + sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmaps[i].iomem); + s->mmaps[i].parent =3D s; + g_free(name); + } + + return parent_fmc ? parent_fmc->parse_reg(obj, reg, errp) : false; +} + static Property rp_properties[] =3D { DEFINE_PROP_UINT32("map-num", RemotePortMemoryMaster, map_num, 0), DEFINE_PROP_UINT64("map-offset", RemotePortMemoryMaster, map_offset, 0= ), @@ -310,9 +341,11 @@ static Property rp_properties[] =3D { =20 static void rp_memory_master_class_init(ObjectClass *oc, const void *data) { + FDTGenericMMapClass *fmc =3D FDT_GENERIC_MMAP_CLASS(oc); DeviceClass *dc =3D DEVICE_CLASS(oc); device_class_set_props_n(dc, rp_properties, ARRAY_SIZE(rp_properties)); dc->realize =3D rp_memory_master_realize; + fmc->parse_reg =3D rp_parse_reg; } =20 static const TypeInfo rp_info =3D { @@ -322,6 +355,7 @@ static const TypeInfo rp_info =3D { .instance_init =3D rp_memory_master_init, .class_init =3D rp_memory_master_class_init, .interfaces =3D (InterfaceInfo[]) { + { TYPE_FDT_GENERIC_MMAP }, { TYPE_REMOTE_PORT_DEVICE }, { }, }, --=20 2.43.0