/*
 * 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"

#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 */
