* [PATCH 01/10] iommu/core: Define iommu_ops and register_iommu only with CONFIG_IOMMU_API
2011-09-22 16:14 [PATCH 0/10 v2] IOMMU: Make iommu_ops per-bus_type Joerg Roedel
@ 2011-09-22 16:14 ` Joerg Roedel
2011-09-22 16:14 ` [PATCH 02/10] Driver core: Add iommu_ops to bus_type Joerg Roedel
` (8 subsequent siblings)
9 siblings, 0 replies; 16+ messages in thread
From: Joerg Roedel @ 2011-09-22 16:14 UTC (permalink / raw)
To: iommu
Cc: Greg Kroah-Hartman, Alex Williamson, Ohad Ben-Cohen,
David Woodhouse, David Brown, joro, linux-kernel, Joerg Roedel
This makes it impossible to compile an iommu driver into the
kernel without selecting CONFIG_IOMMU_API.
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
---
include/linux/iommu.h | 8 +++-----
1 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/include/linux/iommu.h b/include/linux/iommu.h
index 9940319..6470cd8 100644
--- a/include/linux/iommu.h
+++ b/include/linux/iommu.h
@@ -34,6 +34,8 @@ struct iommu_domain {
#define IOMMU_CAP_CACHE_COHERENCY 0x1
#define IOMMU_CAP_INTR_REMAP 0x2 /* isolates device intrs */
+#ifdef CONFIG_IOMMU_API
+
struct iommu_ops {
int (*domain_init)(struct iommu_domain *domain);
void (*domain_destroy)(struct iommu_domain *domain);
@@ -49,8 +51,6 @@ struct iommu_ops {
unsigned long cap);
};
-#ifdef CONFIG_IOMMU_API
-
extern void register_iommu(struct iommu_ops *ops);
extern bool iommu_found(void);
extern struct iommu_domain *iommu_domain_alloc(void);
@@ -70,9 +70,7 @@ extern int iommu_domain_has_cap(struct iommu_domain *domain,
#else /* CONFIG_IOMMU_API */
-static inline void register_iommu(struct iommu_ops *ops)
-{
-}
+struct iommu_ops {};
static inline bool iommu_found(void)
{
--
1.7.4.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 02/10] Driver core: Add iommu_ops to bus_type
2011-09-22 16:14 [PATCH 0/10 v2] IOMMU: Make iommu_ops per-bus_type Joerg Roedel
2011-09-22 16:14 ` [PATCH 01/10] iommu/core: Define iommu_ops and register_iommu only with CONFIG_IOMMU_API Joerg Roedel
@ 2011-09-22 16:14 ` Joerg Roedel
2011-09-22 20:11 ` Greg KH
2011-09-22 16:14 ` [PATCH 03/10] iommu/core: Add bus_type parameter to iommu_domain_alloc Joerg Roedel
` (7 subsequent siblings)
9 siblings, 1 reply; 16+ messages in thread
From: Joerg Roedel @ 2011-09-22 16:14 UTC (permalink / raw)
To: iommu
Cc: Greg Kroah-Hartman, Alex Williamson, Ohad Ben-Cohen,
David Woodhouse, David Brown, joro, linux-kernel, Joerg Roedel
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.
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
---
drivers/base/bus.c | 29 +++++++++++++++++++++++++++++
drivers/iommu/iommu.c | 4 ++++
include/linux/device.h | 10 ++++++++++
include/linux/iommu.h | 2 ++
4 files changed, 45 insertions(+), 0 deletions(-)
diff --git a/drivers/base/bus.c b/drivers/base/bus.c
index 000e7b2..b3014fe 100644
--- a/drivers/base/bus.c
+++ b/drivers/base/bus.c
@@ -1028,6 +1028,35 @@ void bus_sort_breadthfirst(struct bus_type *bus,
}
EXPORT_SYMBOL_GPL(bus_sort_breadthfirst);
+#ifdef CONFIG_IOMMU_API
+/**
+ * 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);
+#endif
+
int __init buses_init(void)
{
bus_kset = kset_create_and_add("bus", &bus_uevent_ops, NULL);
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index 30b0644..3b24a5b 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -34,6 +34,10 @@ void register_iommu(struct iommu_ops *ops)
iommu_ops = ops;
}
+void iommu_bus_init(struct bus_type *bus, struct iommu_ops *ops)
+{
+}
+
bool iommu_found(void)
{
return iommu_ops != NULL;
diff --git a/include/linux/device.h b/include/linux/device.h
index c20dfbf..490382b 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -33,6 +33,7 @@ struct class;
struct subsys_private;
struct bus_type;
struct device_node;
+struct iommu_ops;
struct bus_attribute {
struct attribute attr;
@@ -46,6 +47,7 @@ struct bus_attribute bus_attr_##_name = __ATTR(_name, _mode, _show, _store)
extern int __must_check bus_create_file(struct bus_type *,
struct bus_attribute *);
extern void bus_remove_file(struct bus_type *, struct bus_attribute *);
+extern void iommu_bus_init(struct bus_type *bus, struct iommu_ops *ops);
/**
* struct bus_type - The bus type of the device
@@ -67,6 +69,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 +101,8 @@ struct bus_type {
const struct dev_pm_ops *pm;
+ struct iommu_ops *iommu_ops;
+
struct subsys_private *p;
};
@@ -148,6 +155,9 @@ extern int bus_unregister_notifier(struct bus_type *bus,
#define BUS_NOTIFY_UNBOUND_DRIVER 0x00000006 /* driver is unbound
from the device */
+/* IOMMU related bus functions */
+int bus_set_iommu(struct bus_type *bus, struct iommu_ops *ops);
+
extern struct kset *bus_get_kset(struct bus_type *bus);
extern struct klist *bus_get_device_klist(struct bus_type *bus);
diff --git a/include/linux/iommu.h b/include/linux/iommu.h
index 6470cd8..4739e36 100644
--- a/include/linux/iommu.h
+++ b/include/linux/iommu.h
@@ -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 void iommu_bus_init(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);
--
1.7.4.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 02/10] Driver core: Add iommu_ops to bus_type
2011-09-22 16:14 ` [PATCH 02/10] Driver core: Add iommu_ops to bus_type Joerg Roedel
@ 2011-09-22 20:11 ` Greg KH
2011-09-23 15:19 ` Roedel, Joerg
0 siblings, 1 reply; 16+ messages in thread
From: Greg KH @ 2011-09-22 20:11 UTC (permalink / raw)
To: Joerg Roedel
Cc: iommu, Alex Williamson, Ohad Ben-Cohen, David Woodhouse,
David Brown, joro, linux-kernel
On Thu, Sep 22, 2011 at 06:14:54PM +0200, Joerg Roedel wrote:
> 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.
>
> Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
> ---
> drivers/base/bus.c | 29 +++++++++++++++++++++++++++++
> drivers/iommu/iommu.c | 4 ++++
> include/linux/device.h | 10 ++++++++++
> include/linux/iommu.h | 2 ++
> 4 files changed, 45 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/base/bus.c b/drivers/base/bus.c
> index 000e7b2..b3014fe 100644
> --- a/drivers/base/bus.c
> +++ b/drivers/base/bus.c
> @@ -1028,6 +1028,35 @@ void bus_sort_breadthfirst(struct bus_type *bus,
> }
> EXPORT_SYMBOL_GPL(bus_sort_breadthfirst);
>
> +#ifdef CONFIG_IOMMU_API
> +/**
This ifdef really isn't needed, is it? I think you can remove it.
Other than that, looks much better, thanks.
greg k-h
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 02/10] Driver core: Add iommu_ops to bus_type
2011-09-22 20:11 ` Greg KH
@ 2011-09-23 15:19 ` Roedel, Joerg
0 siblings, 0 replies; 16+ messages in thread
From: Roedel, Joerg @ 2011-09-23 15:19 UTC (permalink / raw)
To: Greg KH
Cc: iommu, Alex Williamson, Ohad Ben-Cohen, David Woodhouse,
David Brown, joro, linux-kernel
On Thu, Sep 22, 2011 at 04:11:55PM -0400, Greg KH wrote:
> On Thu, Sep 22, 2011 at 06:14:54PM +0200, Joerg Roedel wrote:
> > 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.
> >
> > Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
> > ---
> > drivers/base/bus.c | 29 +++++++++++++++++++++++++++++
> > drivers/iommu/iommu.c | 4 ++++
> > include/linux/device.h | 10 ++++++++++
> > include/linux/iommu.h | 2 ++
> > 4 files changed, 45 insertions(+), 0 deletions(-)
> >
> > diff --git a/drivers/base/bus.c b/drivers/base/bus.c
> > index 000e7b2..b3014fe 100644
> > --- a/drivers/base/bus.c
> > +++ b/drivers/base/bus.c
> > @@ -1028,6 +1028,35 @@ void bus_sort_breadthfirst(struct bus_type *bus,
> > }
> > EXPORT_SYMBOL_GPL(bus_sort_breadthfirst);
> >
> > +#ifdef CONFIG_IOMMU_API
> > +/**
>
> This ifdef really isn't needed, is it? I think you can remove it.
Actually, iommu_bus_init is only defined with CONFIG_IOMMU_API=y. But
you are right, the ifdef is not very nice here. I solved this situation
by moving the function into drivers/iommu/iommu.c which is only compiled
with CONFIG_IOMMU_API=y anyway, so no ifdef is required anymore.
> Other than that, looks much better, thanks.
Great, I sent a new round if these patches. Moving this function to
another file caused some changes in the following patches too during the
rebase.
Thanks,
Joerg
--
AMD Operating System Research Center
Advanced Micro Devices GmbH Einsteinring 24 85609 Dornach
General Managers: Alberto Bozzo, Andrew Bowd
Registration: Dornach, Landkr. Muenchen; Registerger. Muenchen, HRB Nr. 43632
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 03/10] iommu/core: Add bus_type parameter to iommu_domain_alloc
2011-09-22 16:14 [PATCH 0/10 v2] IOMMU: Make iommu_ops per-bus_type Joerg Roedel
2011-09-22 16:14 ` [PATCH 01/10] iommu/core: Define iommu_ops and register_iommu only with CONFIG_IOMMU_API Joerg Roedel
2011-09-22 16:14 ` [PATCH 02/10] Driver core: Add iommu_ops to bus_type Joerg Roedel
@ 2011-09-22 16:14 ` Joerg Roedel
2011-09-22 16:14 ` [PATCH 04/10] iommu/core: Convert iommu_found to iommu_present Joerg Roedel
` (6 subsequent siblings)
9 siblings, 0 replies; 16+ messages in thread
From: Joerg Roedel @ 2011-09-22 16:14 UTC (permalink / raw)
To: iommu
Cc: Greg Kroah-Hartman, Alex Williamson, Ohad Ben-Cohen,
David Woodhouse, David Brown, joro, linux-kernel, Joerg Roedel
This is necessary to store a pointer to the bus-specific
iommu_ops in the iommu-domain structure. It will be used
later to call into bus-specific iommu-ops.
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
---
drivers/iommu/iommu.c | 14 +++++++++++++-
drivers/media/video/omap3isp/isp.c | 2 +-
include/linux/iommu.h | 6 ++++--
virt/kvm/iommu.c | 2 +-
4 files changed, 19 insertions(+), 5 deletions(-)
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index 3b24a5b..adaee9b 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -16,6 +16,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+#include <linux/device.h>
#include <linux/kernel.h>
#include <linux/bug.h>
#include <linux/types.h>
@@ -44,15 +45,26 @@ bool iommu_found(void)
}
EXPORT_SYMBOL_GPL(iommu_found);
-struct iommu_domain *iommu_domain_alloc(void)
+struct iommu_domain *iommu_domain_alloc(struct bus_type *bus)
{
struct iommu_domain *domain;
+ struct iommu_ops *ops;
int ret;
+ if (bus->iommu_ops)
+ ops = bus->iommu_ops;
+ else
+ ops = iommu_ops;
+
+ if (ops == NULL)
+ return NULL;
+
domain = kmalloc(sizeof(*domain), GFP_KERNEL);
if (!domain)
return NULL;
+ domain->ops = ops;
+
ret = iommu_ops->domain_init(domain);
if (ret)
goto out_free;
diff --git a/drivers/media/video/omap3isp/isp.c b/drivers/media/video/omap3isp/isp.c
index a4baa61..a7ed985 100644
--- a/drivers/media/video/omap3isp/isp.c
+++ b/drivers/media/video/omap3isp/isp.c
@@ -2141,7 +2141,7 @@ static int isp_probe(struct platform_device *pdev)
/* to be removed once iommu migration is complete */
isp->iommu = to_iommu(isp->iommu_dev);
- isp->domain = iommu_domain_alloc();
+ isp->domain = iommu_domain_alloc(pdev->dev.bus);
if (!isp->domain) {
dev_err(isp->dev, "can't alloc iommu domain\n");
ret = -ENOMEM;
diff --git a/include/linux/iommu.h b/include/linux/iommu.h
index 4739e36..3bd6892 100644
--- a/include/linux/iommu.h
+++ b/include/linux/iommu.h
@@ -25,10 +25,12 @@
#define IOMMU_WRITE (2)
#define IOMMU_CACHE (4) /* DMA cache coherency */
+struct iommu_ops;
struct bus_type;
struct device;
struct iommu_domain {
+ struct iommu_ops *ops;
void *priv;
};
@@ -55,7 +57,7 @@ struct iommu_ops {
extern void register_iommu(struct iommu_ops *ops);
extern void iommu_bus_init(struct bus_type *bus, struct iommu_ops *ops);
extern bool iommu_found(void);
-extern struct iommu_domain *iommu_domain_alloc(void);
+extern struct iommu_domain *iommu_domain_alloc(struct bus_type *bus);
extern void iommu_domain_free(struct iommu_domain *domain);
extern int iommu_attach_device(struct iommu_domain *domain,
struct device *dev);
@@ -79,7 +81,7 @@ static inline bool iommu_found(void)
return false;
}
-static inline struct iommu_domain *iommu_domain_alloc(void)
+static inline struct iommu_domain *iommu_domain_alloc(struct bus_type *bus)
{
return NULL;
}
diff --git a/virt/kvm/iommu.c b/virt/kvm/iommu.c
index 78c80f6..20115b1 100644
--- a/virt/kvm/iommu.c
+++ b/virt/kvm/iommu.c
@@ -233,7 +233,7 @@ int kvm_iommu_map_guest(struct kvm *kvm)
return -ENODEV;
}
- kvm->arch.iommu_domain = iommu_domain_alloc();
+ kvm->arch.iommu_domain = iommu_domain_alloc(&pci_bus_type);
if (!kvm->arch.iommu_domain)
return -ENOMEM;
--
1.7.4.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 04/10] iommu/core: Convert iommu_found to iommu_present
2011-09-22 16:14 [PATCH 0/10 v2] IOMMU: Make iommu_ops per-bus_type Joerg Roedel
` (2 preceding siblings ...)
2011-09-22 16:14 ` [PATCH 03/10] iommu/core: Add bus_type parameter to iommu_domain_alloc Joerg Roedel
@ 2011-09-22 16:14 ` Joerg Roedel
2011-09-22 16:14 ` [PATCH 05/10] iommu/core: Use bus->iommu_ops in the iommu-api Joerg Roedel
` (5 subsequent siblings)
9 siblings, 0 replies; 16+ messages in thread
From: Joerg Roedel @ 2011-09-22 16:14 UTC (permalink / raw)
To: iommu
Cc: Greg Kroah-Hartman, Alex Williamson, Ohad Ben-Cohen,
David Woodhouse, David Brown, joro, linux-kernel, Joerg Roedel
With per-bus iommu_ops the iommu_found function needs to
work on a bus_type too. This patch adds a bus_type parameter
to that function and converts all call-places.
The function is also renamed to iommu_present because the
function now checks if an iommu is present for a given bus
and does not check for a global iommu anymore.
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
---
arch/ia64/kvm/kvm-ia64.c | 3 ++-
arch/x86/kvm/x86.c | 3 ++-
drivers/iommu/iommu.c | 9 ++++++---
include/linux/iommu.h | 4 ++--
virt/kvm/iommu.c | 2 +-
5 files changed, 13 insertions(+), 8 deletions(-)
diff --git a/arch/ia64/kvm/kvm-ia64.c b/arch/ia64/kvm/kvm-ia64.c
index 8213efe..43f4c92 100644
--- a/arch/ia64/kvm/kvm-ia64.c
+++ b/arch/ia64/kvm/kvm-ia64.c
@@ -33,6 +33,7 @@
#include <linux/uaccess.h>
#include <linux/iommu.h>
#include <linux/intel-iommu.h>
+#include <linux/pci.h>
#include <asm/pgtable.h>
#include <asm/gcc_intrin.h>
@@ -204,7 +205,7 @@ int kvm_dev_ioctl_check_extension(long ext)
r = KVM_COALESCED_MMIO_PAGE_OFFSET;
break;
case KVM_CAP_IOMMU:
- r = iommu_found();
+ r = iommu_present(&pci_bus_type);
break;
default:
r = 0;
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 84a28ea..73c6a42 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -44,6 +44,7 @@
#include <linux/perf_event.h>
#include <linux/uaccess.h>
#include <linux/hash.h>
+#include <linux/pci.h>
#include <trace/events/kvm.h>
#define CREATE_TRACE_POINTS
@@ -2095,7 +2096,7 @@ int kvm_dev_ioctl_check_extension(long ext)
r = 0;
break;
case KVM_CAP_IOMMU:
- r = iommu_found();
+ r = iommu_present(&pci_bus_type);
break;
case KVM_CAP_MCE:
r = KVM_MAX_MCE_BANKS;
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index adaee9b..2270127 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -39,11 +39,14 @@ void iommu_bus_init(struct bus_type *bus, struct iommu_ops *ops)
{
}
-bool iommu_found(void)
+bool iommu_present(struct bus_type *bus)
{
- return iommu_ops != NULL;
+ if (bus->iommu_ops != NULL)
+ return true;
+ else
+ return iommu_ops != NULL;
}
-EXPORT_SYMBOL_GPL(iommu_found);
+EXPORT_SYMBOL_GPL(iommu_present);
struct iommu_domain *iommu_domain_alloc(struct bus_type *bus)
{
diff --git a/include/linux/iommu.h b/include/linux/iommu.h
index 3bd6892..de73219 100644
--- a/include/linux/iommu.h
+++ b/include/linux/iommu.h
@@ -56,7 +56,7 @@ struct iommu_ops {
extern void register_iommu(struct iommu_ops *ops);
extern void iommu_bus_init(struct bus_type *bus, struct iommu_ops *ops);
-extern bool iommu_found(void);
+extern bool iommu_present(struct bus_type *bus);
extern struct iommu_domain *iommu_domain_alloc(struct bus_type *bus);
extern void iommu_domain_free(struct iommu_domain *domain);
extern int iommu_attach_device(struct iommu_domain *domain,
@@ -76,7 +76,7 @@ extern int iommu_domain_has_cap(struct iommu_domain *domain,
struct iommu_ops {};
-static inline bool iommu_found(void)
+static inline bool iommu_present(struct bus_type *bus)
{
return false;
}
diff --git a/virt/kvm/iommu.c b/virt/kvm/iommu.c
index 20115b1..d149940 100644
--- a/virt/kvm/iommu.c
+++ b/virt/kvm/iommu.c
@@ -228,7 +228,7 @@ int kvm_iommu_map_guest(struct kvm *kvm)
{
int r;
- if (!iommu_found()) {
+ if (!iommu_present(&pci_bus_type)) {
printk(KERN_ERR "%s: iommu not found\n", __func__);
return -ENODEV;
}
--
1.7.4.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 05/10] iommu/core: Use bus->iommu_ops in the iommu-api
2011-09-22 16:14 [PATCH 0/10 v2] IOMMU: Make iommu_ops per-bus_type Joerg Roedel
` (3 preceding siblings ...)
2011-09-22 16:14 ` [PATCH 04/10] iommu/core: Convert iommu_found to iommu_present Joerg Roedel
@ 2011-09-22 16:14 ` Joerg Roedel
2011-09-22 16:14 ` [PATCH 06/10] iommu/amd: Use bus_set_iommu instead of register_iommu Joerg Roedel
` (4 subsequent siblings)
9 siblings, 0 replies; 16+ messages in thread
From: Joerg Roedel @ 2011-09-22 16:14 UTC (permalink / raw)
To: iommu
Cc: Greg Kroah-Hartman, Alex Williamson, Ohad Ben-Cohen,
David Woodhouse, David Brown, joro, linux-kernel, Joerg Roedel
Use the per-bus iommu-ops in the functions of the iommu-api
instead of the global iommu_ops.
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
---
drivers/iommu/iommu.c | 34 +++++++++++++++++++++++++++-------
1 files changed, 27 insertions(+), 7 deletions(-)
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index 2270127..f2ced4c 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -83,34 +83,48 @@ EXPORT_SYMBOL_GPL(iommu_domain_alloc);
void iommu_domain_free(struct iommu_domain *domain)
{
- iommu_ops->domain_destroy(domain);
+ if (likely(domain->ops->domain_destroy != NULL))
+ domain->ops->domain_destroy(domain);
+
kfree(domain);
}
EXPORT_SYMBOL_GPL(iommu_domain_free);
int iommu_attach_device(struct iommu_domain *domain, struct device *dev)
{
- return iommu_ops->attach_dev(domain, dev);
+ if (unlikely(domain->ops->attach_dev == NULL))
+ return -ENODEV;
+
+ return domain->ops->attach_dev(domain, dev);
}
EXPORT_SYMBOL_GPL(iommu_attach_device);
void iommu_detach_device(struct iommu_domain *domain, struct device *dev)
{
- iommu_ops->detach_dev(domain, dev);
+ if (unlikely(domain->ops->detach_dev == NULL))
+ return;
+
+ domain->ops->detach_dev(domain, dev);
}
EXPORT_SYMBOL_GPL(iommu_detach_device);
phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain,
unsigned long iova)
{
- return iommu_ops->iova_to_phys(domain, iova);
+ if (unlikely(domain->ops->iova_to_phys == NULL))
+ return 0;
+
+ return domain->ops->iova_to_phys(domain, iova);
}
EXPORT_SYMBOL_GPL(iommu_iova_to_phys);
int iommu_domain_has_cap(struct iommu_domain *domain,
unsigned long cap)
{
- return iommu_ops->domain_has_cap(domain, cap);
+ if (unlikely(domain->ops->domain_has_cap == NULL))
+ return 0;
+
+ return domain->ops->domain_has_cap(domain, cap);
}
EXPORT_SYMBOL_GPL(iommu_domain_has_cap);
@@ -119,11 +133,14 @@ int iommu_map(struct iommu_domain *domain, unsigned long iova,
{
size_t size;
+ if (unlikely(domain->ops->map == NULL))
+ return -ENODEV;
+
size = PAGE_SIZE << gfp_order;
BUG_ON(!IS_ALIGNED(iova | paddr, size));
- return iommu_ops->map(domain, iova, paddr, gfp_order, prot);
+ return domain->ops->map(domain, iova, paddr, gfp_order, prot);
}
EXPORT_SYMBOL_GPL(iommu_map);
@@ -131,10 +148,13 @@ int iommu_unmap(struct iommu_domain *domain, unsigned long iova, int gfp_order)
{
size_t size;
+ if (unlikely(domain->ops->unmap == NULL))
+ return -ENODEV;
+
size = PAGE_SIZE << gfp_order;
BUG_ON(!IS_ALIGNED(iova, size));
- return iommu_ops->unmap(domain, iova, gfp_order);
+ return domain->ops->unmap(domain, iova, gfp_order);
}
EXPORT_SYMBOL_GPL(iommu_unmap);
--
1.7.4.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 06/10] iommu/amd: Use bus_set_iommu instead of register_iommu
2011-09-22 16:14 [PATCH 0/10 v2] IOMMU: Make iommu_ops per-bus_type Joerg Roedel
` (4 preceding siblings ...)
2011-09-22 16:14 ` [PATCH 05/10] iommu/core: Use bus->iommu_ops in the iommu-api Joerg Roedel
@ 2011-09-22 16:14 ` Joerg Roedel
2011-09-22 16:14 ` [PATCH 07/10] iommu/vt-d: " Joerg Roedel
` (3 subsequent siblings)
9 siblings, 0 replies; 16+ messages in thread
From: Joerg Roedel @ 2011-09-22 16:14 UTC (permalink / raw)
To: iommu
Cc: Greg Kroah-Hartman, Alex Williamson, Ohad Ben-Cohen,
David Woodhouse, David Brown, joro, linux-kernel, Joerg Roedel
Convert the AMD IOMMU driver to use the new interface for
publishing the iommu_ops.
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
---
drivers/iommu/amd_iommu.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c
index a14f8dc..57f6f38 100644
--- a/drivers/iommu/amd_iommu.c
+++ b/drivers/iommu/amd_iommu.c
@@ -2493,7 +2493,7 @@ static unsigned device_dma_ops_init(void)
void __init amd_iommu_init_api(void)
{
- register_iommu(&amd_iommu_ops);
+ bus_set_iommu(&pci_bus_type, &amd_iommu_ops);
}
int __init amd_iommu_init_dma_ops(void)
--
1.7.4.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 07/10] iommu/vt-d: Use bus_set_iommu instead of register_iommu
2011-09-22 16:14 [PATCH 0/10 v2] IOMMU: Make iommu_ops per-bus_type Joerg Roedel
` (5 preceding siblings ...)
2011-09-22 16:14 ` [PATCH 06/10] iommu/amd: Use bus_set_iommu instead of register_iommu Joerg Roedel
@ 2011-09-22 16:14 ` Joerg Roedel
2011-09-22 16:15 ` [PATCH 08/10] iommu/omap: " Joerg Roedel
` (2 subsequent siblings)
9 siblings, 0 replies; 16+ messages in thread
From: Joerg Roedel @ 2011-09-22 16:14 UTC (permalink / raw)
To: iommu
Cc: Greg Kroah-Hartman, Alex Williamson, Ohad Ben-Cohen,
David Woodhouse, David Brown, joro, linux-kernel, Joerg Roedel
Convert the Intel IOMMU driver to use the new interface for
publishing the iommu_ops.
Cc: David Woodhouse <dwmw2@infradead.org>
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
---
drivers/iommu/intel-iommu.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index c621c98..2d53c3d 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -3486,7 +3486,7 @@ int __init intel_iommu_init(void)
init_iommu_pm_ops();
- register_iommu(&intel_iommu_ops);
+ bus_set_iommu(&pci_bus_type, &intel_iommu_ops);
bus_register_notifier(&pci_bus_type, &device_nb);
--
1.7.4.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 08/10] iommu/omap: Use bus_set_iommu instead of register_iommu
2011-09-22 16:14 [PATCH 0/10 v2] IOMMU: Make iommu_ops per-bus_type Joerg Roedel
` (6 preceding siblings ...)
2011-09-22 16:14 ` [PATCH 07/10] iommu/vt-d: " Joerg Roedel
@ 2011-09-22 16:15 ` Joerg Roedel
2011-09-22 16:15 ` [PATCH 09/10] iommu/msm: " Joerg Roedel
2011-09-22 16:15 ` [PATCH 10/10] iommu/core: Remove global iommu_ops and register_iommu Joerg Roedel
9 siblings, 0 replies; 16+ messages in thread
From: Joerg Roedel @ 2011-09-22 16:15 UTC (permalink / raw)
To: iommu
Cc: Greg Kroah-Hartman, Alex Williamson, Ohad Ben-Cohen,
David Woodhouse, David Brown, joro, linux-kernel, Joerg Roedel
Convert the OMAP IOMMU driver on ARM to use the new
interface for publishing the iommu_ops.
Cc: Ohad Ben-Cohen <ohad@wizery.com>
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
---
drivers/iommu/omap-iommu.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/iommu/omap-iommu.c b/drivers/iommu/omap-iommu.c
index bd5f606..16d5b76 100644
--- a/drivers/iommu/omap-iommu.c
+++ b/drivers/iommu/omap-iommu.c
@@ -1250,7 +1250,7 @@ static int __init omap_iommu_init(void)
return -ENOMEM;
iopte_cachep = p;
- register_iommu(&omap_iommu_ops);
+ bus_set_iommu(&platform_bus_type, &omap_iommu_ops);
return platform_driver_register(&omap_iommu_driver);
}
--
1.7.4.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 09/10] iommu/msm: Use bus_set_iommu instead of register_iommu
2011-09-22 16:14 [PATCH 0/10 v2] IOMMU: Make iommu_ops per-bus_type Joerg Roedel
` (7 preceding siblings ...)
2011-09-22 16:15 ` [PATCH 08/10] iommu/omap: " Joerg Roedel
@ 2011-09-22 16:15 ` Joerg Roedel
2011-09-22 16:15 ` [PATCH 10/10] iommu/core: Remove global iommu_ops and register_iommu Joerg Roedel
9 siblings, 0 replies; 16+ messages in thread
From: Joerg Roedel @ 2011-09-22 16:15 UTC (permalink / raw)
To: iommu
Cc: Greg Kroah-Hartman, Alex Williamson, Ohad Ben-Cohen,
David Woodhouse, David Brown, joro, linux-kernel, Joerg Roedel
Convert the MSM IOMMU driver for ARM to use the new
interface for publishing the iommu_ops.
Cc: David Brown <davidb@codeaurora.org>
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
---
drivers/iommu/msm_iommu.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/iommu/msm_iommu.c b/drivers/iommu/msm_iommu.c
index d1733f6..5865dd2 100644
--- a/drivers/iommu/msm_iommu.c
+++ b/drivers/iommu/msm_iommu.c
@@ -728,7 +728,7 @@ static void __init setup_iommu_tex_classes(void)
static int __init msm_iommu_init(void)
{
setup_iommu_tex_classes();
- register_iommu(&msm_iommu_ops);
+ bus_set_iommu(&platform_bus_type, &msm_iommu_ops);
return 0;
}
--
1.7.4.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 10/10] iommu/core: Remove global iommu_ops and register_iommu
2011-09-22 16:14 [PATCH 0/10 v2] IOMMU: Make iommu_ops per-bus_type Joerg Roedel
` (8 preceding siblings ...)
2011-09-22 16:15 ` [PATCH 09/10] iommu/msm: " Joerg Roedel
@ 2011-09-22 16:15 ` Joerg Roedel
9 siblings, 0 replies; 16+ messages in thread
From: Joerg Roedel @ 2011-09-22 16:15 UTC (permalink / raw)
To: iommu
Cc: Greg Kroah-Hartman, Alex Williamson, Ohad Ben-Cohen,
David Woodhouse, David Brown, joro, linux-kernel, Joerg Roedel
With all IOMMU drivers being converted to bus_set_iommu the
global iommu_ops are no longer required. The same is true
for the deprecated register_iommu function.
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
---
drivers/iommu/iommu.c | 27 ++++-----------------------
include/linux/iommu.h | 1 -
2 files changed, 4 insertions(+), 24 deletions(-)
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index f2ced4c..dab33c4 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -25,50 +25,31 @@
#include <linux/errno.h>
#include <linux/iommu.h>
-static struct iommu_ops *iommu_ops;
-
-void register_iommu(struct iommu_ops *ops)
-{
- if (iommu_ops)
- BUG();
-
- iommu_ops = ops;
-}
-
void iommu_bus_init(struct bus_type *bus, struct iommu_ops *ops)
{
}
bool iommu_present(struct bus_type *bus)
{
- if (bus->iommu_ops != NULL)
- return true;
- else
- return iommu_ops != NULL;
+ return bus->iommu_ops != NULL;
}
EXPORT_SYMBOL_GPL(iommu_present);
struct iommu_domain *iommu_domain_alloc(struct bus_type *bus)
{
struct iommu_domain *domain;
- struct iommu_ops *ops;
int ret;
- if (bus->iommu_ops)
- ops = bus->iommu_ops;
- else
- ops = iommu_ops;
-
- if (ops == NULL)
+ if (bus == NULL || bus->iommu_ops == NULL)
return NULL;
domain = kmalloc(sizeof(*domain), GFP_KERNEL);
if (!domain)
return NULL;
- domain->ops = ops;
+ domain->ops = bus->iommu_ops;
- ret = iommu_ops->domain_init(domain);
+ ret = domain->ops->domain_init(domain);
if (ret)
goto out_free;
diff --git a/include/linux/iommu.h b/include/linux/iommu.h
index de73219..7014f40 100644
--- a/include/linux/iommu.h
+++ b/include/linux/iommu.h
@@ -54,7 +54,6 @@ struct iommu_ops {
unsigned long cap);
};
-extern void register_iommu(struct iommu_ops *ops);
extern void iommu_bus_init(struct bus_type *bus, struct iommu_ops *ops);
extern bool iommu_present(struct bus_type *bus);
extern struct iommu_domain *iommu_domain_alloc(struct bus_type *bus);
--
1.7.4.1
^ permalink raw reply related [flat|nested] 16+ messages in thread