RE: [PATCH 03/10] iommu/core: Add bus_type parameter to iommu_domain_alloc

Sethi Varun-B16395
2011-09-12T11:50:40Z

> -----Original Message-----
> From: kvm-owner@vger.kernel.org [mailto:kvm-owner@vger.kernel.org] On
> Behalf Of Joerg Roedel
> Sent: Wednesday, September 07, 2011 9:12 PM
> To: iommu@lists.linux-foundation.org
> Cc: Greg Kroah-Hartman; Alex Williamson; Ohad Ben-Cohen; David Woodhouse;
> David Brown; joro@8bytes.org; kvm@vger.kernel.org; linux-
> kernel@vger.kernel.org; Joerg Roedel
> Subject: [PATCH 03/10] iommu/core: Add bus_type parameter to
> iommu_domain_alloc
>
> 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);

Although it might require changes starting all the way from the qemu interface, but
it would certainly be nice if this could be made more extendable/generic in terms
of the bus_type usage. This interface would be used by us (Freescale )for direct
assignment of SOC devices sitting on the platform bus.

-Varun