b58deb344d
Most list head structs need not be given a name. In most cases the name is given just in case one is going to use QTAILQ_LAST, QTAILQ_PREV or reverse iteration, but this does not apply to lists of other kinds, and even for QTAILQ in practice this is only rarely needed. In addition, we will soon reimplement those macros completely so that they do not need a name for the head struct. So clean up everything, not giving a name except in the rare case where it is necessary. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
79 lines
2.6 KiB
C
79 lines
2.6 KiB
C
/*
|
|
* vfio based device assignment support - platform devices
|
|
*
|
|
* Copyright Linaro Limited, 2014
|
|
*
|
|
* Authors:
|
|
* Kim Phillips <kim.phillips@linaro.org>
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2. See
|
|
* the COPYING file in the top-level directory.
|
|
*
|
|
* Based on vfio based PCI device assignment support:
|
|
* Copyright Red Hat, Inc. 2012
|
|
*/
|
|
|
|
#ifndef HW_VFIO_VFIO_PLATFORM_H
|
|
#define HW_VFIO_VFIO_PLATFORM_H
|
|
|
|
#include "hw/sysbus.h"
|
|
#include "hw/vfio/vfio-common.h"
|
|
#include "qemu/event_notifier.h"
|
|
#include "qemu/queue.h"
|
|
#include "hw/irq.h"
|
|
|
|
#define TYPE_VFIO_PLATFORM "vfio-platform"
|
|
|
|
enum {
|
|
VFIO_IRQ_INACTIVE = 0,
|
|
VFIO_IRQ_PENDING = 1,
|
|
VFIO_IRQ_ACTIVE = 2,
|
|
/* VFIO_IRQ_ACTIVE_AND_PENDING cannot happen with VFIO */
|
|
};
|
|
|
|
typedef struct VFIOINTp {
|
|
QLIST_ENTRY(VFIOINTp) next; /* entry for IRQ list */
|
|
QSIMPLEQ_ENTRY(VFIOINTp) pqnext; /* entry for pending IRQ queue */
|
|
EventNotifier *interrupt; /* eventfd triggered on interrupt */
|
|
EventNotifier *unmask; /* eventfd for unmask on QEMU bypass */
|
|
qemu_irq qemuirq;
|
|
struct VFIOPlatformDevice *vdev; /* back pointer to device */
|
|
int state; /* inactive, pending, active */
|
|
uint8_t pin; /* index */
|
|
uint32_t flags; /* IRQ info flags */
|
|
bool kvm_accel; /* set when QEMU bypass through KVM enabled */
|
|
} VFIOINTp;
|
|
|
|
/* function type for user side eventfd handler */
|
|
typedef void (*eventfd_user_side_handler_t)(VFIOINTp *intp);
|
|
|
|
typedef struct VFIOPlatformDevice {
|
|
SysBusDevice sbdev;
|
|
VFIODevice vbasedev; /* not a QOM object */
|
|
VFIORegion **regions;
|
|
QLIST_HEAD(, VFIOINTp) intp_list; /* list of IRQs */
|
|
/* queue of pending IRQs */
|
|
QSIMPLEQ_HEAD(, VFIOINTp) pending_intp_queue;
|
|
char *compat; /* DT compatible values, separated by NUL */
|
|
unsigned int num_compat; /* number of compatible values */
|
|
uint32_t mmap_timeout; /* delay to re-enable mmaps after interrupt */
|
|
QEMUTimer *mmap_timer; /* allows fast-path resume after IRQ hit */
|
|
QemuMutex intp_mutex; /* protect the intp_list IRQ state */
|
|
bool irqfd_allowed; /* debug option to force irqfd on/off */
|
|
} VFIOPlatformDevice;
|
|
|
|
typedef struct VFIOPlatformDeviceClass {
|
|
/*< private >*/
|
|
SysBusDeviceClass parent_class;
|
|
/*< public >*/
|
|
} VFIOPlatformDeviceClass;
|
|
|
|
#define VFIO_PLATFORM_DEVICE(obj) \
|
|
OBJECT_CHECK(VFIOPlatformDevice, (obj), TYPE_VFIO_PLATFORM)
|
|
#define VFIO_PLATFORM_DEVICE_CLASS(klass) \
|
|
OBJECT_CLASS_CHECK(VFIOPlatformDeviceClass, (klass), TYPE_VFIO_PLATFORM)
|
|
#define VFIO_PLATFORM_DEVICE_GET_CLASS(obj) \
|
|
OBJECT_GET_CLASS(VFIOPlatformDeviceClass, (obj), TYPE_VFIO_PLATFORM)
|
|
|
|
#endif /* HW_VFIO_VFIO_PLATFORM_H */
|