Antonios Motakis | de49fc0 | 2015-03-16 14:08:42 -0600 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2013 - Virtual Open Systems |
| 3 | * Author: Antonios Motakis <a.motakis@virtualopensystems.com> |
| 4 | * |
| 5 | * This program is free software; you can redistribute it and/or modify |
| 6 | * it under the terms of the GNU General Public License, version 2, as |
| 7 | * published by the Free Software Foundation. |
| 8 | * |
| 9 | * This program is distributed in the hope that it will be useful, |
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 12 | * GNU General Public License for more details. |
| 13 | */ |
| 14 | |
| 15 | #ifndef VFIO_PLATFORM_PRIVATE_H |
| 16 | #define VFIO_PLATFORM_PRIVATE_H |
| 17 | |
| 18 | #include <linux/types.h> |
| 19 | #include <linux/interrupt.h> |
| 20 | |
Antonios Motakis | e8909e6 | 2015-03-16 14:08:46 -0600 | [diff] [blame] | 21 | #define VFIO_PLATFORM_OFFSET_SHIFT 40 |
| 22 | #define VFIO_PLATFORM_OFFSET_MASK (((u64)(1) << VFIO_PLATFORM_OFFSET_SHIFT) - 1) |
| 23 | |
| 24 | #define VFIO_PLATFORM_OFFSET_TO_INDEX(off) \ |
| 25 | (off >> VFIO_PLATFORM_OFFSET_SHIFT) |
| 26 | |
| 27 | #define VFIO_PLATFORM_INDEX_TO_OFFSET(index) \ |
| 28 | ((u64)(index) << VFIO_PLATFORM_OFFSET_SHIFT) |
| 29 | |
Antonios Motakis | 682704c | 2015-03-16 14:08:48 -0600 | [diff] [blame] | 30 | struct vfio_platform_irq { |
| 31 | u32 flags; |
| 32 | u32 count; |
Antonios Motakis | 9a36321 | 2015-03-16 14:08:49 -0600 | [diff] [blame] | 33 | int hwirq; |
Antonios Motakis | 57f972e | 2015-03-16 14:08:50 -0600 | [diff] [blame] | 34 | char *name; |
| 35 | struct eventfd_ctx *trigger; |
Antonios Motakis | 06211b4 | 2015-03-16 14:08:50 -0600 | [diff] [blame] | 36 | bool masked; |
| 37 | spinlock_t lock; |
Antonios Motakis | a7fa7c7 | 2015-03-16 14:08:55 -0600 | [diff] [blame] | 38 | struct virqfd *unmask; |
| 39 | struct virqfd *mask; |
Antonios Motakis | 682704c | 2015-03-16 14:08:48 -0600 | [diff] [blame] | 40 | }; |
| 41 | |
Antonios Motakis | e8909e6 | 2015-03-16 14:08:46 -0600 | [diff] [blame] | 42 | struct vfio_platform_region { |
| 43 | u64 addr; |
| 44 | resource_size_t size; |
| 45 | u32 flags; |
| 46 | u32 type; |
| 47 | #define VFIO_PLATFORM_REGION_TYPE_MMIO 1 |
| 48 | #define VFIO_PLATFORM_REGION_TYPE_PIO 2 |
Antonios Motakis | 6e3f264 | 2015-03-16 14:08:47 -0600 | [diff] [blame] | 49 | void __iomem *ioaddr; |
Antonios Motakis | e8909e6 | 2015-03-16 14:08:46 -0600 | [diff] [blame] | 50 | }; |
| 51 | |
Antonios Motakis | de49fc0 | 2015-03-16 14:08:42 -0600 | [diff] [blame] | 52 | struct vfio_platform_device { |
Antonios Motakis | e8909e6 | 2015-03-16 14:08:46 -0600 | [diff] [blame] | 53 | struct vfio_platform_region *regions; |
| 54 | u32 num_regions; |
Antonios Motakis | 682704c | 2015-03-16 14:08:48 -0600 | [diff] [blame] | 55 | struct vfio_platform_irq *irqs; |
| 56 | u32 num_irqs; |
Antonios Motakis | e8909e6 | 2015-03-16 14:08:46 -0600 | [diff] [blame] | 57 | int refcnt; |
Antonios Motakis | 9a36321 | 2015-03-16 14:08:49 -0600 | [diff] [blame] | 58 | struct mutex igate; |
Eric Auger | 32a2d71 | 2015-11-03 18:12:12 +0000 | [diff] [blame] | 59 | struct module *parent_module; |
Eric Auger | 0628c4d | 2015-11-03 18:12:16 +0000 | [diff] [blame] | 60 | const char *compat; |
Sinan Kaya | a12a936 | 2016-07-19 09:01:44 -0400 | [diff] [blame] | 61 | const char *acpihid; |
Eric Auger | e9e0506 | 2015-11-03 18:12:17 +0000 | [diff] [blame] | 62 | struct module *reset_module; |
Eric Auger | 705e60b | 2015-11-03 18:12:18 +0000 | [diff] [blame] | 63 | struct device *device; |
Antonios Motakis | e8909e6 | 2015-03-16 14:08:46 -0600 | [diff] [blame] | 64 | |
Antonios Motakis | de49fc0 | 2015-03-16 14:08:42 -0600 | [diff] [blame] | 65 | /* |
| 66 | * These fields should be filled by the bus specific binder |
| 67 | */ |
| 68 | void *opaque; |
| 69 | const char *name; |
| 70 | uint32_t flags; |
| 71 | /* callbacks to discover device resources */ |
| 72 | struct resource* |
| 73 | (*get_resource)(struct vfio_platform_device *vdev, int i); |
| 74 | int (*get_irq)(struct vfio_platform_device *vdev, int i); |
Sinan Kaya | 7aef80c | 2016-07-19 09:01:41 -0400 | [diff] [blame] | 75 | int (*of_reset)(struct vfio_platform_device *vdev); |
Sinan Kaya | b5add54 | 2016-07-19 09:01:47 -0400 | [diff] [blame] | 76 | |
| 77 | bool reset_required; |
Antonios Motakis | de49fc0 | 2015-03-16 14:08:42 -0600 | [diff] [blame] | 78 | }; |
| 79 | |
Eric Auger | e086497 | 2015-11-03 18:12:13 +0000 | [diff] [blame] | 80 | typedef int (*vfio_platform_reset_fn_t)(struct vfio_platform_device *vdev); |
| 81 | |
| 82 | struct vfio_platform_reset_node { |
| 83 | struct list_head link; |
| 84 | char *compat; |
| 85 | struct module *owner; |
Sinan Kaya | 7aef80c | 2016-07-19 09:01:41 -0400 | [diff] [blame] | 86 | vfio_platform_reset_fn_t of_reset; |
Eric Auger | e086497 | 2015-11-03 18:12:13 +0000 | [diff] [blame] | 87 | }; |
| 88 | |
Antonios Motakis | de49fc0 | 2015-03-16 14:08:42 -0600 | [diff] [blame] | 89 | extern int vfio_platform_probe_common(struct vfio_platform_device *vdev, |
| 90 | struct device *dev); |
| 91 | extern struct vfio_platform_device *vfio_platform_remove_common |
| 92 | (struct device *dev); |
| 93 | |
Antonios Motakis | 682704c | 2015-03-16 14:08:48 -0600 | [diff] [blame] | 94 | extern int vfio_platform_irq_init(struct vfio_platform_device *vdev); |
| 95 | extern void vfio_platform_irq_cleanup(struct vfio_platform_device *vdev); |
| 96 | |
Antonios Motakis | 9a36321 | 2015-03-16 14:08:49 -0600 | [diff] [blame] | 97 | extern int vfio_platform_set_irqs_ioctl(struct vfio_platform_device *vdev, |
| 98 | uint32_t flags, unsigned index, |
| 99 | unsigned start, unsigned count, |
| 100 | void *data); |
| 101 | |
Eric Auger | e086497 | 2015-11-03 18:12:13 +0000 | [diff] [blame] | 102 | extern void __vfio_platform_register_reset(struct vfio_platform_reset_node *n); |
| 103 | extern void vfio_platform_unregister_reset(const char *compat, |
| 104 | vfio_platform_reset_fn_t fn); |
| 105 | #define vfio_platform_register_reset(__compat, __reset) \ |
| 106 | static struct vfio_platform_reset_node __reset ## _node = { \ |
| 107 | .owner = THIS_MODULE, \ |
| 108 | .compat = __compat, \ |
Sinan Kaya | 7aef80c | 2016-07-19 09:01:41 -0400 | [diff] [blame] | 109 | .of_reset = __reset, \ |
Eric Auger | e086497 | 2015-11-03 18:12:13 +0000 | [diff] [blame] | 110 | }; \ |
| 111 | __vfio_platform_register_reset(&__reset ## _node) |
| 112 | |
Eric Auger | 5886465 | 2015-11-03 18:12:14 +0000 | [diff] [blame] | 113 | #define module_vfio_reset_handler(compat, reset) \ |
| 114 | MODULE_ALIAS("vfio-reset:" compat); \ |
| 115 | static int __init reset ## _module_init(void) \ |
| 116 | { \ |
| 117 | vfio_platform_register_reset(compat, reset); \ |
| 118 | return 0; \ |
| 119 | }; \ |
| 120 | static void __exit reset ## _module_exit(void) \ |
| 121 | { \ |
| 122 | vfio_platform_unregister_reset(compat, reset); \ |
| 123 | }; \ |
| 124 | module_init(reset ## _module_init); \ |
| 125 | module_exit(reset ## _module_exit) |
| 126 | |
Antonios Motakis | de49fc0 | 2015-03-16 14:08:42 -0600 | [diff] [blame] | 127 | #endif /* VFIO_PLATFORM_PRIVATE_H */ |