Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 271579
b: refs/heads/master
c: ff21776
h: refs/heads/master
i:
  271577: 3acdbc7
  271575: 111f4e4
v: v3
  • Loading branch information
Joerg Roedel committed Oct 21, 2011
1 parent 251f375 commit 7db3410
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 39d4ebb95925046863dc0ef2698dfcf2c1f1dcbe
refs/heads/master: ff21776d12ff7993a6b236b8273ef62777d25dfb
31 changes: 31 additions & 0 deletions trunk/drivers/iommu/iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
6 changes: 6 additions & 0 deletions trunk/include/linux/device.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ struct class;
struct subsys_private;
struct bus_type;
struct device_node;
struct iommu_ops;

struct bus_attribute {
struct attribute attr;
Expand Down Expand Up @@ -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.
*
Expand Down Expand Up @@ -96,6 +100,8 @@ struct bus_type {

const struct dev_pm_ops *pm;

struct iommu_ops *iommu_ops;

struct subsys_private *p;
};

Expand Down
2 changes: 2 additions & 0 deletions trunk/include/linux/iommu.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#define IOMMU_WRITE (2)
#define IOMMU_CACHE (4) /* DMA cache coherency */

struct bus_type;
struct device;

struct iommu_domain {
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 7db3410

Please sign in to comment.