aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoerg Roedel <joerg.roedel@amd.com>2011-08-26 10:48:26 -0400
committerJoerg Roedel <joerg.roedel@amd.com>2011-10-21 08:37:19 -0400
commitff21776d12ff7993a6b236b8273ef62777d25dfb (patch)
treee4775ee5c1f5f5e7e6975c0887766a3b886c1258
parent39d4ebb95925046863dc0ef2698dfcf2c1f1dcbe (diff)
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>
-rw-r--r--drivers/iommu/iommu.c31
-rw-r--r--include/linux/device.h6
-rw-r--r--include/linux/iommu.h2
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
37static 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 */
54int 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}
66EXPORT_SYMBOL_GPL(bus_set_iommu);
67
37bool iommu_found(void) 68bool 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;
33struct subsys_private; 33struct subsys_private;
34struct bus_type; 34struct bus_type;
35struct device_node; 35struct device_node;
36struct iommu_ops;
36 37
37struct bus_attribute { 38struct 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
28struct bus_type;
28struct device; 29struct device;
29 30
30struct iommu_domain { 31struct iommu_domain {
@@ -52,6 +53,7 @@ struct iommu_ops {
52}; 53};
53 54
54extern void register_iommu(struct iommu_ops *ops); 55extern void register_iommu(struct iommu_ops *ops);
56extern int bus_set_iommu(struct bus_type *bus, struct iommu_ops *ops);
55extern bool iommu_found(void); 57extern bool iommu_found(void);
56extern struct iommu_domain *iommu_domain_alloc(void); 58extern struct iommu_domain *iommu_domain_alloc(void);
57extern void iommu_domain_free(struct iommu_domain *domain); 59extern void iommu_domain_free(struct iommu_domain *domain);