| # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) |
| %YAML 1.2 |
| --- |
| $id: http://devicetree.org/schemas/virtio/pci-iommu.yaml# |
| $schema: http://devicetree.org/meta-schemas/core.yaml# |
| |
| title: virtio-iommu device using the virtio-pci transport |
| |
| maintainers: |
| - Jean-Philippe Brucker <jean-philippe@linaro.org> |
| |
| description: | |
| 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. |
| |
| 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. |
| |
| properties: |
| # If compatible is present, it should contain the vendor and device ID |
| # according to the PCI Bus Binding specification. Since PCI provides |
| # built-in identification methods, compatible is not actually required. |
| compatible: |
| oneOf: |
| - items: |
| - const: virtio,pci-iommu |
| - const: pci1af4,1057 |
| - items: |
| - const: pci1af4,1057 |
| |
| reg: |
| description: | |
| PCI address of the IOMMU. As defined in the PCI Bus Binding |
| reference, 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. See Documentation/devicetree/bindings/pci/pci.txt |
| |
| '#iommu-cells': |
| const: 1 |
| |
| required: |
| - compatible |
| - reg |
| - '#iommu-cells' |
| |
| additionalProperties: false |
| |
| examples: |
| - | |
| bus { |
| #address-cells = <2>; |
| #size-cells = <2>; |
| |
| pcie@40000000 { |
| device_type = "pci"; |
| #address-cells = <3>; |
| #size-cells = <2>; |
| reg = <0x0 0x40000000 0x0 0x1000000>; |
| ranges = <0x02000000 0x0 0x41000000 0x0 0x41000000 0x0 0x0f000000>; |
| |
| /* |
| * 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>; |
| |
| /* The IOMMU programming interface uses slot 00:01.0 */ |
| iommu0: iommu@1,0 { |
| compatible = "pci1af4,1057"; |
| reg = <0x800 0 0 0 0>; |
| #iommu-cells = <1>; |
| }; |
| }; |
| |
| pcie@50000000 { |
| device_type = "pci"; |
| #address-cells = <3>; |
| #size-cells = <2>; |
| reg = <0x0 0x50000000 0x0 0x1000000>; |
| ranges = <0x02000000 0x0 0x51000000 0x0 0x51000000 0x0 0x0f000000>; |
| |
| /* |
| * The IOMMU also manages all functions from this domain, |
| * with endpoint IDs 0x10000 - 0x1ffff |
| */ |
| iommu-map = <0x0 &iommu0 0x10000 0x10000>; |
| }; |
| |
| ethernet { |
| /* The IOMMU manages this platform device with endpoint ID 0x20000 */ |
| iommus = <&iommu0 0x20000>; |
| }; |
| }; |
| |
| ... |