Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Driver core: Add iommu_ops to bus_type

This is the starting point to make the iommu_ops used for
the iommu-api a per-bus-type structure. It is required to
easily implement bus-specific setup in the iommu-layer.
The first user will be the iommu-group attribute in sysfs.

Acked-by: Greg Kroah-Hartman <gregkh@suse.de>
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>

+39
+31
drivers/iommu/iommu.c
··· 34 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 68 bool iommu_found(void) 38 69 { 39 70 return iommu_ops != NULL;
+6
include/linux/device.h
··· 33 33 struct subsys_private; 34 34 struct bus_type; 35 35 struct device_node; 36 + struct iommu_ops; 36 37 37 38 struct bus_attribute { 38 39 struct attribute attr; ··· 68 67 * @resume: Called to bring a device on this bus out of sleep mode. 69 68 * @pm: Power management operations of this bus, callback the specific 70 69 * device driver's pm-ops. 70 + * @iommu_ops IOMMU specific operations for this bus, used to attach IOMMU 71 + * driver implementations to a bus and allow the driver to do 72 + * bus-specific setup 71 73 * @p: The private data of the driver core, only the driver core can 72 74 * touch this. 73 75 * ··· 99 95 int (*resume)(struct device *dev); 100 96 101 97 const struct dev_pm_ops *pm; 98 + 99 + struct iommu_ops *iommu_ops; 102 100 103 101 struct subsys_private *p; 104 102 };
+2
include/linux/iommu.h
··· 25 25 #define IOMMU_WRITE (2) 26 26 #define IOMMU_CACHE (4) /* DMA cache coherency */ 27 27 28 + struct bus_type; 28 29 struct device; 29 30 30 31 struct iommu_domain { ··· 53 52 }; 54 53 55 54 extern void register_iommu(struct iommu_ops *ops); 55 + extern int bus_set_iommu(struct bus_type *bus, struct iommu_ops *ops); 56 56 extern bool iommu_found(void); 57 57 extern struct iommu_domain *iommu_domain_alloc(void); 58 58 extern void iommu_domain_free(struct iommu_domain *domain);