|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 3/6] xen/arm: assign devices to boot domains
Stefano Stabellini writes:
> Scan the user provided dtb fragment at boot. For each device node, map
> memory to guests, and route interrupts and setup the iommu.
>
> The iommu is setup by passing the node of the device to assign on the
> host device tree. The path is specified in the device tree fragment as
> the "xen,path" string property.
>
> The memory region to remap is specified by the "xen,reg" property.
> (Perhaps it might be possible to use "range" instead of "xen,regs". This
> is something to investigate.)
>
> The interrupts are taken from the host device tree corresponding node.
> To map the interrupt call handle_interrupts, which is shared with the
> existing dom0 path.
>
> Add a interrupt-parent property automatically to the guest device tree
> when the interrupt-parent should be the GIC. Copy over the interrupt
> property from the host device tree node.
>
> Signed-off-by: Stefano Stabellini <stefanos@xxxxxxxxxx>
> ---
> Changes in v3:
> - improve commit message
> - remove superfluous cast
> - merge code with the copy code
> - add interrup-parent
> - demove depth > 2 check
> - reuse code from handle_interrupts
> - copy interrupts from host dt
>
> Changes in v2:
> - rename "path" to "xen,path"
> - grammar fix
> - use gaddr_to_gfn and maddr_to_mfn
> - remove depth <= 2 limitation in scanning the dtb fragment
> - introduce and parse xen,reg
> - code style
> - support more than one interrupt per device
> - specify only the GIC is supported
> ---
> xen/arch/arm/domain_build.c | 66 +++++++++++++++++++++++++++++++++++++
> 1 file changed, 66 insertions(+)
>
> diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> index 70bcdc449d..0057a509d1 100644
> --- a/xen/arch/arm/domain_build.c
> +++ b/xen/arch/arm/domain_build.c
> @@ -1712,6 +1712,9 @@ static int __init handle_properties(struct domain *d,
> void *fdt, const void *pfd
> {
> int propoff, nameoff, r;
> const struct fdt_property *prop;
> + struct dt_device_node *node;
> + const __be32 *cell;
> + int i, len;
>
> for ( propoff = fdt_first_property_offset(pfdt, nodeoff);
> propoff >= 0;
> @@ -1726,6 +1729,69 @@ static int __init handle_properties(struct domain *d,
> void *fdt, const void *pfd
> prop->data, fdt32_to_cpu(prop->len));
> if ( r )
> return r;
> +
> + if ( strcmp("xen,reg", fdt_string(pfdt, nameoff)) == 0 )
IIRC, in your other patch series you used dt_*_cmp function there.
Should it be dt_prop_cmp() in this case?
> + {
> + paddr_t mstart, size, gstart;
> + cell = (const __be32 *)prop->data;
> + len = fdt32_to_cpu(prop->len) /
> + ((address_cells*2 + size_cells) * sizeof (u32));
Coding style: address_cells * 2. Also "sizeof(u32)".
> +
> + for ( i = 0; i < len; i++ )
> + {
> + mstart = dt_next_cell(address_cells, &cell);
> + size = dt_next_cell(size_cells, &cell);
> + gstart = dt_next_cell(address_cells, &cell);
> +
> + r = guest_physmap_add_entry(d, gaddr_to_gfn(gstart),
> + maddr_to_mfn(mstart),
> + get_order_from_bytes(size),
> + p2m_mmio_direct_dev);
> + if ( r < 0 )
> + {
> + dprintk(XENLOG_ERR,
> + "Failed to map %"PRIpaddr" to the guest
> at%"PRIpaddr"\n",
> + mstart, gstart);
> + return -EFAULT;
> + }
> + }
> + }
> +
> + if ( strcmp("xen,path", fdt_string(pfdt, nameoff)) == 0 )
The same question about dt_prop_cmp.
> + {
> + node = dt_find_node_by_path(prop->data);
> + if ( node != NULL )
> + r = iommu_assign_dt_device(d, node);
> + else
> + {
> + dprintk(XENLOG_ERR, "Couldn't find node %s in host_dt!\n",
> + (char *)prop->data);
> + return -EINVAL;
> + }
> +
> + r = handle_interrupts(d, node, true);
> + if ( r < 0 )
> + return r;
> + if ( r > 0 )
nitpicking: how about
if ( r == 0 )
continue;
?
This will save one level of nesting.
Also, now I can see why handle_interrupts() returns either <0, 0 or 1.
But this was not clear in the patch #1. Additionally, need_mapping is
always true in this case. So actually you can check only for (r < 0)
> + {
> + unsigned int intlen;
> + const u32* intspec;
> +
> + /* generate interrupt-parent to point to the virtual GIC */
> + r = fdt_property_u32(fdt, "interrupt-parent",
> GUEST_PHANDLE_GIC);
> + if ( r )
> + return r;
> +
> + /* copy interrupts/interrupts-extended from the host DT node
> */
I can't see "interrupts-extended" handling in the code below.
> + intspec = dt_get_property(node, "interrupts", &intlen);
> + if ( intspec == NULL )
> + return -EFAULT;
> +
> + r = fdt_property(fdt, "interrupts", intspec, intlen);
> + if ( r )
> + return r;
> + }
> + }
> }
>
> /* FDT_ERR_NOTFOUND => There is no more properties for this node */
--
Volodymyr Babchuk at EPAM
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |