27
How to passthrough your integrated device to a VM on ARM Julien Grall [email protected] Xen Developper Summit 2015

How to passthrough your integrated device to a VM on ARM

Embed Size (px)

Citation preview

Page 1: How to passthrough your integrated device to a VM on ARM

How to passthrough your integrated device to aVM on ARM

Julien [email protected]

Xen Developper Summit 2015

Page 2: How to passthrough your integrated device to a VM on ARM

Intro Mark the device Partial device tree Guest configuration Improvement Conclusion

Platform Device

I Directly integrated in the ARM SOC

I Non-discoverable device

I Described via Device Tree

Xen Developper Summit 2015 How to passthrough your integrated device to a VM on ARM 2 / 27

Page 3: How to passthrough your integrated device to a VM on ARM

Intro Mark the device Partial device tree Guest configuration Improvement Conclusion

Device Tree - 1

I Tree data structure

I Each node describe the physical devices in a system

Xen Developper Summit 2015 How to passthrough your integrated device to a VM on ARM 3 / 27

Page 4: How to passthrough your integrated device to a VM on ARM

Intro Mark the device Partial device tree Guest configuration Improvement Conclusion

Device Tree - 2

/dts-v1/;

/ {

model = "XENVM-4.2";

compatible = "xen,xenvm-4.2", "xen,xenvm";

interrupt-parent = <&gic>;

#address-cells = <2>;

#size-cells = <2>;

cpus {

#address-cells = <1>;

#size-cells = <0>;

cpu@0 {

device_type = "cpu";

compatible = "arm,cortex-a15";

reg = <0>;

};

};

gic: int-controller@2c001000 {

compatible = "arm,cortex-a15-gic", "arm,cortex-a9-gic";

#interrupt-cells = <3>;

#address-cells = <0>;

interrupt-controller;

reg = <0 0x2c001000 0 0x1000>,

<0 0x2c002000 0 0x100>;

};

};

Xen Developper Summit 2015 How to passthrough your integrated device to a VM on ARM 4 / 27

Page 5: How to passthrough your integrated device to a VM on ARM

Intro Mark the device Partial device tree Guest configuration Improvement Conclusion

Device path

I Every node has a unique pathI Concatenation of parent nodes separated by /

I ExamplesI cpu@0: /cpus/cpu@0I int-controller@2c001000: /int-controller@2c001000

Xen Developper Summit 2015 How to passthrough your integrated device to a VM on ARM 5 / 27

Page 6: How to passthrough your integrated device to a VM on ARM

Intro Mark the device Partial device tree Guest configuration Improvement Conclusion

DOM0

I Special case of passthrough

I Every device are assigned by Xen to DOM0 at boot

Xen Developper Summit 2015 How to passthrough your integrated device to a VM on ARM 6 / 27

Page 7: How to passthrough your integrated device to a VM on ARM

Intro Mark the device Partial device tree Guest configuration Improvement Conclusion

Problems with platform device passthrough

I Device can depends on other devicesI PHYI ClockI ...

I Some node properties should be dropped

I Reset is device specific

Xen Developper Summit 2015 How to passthrough your integrated device to a VM on ARM 7 / 27

Page 8: How to passthrough your integrated device to a VM on ARM

Intro Mark the device Partial device tree Guest configuration Improvement Conclusion

Requirements

I Hardware with IOMMUI SMMUv1 and SMMUv2 supported

I Device path of the device to passthrough

I Know the dependencies of the device

Xen Developper Summit 2015 How to passthrough your integrated device to a VM on ARM 8 / 27

Page 9: How to passthrough your integrated device to a VM on ARM

Intro Mark the device Partial device tree Guest configuration Improvement Conclusion

Example used

I Midway server from Calxeda

I SMMUv1 supported

I Second network card

Xen Developper Summit 2015 How to passthrough your integrated device to a VM on ARM 9 / 27

Page 10: How to passthrough your integrated device to a VM on ARM

Intro Mark the device Partial device tree Guest configuration Improvement Conclusion

Example used - DTS

/ {

soc {

#address-cells = <1>;

#size-cells = <1>;

compatible = "simple-bus";

interrupt-parent = <&intc>;

[...]

mac0: ethernet@fff50000 {

compatible = "calxeda,hb-xgmac";

reg = <0xfff50000 0x1000>;

interrupts = <0 77 4 0 78 4 0 79 4>;

dma-coherent;

#stream-id-cells = <2>;

};

mac1: ethernet@fff51000 {compatible = "calxeda,hb-xgmac";

reg = <0xfff51000 0x1000>;

interrupts = <0 80 4 0 81 4 0 82 4>;

dma-coherent;

#stream-id-cells = <2>;

};};

};

Xen Developper Summit 2015 How to passthrough your integrated device to a VM on ARM 10 / 27

Page 11: How to passthrough your integrated device to a VM on ARM

Intro Mark the device Partial device tree Guest configuration Improvement Conclusion

Mark the device for passthrough

I Used to notify Xen the device will be passthrough

I Property xen,passthrough used in DT nodeI Example for U-Boot

I fdt set /soc/ethernet@fff51000 xen,passthrough

Xen Developper Summit 2015 How to passthrough your integrated device to a VM on ARM 11 / 27

Page 12: How to passthrough your integrated device to a VM on ARM

Intro Mark the device Partial device tree Guest configuration Improvement Conclusion

Why?

I Disabling the device from DOM0 during runtime is complexI Xen need to tell DOM0 not using the device at boot

I Property status = ”disabled” used DT nodeI OS already knows the property

Xen Developper Summit 2015 How to passthrough your integrated device to a VM on ARM 12 / 27

Page 13: How to passthrough your integrated device to a VM on ARM

Intro Mark the device Partial device tree Guest configuration Improvement Conclusion

Xen DTS

/ {

soc {

#address-cells = <1>;

#size-cells = <1>;

compatible = "simple-bus";

interrupt-parent = <&intc>;

[...]

mac0: ethernet@fff50000 {

compatible = "calxeda,hb-xgmac";

reg = <0xfff50000 0x1000>;

interrupts = <0 77 4 0 78 4 0 79 4>;

dma-coherent;

#stream-id-cells = <2>;

};

mac1: ethernet@fff51000 {

compatible = "calxeda,hb-xgmac";

reg = <0xfff51000 0x1000>;

interrupts = <0 80 4 0 81 4 0 82 4>;

dma-coherent;

xen,passthrough;

#stream-id-cells = <2>;

};

};

};

Xen Developper Summit 2015 How to passthrough your integrated device to a VM on ARM 13 / 27

Page 14: How to passthrough your integrated device to a VM on ARM

Intro Mark the device Partial device tree Guest configuration Improvement Conclusion

DOM0 DTS

/ {

soc {

#address-cells = <1>;

#size-cells = <1>;

compatible = "simple-bus";

interrupt-parent = <&intc>;

[...]

mac0: ethernet@fff50000 {

compatible = "calxeda,hb-xgmac";

reg = <0xfff50000 0x1000>;

interrupts = <0 77 4 0 78 4 0 79 4>;

dma-coherent;

#stream-id-cells = <2>;

};

mac1: ethernet@fff51000 {

compatible = "calxeda,hb-xgmac";

reg = <0xfff51000 0x1000>;

interrupts = <0 80 4 0 81 4 0 82 4>;

dma-coherent;

status = "disabled";

#stream-id-cells = <2>;

};

};

};

Xen Developper Summit 2015 How to passthrough your integrated device to a VM on ARM 14 / 27

Page 15: How to passthrough your integrated device to a VM on ARM

Intro Mark the device Partial device tree Guest configuration Improvement Conclusion

Partial Device Tree - What is it?

I Allow the user to pass additional nodes to the guest DTI Everything under the following nodes will be copied:

I /passthroughI /aliases

Xen Developper Summit 2015 How to passthrough your integrated device to a VM on ARM 15 / 27

Page 16: How to passthrough your integrated device to a VM on ARM

Intro Mark the device Partial device tree Guest configuration Improvement Conclusion

Skeleton DTS

/ {

/* #*cells are here to keep DTC happy */

#address-cells = <2>;

#size-cells = <2>;

aliases {

/* List of your aliases */

};

passthrough {

compatible = "simple-bus";

ranges;

#address-cells = <2>;

#size-cells = <2>;

/* List of your nodes */

};

};

Xen Developper Summit 2015 How to passthrough your integrated device to a VM on ARM 16 / 27

Page 17: How to passthrough your integrated device to a VM on ARM

Intro Mark the device Partial device tree Guest configuration Improvement Conclusion

How to write it?

I Interrupt numbers:I Same as the hardwareI Only SPIs are supported

I MMIO regions:I Need to find a hole in the guest layoutI Guest layout defined in xen/include/public/arch-arm.hI The layout may change between Xen versions

I Device specific properties:I Not all the properties can be copied

Xen Developper Summit 2015 How to passthrough your integrated device to a VM on ARM 17 / 27

Page 18: How to passthrough your integrated device to a VM on ARM

Intro Mark the device Partial device tree Guest configuration Improvement Conclusion

Example HW DTS

/ {

soc {

#address-cells = <1>;

#size-cells = <1>;

compatible = "simple-bus";

interrupt-parent = <&intc>;

[...]

mac0: ethernet@fff50000 {

compatible = "calxeda,hb-xgmac";

reg = <0xfff50000 0x1000>;

interrupts = <0 77 4 0 78 4 0 79 4>;

dma-coherent;

#stream-id-cells = <2>;

};

mac1: ethernet@fff51000 {compatible = "calxeda,hb-xgmac";

reg = <0xfff51000 0x1000>;

interrupts = <0 80 4 0 81 4 0 82 4>;

dma-coherent;

#stream-id-cells = <2>;

};};

};

Xen Developper Summit 2015 How to passthrough your integrated device to a VM on ARM 18 / 27

Page 19: How to passthrough your integrated device to a VM on ARM

Intro Mark the device Partial device tree Guest configuration Improvement Conclusion

Example partial DTS

/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;

#stream-id-cells = <2>;

};};

Xen Developper Summit 2015 How to passthrough your integrated device to a VM on ARM 19 / 27

Page 20: How to passthrough your integrated device to a VM on ARM

Intro Mark the device Partial device tree Guest configuration Improvement Conclusion

What to add?

I device tree = ”path”I Path to the partial device tree.I Only trusted device tree should be passed

I dtdev = [ ”DTpath1”, ”DTpath2”, ... ]I List of device to passthroughI Used to setup the SMMUI Only device protected by SMMU should be list

Xen Developper Summit 2015 How to passthrough your integrated device to a VM on ARM 20 / 27

Page 21: How to passthrough your integrated device to a VM on ARM

Intro Mark the device Partial device tree Guest configuration Improvement Conclusion

What to add? - 2

I irqs = [ irq1, irq2, ... ]I List of interrupts to route

I iomem = [ ”START,NUM[@GFN]”, ...]I List of MMIO to assignI START: Start frame of the I/O regionI NUM: Number of 4K pages to assignI GFN: Start frame in the guest layout (optional)

Xen Developper Summit 2015 How to passthrough your integrated device to a VM on ARM 21 / 27

Page 22: How to passthrough your integrated device to a VM on ARM

Intro Mark the device Partial device tree Guest configuration Improvement Conclusion

Example guest configuration

device_tree = "/root/guest-midway.dtb"

dtdev = [ "/soc/ethernet@fff51000" ]

irqs = [ 112, 113, 114 ]

iomem = [ "0xfff51,1@0x10000" ]

Xen Developper Summit 2015 How to passthrough your integrated device to a VM on ARM 22 / 27

Page 23: How to passthrough your integrated device to a VM on ARM

Intro Mark the device Partial device tree Guest configuration Improvement Conclusion

Reset

I Require a specific reset code per deviceI See whether we can share with VFIO

I DOM0 must be able to remove a deviceI Interrupts can’t be shared between domains

Xen Developper Summit 2015 How to passthrough your integrated device to a VM on ARM 23 / 27

Page 24: How to passthrough your integrated device to a VM on ARM

Intro Mark the device Partial device tree Guest configuration Improvement Conclusion

Clock

I Clock may be shared between multiple devicesI Can’t passthrough the clock to the guest

I How to handle the clock in the guest?

Xen Developper Summit 2015 How to passthrough your integrated device to a VM on ARM 24 / 27

Page 25: How to passthrough your integrated device to a VM on ARM

Intro Mark the device Partial device tree Guest configuration Improvement Conclusion

DT improvement

I MMIO/Interrupts needs to be described in the DT and Xencfg

I More works for the user

I Introduce Xen bindings the DT to specify HW mapping?

Xen Developper Summit 2015 How to passthrough your integrated device to a VM on ARM 25 / 27

Page 26: How to passthrough your integrated device to a VM on ARM

Intro Mark the device Partial device tree Guest configuration Improvement Conclusion

Further reading

I http://www.devicetree.org/Device_Tree_Usage

I http://xenbits.xen.org/docs/unstable/misc/arm/

passthrough.txt

Xen Developper Summit 2015 How to passthrough your integrated device to a VM on ARM 26 / 27

Page 27: How to passthrough your integrated device to a VM on ARM

Intro Mark the device Partial device tree Guest configuration Improvement Conclusion

Fin

Xen Developper Summit 2015 How to passthrough your integrated device to a VM on ARM 27 / 27