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 "hw/irq.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
  50typedef struct 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(pending_intp_queue, VFIOINTp) pending_intp_queue;
  57    char *compat; /* compatibility string */
  58    uint32_t mmap_timeout; /* delay to re-enable mmaps after interrupt */
  59    QEMUTimer *mmap_timer; /* allows fast-path resume after IRQ hit */
  60    QemuMutex intp_mutex; /* protect the intp_list IRQ state */
  61    bool irqfd_allowed; /* debug option to force irqfd on/off */
  62} VFIOPlatformDevice;
  63
  64typedef struct VFIOPlatformDeviceClass {
  65    /*< private >*/
  66    SysBusDeviceClass parent_class;
  67    /*< public >*/
  68} VFIOPlatformDeviceClass;
  69
  70#define VFIO_PLATFORM_DEVICE(obj) \
  71     OBJECT_CHECK(VFIOPlatformDevice, (obj), TYPE_VFIO_PLATFORM)
  72#define VFIO_PLATFORM_DEVICE_CLASS(klass) \
  73     OBJECT_CLASS_CHECK(VFIOPlatformDeviceClass, (klass), TYPE_VFIO_PLATFORM)
  74#define VFIO_PLATFORM_DEVICE_GET_CLASS(obj) \
  75     OBJECT_GET_CLASS(VFIOPlatformDeviceClass, (obj), TYPE_VFIO_PLATFORM)
  76
  77#endif /*HW_VFIO_VFIO_PLATFORM_H*/
  78