diff options
| -rw-r--r-- | drivers/iommu/iommu.c | 31 | ||||
| -rw-r--r-- | include/linux/device.h | 6 | ||||
| -rw-r--r-- | include/linux/iommu.h | 2 |
3 files changed, 39 insertions, 0 deletions
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index 30b064497486..3343264f5105 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c | |||
| @@ -34,6 +34,37 @@ void register_iommu(struct iommu_ops *ops) | |||
| 34 | iommu_ops = ops; | 34 | iommu_ops = ops; |
| 35 | } | 35 | } |
| 36 | 36 | ||
| 37 | static void iommu_bus_init(struct bus_type *bus, struct iommu_ops *ops) | ||
| 38 | { | ||
| 39 | } | ||
| 40 | |||
| 41 | /** | ||
| 42 | * bus_set_iommu - set iommu-callbacks for the bus | ||
| 43 | * @bus: bus. | ||
| 44 | * @ops: the callbacks provided by the iommu-driver | ||
| 45 | * | ||
| 46 | * This function is called by an iommu driver to set the iommu methods | ||
| 47 | * used for a particular bus. Drivers for devices on that bus can use | ||
| 48 | * the iommu-api after these ops are registered. | ||
| 49 | * This special function is needed because IOMMUs are usually devices on | ||
| 50 | * the bus itself, so the iommu drivers are not initialized when the bus | ||
| 51 | * is set up. With this function the iommu-driver can set the iommu-ops | ||
| 52 | * afterwards. | ||
| 53 | */ | ||
| 54 | int bus_set_iommu(struct bus_type *bus, struct iommu_ops *ops) | ||
| 55 | { | ||
| 56 | if (bus->iommu_ops != NULL) | ||
| 57 | return -EBUSY; | ||
| 58 | |||
| 59 | bus->iommu_ops = ops; | ||
| 60 | |||
| 61 | /* Do IOMMU specific setup for this bus-type */ | ||
| 62 | iommu_bus_init(bus, ops); | ||
| 63 | |||
| 64 | return 0; | ||
| 65 | } | ||
| 66 | EXPORT_SYMBOL_GPL(bus_set_iommu); | ||
| 67 | |||
| 37 | bool iommu_found(void) | 68 | bool iommu_found(void) |
| 38 | { | 69 | { |
| 39 | return iommu_ops != NULL; | 70 | return iommu_ops != NULL; |
diff --git a/include/linux/device.h b/include/linux/device.h index c20dfbfc49b4..e838e143baa7 100644 --- a/include/linux/device.h +++ b/include/linux/device.h | |||
| @@ -33,6 +33,7 @@ struct class; | |||
| 33 | struct subsys_private; | 33 | struct subsys_private; |
| 34 | struct bus_type; | 34 | struct bus_type; |
| 35 | struct device_node; | 35 | struct device_node; |
| 36 | struct iommu_ops; | ||
| 36 | 37 | ||
| 37 | struct bus_attribute { | 38 | struct bus_attribute { |
| 38 | struct attribute attr; | 39 | struct attribute attr; |
| @@ -67,6 +68,9 @@ extern void bus_remove_file(struct bus_type *, struct bus_attribute *); | |||
| 67 | * @resume: Called to bring a device on this bus out of sleep mode. | 68 | * @resume: Called to bring a device on this bus out of sleep mode. |
| 68 | * @pm: Power management operations of this bus, callback the specific | 69 | * @pm: Power management operations of this bus, callback the specific |
| 69 | * device driver's pm-ops. | 70 | * device driver's pm-ops. |
| 71 | * @iommu_ops IOMMU specific operations for this bus, used to attach IOMMU | ||
| 72 | * driver implementations to a bus and allow the driver to do | ||
| 73 | * bus-specific setup | ||
| 70 | * @p: The private data of the driver core, only the driver core can | 74 | * @p: The private data of the driver core, only the driver core can |
| 71 | * touch this. | 75 | * touch this. |
| 72 | * | 76 | * |
| @@ -96,6 +100,8 @@ struct bus_type { | |||
| 96 | 100 | ||
| 97 | const struct dev_pm_ops *pm; | 101 | const struct dev_pm_ops *pm; |
| 98 | 102 | ||
| 103 | struct iommu_ops *iommu_ops; | ||
| 104 | |||
| 99 | struct subsys_private *p; | 105 | struct subsys_private *p; |
| 100 | }; | 106 | }; |
| 101 | 107 | ||
diff --git a/include/linux/iommu.h b/include/linux/iommu.h index 6470cd87b4ea..dca83d3405b1 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #define IOMMU_WRITE (2) | 25 | #define IOMMU_WRITE (2) |
| 26 | #define IOMMU_CACHE (4) /* DMA cache coherency */ | 26 | #define IOMMU_CACHE (4) /* DMA cache coherency */ |
| 27 | 27 | ||
| 28 | struct bus_type; | ||
| 28 | struct device; | 29 | struct device; |
| 29 | 30 | ||
| 30 | struct iommu_domain { | 31 | struct iommu_domain { |
| @@ -52,6 +53,7 @@ struct iommu_ops { | |||
| 52 | }; | 53 | }; |
| 53 | 54 | ||
| 54 | extern void register_iommu(struct iommu_ops *ops); | 55 | extern void register_iommu(struct iommu_ops *ops); |
| 56 | extern int bus_set_iommu(struct bus_type *bus, struct iommu_ops *ops); | ||
| 55 | extern bool iommu_found(void); | 57 | extern bool iommu_found(void); |
| 56 | extern struct iommu_domain *iommu_domain_alloc(void); | 58 | extern struct iommu_domain *iommu_domain_alloc(void); |
| 57 | extern void iommu_domain_free(struct iommu_domain *domain); | 59 | extern void iommu_domain_free(struct iommu_domain *domain); |
