1*e6c33efeSGustavo Romero /* 2*e6c33efeSGustavo Romero * Inter-VM Shared Memory Flat Device 3*e6c33efeSGustavo Romero * 4*e6c33efeSGustavo Romero * SPDX-FileCopyrightText: 2023 Linaro Ltd. 5*e6c33efeSGustavo Romero * SPDX-FileContributor: Gustavo Romero <gustavo.romero@linaro.org> 6*e6c33efeSGustavo Romero * SPDX-License-Identifier: GPL-2.0-or-later 7*e6c33efeSGustavo Romero * 8*e6c33efeSGustavo Romero */ 9*e6c33efeSGustavo Romero 10*e6c33efeSGustavo Romero #ifndef IVSHMEM_FLAT_H 11*e6c33efeSGustavo Romero #define IVSHMEM_FLAT_H 12*e6c33efeSGustavo Romero 13*e6c33efeSGustavo Romero #include "qemu/queue.h" 14*e6c33efeSGustavo Romero #include "qemu/event_notifier.h" 15*e6c33efeSGustavo Romero #include "chardev/char-fe.h" 16*e6c33efeSGustavo Romero #include "exec/memory.h" 17*e6c33efeSGustavo Romero #include "qom/object.h" 18*e6c33efeSGustavo Romero #include "hw/sysbus.h" 19*e6c33efeSGustavo Romero 20*e6c33efeSGustavo Romero #define IVSHMEM_MAX_VECTOR_NUM 64 21*e6c33efeSGustavo Romero 22*e6c33efeSGustavo Romero /* 23*e6c33efeSGustavo Romero * QEMU interface: 24*e6c33efeSGustavo Romero * + QOM property "chardev" is the character device id of the ivshmem server 25*e6c33efeSGustavo Romero * socket 26*e6c33efeSGustavo Romero * + QOM property "shmem-size" sets the size of the RAM region shared between 27*e6c33efeSGustavo Romero * the device and the ivshmem server 28*e6c33efeSGustavo Romero * + sysbus MMIO region 0: device I/O mapped registers 29*e6c33efeSGustavo Romero * + sysbus MMIO region 1: shared memory with ivshmem server 30*e6c33efeSGustavo Romero * + sysbus IRQ 0: single output interrupt 31*e6c33efeSGustavo Romero */ 32*e6c33efeSGustavo Romero 33*e6c33efeSGustavo Romero #define TYPE_IVSHMEM_FLAT "ivshmem-flat" 34*e6c33efeSGustavo Romero typedef struct IvshmemFTState IvshmemFTState; 35*e6c33efeSGustavo Romero 36*e6c33efeSGustavo Romero DECLARE_INSTANCE_CHECKER(IvshmemFTState, IVSHMEM_FLAT, TYPE_IVSHMEM_FLAT) 37*e6c33efeSGustavo Romero 38*e6c33efeSGustavo Romero /* Ivshmem registers. See ./docs/specs/ivshmem-spec.txt for details. */ 39*e6c33efeSGustavo Romero enum ivshmem_registers { 40*e6c33efeSGustavo Romero INTMASK = 0, 41*e6c33efeSGustavo Romero INTSTATUS = 4, 42*e6c33efeSGustavo Romero IVPOSITION = 8, 43*e6c33efeSGustavo Romero DOORBELL = 12, 44*e6c33efeSGustavo Romero }; 45*e6c33efeSGustavo Romero 46*e6c33efeSGustavo Romero typedef struct VectorInfo { 47*e6c33efeSGustavo Romero EventNotifier event_notifier; 48*e6c33efeSGustavo Romero uint16_t id; 49*e6c33efeSGustavo Romero } VectorInfo; 50*e6c33efeSGustavo Romero 51*e6c33efeSGustavo Romero typedef struct IvshmemPeer { 52*e6c33efeSGustavo Romero QTAILQ_ENTRY(IvshmemPeer) next; 53*e6c33efeSGustavo Romero VectorInfo vector[IVSHMEM_MAX_VECTOR_NUM]; 54*e6c33efeSGustavo Romero int vector_counter; 55*e6c33efeSGustavo Romero uint16_t id; 56*e6c33efeSGustavo Romero } IvshmemPeer; 57*e6c33efeSGustavo Romero 58*e6c33efeSGustavo Romero struct IvshmemFTState { 59*e6c33efeSGustavo Romero SysBusDevice parent_obj; 60*e6c33efeSGustavo Romero 61*e6c33efeSGustavo Romero uint64_t msg_buf; 62*e6c33efeSGustavo Romero int msg_buffered_bytes; 63*e6c33efeSGustavo Romero 64*e6c33efeSGustavo Romero QTAILQ_HEAD(, IvshmemPeer) peer; 65*e6c33efeSGustavo Romero IvshmemPeer own; 66*e6c33efeSGustavo Romero 67*e6c33efeSGustavo Romero CharBackend server_chr; 68*e6c33efeSGustavo Romero 69*e6c33efeSGustavo Romero /* IRQ */ 70*e6c33efeSGustavo Romero qemu_irq irq; 71*e6c33efeSGustavo Romero 72*e6c33efeSGustavo Romero /* I/O registers */ 73*e6c33efeSGustavo Romero MemoryRegion iomem; 74*e6c33efeSGustavo Romero uint32_t intmask; 75*e6c33efeSGustavo Romero uint32_t intstatus; 76*e6c33efeSGustavo Romero uint32_t ivposition; 77*e6c33efeSGustavo Romero uint32_t doorbell; 78*e6c33efeSGustavo Romero 79*e6c33efeSGustavo Romero /* Shared memory */ 80*e6c33efeSGustavo Romero MemoryRegion shmem; 81*e6c33efeSGustavo Romero int shmem_fd; 82*e6c33efeSGustavo Romero uint32_t shmem_size; 83*e6c33efeSGustavo Romero }; 84*e6c33efeSGustavo Romero 85*e6c33efeSGustavo Romero #endif /* IVSHMEM_FLAT_H */ 86