xref: /qemu/include/hw/misc/ivshmem-flat.h (revision fc524567087c2537b5103cdfc1d41e4f442892b6)
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