Patchwork [RFC,3/7] pci: call IOMMU hooks

login
register
mail settings
Submitter Eduard - Gabriel Munteanu
Date July 14, 2010, 5:45 a.m.
Message ID <1279086307-9596-4-git-send-email-eduard.munteanu@linux360.ro>
Download mbox | patch
Permalink /patch/58847/
State New
Headers show

Comments

Eduard - Gabriel Munteanu - July 14, 2010, 5:45 a.m.
Memory accesses must go through the IOMMU layer.

Signed-off-by: Eduard - Gabriel Munteanu <eduard.munteanu@linux360.ro>
---
 hw/pci.c |   21 +++++++++++++++++++++
 1 files changed, 21 insertions(+), 0 deletions(-)
Isaku Yamahata - July 14, 2010, 7:37 a.m.
On Wed, Jul 14, 2010 at 08:45:03AM +0300, Eduard - Gabriel Munteanu wrote:
> Memory accesses must go through the IOMMU layer.
> 
> Signed-off-by: Eduard - Gabriel Munteanu <eduard.munteanu@linux360.ro>
> ---
>  hw/pci.c |   21 +++++++++++++++++++++
>  1 files changed, 21 insertions(+), 0 deletions(-)
> 
> diff --git a/hw/pci.c b/hw/pci.c
> index 6871728..9c5d706 100644
> --- a/hw/pci.c
> +++ b/hw/pci.c
> @@ -22,6 +22,7 @@
>   * THE SOFTWARE.
>   */
>  #include "hw.h"
> +#include "iommu.h"
>  #include "pci.h"
>  #include "monitor.h"
>  #include "net.h"
> @@ -733,12 +734,25 @@ static void do_pci_unregister_device(PCIDevice *pci_dev)
>      pci_config_free(pci_dev);
>  }
>  
> +#ifdef CONFIG_IOMMU
> +static inline int pci_iommu_register_device(PCIBus *bus, PCIDevice *dev)
> +{
> +    return iommu_register_device(bus->qbus.iommu, &dev->qdev);
> +}
> +#else
> +static inline int pci_iommu_register_device(PCIBus *bus, PCIDevice *dev)
> +{
> +    return 0;
> +}
> +#endif
> +
>  PCIDevice *pci_register_device(PCIBus *bus, const char *name,
>                                 int instance_size, int devfn,
>                                 PCIConfigReadFunc *config_read,
>                                 PCIConfigWriteFunc *config_write)
>  {
>      PCIDevice *pci_dev;
> +    int err;
>  
>      pci_dev = qemu_mallocz(instance_size);
>      pci_dev = do_pci_register_device(pci_dev, bus, name, devfn,
> @@ -747,6 +761,13 @@ PCIDevice *pci_register_device(PCIBus *bus, const char *name,
>      if (pci_dev == NULL) {
>          hw_error("PCI: can't register device\n");
>      }
> +
> +    err = pci_iommu_register_device(bus, pci_dev);
> +    if (err) {
> +        hw_error("PCI: can't register device with IOMMU\n");
> +        return NULL;
> +    }
> +
>      return pci_dev;
>  }

pci_register_device() is pre-qdev api.
qdev'fied device doesn't call pci_register_device().
So please move the initialization hook into do_pci_register_device()
which are commonly used by pci_register_device() and pci_qdev_init().
Eduard - Gabriel Munteanu - July 14, 2010, 10:50 p.m.
On Wed, Jul 14, 2010 at 04:37:39PM +0900, Isaku Yamahata wrote:
> On Wed, Jul 14, 2010 at 08:45:03AM +0300, Eduard - Gabriel Munteanu wrote:

[snip]

> >  PCIDevice *pci_register_device(PCIBus *bus, const char *name,
> >                                 int instance_size, int devfn,
> >                                 PCIConfigReadFunc *config_read,
> >                                 PCIConfigWriteFunc *config_write)
> >  {
> >      PCIDevice *pci_dev;
> > +    int err;
> >  
> >      pci_dev = qemu_mallocz(instance_size);
> >      pci_dev = do_pci_register_device(pci_dev, bus, name, devfn,
> > @@ -747,6 +761,13 @@ PCIDevice *pci_register_device(PCIBus *bus, const char *name,
> >      if (pci_dev == NULL) {
> >          hw_error("PCI: can't register device\n");
> >      }
> > +
> > +    err = pci_iommu_register_device(bus, pci_dev);
> > +    if (err) {
> > +        hw_error("PCI: can't register device with IOMMU\n");
> > +        return NULL;
> > +    }
> > +
> >      return pci_dev;
> >  }
> 
> pci_register_device() is pre-qdev api.
> qdev'fied device doesn't call pci_register_device().
> So please move the initialization hook into do_pci_register_device()
> which are commonly used by pci_register_device() and pci_qdev_init().
> -- 
> yamahata

Thanks, I didn't need the functionality and missed this.


	Eduard

Patch

diff --git a/hw/pci.c b/hw/pci.c
index 6871728..9c5d706 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -22,6 +22,7 @@ 
  * THE SOFTWARE.
  */
 #include "hw.h"
+#include "iommu.h"
 #include "pci.h"
 #include "monitor.h"
 #include "net.h"
@@ -733,12 +734,25 @@  static void do_pci_unregister_device(PCIDevice *pci_dev)
     pci_config_free(pci_dev);
 }
 
+#ifdef CONFIG_IOMMU
+static inline int pci_iommu_register_device(PCIBus *bus, PCIDevice *dev)
+{
+    return iommu_register_device(bus->qbus.iommu, &dev->qdev);
+}
+#else
+static inline int pci_iommu_register_device(PCIBus *bus, PCIDevice *dev)
+{
+    return 0;
+}
+#endif
+
 PCIDevice *pci_register_device(PCIBus *bus, const char *name,
                                int instance_size, int devfn,
                                PCIConfigReadFunc *config_read,
                                PCIConfigWriteFunc *config_write)
 {
     PCIDevice *pci_dev;
+    int err;
 
     pci_dev = qemu_mallocz(instance_size);
     pci_dev = do_pci_register_device(pci_dev, bus, name, devfn,
@@ -747,6 +761,13 @@  PCIDevice *pci_register_device(PCIBus *bus, const char *name,
     if (pci_dev == NULL) {
         hw_error("PCI: can't register device\n");
     }
+
+    err = pci_iommu_register_device(bus, pci_dev);
+    if (err) {
+        hw_error("PCI: can't register device with IOMMU\n");
+        return NULL;
+    }
+
     return pci_dev;
 }