mirror of https://gitee.com/openkylin/linux.git
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
|
@ -34,6 +34,37 @@ void register_iommu(struct iommu_ops *ops)
|
||||||
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)
|
bool iommu_found(void)
|
||||||
{
|
{
|
||||||
return iommu_ops != NULL;
|
return iommu_ops != NULL;
|
||||||
|
|
|
@ -33,6 +33,7 @@ struct class;
|
||||||
struct subsys_private;
|
struct subsys_private;
|
||||||
struct bus_type;
|
struct bus_type;
|
||||||
struct device_node;
|
struct device_node;
|
||||||
|
struct iommu_ops;
|
||||||
|
|
||||||
struct bus_attribute {
|
struct bus_attribute {
|
||||||
struct attribute attr;
|
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.
|
* @resume: Called to bring a device on this bus out of sleep mode.
|
||||||
* @pm: Power management operations of this bus, callback the specific
|
* @pm: Power management operations of this bus, callback the specific
|
||||||
* device driver's pm-ops.
|
* 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
|
* @p: The private data of the driver core, only the driver core can
|
||||||
* touch this.
|
* touch this.
|
||||||
*
|
*
|
||||||
|
@ -96,6 +100,8 @@ struct bus_type {
|
||||||
|
|
||||||
const struct dev_pm_ops *pm;
|
const struct dev_pm_ops *pm;
|
||||||
|
|
||||||
|
struct iommu_ops *iommu_ops;
|
||||||
|
|
||||||
struct subsys_private *p;
|
struct subsys_private *p;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#define IOMMU_WRITE (2)
|
#define IOMMU_WRITE (2)
|
||||||
#define IOMMU_CACHE (4) /* DMA cache coherency */
|
#define IOMMU_CACHE (4) /* DMA cache coherency */
|
||||||
|
|
||||||
|
struct bus_type;
|
||||||
struct device;
|
struct device;
|
||||||
|
|
||||||
struct iommu_domain {
|
struct iommu_domain {
|
||||||
|
@ -52,6 +53,7 @@ struct iommu_ops {
|
||||||
};
|
};
|
||||||
|
|
||||||
extern void register_iommu(struct iommu_ops *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 bool iommu_found(void);
|
||||||
extern struct iommu_domain *iommu_domain_alloc(void);
|
extern struct iommu_domain *iommu_domain_alloc(void);
|
||||||
extern void iommu_domain_free(struct iommu_domain *domain);
|
extern void iommu_domain_free(struct iommu_domain *domain);
|
||||||
|
|
Loading…
Reference in New Issue