Loading Documentation/devicetree/bindings/iommu/arm,smmu-v3.txt +7 −1 Original line number Original line Diff line number Diff line Loading @@ -27,6 +27,12 @@ the PCIe specification. * "cmdq-sync" - CMD_SYNC complete * "cmdq-sync" - CMD_SYNC complete * "gerror" - Global Error activated * "gerror" - Global Error activated - #iommu-cells : See the generic IOMMU binding described in devicetree/bindings/pci/pci-iommu.txt for details. For SMMUv3, must be 1, with each cell describing a single stream ID. All possible stream IDs which a device may emit must be described. ** SMMUv3 optional properties: ** SMMUv3 optional properties: - dma-coherent : Present if DMA operations made by the SMMU (page - dma-coherent : Present if DMA operations made by the SMMU (page Loading Loading @@ -54,6 +60,6 @@ the PCIe specification. <GIC_SPI 79 IRQ_TYPE_EDGE_RISING>; <GIC_SPI 79 IRQ_TYPE_EDGE_RISING>; interrupt-names = "eventq", "priq", "cmdq-sync", "gerror"; interrupt-names = "eventq", "priq", "cmdq-sync", "gerror"; dma-coherent; dma-coherent; #iommu-cells = <0>; #iommu-cells = <1>; msi-parent = <&its 0xff0000>; msi-parent = <&its 0xff0000>; }; }; Documentation/devicetree/bindings/iommu/arm,smmu.txt +47 −14 Original line number Original line Diff line number Diff line Loading @@ -35,12 +35,16 @@ conditions. interrupt per context bank. In the case of a single, interrupt per context bank. In the case of a single, combined interrupt, it must be listed multiple times. combined interrupt, it must be listed multiple times. - mmu-masters : A list of phandles to device nodes representing bus - #iommu-cells : See Documentation/devicetree/bindings/iommu/iommu.txt masters for which the SMMU can provide a translation for details. With a value of 1, each "iommus" entry and their corresponding StreamIDs (see example below). represents a distinct stream ID emitted by that device Each device node linked from this list must have a into the relevant SMMU. "#stream-id-cells" property, indicating the number of StreamIDs associated with it. SMMUs with stream matching support and complex masters may use a value of 2, where the second cell represents an SMR mask to combine with the ID in the first cell. Care must be taken to ensure the set of matched IDs does not result in conflicts. ** System MMU optional properties: ** System MMU optional properties: Loading @@ -56,9 +60,20 @@ conditions. aliases of secure registers have to be used during aliases of secure registers have to be used during SMMU configuration. SMMU configuration. Example: ** Deprecated properties: - mmu-masters (deprecated in favour of the generic "iommus" binding) : A list of phandles to device nodes representing bus masters for which the SMMU can provide a translation and their corresponding Stream IDs. Each device node linked from this list must have a "#stream-id-cells" property, indicating the number of Stream ID arguments associated with its phandle. smmu { ** Examples: /* SMMU with stream matching or stream indexing */ smmu1: iommu { compatible = "arm,smmu-v1"; compatible = "arm,smmu-v1"; reg = <0xba5e0000 0x10000>; reg = <0xba5e0000 0x10000>; #global-interrupts = <2>; #global-interrupts = <2>; Loading @@ -68,11 +83,29 @@ Example: <0 35 4>, <0 35 4>, <0 36 4>, <0 36 4>, <0 37 4>; <0 37 4>; #iommu-cells = <1>; }; /* device with two stream IDs, 0 and 7 */ master1 { iommus = <&smmu1 0>, <&smmu1 7>; }; /* SMMU with stream matching */ smmu2: iommu { ... #iommu-cells = <2>; }; /* device with stream IDs 0 and 7 */ master2 { iommus = <&smmu2 0 0>, <&smmu2 7 0>; }; /* /* device with stream IDs 1, 17, 33 and 49 */ * Two DMA controllers, the first with two StreamIDs (0xd01d master3 { * and 0xd01e) and the second with only one (0xd11c). iommus = <&smmu2 1 0x30>; */ mmu-masters = <&dma0 0xd01d 0xd01e>, <&dma1 0xd11c>; }; }; Documentation/devicetree/bindings/pci/pci-iommu.txt 0 → 100644 +171 −0 Original line number Original line Diff line number Diff line This document describes the generic device tree binding for describing the relationship between PCI(e) devices and IOMMU(s). Each PCI(e) device under a root complex is uniquely identified by its Requester ID (AKA RID). A Requester ID is a triplet of a Bus number, Device number, and Function number. For the purpose of this document, when treated as a numeric value, a RID is formatted such that: * Bits [15:8] are the Bus number. * Bits [7:3] are the Device number. * Bits [2:0] are the Function number. * Any other bits required for padding must be zero. IOMMUs may distinguish PCI devices through sideband data derived from the Requester ID. While a given PCI device can only master through one IOMMU, a root complex may split masters across a set of IOMMUs (e.g. with one IOMMU per bus). The generic 'iommus' property is insufficient to describe this relationship, and a mechanism is required to map from a PCI device to its IOMMU and sideband data. For generic IOMMU bindings, see Documentation/devicetree/bindings/iommu/iommu.txt. PCI root complex ================ Optional properties ------------------- - iommu-map: Maps a Requester ID to an IOMMU and associated iommu-specifier data. The property is an arbitrary number of tuples of (rid-base,iommu,iommu-base,length). Any RID r in the interval [rid-base, rid-base + length) is associated with the listed IOMMU, with the iommu-specifier (r - rid-base + iommu-base). - iommu-map-mask: A mask to be applied to each Requester ID prior to being mapped to an iommu-specifier per the iommu-map property. Example (1) =========== / { #address-cells = <1>; #size-cells = <1>; iommu: iommu@a { reg = <0xa 0x1>; compatible = "vendor,some-iommu"; #iommu-cells = <1>; }; pci: pci@f { reg = <0xf 0x1>; compatible = "vendor,pcie-root-complex"; device_type = "pci"; /* * The sideband data provided to the IOMMU is the RID, * identity-mapped. */ iommu-map = <0x0 &iommu 0x0 0x10000>; }; }; Example (2) =========== / { #address-cells = <1>; #size-cells = <1>; iommu: iommu@a { reg = <0xa 0x1>; compatible = "vendor,some-iommu"; #iommu-cells = <1>; }; pci: pci@f { reg = <0xf 0x1>; compatible = "vendor,pcie-root-complex"; device_type = "pci"; /* * The sideband data provided to the IOMMU is the RID with the * function bits masked out. */ iommu-map = <0x0 &iommu 0x0 0x10000>; iommu-map-mask = <0xfff8>; }; }; Example (3) =========== / { #address-cells = <1>; #size-cells = <1>; iommu: iommu@a { reg = <0xa 0x1>; compatible = "vendor,some-iommu"; #iommu-cells = <1>; }; pci: pci@f { reg = <0xf 0x1>; compatible = "vendor,pcie-root-complex"; device_type = "pci"; /* * The sideband data provided to the IOMMU is the RID, * but the high bits of the bus number are flipped. */ iommu-map = <0x0000 &iommu 0x8000 0x8000>, <0x8000 &iommu 0x0000 0x8000>; }; }; Example (4) =========== / { #address-cells = <1>; #size-cells = <1>; iommu_a: iommu@a { reg = <0xa 0x1>; compatible = "vendor,some-iommu"; #iommu-cells = <1>; }; iommu_b: iommu@b { reg = <0xb 0x1>; compatible = "vendor,some-iommu"; #iommu-cells = <1>; }; iommu_c: iommu@c { reg = <0xc 0x1>; compatible = "vendor,some-iommu"; #iommu-cells = <1>; }; pci: pci@f { reg = <0xf 0x1>; compatible = "vendor,pcie-root-complex"; device_type = "pci"; /* * Devices with bus number 0-127 are mastered via IOMMU * a, with sideband data being RID[14:0]. * Devices with bus number 128-255 are mastered via * IOMMU b, with sideband data being RID[14:0]. * No devices master via IOMMU c. */ iommu-map = <0x0000 &iommu_a 0x0000 0x8000>, <0x8000 &iommu_b 0x0000 0x8000>; }; }; arch/arm64/mm/dma-mapping.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -827,7 +827,7 @@ static bool do_iommu_attach(struct device *dev, const struct iommu_ops *ops, * then the IOMMU core will have already configured a group for this * then the IOMMU core will have already configured a group for this * device, and allocated the default domain for that group. * device, and allocated the default domain for that group. */ */ if (!domain || iommu_dma_init_domain(domain, dma_base, size)) { if (!domain || iommu_dma_init_domain(domain, dma_base, size, dev)) { pr_warn("Failed to set up IOMMU for device %s; retaining platform DMA ops\n", pr_warn("Failed to set up IOMMU for device %s; retaining platform DMA ops\n", dev_name(dev)); dev_name(dev)); return false; return false; Loading drivers/gpu/drm/exynos/exynos_drm_iommu.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -66,7 +66,7 @@ static inline int __exynos_iommu_create_mapping(struct exynos_drm_private *priv, if (ret) if (ret) goto free_domain; goto free_domain; ret = iommu_dma_init_domain(domain, start, size); ret = iommu_dma_init_domain(domain, start, size, NULL); if (ret) if (ret) goto put_cookie; goto put_cookie; Loading Loading
Documentation/devicetree/bindings/iommu/arm,smmu-v3.txt +7 −1 Original line number Original line Diff line number Diff line Loading @@ -27,6 +27,12 @@ the PCIe specification. * "cmdq-sync" - CMD_SYNC complete * "cmdq-sync" - CMD_SYNC complete * "gerror" - Global Error activated * "gerror" - Global Error activated - #iommu-cells : See the generic IOMMU binding described in devicetree/bindings/pci/pci-iommu.txt for details. For SMMUv3, must be 1, with each cell describing a single stream ID. All possible stream IDs which a device may emit must be described. ** SMMUv3 optional properties: ** SMMUv3 optional properties: - dma-coherent : Present if DMA operations made by the SMMU (page - dma-coherent : Present if DMA operations made by the SMMU (page Loading Loading @@ -54,6 +60,6 @@ the PCIe specification. <GIC_SPI 79 IRQ_TYPE_EDGE_RISING>; <GIC_SPI 79 IRQ_TYPE_EDGE_RISING>; interrupt-names = "eventq", "priq", "cmdq-sync", "gerror"; interrupt-names = "eventq", "priq", "cmdq-sync", "gerror"; dma-coherent; dma-coherent; #iommu-cells = <0>; #iommu-cells = <1>; msi-parent = <&its 0xff0000>; msi-parent = <&its 0xff0000>; }; };
Documentation/devicetree/bindings/iommu/arm,smmu.txt +47 −14 Original line number Original line Diff line number Diff line Loading @@ -35,12 +35,16 @@ conditions. interrupt per context bank. In the case of a single, interrupt per context bank. In the case of a single, combined interrupt, it must be listed multiple times. combined interrupt, it must be listed multiple times. - mmu-masters : A list of phandles to device nodes representing bus - #iommu-cells : See Documentation/devicetree/bindings/iommu/iommu.txt masters for which the SMMU can provide a translation for details. With a value of 1, each "iommus" entry and their corresponding StreamIDs (see example below). represents a distinct stream ID emitted by that device Each device node linked from this list must have a into the relevant SMMU. "#stream-id-cells" property, indicating the number of StreamIDs associated with it. SMMUs with stream matching support and complex masters may use a value of 2, where the second cell represents an SMR mask to combine with the ID in the first cell. Care must be taken to ensure the set of matched IDs does not result in conflicts. ** System MMU optional properties: ** System MMU optional properties: Loading @@ -56,9 +60,20 @@ conditions. aliases of secure registers have to be used during aliases of secure registers have to be used during SMMU configuration. SMMU configuration. Example: ** Deprecated properties: - mmu-masters (deprecated in favour of the generic "iommus" binding) : A list of phandles to device nodes representing bus masters for which the SMMU can provide a translation and their corresponding Stream IDs. Each device node linked from this list must have a "#stream-id-cells" property, indicating the number of Stream ID arguments associated with its phandle. smmu { ** Examples: /* SMMU with stream matching or stream indexing */ smmu1: iommu { compatible = "arm,smmu-v1"; compatible = "arm,smmu-v1"; reg = <0xba5e0000 0x10000>; reg = <0xba5e0000 0x10000>; #global-interrupts = <2>; #global-interrupts = <2>; Loading @@ -68,11 +83,29 @@ Example: <0 35 4>, <0 35 4>, <0 36 4>, <0 36 4>, <0 37 4>; <0 37 4>; #iommu-cells = <1>; }; /* device with two stream IDs, 0 and 7 */ master1 { iommus = <&smmu1 0>, <&smmu1 7>; }; /* SMMU with stream matching */ smmu2: iommu { ... #iommu-cells = <2>; }; /* device with stream IDs 0 and 7 */ master2 { iommus = <&smmu2 0 0>, <&smmu2 7 0>; }; /* /* device with stream IDs 1, 17, 33 and 49 */ * Two DMA controllers, the first with two StreamIDs (0xd01d master3 { * and 0xd01e) and the second with only one (0xd11c). iommus = <&smmu2 1 0x30>; */ mmu-masters = <&dma0 0xd01d 0xd01e>, <&dma1 0xd11c>; }; };
Documentation/devicetree/bindings/pci/pci-iommu.txt 0 → 100644 +171 −0 Original line number Original line Diff line number Diff line This document describes the generic device tree binding for describing the relationship between PCI(e) devices and IOMMU(s). Each PCI(e) device under a root complex is uniquely identified by its Requester ID (AKA RID). A Requester ID is a triplet of a Bus number, Device number, and Function number. For the purpose of this document, when treated as a numeric value, a RID is formatted such that: * Bits [15:8] are the Bus number. * Bits [7:3] are the Device number. * Bits [2:0] are the Function number. * Any other bits required for padding must be zero. IOMMUs may distinguish PCI devices through sideband data derived from the Requester ID. While a given PCI device can only master through one IOMMU, a root complex may split masters across a set of IOMMUs (e.g. with one IOMMU per bus). The generic 'iommus' property is insufficient to describe this relationship, and a mechanism is required to map from a PCI device to its IOMMU and sideband data. For generic IOMMU bindings, see Documentation/devicetree/bindings/iommu/iommu.txt. PCI root complex ================ Optional properties ------------------- - iommu-map: Maps a Requester ID to an IOMMU and associated iommu-specifier data. The property is an arbitrary number of tuples of (rid-base,iommu,iommu-base,length). Any RID r in the interval [rid-base, rid-base + length) is associated with the listed IOMMU, with the iommu-specifier (r - rid-base + iommu-base). - iommu-map-mask: A mask to be applied to each Requester ID prior to being mapped to an iommu-specifier per the iommu-map property. Example (1) =========== / { #address-cells = <1>; #size-cells = <1>; iommu: iommu@a { reg = <0xa 0x1>; compatible = "vendor,some-iommu"; #iommu-cells = <1>; }; pci: pci@f { reg = <0xf 0x1>; compatible = "vendor,pcie-root-complex"; device_type = "pci"; /* * The sideband data provided to the IOMMU is the RID, * identity-mapped. */ iommu-map = <0x0 &iommu 0x0 0x10000>; }; }; Example (2) =========== / { #address-cells = <1>; #size-cells = <1>; iommu: iommu@a { reg = <0xa 0x1>; compatible = "vendor,some-iommu"; #iommu-cells = <1>; }; pci: pci@f { reg = <0xf 0x1>; compatible = "vendor,pcie-root-complex"; device_type = "pci"; /* * The sideband data provided to the IOMMU is the RID with the * function bits masked out. */ iommu-map = <0x0 &iommu 0x0 0x10000>; iommu-map-mask = <0xfff8>; }; }; Example (3) =========== / { #address-cells = <1>; #size-cells = <1>; iommu: iommu@a { reg = <0xa 0x1>; compatible = "vendor,some-iommu"; #iommu-cells = <1>; }; pci: pci@f { reg = <0xf 0x1>; compatible = "vendor,pcie-root-complex"; device_type = "pci"; /* * The sideband data provided to the IOMMU is the RID, * but the high bits of the bus number are flipped. */ iommu-map = <0x0000 &iommu 0x8000 0x8000>, <0x8000 &iommu 0x0000 0x8000>; }; }; Example (4) =========== / { #address-cells = <1>; #size-cells = <1>; iommu_a: iommu@a { reg = <0xa 0x1>; compatible = "vendor,some-iommu"; #iommu-cells = <1>; }; iommu_b: iommu@b { reg = <0xb 0x1>; compatible = "vendor,some-iommu"; #iommu-cells = <1>; }; iommu_c: iommu@c { reg = <0xc 0x1>; compatible = "vendor,some-iommu"; #iommu-cells = <1>; }; pci: pci@f { reg = <0xf 0x1>; compatible = "vendor,pcie-root-complex"; device_type = "pci"; /* * Devices with bus number 0-127 are mastered via IOMMU * a, with sideband data being RID[14:0]. * Devices with bus number 128-255 are mastered via * IOMMU b, with sideband data being RID[14:0]. * No devices master via IOMMU c. */ iommu-map = <0x0000 &iommu_a 0x0000 0x8000>, <0x8000 &iommu_b 0x0000 0x8000>; }; };
arch/arm64/mm/dma-mapping.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -827,7 +827,7 @@ static bool do_iommu_attach(struct device *dev, const struct iommu_ops *ops, * then the IOMMU core will have already configured a group for this * then the IOMMU core will have already configured a group for this * device, and allocated the default domain for that group. * device, and allocated the default domain for that group. */ */ if (!domain || iommu_dma_init_domain(domain, dma_base, size)) { if (!domain || iommu_dma_init_domain(domain, dma_base, size, dev)) { pr_warn("Failed to set up IOMMU for device %s; retaining platform DMA ops\n", pr_warn("Failed to set up IOMMU for device %s; retaining platform DMA ops\n", dev_name(dev)); dev_name(dev)); return false; return false; Loading
drivers/gpu/drm/exynos/exynos_drm_iommu.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -66,7 +66,7 @@ static inline int __exynos_iommu_create_mapping(struct exynos_drm_private *priv, if (ret) if (ret) goto free_domain; goto free_domain; ret = iommu_dma_init_domain(domain, start, size); ret = iommu_dma_init_domain(domain, start, size, NULL); if (ret) if (ret) goto put_cookie; goto put_cookie; Loading