130 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * Copyright (C) 2013 - Virtual Open Systems4 * Author: Antonios Motakis <a.motakis@virtualopensystems.com>5 */6 7#ifndef VFIO_PLATFORM_PRIVATE_H8#define VFIO_PLATFORM_PRIVATE_H9 10#include <linux/types.h>11#include <linux/interrupt.h>12#include <linux/vfio.h>13 14#define VFIO_PLATFORM_OFFSET_SHIFT 4015#define VFIO_PLATFORM_OFFSET_MASK (((u64)(1) << VFIO_PLATFORM_OFFSET_SHIFT) - 1)16 17#define VFIO_PLATFORM_OFFSET_TO_INDEX(off) \18 (off >> VFIO_PLATFORM_OFFSET_SHIFT)19 20#define VFIO_PLATFORM_INDEX_TO_OFFSET(index) \21 ((u64)(index) << VFIO_PLATFORM_OFFSET_SHIFT)22 23struct vfio_platform_irq {24 u32 flags;25 u32 count;26 int hwirq;27 char *name;28 struct eventfd_ctx *trigger;29 bool masked;30 spinlock_t lock;31 struct virqfd *unmask;32 struct virqfd *mask;33};34 35struct vfio_platform_region {36 u64 addr;37 resource_size_t size;38 u32 flags;39 u32 type;40#define VFIO_PLATFORM_REGION_TYPE_MMIO 141#define VFIO_PLATFORM_REGION_TYPE_PIO 242 void __iomem *ioaddr;43};44 45struct vfio_platform_device {46 struct vfio_device vdev;47 struct vfio_platform_region *regions;48 u32 num_regions;49 struct vfio_platform_irq *irqs;50 u32 num_irqs;51 struct mutex igate;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 binder59 */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 81int vfio_platform_init_common(struct vfio_platform_device *vdev);82void vfio_platform_release_common(struct vfio_platform_device *vdev);83 84int vfio_platform_open_device(struct vfio_device *core_vdev);85void vfio_platform_close_device(struct vfio_device *core_vdev);86long vfio_platform_ioctl(struct vfio_device *core_vdev,87 unsigned int cmd, unsigned long arg);88ssize_t vfio_platform_read(struct vfio_device *core_vdev,89 char __user *buf, size_t count,90 loff_t *ppos);91ssize_t vfio_platform_write(struct vfio_device *core_vdev,92 const char __user *buf,93 size_t count, loff_t *ppos);94int vfio_platform_mmap(struct vfio_device *core_vdev,95 struct vm_area_struct *vma);96 97int vfio_platform_irq_init(struct vfio_platform_device *vdev);98void vfio_platform_irq_cleanup(struct vfio_platform_device *vdev);99 100int vfio_platform_set_irqs_ioctl(struct vfio_platform_device *vdev,101 uint32_t flags, unsigned index,102 unsigned start, unsigned count, void *data);103 104void __vfio_platform_register_reset(struct vfio_platform_reset_node *n);105void vfio_platform_unregister_reset(const char *compat,106 vfio_platform_reset_fn_t fn);107#define vfio_platform_register_reset(__compat, __reset) \108static struct vfio_platform_reset_node __reset ## _node = { \109 .owner = THIS_MODULE, \110 .compat = __compat, \111 .of_reset = __reset, \112}; \113__vfio_platform_register_reset(&__reset ## _node)114 115#define module_vfio_reset_handler(compat, reset) \116MODULE_ALIAS("vfio-reset:" compat); \117static int __init reset ## _module_init(void) \118{ \119 vfio_platform_register_reset(compat, reset); \120 return 0; \121}; \122static void __exit reset ## _module_exit(void) \123{ \124 vfio_platform_unregister_reset(compat, reset); \125}; \126module_init(reset ## _module_init); \127module_exit(reset ## _module_exit)128 129#endif /* VFIO_PLATFORM_PRIVATE_H */130