Re: [PATCH] arm64: dts: juno: Enable smmu_pcie for Juno r1/r2

From: Robin Murphy
Date: Wed Mar 20 2019 - 07:24:24 EST


Hi Leo,

On 20/03/2019 08:31, Leo Yan wrote:
Though PCIe controller has been enabled on Juno r1/r2, but it misses to
enable its connected SMMU. From the testing, even without set this SMMU
status property to 'okay', the PCIe NIC device still works well. Since
the SMMU is not enabled in DT binding and its iommu_groups is not
created properly, finally this prevents to enable vfio-pci for NIC
device with KVM.

FWIW, whilst it might appear to be fine, there are still potential issues once the DMA API sees this SMMU and starts using it, which is why this particular change remains as one of my oldest local hacks that I've never yet considered upstreamable.

The IOMMU DMA ops happen to work for light usage now as a side-effect of 122fac030e912 combined with the current top-down allocation behaviour, but as soon as IOVA usage/fragmentation leads to 32-bit DMA addresses below 0x8000000, or full 40-bit addresses, being allocated then data loss and other problems will happen (for the reasons explained on the other thread). Similarly, it's also going to be fragile to any internal changes in the IOVA allocator.

Until we have a decent solution for handling such 'windowed' DMA restrictions (there do exist other systems with similar behaviour) I'd be very wary of enabling the PCIe SMMU for all users who may not be aware of the caveats. Given that the lack of stream IDs and SR-IOV support prevents Juno from being a realistic virtualisation platform anyway, I'm not convinced there's enough benefit to justify the risk.

Thanks,
Robin.

After reviewing the code in dts, Juno r1/r2 both have enabled PCIe
controller but Juno r0 board (in juno.dts) doesn't contain PCIe
controller; hence this patch only change SMMU status property to 'okay'
for Juno r1/r2 dts files for the sake of only enabling it for Juno r1/r2
and avoiding touching Juno r0.

Committer testing on Juno r2:

Before:

root@debian:~# tree /sys/kernel/iommu_groups/
/sys/kernel/iommu_groups/
âââ 0
â âââ devices
â â âââ 7ffb0000.ohci -> ../../../../devices/platform/7ffb0000.ohci
â â âââ 7ffc0000.ehci -> ../../../../devices/platform/7ffc0000.ehci
â âââ reserved_regions
â âââ type
âââ 1
âââ devices
â âââ 20070000.etr -> ../../../../devices/platform/20070000.etr
âââ reserved_regions
âââ type

7 directories, 4 files

After:

root@debian:~# tree /sys/kernel/iommu_groups/
/sys/kernel/iommu_groups/
âââ 0
â âââ devices
â â âââ 0000:00:00.0 -> ../../../../devices/platform/40000000.pcie/pci0000:00/0000:00:00.0
â â âââ 0000:01:00.0 -> ../../../../devices/platform/40000000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0
â â âââ 0000:02:01.0 -> ../../../../devices/platform/40000000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/0000:02:01.0
â â âââ 0000:02:02.0 -> ../../../../devices/platform/40000000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/0000:02:02.0
â â âââ 0000:02:03.0 -> ../../../../devices/platform/40000000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/0000:02:03.0
â â âââ 0000:02:0c.0 -> ../../../../devices/platform/40000000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/0000:02:0c.0
â â âââ 0000:02:10.0 -> ../../../../devices/platform/40000000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/0000:02:10.0
â â âââ 0000:02:1f.0 -> ../../../../devices/platform/40000000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/0000:02:1f.0
â â âââ 0000:03:00.0 -> ../../../../devices/platform/40000000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/0000:02:01.0/0000:03:00.0
â â âââ 0000:08:00.0 -> ../../../../devices/platform/40000000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/0000:02:1f.0/0000:08:00.0
â âââ reserved_regions
â âââ type
âââ 1
â âââ devices
â â âââ 7ffb0000.ohci -> ../../../../devices/platform/7ffb0000.ohci
â â âââ 7ffc0000.ehci -> ../../../../devices/platform/7ffc0000.ehci
â âââ reserved_regions
â âââ type
âââ 2
âââ devices
â âââ 20070000.etr -> ../../../../devices/platform/20070000.etr
âââ reserved_regions
âââ type

19 directories, 6 files

Signed-off-by: Leo Yan <leo.yan@xxxxxxxxxx>
---
arch/arm64/boot/dts/arm/juno-r1.dts | 4 ++++
arch/arm64/boot/dts/arm/juno-r2.dts | 4 ++++
2 files changed, 8 insertions(+)

diff --git a/arch/arm64/boot/dts/arm/juno-r1.dts b/arch/arm64/boot/dts/arm/juno-r1.dts
index b2b7ced633cf..67e161a6272a 100644
--- a/arch/arm64/boot/dts/arm/juno-r1.dts
+++ b/arch/arm64/boot/dts/arm/juno-r1.dts
@@ -226,6 +226,10 @@
status = "okay";
};
+&smmu_pcie {
+ status = "okay";
+};
+
&pcie_ctlr {
status = "okay";
};
diff --git a/arch/arm64/boot/dts/arm/juno-r2.dts b/arch/arm64/boot/dts/arm/juno-r2.dts
index ab77adb4f3c2..0e1c5c814b01 100644
--- a/arch/arm64/boot/dts/arm/juno-r2.dts
+++ b/arch/arm64/boot/dts/arm/juno-r2.dts
@@ -226,6 +226,10 @@
status = "okay";
};
+&smmu_pcie {
+ status = "okay";
+};
+
&pcie_ctlr {
status = "okay";
};