|
@@ -34,6 +34,37 @@ void register_iommu(struct iommu_ops *ops)
|
|
|
iommu_ops = ops;
|
|
|
}
|
|
|
|
|
|
+static void iommu_bus_init(struct bus_type *bus, struct iommu_ops *ops)
|
|
|
+{
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * bus_set_iommu - set iommu-callbacks for the bus
|
|
|
+ * @bus: bus.
|
|
|
+ * @ops: the callbacks provided by the iommu-driver
|
|
|
+ *
|
|
|
+ * This function is called by an iommu driver to set the iommu methods
|
|
|
+ * used for a particular bus. Drivers for devices on that bus can use
|
|
|
+ * the iommu-api after these ops are registered.
|
|
|
+ * This special function is needed because IOMMUs are usually devices on
|
|
|
+ * the bus itself, so the iommu drivers are not initialized when the bus
|
|
|
+ * is set up. With this function the iommu-driver can set the iommu-ops
|
|
|
+ * afterwards.
|
|
|
+ */
|
|
|
+int bus_set_iommu(struct bus_type *bus, struct iommu_ops *ops)
|
|
|
+{
|
|
|
+ if (bus->iommu_ops != NULL)
|
|
|
+ return -EBUSY;
|
|
|
+
|
|
|
+ bus->iommu_ops = ops;
|
|
|
+
|
|
|
+ /* Do IOMMU specific setup for this bus-type */
|
|
|
+ iommu_bus_init(bus, ops);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(bus_set_iommu);
|
|
|
+
|
|
|
bool iommu_found(void)
|
|
|
{
|
|
|
return iommu_ops != NULL;
|