Christoph Hellwig | 8cc02d2 | 2021-09-24 17:56:59 +0200 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
| 2 | /* |
| 3 | * Copyright (C) 2012 Red Hat, Inc. All rights reserved. |
| 4 | * Author: Alex Williamson <alex.williamson@redhat.com> |
| 5 | */ |
| 6 | |
Christoph Hellwig | c3c0fa9d | 2021-09-24 17:57:01 +0200 | [diff] [blame] | 7 | enum vfio_group_type { |
| 8 | /* |
| 9 | * Physical device with IOMMU backing. |
| 10 | */ |
| 11 | VFIO_IOMMU, |
| 12 | |
| 13 | /* |
| 14 | * Virtual device without IOMMU backing. The VFIO core fakes up an |
| 15 | * iommu_group as the iommu_group sysfs interface is part of the |
| 16 | * userspace ABI. The user of these devices must not be able to |
| 17 | * directly trigger unmediated DMA. |
| 18 | */ |
| 19 | VFIO_EMULATED_IOMMU, |
| 20 | |
| 21 | /* |
| 22 | * Physical device without IOMMU backing. The VFIO core fakes up an |
| 23 | * iommu_group as the iommu_group sysfs interface is part of the |
| 24 | * userspace ABI. Users can trigger unmediated DMA by the device, |
| 25 | * usage is highly dangerous, requires an explicit opt-in and will |
| 26 | * taint the kernel. |
| 27 | */ |
| 28 | VFIO_NO_IOMMU, |
| 29 | }; |
| 30 | |
Christoph Hellwig | 8cc02d2 | 2021-09-24 17:56:59 +0200 | [diff] [blame] | 31 | /* events for the backend driver notify callback */ |
| 32 | enum vfio_iommu_notify_type { |
| 33 | VFIO_IOMMU_CONTAINER_CLOSE = 0, |
| 34 | }; |
| 35 | |
| 36 | /** |
| 37 | * struct vfio_iommu_driver_ops - VFIO IOMMU driver callbacks |
| 38 | */ |
| 39 | struct vfio_iommu_driver_ops { |
| 40 | char *name; |
| 41 | struct module *owner; |
| 42 | void *(*open)(unsigned long arg); |
| 43 | void (*release)(void *iommu_data); |
| 44 | long (*ioctl)(void *iommu_data, unsigned int cmd, |
| 45 | unsigned long arg); |
| 46 | int (*attach_group)(void *iommu_data, |
Christoph Hellwig | c3c0fa9d | 2021-09-24 17:57:01 +0200 | [diff] [blame] | 47 | struct iommu_group *group, |
| 48 | enum vfio_group_type); |
Christoph Hellwig | 8cc02d2 | 2021-09-24 17:56:59 +0200 | [diff] [blame] | 49 | void (*detach_group)(void *iommu_data, |
| 50 | struct iommu_group *group); |
| 51 | int (*pin_pages)(void *iommu_data, |
| 52 | struct iommu_group *group, |
| 53 | unsigned long *user_pfn, |
| 54 | int npage, int prot, |
| 55 | unsigned long *phys_pfn); |
| 56 | int (*unpin_pages)(void *iommu_data, |
| 57 | unsigned long *user_pfn, int npage); |
| 58 | int (*register_notifier)(void *iommu_data, |
| 59 | unsigned long *events, |
| 60 | struct notifier_block *nb); |
| 61 | int (*unregister_notifier)(void *iommu_data, |
| 62 | struct notifier_block *nb); |
| 63 | int (*dma_rw)(void *iommu_data, dma_addr_t user_iova, |
| 64 | void *data, size_t count, bool write); |
| 65 | struct iommu_domain *(*group_iommu_domain)(void *iommu_data, |
| 66 | struct iommu_group *group); |
| 67 | void (*notify)(void *iommu_data, |
| 68 | enum vfio_iommu_notify_type event); |
| 69 | }; |
| 70 | |
| 71 | int vfio_register_iommu_driver(const struct vfio_iommu_driver_ops *ops); |
| 72 | void vfio_unregister_iommu_driver(const struct vfio_iommu_driver_ops *ops); |