| /* |
| * Inter-VM Shared Memory Flat Device |
| * |
| * SPDX-License-Identifier: GPL-2.0-or-later |
| * Copyright (c) 2023 Linaro Ltd. |
| * Authors: |
| * Gustavo Romero |
| * |
| */ |
| |
| #ifndef IVSHMEM_FLAT_H |
| #define IVSHMEM_FLAT_H |
| |
| #include "qemu/queue.h" |
| #include "qemu/event_notifier.h" |
| #include "chardev/char-fe.h" |
| #include "system/memory.h" |
| #include "qom/object.h" |
| #include "hw/sysbus.h" |
| |
| #define IVSHMEM_MAX_VECTOR_NUM 64 |
| |
| /* |
| * QEMU interface: |
| * + QOM property "chardev" is the character device id of the ivshmem server |
| * socket |
| * + QOM property "shmem-size" sets the size of the RAM region shared between |
| * the device and the ivshmem server |
| * + sysbus MMIO region 0: device I/O mapped registers |
| * + sysbus MMIO region 1: shared memory with ivshmem server |
| * + sysbus IRQ 0: single output interrupt |
| */ |
| |
| #define TYPE_IVSHMEM_FLAT "ivshmem-flat" |
| typedef struct IvshmemFTState IvshmemFTState; |
| |
| DECLARE_INSTANCE_CHECKER(IvshmemFTState, IVSHMEM_FLAT, TYPE_IVSHMEM_FLAT) |
| |
| /* Ivshmem registers. See ./docs/specs/ivshmem-spec.txt for details. */ |
| enum ivshmem_registers { |
| INTMASK = 0, |
| INTSTATUS = 4, |
| IVPOSITION = 8, |
| DOORBELL = 12, |
| }; |
| |
| typedef struct VectorInfo { |
| EventNotifier event_notifier; |
| uint16_t id; |
| } VectorInfo; |
| |
| typedef struct IvshmemPeer { |
| QTAILQ_ENTRY(IvshmemPeer) next; |
| VectorInfo vector[IVSHMEM_MAX_VECTOR_NUM]; |
| int vector_counter; |
| uint16_t id; |
| } IvshmemPeer; |
| |
| struct IvshmemFTState { |
| SysBusDevice parent_obj; |
| |
| uint64_t msg_buf; |
| int msg_buffered_bytes; |
| |
| QTAILQ_HEAD(, IvshmemPeer) peer; |
| IvshmemPeer own; |
| |
| CharBackend server_chr; |
| |
| /* IRQ */ |
| qemu_irq irq; |
| |
| /* I/O registers */ |
| MemoryRegion iomem; |
| uint32_t intmask; |
| uint32_t intstatus; |
| uint32_t ivposition; |
| uint32_t doorbell; |
| |
| /* Shared memory */ |
| MemoryRegion shmem; |
| int shmem_fd; |
| uint32_t shmem_size; |
| }; |
| |
| #endif /* IVSHMEM_FLAT_H */ |