linux/drivers/vfio/platform/vfio_platform_private.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * Copyright (C) 2013 - Virtual Open Systems
   4 * Author: Antonios Motakis <a.motakis@virtualopensystems.com>
   5 */
   6
   7#ifndef VFIO_PLATFORM_PRIVATE_H
   8#define VFIO_PLATFORM_PRIVATE_H
   9
  10#include <linux/types.h>
  11#include <linux/interrupt.h>
  12
  13#define VFIO_PLATFORM_OFFSET_SHIFT   40
  14#define VFIO_PLATFORM_OFFSET_MASK (((u64)(1) << VFIO_PLATFORM_OFFSET_SHIFT) - 1)
  15
  16#define VFIO_PLATFORM_OFFSET_TO_INDEX(off)      \
  17        (off >> VFIO_PLATFORM_OFFSET_SHIFT)
  18
  19#define VFIO_PLATFORM_INDEX_TO_OFFSET(index)    \
  20        ((u64)(index) << VFIO_PLATFORM_OFFSET_SHIFT)
  21
  22struct vfio_platform_irq {
  23        u32                     flags;
  24        u32                     count;
  25        int                     hwirq;
  26        char                    *name;
  27        struct eventfd_ctx      *trigger;
  28        bool                    masked;
  29        spinlock_t              lock;
  30        struct virqfd           *unmask;
  31        struct virqfd           *mask;
  32};
  33
  34struct vfio_platform_region {
  35        u64                     addr;
  36        resource_size_t         size;
  37        u32                     flags;
  38        u32                     type;
  39#define VFIO_PLATFORM_REGION_TYPE_MMIO  1
  40#define VFIO_PLATFORM_REGION_TYPE_PIO   2
  41        void __iomem            *ioaddr;
  42};
  43
  44struct vfio_platform_device {
  45        struct vfio_platform_region     *regions;
  46        u32                             num_regions;
  47        struct vfio_platform_irq        *irqs;
  48        u32                             num_irqs;
  49        int                             refcnt;
  50        struct mutex                    igate;
  51        struct module                   *parent_module;
  52        const char                      *compat;
  53        const char                      *acpihid;
  54        struct module                   *reset_module;
  55        struct device                   *device;
  56
  57        /*
  58         * These fields should be filled by the bus specific binder
  59         */
  60        void            *opaque;
  61        const char      *name;
  62        uint32_t        flags;
  63        /* callbacks to discover device resources */
  64        struct resource*
  65                (*get_resource)(struct vfio_platform_device *vdev, int i);
  66        int     (*get_irq)(struct vfio_platform_device *vdev, int i);
  67        int     (*of_reset)(struct vfio_platform_device *vdev);
  68
  69        bool                            reset_required;
  70};
  71
  72typedef int (*vfio_platform_reset_fn_t)(struct vfio_platform_device *vdev);
  73
  74struct vfio_platform_reset_node {
  75        struct list_head link;
  76        char *compat;
  77        struct module *owner;
  78        vfio_platform_reset_fn_t of_reset;
  79};
  80
  81extern int vfio_platform_probe_common(struct vfio_platform_device *vdev,
  82                                      struct device *dev);
  83extern struct vfio_platform_device *vfio_platform_remove_common
  84                                     (struct device *dev);
  85
  86extern int vfio_platform_irq_init(struct vfio_platform_device *vdev);
  87extern void vfio_platform_irq_cleanup(struct vfio_platform_device *vdev);
  88
  89extern int vfio_platform_set_irqs_ioctl(struct vfio_platform_device *vdev,
  90                                        uint32_t flags, unsigned index,
  91                                        unsigned start, unsigned count,
  92                                        void *data);
  93
  94extern void __vfio_platform_register_reset(struct vfio_platform_reset_node *n);
  95extern void vfio_platform_unregister_reset(const char *compat,
  96                                           vfio_platform_reset_fn_t fn);
  97#define vfio_platform_register_reset(__compat, __reset)         \
  98static struct vfio_platform_reset_node __reset ## _node = {     \
  99        .owner = THIS_MODULE,                                   \
 100        .compat = __compat,                                     \
 101        .of_reset = __reset,                                    \
 102};                                                              \
 103__vfio_platform_register_reset(&__reset ## _node)
 104
 105#define module_vfio_reset_handler(compat, reset)                \
 106MODULE_ALIAS("vfio-reset:" compat);                             \
 107static int __init reset ## _module_init(void)                   \
 108{                                                               \
 109        vfio_platform_register_reset(compat, reset);            \
 110        return 0;                                               \
 111};                                                              \
 112static void __exit reset ## _module_exit(void)                  \
 113{                                                               \
 114        vfio_platform_unregister_reset(compat, reset);          \
 115};                                                              \
 116module_init(reset ## _module_init);                             \
 117module_exit(reset ## _module_exit)
 118
 119#endif /* VFIO_PLATFORM_PRIVATE_H */
 120