Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
Pull virtio, vhost updates from Michael Tsirkin: "Fixes, features, performance: - new iommu device - vhost guest memory access using vmap (just meta-data for now) - minor fixes" * tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost: virtio-mmio: add error check for platform_get_irq scsi: virtio_scsi: Use struct_size() helper iommu/virtio: Add event queue iommu/virtio: Add probe request iommu: Add virtio-iommu driver PCI: OF: Initialize dev->fwnode appropriately of: Allow the iommu-map property to omit untranslated devices dt-bindings: virtio: Add virtio-pci-iommu node dt-bindings: virtio-mmio: Add IOMMU description vhost: fix clang build warning vhost: access vq metadata through kernel virtual address vhost: factor out setting vring addr and num vhost: introduce helpers to get the size of metadata area vhost: rename vq_iotlb_prefetch() to vq_meta_prefetch() vhost: fine grain userspace memory accessors vhost: generalize adding used elem
This commit is contained in:
66
Documentation/devicetree/bindings/virtio/iommu.txt
Normal file
66
Documentation/devicetree/bindings/virtio/iommu.txt
Normal file
@@ -0,0 +1,66 @@
|
||||
* virtio IOMMU PCI device
|
||||
|
||||
When virtio-iommu uses the PCI transport, its programming interface is
|
||||
discovered dynamically by the PCI probing infrastructure. However the
|
||||
device tree statically describes the relation between IOMMU and DMA
|
||||
masters. Therefore, the PCI root complex that hosts the virtio-iommu
|
||||
contains a child node representing the IOMMU device explicitly.
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible: Should be "virtio,pci-iommu"
|
||||
- reg: PCI address of the IOMMU. As defined in the PCI Bus
|
||||
Binding reference [1], the reg property is a five-cell
|
||||
address encoded as (phys.hi phys.mid phys.lo size.hi
|
||||
size.lo). phys.hi should contain the device's BDF as
|
||||
0b00000000 bbbbbbbb dddddfff 00000000. The other cells
|
||||
should be zero.
|
||||
- #iommu-cells: Each platform DMA master managed by the IOMMU is assigned
|
||||
an endpoint ID, described by the "iommus" property [2].
|
||||
For virtio-iommu, #iommu-cells must be 1.
|
||||
|
||||
Notes:
|
||||
|
||||
- DMA from the IOMMU device isn't managed by another IOMMU. Therefore the
|
||||
virtio-iommu node doesn't have an "iommus" property, and is omitted from
|
||||
the iommu-map property of the root complex.
|
||||
|
||||
Example:
|
||||
|
||||
pcie@10000000 {
|
||||
compatible = "pci-host-ecam-generic";
|
||||
...
|
||||
|
||||
/* The IOMMU programming interface uses slot 00:01.0 */
|
||||
iommu0: iommu@0008 {
|
||||
compatible = "virtio,pci-iommu";
|
||||
reg = <0x00000800 0 0 0 0>;
|
||||
#iommu-cells = <1>;
|
||||
};
|
||||
|
||||
/*
|
||||
* The IOMMU manages all functions in this PCI domain except
|
||||
* itself. Omit BDF 00:01.0.
|
||||
*/
|
||||
iommu-map = <0x0 &iommu0 0x0 0x8>
|
||||
<0x9 &iommu0 0x9 0xfff7>;
|
||||
};
|
||||
|
||||
pcie@20000000 {
|
||||
compatible = "pci-host-ecam-generic";
|
||||
...
|
||||
/*
|
||||
* The IOMMU also manages all functions from this domain,
|
||||
* with endpoint IDs 0x10000 - 0x1ffff
|
||||
*/
|
||||
iommu-map = <0x0 &iommu0 0x10000 0x10000>;
|
||||
};
|
||||
|
||||
ethernet@fe001000 {
|
||||
...
|
||||
/* The IOMMU manages this platform device with endpoint ID 0x20000 */
|
||||
iommus = <&iommu0 0x20000>;
|
||||
};
|
||||
|
||||
[1] Documentation/devicetree/bindings/pci/pci.txt
|
||||
[2] Documentation/devicetree/bindings/iommu/iommu.txt
|
@@ -8,10 +8,40 @@ Required properties:
|
||||
- reg: control registers base address and size including configuration space
|
||||
- interrupts: interrupt generated by the device
|
||||
|
||||
Required properties for virtio-iommu:
|
||||
|
||||
- #iommu-cells: When the node corresponds to a virtio-iommu device, it is
|
||||
linked to DMA masters using the "iommus" or "iommu-map"
|
||||
properties [1][2]. #iommu-cells specifies the size of the
|
||||
"iommus" property. For virtio-iommu #iommu-cells must be
|
||||
1, each cell describing a single endpoint ID.
|
||||
|
||||
Optional properties:
|
||||
|
||||
- iommus: If the device accesses memory through an IOMMU, it should
|
||||
have an "iommus" property [1]. Since virtio-iommu itself
|
||||
does not access memory through an IOMMU, the "virtio,mmio"
|
||||
node cannot have both an "#iommu-cells" and an "iommus"
|
||||
property.
|
||||
|
||||
Example:
|
||||
|
||||
virtio_block@3000 {
|
||||
compatible = "virtio,mmio";
|
||||
reg = <0x3000 0x100>;
|
||||
interrupts = <41>;
|
||||
|
||||
/* Device has endpoint ID 23 */
|
||||
iommus = <&viommu 23>
|
||||
}
|
||||
|
||||
viommu: iommu@3100 {
|
||||
compatible = "virtio,mmio";
|
||||
reg = <0x3100 0x100>;
|
||||
interrupts = <42>;
|
||||
|
||||
#iommu-cells = <1>
|
||||
}
|
||||
|
||||
[1] Documentation/devicetree/bindings/iommu/iommu.txt
|
||||
[2] Documentation/devicetree/bindings/pci/pci-iommu.txt
|
||||
|
Reference in New Issue
Block a user