A gentle ping. Would appreciate some feedback on this series. On Tue, Sep 15, 2026 at 6:01 PM Ruslan Ruslichenko <[email protected]> wrote: > > From: Ruslan Ruslichenko <[email protected]> > > This patch series introduces the Remote Port (RP) subsystem, a framework > designed to connect QEMU with external simulation environments (such as > SystemC models or RTL simulators). > > Updates in v2: > > - Removed global 'machine-path' and 'sync-quantum' cmdline options > - Added EventNotifier for communication between IO and CPU threads, instead > of pipes and sockets > - Made chrdev_id mandatory and simplified chardev configuration > - MemoryTransaction .access handler dropped and reworked RPMemoryTransaction > to use existing .read/write_with_attrs > - Reduced coupling with HW Device Tree by making rp devices register > themselves within rp core using rp-chan property > - Dropped debug macros and added tracepoints instead > - Added reference to sample project using QEMU with SystemC > - Addressed review comments from v1 patch series: > https://lists.gnu.org/archive/html/qemu-devel/2026-02/msg01760.html > > Origin: > The Remote Port protocol was originally developed by Edgar E. Iglesias. > The original source code is available in the QEMU repository at AMD: > https://github.com/Xilinx/qemu. > > Motivation > In modern SoC and FPGA development, specialized hardware blocks are often > verified using SystemC, Verilog, or VHDL long before silicon is available. > While QEMU is optimized for high-performance CPU emulation and software > development, it requires hardware models to be rewritten in C, which is > time-consuming and duplicates effort. > > The Remote Port (RP) subsystem addresses this limitation by enabling a > Co-simulation environment. It allows QEMU to act as the high-performance > Processing Subsystem, booting complex operating systems (e.g. Linux), while > delegating specific peripheral modeling to external simulators (SystemC, RTL) > via a socket connection. > > The Remote Port protocol provides a socket-based interface that supports: > > Memory Transactions: Bidirectional memory accesses (Master and Slave) > allowing QEMU to access remote devices and vice versa. > Interrupts/GPIO: Propagation of interrupt signals between QEMU and the remote > peer. > IOMMU/ATS Support: Support for Address Translation Services, allowing remote > devices to operate correctly behind IOMMU. > Time Synchronization: Keeps QEMU and the external simulator in sync by > advancing time in fixed steps (quantums). > > Integration with SystemC Ecosystem > > To connect the simulation side, the open-source libsystemctlm-soc library [1] > is used. It acts as a bridge, translating Remote Port protocol packets into > standard SystemC/TLM-2.0 transactions [2]. This allows users to attach > existing TLM-2.0 compliant models to QEMU. > > Architecture Overview > > The series is structured into the following logical components: > > 1. Core Protocol & Infrastructure > > Establishes the socket connection and handshake (Hello protocol). > Implements the packet dispatch loop and thread management. > > 2. Memory Transaction Support > > RP Memory Slave: Allows the remote peer to initiate bus transactions within > QEMU. > RP Memory Master: Represents a memory region in QEMU that forwards accesses > to the remote peer. > > 3. Address Translation Services (ATS) > > Implements the logic to handle ATS requests from remote masters. > Integrates with QEMU's IOMMU notifiers to manage translation caches. > > 4. Device Tree (FDT) & Configuration > > Added FDT support for Remote Port Memory Master and GPIO > > Dependencies > > Patches 19-20 in series are based on the following previously submitted > series: > FDT based machine v3: > https://lists.nongnu.org/archive/html/qemu-devel/2026-04/msg00415.html > > Instantiation of Remote Port via FDT also registers its reset handler, > needed to start protocol thread. > > Validation: > > The Sample Project demonstrating test setup with QEMU/Remote Port and SystemC > emulated PL011 UART module available by following link: > https://github.com/renesas/SysC_Island_MIT > > > Patch Summary > The series is organized as follows: > > System/Global: > > system/physmem: Add ats_do_translate helper > > Remote Port Core: > > hw/core: Add Remote Port protocol packet definition > hw/core: Add Remote Port header helpers > hw/core: Add Remote Port session state and hello protocol > hw/core: Add Remote Port object skeleton > hw/core: Add Remote Port protocol thread and handshake > hw/core: Implement Remote Port response handling > hw/core: Implement Remote Port time synchronization > hw/core: Implement Remote Port irq, sync and ATS helpers > hw/core: Add Remote Port files to build > > Memory & Bus Access: > > hw/core: Implement Remote Port bus access helpers > hw/core: Add Remote Port Memory Master object skeleton > hw/core: Implement Remote Port Memory Master bus transactions > hw/core: Add Remote Port memory slave device > > ATS & Streams: > > hw/core: Add Remote Port Stream device > hw/core: Add Remote Port ATS device skeleton > hw/core: Implement Remote Port ATS logic and cache management > > FDT & GPIO: > > hw/core: Add Remote Port GPIO/Interrupt bridge > hw/core: Add FDT support to Remote Port GPIO > hw/core: Add FDT support to Remote Port memory master > > Links: > [1] libsystemctlm library: https://github.com/Xilinx/libsystemctlm-soc > > [2] SystemC TLM description: https://systemc.org/overview/systemc-tlm/ > > > Ruslan Ruslichenko (20): > hw/core: Add Remote Port protocol packet definition > hw/core: Add Remote Port header helpers > hw/core: Add Remote Port session state and hello protocol > hw/core: Implement Remote Port bus access helpers > hw/core: Implement Remote Port irq, sync and ATS helpers > hw/core: Add Remote Port object skeleton > hw/core: Add Remote Port protocol thread and handshake > hw/core: Implement Remote Port response handling > hw/core: Implement Remote Port time synchronization > hw/core: Add Remote Port Memory Master object skeleton > hw/core: Implement Remote Port Memory Master bus transactions > system/physmem: Add ats_do_translate helper > hw/core: Add Remote Port ATS device skeleton > hw/core: Implement Remote Port ATS logic and cache management > hw/core: Add Remote Port memory slave device > hw/core: Add Remote Port GPIO/Interrupt bridge > hw/core: Add Remote Port Stream device > hw/core: Add Remote Port files to build > hw/core: Add FDT support to Remote Port GPIO > hw/core: Add FDT support to Remote Port memory master > > hw/core/Kconfig | 4 + > hw/core/meson.build | 10 + > hw/core/remote-port-ats.c | 412 +++++++++++ > hw/core/remote-port-gpio.c | 210 ++++++ > hw/core/remote-port-memory-master.c | 369 +++++++++ > hw/core/remote-port-memory-slave.c | 242 ++++++ > hw/core/remote-port-proto.c | 467 ++++++++++++ > hw/core/remote-port-stream.c | 246 ++++++ > hw/core/remote-port.c | 782 ++++++++++++++++++++ > hw/core/trace-events | 22 + > include/hw/core/remote-port-ats.h | 76 ++ > include/hw/core/remote-port-gpio.h | 34 + > include/hw/core/remote-port-memory-master.h | 81 ++ > include/hw/core/remote-port-memory-slave.h | 35 + > include/hw/core/remote-port-proto.h | 541 ++++++++++++++ > include/hw/core/remote-port.h | 164 ++++ > include/system/memory.h | 8 + > system/physmem.c | 53 ++ > 18 files changed, 3756 insertions(+) > create mode 100644 hw/core/remote-port-ats.c > create mode 100644 hw/core/remote-port-gpio.c > create mode 100644 hw/core/remote-port-memory-master.c > create mode 100644 hw/core/remote-port-memory-slave.c > create mode 100644 hw/core/remote-port-proto.c > create mode 100644 hw/core/remote-port-stream.c > create mode 100644 hw/core/remote-port.c > create mode 100644 include/hw/core/remote-port-ats.h > create mode 100644 include/hw/core/remote-port-gpio.h > create mode 100644 include/hw/core/remote-port-memory-master.h > create mode 100644 include/hw/core/remote-port-memory-slave.h > create mode 100644 include/hw/core/remote-port-proto.h > create mode 100644 include/hw/core/remote-port.h > > -- > 2.43.0 >
