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>
This commit is contained in:
parent
39d4ebb959
commit
ff21776d12
3 changed files with 39 additions and 0 deletions
|
@ -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;
|
||||
|
|
|
@ -33,6 +33,7 @@ struct class;
|
|||
struct subsys_private;
|
||||
struct bus_type;
|
||||
struct device_node;
|
||||
struct iommu_ops;
|
||||
|
||||
struct bus_attribute {
|
||||
struct attribute attr;
|
||||
|
@ -67,6 +68,9 @@ extern void bus_remove_file(struct bus_type *, struct bus_attribute *);
|
|||
* @resume: Called to bring a device on this bus out of sleep mode.
|
||||
* @pm: Power management operations of this bus, callback the specific
|
||||
* device driver's pm-ops.
|
||||
* @iommu_ops IOMMU specific operations for this bus, used to attach IOMMU
|
||||
* driver implementations to a bus and allow the driver to do
|
||||
* bus-specific setup
|
||||
* @p: The private data of the driver core, only the driver core can
|
||||
* touch this.
|
||||
*
|
||||
|
@ -96,6 +100,8 @@ struct bus_type {
|
|||
|
||||
const struct dev_pm_ops *pm;
|
||||
|
||||
struct iommu_ops *iommu_ops;
|
||||
|
||||
struct subsys_private *p;
|
||||
};
|
||||
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#define IOMMU_WRITE (2)
|
||||
#define IOMMU_CACHE (4) /* DMA cache coherency */
|
||||
|
||||
struct bus_type;
|
||||
struct device;
|
||||
|
||||
struct iommu_domain {
|
||||
|
@ -52,6 +53,7 @@ struct iommu_ops {
|
|||
};
|
||||
|
||||
extern void register_iommu(struct iommu_ops *ops);
|
||||
extern int bus_set_iommu(struct bus_type *bus, struct iommu_ops *ops);
|
||||
extern bool iommu_found(void);
|
||||
extern struct iommu_domain *iommu_domain_alloc(void);
|
||||
extern void iommu_domain_free(struct iommu_domain *domain);
|
||||
|
|
Loading…
Reference in a new issue