diff options
author | Joerg Roedel <joerg.roedel@amd.com> | 2011-08-26 10:48:26 -0400 |
---|---|---|
committer | Joerg Roedel <joerg.roedel@amd.com> | 2011-10-21 08:37:19 -0400 |
commit | ff21776d12ff7993a6b236b8273ef62777d25dfb (patch) | |
tree | e4775ee5c1f5f5e7e6975c0887766a3b886c1258 | |
parent | 39d4ebb95925046863dc0ef2698dfcf2c1f1dcbe (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.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); |