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