qemu/include/hw/vfio/vfio-platform.h
<<
>>
Prefs
   1/*
   2 * vfio based device assignment support - platform devices
   3 *
   4 * Copyright Linaro Limited, 2014
   5 *
   6 * Authors:
   7 *  Kim Phillips <kim.phillips@linaro.org>
   8 *
   9 * This work is licensed under the terms of the GNU GPL, version 2.  See
  10 * the COPYING file in the top-level directory.
  11 *
  12 * Based on vfio based PCI device assignment support:
  13 *  Copyright Red Hat, Inc. 2012
  14 */
  15
  16#ifndef HW_VFIO_VFIO_PLATFORM_H
  17#define HW_VFIO_VFIO_PLATFORM_H
  18
  19#include "hw/sysbus.h"
  20#include "hw/vfio/vfio-common.h"
  21#include "qemu/event_notifier.h"
  22#include "qemu/queue.h"
  23#include "qom/object.h"
  24
  25#define TYPE_VFIO_PLATFORM "vfio-platform"
  26
  27enum {
  28    VFIO_IRQ_INACTIVE = 0,
  29    VFIO_IRQ_PENDING = 1,
  30    VFIO_IRQ_ACTIVE = 2,
  31    /* VFIO_IRQ_ACTIVE_AND_PENDING cannot happen with VFIO */
  32};
  33
  34typedef struct VFIOINTp {
  35    QLIST_ENTRY(VFIOINTp) next; /* entry for IRQ list */
  36    QSIMPLEQ_ENTRY(VFIOINTp) pqnext; /* entry for pending IRQ queue */
  37    EventNotifier *interrupt; /* eventfd triggered on interrupt */
  38    EventNotifier *unmask; /* eventfd for unmask on QEMU bypass */
  39    qemu_irq qemuirq;
  40    struct VFIOPlatformDevice *vdev; /* back pointer to device */
  41    int state; /* inactive, pending, active */
  42    uint8_t pin; /* index */
  43    uint32_t flags; /* IRQ info flags */
  44    bool kvm_accel; /* set when QEMU bypass through KVM enabled */
  45} VFIOINTp;
  46
  47/* function type for user side eventfd handler */
  48typedef void (*eventfd_user_side_handler_t)(VFIOINTp *intp);
  49
  50struct VFIOPlatformDevice {
  51    SysBusDevice sbdev;
  52    VFIODevice vbasedev; /* not a QOM object */
  53    VFIORegion **regions;
  54    QLIST_HEAD(, VFIOINTp) intp_list; /* list of IRQs */
  55    /* queue of pending IRQs */
  56    QSIMPLEQ_HEAD(, VFIOINTp) pending_intp_queue;
  57    char *compat; /* DT compatible values, separated by NUL */
  58    unsigned int num_compat; /* number of compatible values */
  59    uint32_t mmap_timeout; /* delay to re-enable mmaps after interrupt */
  60    QEMUTimer *mmap_timer; /* allows fast-path resume after IRQ hit */
  61    QemuMutex intp_mutex; /* protect the intp_list IRQ state */
  62    bool irqfd_allowed; /* debug option to force irqfd on/off */
  63};
  64typedef struct VFIOPlatformDevice VFIOPlatformDevice;
  65
  66struct VFIOPlatformDeviceClass {
  67    /*< private >*/
  68    SysBusDeviceClass parent_class;
  69    /*< public >*/
  70};
  71typedef struct VFIOPlatformDeviceClass VFIOPlatformDeviceClass;
  72
  73DECLARE_OBJ_CHECKERS(VFIOPlatformDevice, VFIOPlatformDeviceClass,
  74                     VFIO_PLATFORM_DEVICE, TYPE_VFIO_PLATFORM)
  75
  76#endif /* HW_VFIO_VFIO_PLATFORM_H */
  77