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