[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v2 14/15] xen/arm: Add the property "protected-devices" in the hypervisor node



On Sun, 23 Feb 2014, Julien Grall wrote:
> DOM0 is using the swiotlb to bounce DMA. With the IOMMU support in Xen,
> protected devices should not use it.
> 
> Only Xen is abled to know if an IOMMU protects the device. The new property
> "protected-devices" is a list of device phandles protected by an IOMMU.
> 
> Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx>

You need to send a patch to

Documentation/devicetree/bindings/arm/xen.txt

I would like the commit message of this patch to reference the changes to it


>     This patch *MUST NOT* be applied until we agreed on a device binding
>     the device tree folks. DOM0 can run safely with swiotlb on protected
>     devices while LVM is not used for guest disk.
> 
>     Changes in v2:
>         - Patch added
> ---
>  xen/arch/arm/domain_build.c |   51 
> ++++++++++++++++++++++++++++++++++++++-----
>  xen/arch/arm/kernel.h       |    3 +++
>  2 files changed, 48 insertions(+), 6 deletions(-)
> 
> diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> index 9cbdd61..ca7dade 100644
> --- a/xen/arch/arm/domain_build.c
> +++ b/xen/arch/arm/domain_build.c
> @@ -324,19 +324,22 @@ static int make_memory_node(const struct domain *d,
>      return res;
>  }
>  
> -static int make_hypervisor_node(struct domain *d,
> -                                void *fdt, const struct dt_device_node 
> *parent)
> +static int make_hypervisor_node(struct domain *d, struct kernel_info *kinfo,
> +                                const struct dt_device_node *parent)
>  {
>      const char compat[] =
>          "xen,xen-"__stringify(XEN_VERSION)"."__stringify(XEN_SUBVERSION)"\0"
>          "xen,xen";
>      __be32 reg[4];
>      gic_interrupt_t intr;
> -    __be32 *cells;
> +    __be32 *cells, *_cells;
>      int res;
>      int addrcells = dt_n_addr_cells(parent);
>      int sizecells = dt_n_size_cells(parent);
>      paddr_t gnttab_start, gnttab_size;
> +    const struct dt_device_node *dev;
> +    struct hvm_iommu *hd = domain_hvm_iommu(d);
> +    void *fdt = kinfo->fdt;
>  
>      DPRINT("Create hypervisor node\n");
>  
> @@ -384,6 +387,39 @@ static int make_hypervisor_node(struct domain *d,
>      if ( res )
>          return res;
>  
> +    if ( kinfo->num_dev_protected )
> +    {
> +        /* Don't need to take dtdevs_lock here */
> +        cells = xmalloc_array(__be32, kinfo->num_dev_protected *
> +                              dt_size_to_cells(sizeof(dt_phandle)));
> +        if ( !cells )
> +            return -FDT_ERR_XEN(ENOMEM);
> +
> +        _cells = cells;
> +
> +        DPRINT("  List of protected devices\n");
> +        list_for_each_entry( dev, &hd->dt_devices, next_assigned )
> +        {
> +            DPRINT("    - %s\n", dt_node_full_name(dev));
> +            if ( !dev->phandle )
> +            {
> +                printk(XENLOG_ERR "Unable to handle protected device (%s)"
> +                       "with no phandle", dt_node_full_name(dev));
> +                xfree(cells);
> +                return -FDT_ERR_XEN(EINVAL);
> +            }
> +            dt_set_cell(&_cells, dt_size_to_cells(sizeof(dt_phandle)),
> +                        dev->phandle);
> +        }
> +
> +        res = fdt_property(fdt, "protected-devices", cells,
> +                           sizeof (dt_phandle) * kinfo->num_dev_protected);
> +
> +        xfree(cells);
> +        if ( res )
> +            return res;
> +    }
> +
>      res = fdt_end_node(fdt);
>  
>      return res;
> @@ -670,7 +706,8 @@ static int make_timer_node(const struct domain *d, void 
> *fdt,
>  }
>  
>  /* Map the device in the domain */
> -static int map_device(struct domain *d, struct dt_device_node *dev)
> +static int map_device(struct domain *d, struct kernel_info *kinfo,
> +                      struct dt_device_node *dev)
>  {
>      unsigned int nirq;
>      unsigned int naddr;
> @@ -695,6 +732,7 @@ static int map_device(struct domain *d, struct 
> dt_device_node *dev)
>                     dt_node_full_name(dev));
>              return res;
>          }
> +        kinfo->num_dev_protected++;
>      }
>  
>      /* Map IRQs */
> @@ -844,7 +882,7 @@ static int handle_node(struct domain *d, struct 
> kernel_info *kinfo,
>      if ( !dt_device_type_is_equal(node, "memory") &&
>           dt_device_is_available(node) )
>      {
> -        res = map_device(d, node);
> +        res = map_device(d, kinfo, node);
>  
>          if ( res )
>              return res;
> @@ -875,7 +913,7 @@ static int handle_node(struct domain *d, struct 
> kernel_info *kinfo,
>  
>      if ( node == dt_host )
>      {
> -        res = make_hypervisor_node(d, kinfo->fdt, node);
> +        res = make_hypervisor_node(d, kinfo, node);
>          if ( res )
>              return res;
>  
> @@ -1028,6 +1066,7 @@ int construct_dom0(struct domain *d)
>  
>      d->max_pages = ~0U;
>  
> +    kinfo.num_dev_protected = 0;
>      kinfo.unassigned_mem = dom0_mem;
>  
>      allocate_memory(d, &kinfo);
> diff --git a/xen/arch/arm/kernel.h b/xen/arch/arm/kernel.h
> index b48c2c9..3af5c50 100644
> --- a/xen/arch/arm/kernel.h
> +++ b/xen/arch/arm/kernel.h
> @@ -18,6 +18,9 @@ struct kernel_info {
>      paddr_t unassigned_mem; /* RAM not (yet) assigned to a bank */
>      struct dt_mem_info mem;
>  
> +    /* Number of devices protected by an IOMMU */
> +    unsigned int num_dev_protected;
> +
>      paddr_t dtb_paddr;
>      paddr_t entry;
>  
> -- 
> 1.7.10.4
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.