|
[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |