[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v3 00/24] xen/arm: Add support for non-pci passthrough
Hello all, This is the third version of this patch series to add support for platform device passthrough on ARM. Compare to the previous version [1], the automatic mapping of MMIO/IRQ and the generation of the device tree has been dropped. Instead the user will have to: - Map manually MMIO/IRQ - Describe the device in the newly partial device tree support - Specify the list of device protected by an IOMMU to assign to the guest. While this solution is primitive, this is allow us to support more complex device in Xen with an little additionnal work for the user. Attempting to do it automatically is more difficult because we may not know the dependencies between devices (for instance a Network card and a phy). To avoid adding code in DOM0 to manage platform device deassignment, the user has to add the property "xen,passthrough" to the device tree node describing the device. This can be easily done via U-Boot. For instance, if we want to passthrough the second network card of a Midway server to the guest. The user will have to add the following line the u-boot script: fdt set /soc/ethernet@fff51000 xen,passthrough This series has been tested on Midway by assigning the secondary network card to a guest (see instruction below). I plan to do futher testing on other boards. There is some TODO, mostly related to XSM in different patches (see commit message or /* TODO: ... */ in the files). This series is based on my series "Find automatically a PPI for DOM0 event channel IRQ" [2] and "xen/arm: Resync the SMMU driver with the Linux one" [3]. A working tree can be found here: git://xenbits.xen.org/julieng/xen-unstable.git branch passthrough-v3 Major changes in v3: - Rework the approach to passthrough a device (xen,passthrough + partial device tree). - Extend the existing hypercalls to assign/deassign device rather than adding new one. - Merge series [4] and [5] in this serie. Major changes in v2: - Drop the patch #1 of the previous version - Virtual IRQ are not anymore equal to the physical interrupt - Move the hypercall to get DT informations for privcmd to domctl - Split the domain creation in 2 two parts to allow per guest VGIC configuration (such as the number of SPIs). - Bunch of typoes, commit improvement, function renaming. For all changes see in each patch. I believe, it's better to have a basic support in Xen rather than nothing. This could be improved later. Sincerely yours, [1] http://lists.xen.org/archives/html/xen-devel/2014-07/msg04090.html [2] http://lists.xenproject.org/archives/html/xen-devel/2014-12/msg01386.html [3] http://lists.xenproject.org/archives/html/xen-devel/2014-12/msg01612.html [4] http://lists.xen.org/archives/html/xen-devel/2014-11/msg01672.html [5] http://lists.xenproject.org/archives/html/xen-devel/2014-07/msg02098.html ========================================================================= Instructions to passthrough a non-PCI device The example will use the secondary network card for the midway server. 1) Mark the device to let Xen knowns the device will be used for passthrough. This is done in the device tree node describing the device by adding the property "xen,passthrough". The command to do it in U-Boot is: fdt set /soc/ethernet@fff51000 xen,passthrough 2) Create the partial device tree describing the device. The IRQ are mapped 1:1 to the guest (i.e VIRQ == IRQ). For MMIO will have to find hole in the guest memory layout (see xen/include/public/arch-arm.h, noted the layout is not stable and can change between 2 releases version of Xen). /dts-v1/; / { #address-cells = <2>; #size-cells = <2>; aliases { net = &mac0; }; passthrough { compatible = "simple-bus"; ranges; #address-cells = <2>; #size-cells = <2>; mac0: ethernet@10000000 { compatible = "calxeda,hb-xgmac"; reg = <0 0x10000000 0 0x1000>; interrupts = <0 80 4 0 81 4 0 82 4>; /* dma-coherent can't be set because it requires platform * specific code for highbank */ /* dma-coherent; */ }; foo { my = <&mac0>; }; }; }; 3) Compile the partial guest device with dtc (Device Tree Compiler). For our purpose, the compiled file will be called guest-midway.dtb and placed in /root in DOM0. 3) Add the following options in the guest configuration file: device_tree = "/root/guest-midway.dtb" dtdev = [ "/soc/ethernet@fff51000" ] irqs = [ 112, 113, 114 ] iomem = [ "0xfff51,1@0x10000" ] Cc: manish.jaggi@xxxxxxxxxxxxxxxxxx Cc: suravee.suthikulpanit@xxxxxxx Cc: andrii.tseglytskyi@xxxxxxxxxxxxxxx Julien Grall (24): xen: Extend DOMCTL createdomain to support arch configuration xen/arm: Divide GIC initialization in 2 parts xen/dts: Allow only IRQ translation that are mapped to main GIC xen: guestcopy: Provide an helper to safely copy string from guest xen/arm: vgic: Introduce a function to initialize pending_irq xen/arm: Map disabled device in DOM0 xen/arm: Introduce xen,passthrough property xen/arm: Allow virq != irq xen/arm: route_irq_to_guest: Check validity of the IRQ xen/arm: gic: Add sanity checks gic_route_irq_to_guest xen/arm: Let the toolstack configure the number of SPIs xen/arm: Release IRQ routed to a domain when it's destroying xen/arm: Implement hypercall PHYSDEVOP_{,un}map_pirq xen/dts: Use unsigned int for MMIO and IRQ index xen/dts: Provide an helper to get a DT node from a path provided by a guest xen/passthrough: Introduce iommu_construct xen/passthrough: arm: release earlier the DT devices assigned to a guest xen/passthrough: iommu_deassign_device_dt: By default reassign device to nobody xen/iommu: arm: Wire iommu DOMCTL for ARM xen/passthrough: Extend XEN_DOMCTL_assign_device to support DT device tools/(lib)xl: Add partial device tree support for ARM tools/libxl: arm: Use an higher value for the GIC phandle libxl: Add support for non-PCI passthrough xl: Add new option dtdev docs/man/xl.cfg.pod.5 | 12 ++ docs/misc/arm/device-tree/passthrough.txt | 7 + tools/flask/policy/policy/modules/xen/xen.if | 2 +- tools/libxc/include/xenctrl.h | 24 ++- tools/libxc/xc_domain.c | 142 ++++++++++-- tools/libxl/Makefile | 2 +- tools/libxl/libxl_arch.h | 6 + tools/libxl/libxl_arm.c | 309 +++++++++++++++++++++++++-- tools/libxl/libxl_create.c | 31 ++- tools/libxl/libxl_dm.c | 3 +- tools/libxl/libxl_dom.c | 2 +- tools/libxl/libxl_dtdev.c | 34 +++ tools/libxl/libxl_internal.h | 12 +- tools/libxl/libxl_types.idl | 6 + tools/libxl/libxl_x86.c | 10 + tools/libxl/xl_cmdimpl.c | 22 +- xen/arch/arm/device.c | 2 +- xen/arch/arm/domain.c | 39 +++- xen/arch/arm/domain_build.c | 119 +++++++---- xen/arch/arm/domctl.c | 37 +--- xen/arch/arm/gic-v2.c | 70 +++--- xen/arch/arm/gic-v3.c | 75 +++---- xen/arch/arm/gic.c | 97 ++++++++- xen/arch/arm/irq.c | 163 ++++++++++++-- xen/arch/arm/mm.c | 6 +- xen/arch/arm/physdev.c | 136 +++++++++++- xen/arch/arm/platforms/omap5.c | 12 -- xen/arch/arm/platforms/xgene-storm.c | 2 +- xen/arch/arm/setup.c | 10 +- xen/arch/arm/vgic.c | 65 +++--- xen/arch/x86/domain.c | 3 +- xen/arch/x86/mm.c | 6 +- xen/arch/x86/setup.c | 8 +- xen/common/Makefile | 1 + xen/common/device_tree.c | 44 +++- xen/common/domain.c | 7 +- xen/common/domctl.c | 3 +- xen/common/guestcopy.c | 30 +++ xen/common/schedule.c | 3 +- xen/drivers/passthrough/arm/iommu.c | 7 +- xen/drivers/passthrough/arm/smmu.c | 8 +- xen/drivers/passthrough/device_tree.c | 115 +++++++++- xen/drivers/passthrough/iommu.c | 26 +++ xen/drivers/passthrough/pci.c | 58 +++-- xen/include/asm-arm/domain.h | 2 + xen/include/asm-arm/gic.h | 18 +- xen/include/asm-arm/irq.h | 8 +- xen/include/asm-arm/setup.h | 1 + xen/include/asm-arm/vgic.h | 8 +- xen/include/public/arch-arm.h | 10 + xen/include/public/arch-x86/xen.h | 4 + xen/include/public/domctl.h | 33 ++- xen/include/xen/device_tree.h | 35 ++- xen/include/xen/domain.h | 3 +- xen/include/xen/guest_access.h | 5 + xen/include/xen/iommu.h | 7 +- xen/include/xen/sched.h | 9 +- xen/xsm/flask/flask_op.c | 43 +--- xen/xsm/flask/hooks.c | 3 - xen/xsm/flask/policy/access_vectors | 2 - 60 files changed, 1570 insertions(+), 397 deletions(-) create mode 100644 docs/misc/arm/device-tree/passthrough.txt create mode 100644 tools/libxl/libxl_dtdev.c create mode 100644 xen/common/guestcopy.c -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |