[Linaro-uefi,4/6] Platforms/AMD/Styx: enable SMMUs in the device tree

Message ID 20170601094353.16235-5-ard.biesheuvel@linaro.org
State New
Headers show
Series
  • OpenPlatformPkg/AMD updates
Related show

Commit Message

Ard Biesheuvel June 1, 2017, 9:43 a.m.
Due to the fact that AMD Seattle maps all its DRAM starting at
physical address 0x80_0000_0000, we currently only support DMA for
devices that can access 40 bits of physical address space.

This is not a problem for the onboard devices, but it would be useful
if we could support arbitrary PCIe plug-in cards, even if they are only
32-bit DMA capable.

Fortunately, there is a ARM (tm) Corelink(r) MMU-401 between the PCIe
root complex and the CPU bus, and so all we need to do is to inform
the OS about this. So add a description of it to the APCI IORT table.

While we're at it, let's describe all the other SMMUs we may be able to
make use of, i.e., 2x SATA and 2x XGBE, as well.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
 Platforms/AMD/Styx/Library/StyxDtbLoaderLib/StyxDtbLoaderLib.c   |  51 ++++++++++++++
 Platforms/AMD/Styx/Library/StyxDtbLoaderLib/StyxDtbLoaderLib.inf |   2 +
 Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-overdrive.dtb     | Bin 8293 -> 9357 bytes
 Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-overdrive.dts     |  72 +++++++++++++++++++-
 4 files changed, 123 insertions(+), 2 deletions(-)

Comments

Leif Lindholm June 1, 2017, 1:41 p.m. | #1
On Thu, Jun 01, 2017 at 09:43:51AM +0000, Ard Biesheuvel wrote:
> Due to the fact that AMD Seattle maps all its DRAM starting at
> physical address 0x80_0000_0000, we currently only support DMA for
> devices that can access 40 bits of physical address space.
> 
> This is not a problem for the onboard devices, but it would be useful
> if we could support arbitrary PCIe plug-in cards, even if they are only
> 32-bit DMA capable.
> 
> Fortunately, there is a ARM (tm) Corelink(r) MMU-401 between the PCIe
> root complex and the CPU bus, and so all we need to do is to inform
> the OS about this. So add a description of it to the APCI IORT table.
> 
> While we're at it, let's describe all the other SMMUs we may be able to
> make use of, i.e., 2x SATA and 2x XGBE, as well.
> 
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>


> ---
>  Platforms/AMD/Styx/Library/StyxDtbLoaderLib/StyxDtbLoaderLib.c   |  51 ++++++++++++++
>  Platforms/AMD/Styx/Library/StyxDtbLoaderLib/StyxDtbLoaderLib.inf |   2 +
>  Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-overdrive.dtb     | Bin 8293 -> 9357 bytes
>  Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-overdrive.dts     |  72 +++++++++++++++++++-
>  4 files changed, 123 insertions(+), 2 deletions(-)
> 
> diff --git a/Platforms/AMD/Styx/Library/StyxDtbLoaderLib/StyxDtbLoaderLib.c b/Platforms/AMD/Styx/Library/StyxDtbLoaderLib/StyxDtbLoaderLib.c
> index b18caf19985b..093db6517c1a 100644
> --- a/Platforms/AMD/Styx/Library/StyxDtbLoaderLib/StyxDtbLoaderLib.c
> +++ b/Platforms/AMD/Styx/Library/StyxDtbLoaderLib/StyxDtbLoaderLib.c
> @@ -22,6 +22,7 @@
>  #include <Library/DebugLib.h>
>  #include <Library/DxeServicesLib.h>
>  #include <Library/MemoryAllocationLib.h>
> +#include <Library/PcdLib.h>
>  #include <Library/PrintLib.h>
>  #include <Library/UefiBootServicesTableLib.h>
>  
> @@ -189,6 +190,46 @@ SetMacAddress (
>  
>  #endif
>  
> +STATIC
> +VOID
> +DisableSmmu (
> +  IN  VOID          *Fdt,
> +  IN  CONST CHAR8   *IommuPropName,
> +  IN  CONST CHAR8   *SmmuNodeName,
> +  IN  CONST CHAR8   *DeviceNodeName
> +  )
> +{
> +  INT32   Node;
> +  INT32   Error;
> +
> +  Node = fdt_path_offset (Fdt, DeviceNodeName);
> +  if (Node <= 0) {
> +    DEBUG ((DEBUG_WARN, "%a: Failed to find path %s: %a\n",
> +      __FUNCTION__, DeviceNodeName, fdt_strerror (Node)));
> +    return;
> +  }
> +
> +  Error = fdt_delprop (Fdt, Node, IommuPropName);
> +  if (Error != 0) {
> +    DEBUG ((DEBUG_WARN, "%a: Failed to delete property %a: %a\n",
> +      __FUNCTION__, IommuPropName, fdt_strerror (Error)));
> +    return;
> +  }
> +
> +  Node = fdt_path_offset (Fdt, SmmuNodeName);
> +  if (Node <= 0) {
> +    DEBUG ((DEBUG_WARN, "%a: Failed to find path %s: %a\n",
> +      __FUNCTION__, SmmuNodeName, fdt_strerror (Node)));
> +    return;
> +  }
> +
> +  Error = fdt_del_node (Fdt, Node);
> +  if (Error != 0) {
> +    DEBUG ((DEBUG_WARN, "%a: Failed to delete node %a: %a\n",
> +      __FUNCTION__, SmmuNodeName, fdt_strerror (Error)));
> +  }
> +}
> +
>  #define STYX_SOC_VERSION_MASK    0xFFF
>  #define STYX_SOC_VERSION_A0      0x000
>  #define STYX_SOC_VERSION_B0      0x010
> @@ -216,6 +257,16 @@ SetSocIdStatus (
>  #else
>    SetDeviceStatus (Fdt, "kcs@e0010000", FALSE);
>  #endif
> +
> +  if (!PcdGetBool (PcdEnableSmmus)) {
> +    DisableSmmu (Fdt, "iommu-map", "/smb/smmu@e0a00000", "/smb/pcie@f0000000");
> +    DisableSmmu (Fdt, "iommus", "/smb/smmu@e0200000", "/smb/sata@e0300000");
> +    DisableSmmu (Fdt, "iommus", "/smb/smmu@e0c00000", "/smb/sata@e0d00000");
> +#if DO_XGBE
> +    DisableSmmu (Fdt, "iommus", "/smb/smmu@e0600000", "/smb/xgmac@e0700000");
> +    DisableSmmu (Fdt, "iommus", "/smb/smmu@e0800000", "/smb/xgmac@e0900000");
> +#endif
> +  }
>  }
>  
>  STATIC
> diff --git a/Platforms/AMD/Styx/Library/StyxDtbLoaderLib/StyxDtbLoaderLib.inf b/Platforms/AMD/Styx/Library/StyxDtbLoaderLib/StyxDtbLoaderLib.inf
> index 8bb6e9fa41cb..fcf2f058fbdf 100644
> --- a/Platforms/AMD/Styx/Library/StyxDtbLoaderLib/StyxDtbLoaderLib.inf
> +++ b/Platforms/AMD/Styx/Library/StyxDtbLoaderLib/StyxDtbLoaderLib.inf
> @@ -37,6 +37,7 @@
>    DxeServicesLib
>    FdtLib
>    MemoryAllocationLib
> +  PcdLib
>    PrintLib
>    UefiBootServicesTableLib
>  
> @@ -44,6 +45,7 @@
>    gAmdStyxTokenSpaceGuid.PcdSocCpuId
>    gAmdStyxTokenSpaceGuid.PcdEthMacA
>    gAmdStyxTokenSpaceGuid.PcdEthMacB
> +  gAmdStyxTokenSpaceGuid.PcdEnableSmmus
>    gArmTokenSpaceGuid.PcdSystemMemoryBase
>  
>  [FixedPcd]
> diff --git a/Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-overdrive.dtb b/Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-overdrive.dtb
> index d380ea8714b85ec14f593b3795529c952e988df3..7ec1f63aff7805a3db7efc7a9b6e3c04f3c856cd 100644
> GIT binary patch
> delta 2262
> zcmcImOK1~O6rJ~?Z4;9;X;PDZG-^w!+G;FTi;6_STG84f{&qHwv4$pXX!=nUQt-bh
> zh<BwczdOZGRTLDv5UDHc)`e84D-{)7i4^adnHOScv0ZrK&b<3SbKko!`4k!6Q9JIM
> z`l@Nw!<wcwY1+~be%CU4nLW%*wtCjrKB&D|kVz){Be8Hp7-Sjw<zz01_9pAtT)#HF
> z1{NDL;&liUOYme8#uK)A%<n7><REh=Gn3fG57?QqYa=GZnn`BK3<c;1vr2e^*X|q{
> z{*d7>(k6I)&frHm8YDF2%NCmn{Z95#=+#;Q{1^D*oct&T*#sZ$i$-Gfq#(9@%F^XG
> zfOkR6XB$2k6r#GqWl}h)y|DA2K_~<Y(OBW2n4(D0Nq#;r%9NrUN-6eo86UOV2c%$U
> zdzClW!EP9T+q+>*IHogRa|FaHdg|zkHHtNSvdqjy9JrlN(vYUPS}YwmQS65Ulhr_R
> z)D*MwK%RUyPrgDI7PN`GH0t!zmjwawjKZRVLeA=GU~h6&Qp#C^mL*&pji8m;06$f@
> zJktiP$_*%`7p{d?&^OmiRU+>7M*313b}R3f?&-XLx=*`uPPlkOXNm{6@nDJf)|Z+?
> z`qyBI$&?<48C^qXzgxaIQmT``sM@na%K6mpDVH)hlJI;M;s+fpxs<UcB|7Ixxn|Y*
> z3(bsU-pbx;P}Cae8ll9bAPp3toF-@(b9}b-DaKfOXrkntdD??C<ZG6)hQ@piQikcb
> zuLg!{|7tNwd;QHTWH_Em#t(JrX=G-y63Ga!RZ#{ZcZ|I9AC(BM3y^moTS4&VVUs$I
> z2Lfftfe{54GArx(%fUd|RaRiMz>XZ_9SR2n;x)AdcbnOp=|iyfe^hu>wpQ)ux;gJ>
> z2SWzUZa>@EQ|+f(qZ=8upJ)*jp#1&hYej8?v7eC5o6o$qo8}CDh%<nMacgIjzk`Yy
> zKyrU{+E`ZT)fzst0bgR}gD<K<Hozb6Oh$G3T2_i(K2@=Wwv~4`POuf33)tzGynf^6
> zt=lY_I-XVy7b-4twi|wY)cMBks4U-XgNpB16>jr#fw(d1rjAY7&Z^%7bP^Pzri!g5
> zj(d3+9y}a*^w@9$E`<T78EfeBFsQT4cxHtG4FQGde&uFqE2r<32Sg3EEc&>isx#4Z
> zIGU)BclX75d;3#;X{{>WgMSiwERjfSN0QNcz2{i0H`d*!>4_e_E3Fy!G;Lb^)^55c
> Pqp1-`XuY64OMHI-={_7_
> 
> delta 1263
> zcmcIj-%C?*6hGfv&8fTlVRO#SAInMjYiMF31Q{k`52X=QPujY>xwXw*+{!@9J@ppE
> z4*da{Jr$^}pohTMd@`Xx=w&@fM*0|xi0quZAB~~VO9#%q-*Z0aoX_{1@Av!Y!uGkg
> z5AyFl0FMd)0|1TJ>EA|bBejx}9FfWI!A`q-_58E}+l{wvo8*=lVw_|P-x*sZ*v5=;
> z>HtuyoE4k6Q#nW9K-EGmr*mpSnQRxcRd*%GqE_wIOBBFL22<5;T&upqxZUJ!FD;<s
> ze(mO@rbNON%fh)w0YnAfFojjKIOQvNjpX$Jn34eUDEy7=rZr0;b1-KX?Xfa@qRgJb
> z9(hbW#H8FQQrIKhxNNrLXW4pCFLtz=T|BNX^BKw+x76Z&v!j^TdRUGzWvMAmE2Vm2
> zIfN=>86*ymwKRCndPwk!H70MBjA0SGY_sh=%Cx40xMv;^4{?nRk_FPj(AIIs*3l$B
> z0_^Kp{!@_)5gAJRn(nFjF2oi#*dJrC_CfB_I8%-hN&LW3N3SIIao%x~{Y#E+Lpr2I
> zLx7i!cHDFLI>bKPlVK&EubrosEM$uu51+i`Ob^%HlDNvtdbG8cM4Jfh#c@|%{SbNi
> z7PIE}2#j9EB%$0bS7ogtWhO@FaK%+8p5S}erCj+DoN!<KFBE+ZeVA#~Z_2O6<<rag
> zT^MK=>(bN3XG_n?Q#=yjS8<G#aDBJ@es?j`<m#6`(UKnuH^J$ddsESnex5lWkL(*^
> z&U_60=ur<e4{?k0&E?#yuhOsIaExA%u7l3aGvqaslyMgZ`0w0rJ!d89CuTj@gaOA-
> zd^xT}VoEp;fvDf7#DeOKI-S69%SL+G+b>$Z@x+YkkNQFZpQ1)0afl}Zu{#N$=1&A6
> KswRT50Q><AjNWko
> 
> diff --git a/Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-overdrive.dts b/Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-overdrive.dts
> index b462910b3bf0..c896bba18056 100644
> --- a/Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-overdrive.dts
> +++ b/Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-overdrive.dts
> @@ -122,12 +122,39 @@
>  			phandle = <0x3>;
>  		};
>  
> +		sata0_smmu: smmu@e0200000 {
> +			compatible = "arm,mmu-401";
> +			reg = <0 0xe0200000 0 0x10000>;
> +			#global-interrupts = <1>;
> +			interrupts = /* Uses combined intr for both
> +				       * global and context
> +				       */
> +				      <0 332 4>,
> +				      <0 332 4>;
> +			#iommu-cells = <2>;
> +			dma-coherent;
> +		};
> +
> +		sata1_smmu: smmu@e0c00000 {
> +			compatible = "arm,mmu-401";
> +			reg = <0 0xe0c00000 0 0x10000>;
> +			#global-interrupts = <1>;
> +			interrupts = /* Uses combined intr for both
> +				       * global and context
> +				       */
> +				      <0 331 4>,
> +				      <0 331 4>;
> +			#iommu-cells = <2>;
> +			dma-coherent;
> +		};
> +
>  		sata@e0300000 {
>  			compatible = "snps,dwc-ahci";
>  			reg = <0x0 0xe0300000 0x0 0xf0000>;
>  			interrupts = <0x0 0x163 0x4>;
>  			clocks = <0x2>;
>  			dma-coherent;
> +			iommus = <&sata0_smmu 0x00 0x1f>; /* 0-31 */
>  		};
>  
>  		sata@e0d00000 {
> @@ -137,6 +164,7 @@
>  			interrupts = <0x0 0x162 0x4>;
>  			clocks = <0x2>;
>  			dma-coherent;
> +			iommus = <&sata1_smmu 0x00 0x1f>; /* 0-31 */
>  		};
>  
>  		i2c@e1000000 {
> @@ -257,6 +285,7 @@
>  			#address-cells = <0x3>;
>  			#size-cells = <0x2>;
>  			#interrupt-cells = <0x1>;
> +			iommu-map = <0x0 &pcie_smmu 0x0 0x10000>;
>  			device_type = "pci";
>  			bus-range = <0x0 0x7f>;
>  			msi-parent = <0x4>;
> @@ -283,6 +312,19 @@
>  				 <0x3000000 0x1 0x00000000 0x1 0x00000000 0x7f 0x00000000>; /* 64-bit MMIO (size= 124G) */
>  		};
>  
> +		pcie_smmu: smmu@e0a00000 {
> +			compatible = "arm,mmu-401";
> +			reg = <0 0xe0a00000 0 0x10000>;
> +			#global-interrupts = <1>;
> +			interrupts = /* Uses combined intr for both
> +				       * global and context
> +				       */
> +				      <0 333 4>,
> +				      <0 333 4>;
> +			#iommu-cells = <1>;
> +			dma-coherent;
> +		};
> +
>  		ccn@0xe8000000 {
>  			compatible = "arm,ccn-504";
>  			reg = <0x0 0xe8000000 0x0 0x1000000>;
> @@ -382,6 +424,32 @@
>  			phandle = <0xa>;
>  		};
>  
> +		xgmac0_smmu: smmu@e0600000 {
> +			compatible = "arm,mmu-401";
> +			reg = <0 0xe0600000 0 0x10000>;
> +			#global-interrupts = <1>;
> +			interrupts = /* Uses combined intr for both
> +				       * global and context
> +				       */
> +				      <0 336 4>,
> +				      <0 336 4>;
> +			#iommu-cells = <2>;
> +			dma-coherent;
> +		};
> +
> +		xgmac1_smmu: smmu@e0800000 {
> +			compatible = "arm,mmu-401";
> +			reg = <0 0xe0800000 0 0x10000>;
> +			#global-interrupts = <1>;
> +			interrupts = /* Uses combined intr for both
> +				       * global and context
> +				       */
> +				      <0 335 4>,
> +				      <0 335 4>;
> +			#iommu-cells = <2>;
> +			dma-coherent;
> +		};
> +
>  		xgmac@e0700000 {
>  			status = "disabled";
>  			compatible = "amd,xgbe-seattle-v1a";
> @@ -397,8 +465,8 @@
>  			clock-names = "dma_clk", "ptp_clk";
>  			phy-handle = <0x9>;
>  			phy-mode = "xgmii";
> -			#stream-id-cells = <0x18>;
>  			dma-coherent;
> +			iommus = <&xgmac0_smmu 0x00 0x1f>; /* 0-31 */
>  			linux,phandle = <0xb>;
>  			phandle = <0xb>;
>  		};
> @@ -418,8 +486,8 @@
>  			clock-names = "dma_clk", "ptp_clk";
>  			phy-handle = <0xa>;
>  			phy-mode = "xgmii";
> -			#stream-id-cells = <0x18>;
>  			dma-coherent;
> +			iommus = <&xgmac1_smmu 0x00 0x1f>; /* 0-31 */
>  			linux,phandle = <0xc>;
>  			phandle = <0xc>;
>  		};
> -- 
> 2.9.3
>

Patch hide | download patch | download mbox

diff --git a/Platforms/AMD/Styx/Library/StyxDtbLoaderLib/StyxDtbLoaderLib.c b/Platforms/AMD/Styx/Library/StyxDtbLoaderLib/StyxDtbLoaderLib.c
index b18caf19985b..093db6517c1a 100644
--- a/Platforms/AMD/Styx/Library/StyxDtbLoaderLib/StyxDtbLoaderLib.c
+++ b/Platforms/AMD/Styx/Library/StyxDtbLoaderLib/StyxDtbLoaderLib.c
@@ -22,6 +22,7 @@ 
 #include <Library/DebugLib.h>
 #include <Library/DxeServicesLib.h>
 #include <Library/MemoryAllocationLib.h>
+#include <Library/PcdLib.h>
 #include <Library/PrintLib.h>
 #include <Library/UefiBootServicesTableLib.h>
 
@@ -189,6 +190,46 @@  SetMacAddress (
 
 #endif
 
+STATIC
+VOID
+DisableSmmu (
+  IN  VOID          *Fdt,
+  IN  CONST CHAR8   *IommuPropName,
+  IN  CONST CHAR8   *SmmuNodeName,
+  IN  CONST CHAR8   *DeviceNodeName
+  )
+{
+  INT32   Node;
+  INT32   Error;
+
+  Node = fdt_path_offset (Fdt, DeviceNodeName);
+  if (Node <= 0) {
+    DEBUG ((DEBUG_WARN, "%a: Failed to find path %s: %a\n",
+      __FUNCTION__, DeviceNodeName, fdt_strerror (Node)));
+    return;
+  }
+
+  Error = fdt_delprop (Fdt, Node, IommuPropName);
+  if (Error != 0) {
+    DEBUG ((DEBUG_WARN, "%a: Failed to delete property %a: %a\n",
+      __FUNCTION__, IommuPropName, fdt_strerror (Error)));
+    return;
+  }
+
+  Node = fdt_path_offset (Fdt, SmmuNodeName);
+  if (Node <= 0) {
+    DEBUG ((DEBUG_WARN, "%a: Failed to find path %s: %a\n",
+      __FUNCTION__, SmmuNodeName, fdt_strerror (Node)));
+    return;
+  }
+
+  Error = fdt_del_node (Fdt, Node);
+  if (Error != 0) {
+    DEBUG ((DEBUG_WARN, "%a: Failed to delete node %a: %a\n",
+      __FUNCTION__, SmmuNodeName, fdt_strerror (Error)));
+  }
+}
+
 #define STYX_SOC_VERSION_MASK    0xFFF
 #define STYX_SOC_VERSION_A0      0x000
 #define STYX_SOC_VERSION_B0      0x010
@@ -216,6 +257,16 @@  SetSocIdStatus (
 #else
   SetDeviceStatus (Fdt, "kcs@e0010000", FALSE);
 #endif
+
+  if (!PcdGetBool (PcdEnableSmmus)) {
+    DisableSmmu (Fdt, "iommu-map", "/smb/smmu@e0a00000", "/smb/pcie@f0000000");
+    DisableSmmu (Fdt, "iommus", "/smb/smmu@e0200000", "/smb/sata@e0300000");
+    DisableSmmu (Fdt, "iommus", "/smb/smmu@e0c00000", "/smb/sata@e0d00000");
+#if DO_XGBE
+    DisableSmmu (Fdt, "iommus", "/smb/smmu@e0600000", "/smb/xgmac@e0700000");
+    DisableSmmu (Fdt, "iommus", "/smb/smmu@e0800000", "/smb/xgmac@e0900000");
+#endif
+  }
 }
 
 STATIC
diff --git a/Platforms/AMD/Styx/Library/StyxDtbLoaderLib/StyxDtbLoaderLib.inf b/Platforms/AMD/Styx/Library/StyxDtbLoaderLib/StyxDtbLoaderLib.inf
index 8bb6e9fa41cb..fcf2f058fbdf 100644
--- a/Platforms/AMD/Styx/Library/StyxDtbLoaderLib/StyxDtbLoaderLib.inf
+++ b/Platforms/AMD/Styx/Library/StyxDtbLoaderLib/StyxDtbLoaderLib.inf
@@ -37,6 +37,7 @@ 
   DxeServicesLib
   FdtLib
   MemoryAllocationLib
+  PcdLib
   PrintLib
   UefiBootServicesTableLib
 
@@ -44,6 +45,7 @@ 
   gAmdStyxTokenSpaceGuid.PcdSocCpuId
   gAmdStyxTokenSpaceGuid.PcdEthMacA
   gAmdStyxTokenSpaceGuid.PcdEthMacB
+  gAmdStyxTokenSpaceGuid.PcdEnableSmmus
   gArmTokenSpaceGuid.PcdSystemMemoryBase
 
 [FixedPcd]
diff --git a/Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-overdrive.dtb b/Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-overdrive.dtb
index d380ea8714b85ec14f593b3795529c952e988df3..7ec1f63aff7805a3db7efc7a9b6e3c04f3c856cd 100644
GIT binary patch
delta 2262
zcmcImOK1~O6rJ~?Z4;9;X;PDZG-^w!+G;FTi;6_STG84f{&qHwv4$pXX!=nUQt-bh
zh<BwczdOZGRTLDv5UDHc)`e84D-{)7i4^adnHOScv0ZrK&b<3SbKko!`4k!6Q9JIM
z`l@Nw!<wcwY1+~be%CU4nLW%*wtCjrKB&D|kVz){Be8Hp7-Sjw<zz01_9pAtT)#HF
z1{NDL;&liUOYme8#uK)A%<n7><REh=Gn3fG57?QqYa=GZnn`BK3<c;1vr2e^*X|q{
z{*d7>(k6I)&frHm8YDF2%NCmn{Z95#=+#;Q{1^D*oct&T*#sZ$i$-Gfq#(9@%F^XG
zfOkR6XB$2k6r#GqWl}h)y|DA2K_~<Y(OBW2n4(D0Nq#;r%9NrUN-6eo86UOV2c%$U
zdzClW!EP9T+q+>*IHogRa|FaHdg|zkHHtNSvdqjy9JrlN(vYUPS}YwmQS65Ulhr_R
z)D*MwK%RUyPrgDI7PN`GH0t!zmjwawjKZRVLeA=GU~h6&Qp#C^mL*&pji8m;06$f@
zJktiP$_*%`7p{d?&^OmiRU+>7M*313b}R3f?&-XLx=*`uPPlkOXNm{6@nDJf)|Z+?
z`qyBI$&?<48C^qXzgxaIQmT``sM@na%K6mpDVH)hlJI;M;s+fpxs<UcB|7Ixxn|Y*
z3(bsU-pbx;P}Cae8ll9bAPp3toF-@(b9}b-DaKfOXrkntdD??C<ZG6)hQ@piQikcb
zuLg!{|7tNwd;QHTWH_Em#t(JrX=G-y63Ga!RZ#{ZcZ|I9AC(BM3y^moTS4&VVUs$I
z2Lfftfe{54GArx(%fUd|RaRiMz>XZ_9SR2n;x)AdcbnOp=|iyfe^hu>wpQ)ux;gJ>
z2SWzUZa>@EQ|+f(qZ=8upJ)*jp#1&hYej8?v7eC5o6o$qo8}CDh%<nMacgIjzk`Yy
zKyrU{+E`ZT)fzst0bgR}gD<K<Hozb6Oh$G3T2_i(K2@=Wwv~4`POuf33)tzGynf^6
zt=lY_I-XVy7b-4twi|wY)cMBks4U-XgNpB16>jr#fw(d1rjAY7&Z^%7bP^Pzri!g5
zj(d3+9y}a*^w@9$E`<T78EfeBFsQT4cxHtG4FQGde&uFqE2r<32Sg3EEc&>isx#4Z
zIGU)BclX75d;3#;X{{>WgMSiwERjfSN0QNcz2{i0H`d*!>4_e_E3Fy!G;Lb^)^55c
Pqp1-`XuY64OMHI-={_7_

delta 1263
zcmcIj-%C?*6hGfv&8fTlVRO#SAInMjYiMF31Q{k`52X=QPujY>xwXw*+{!@9J@ppE
z4*da{Jr$^}pohTMd@`Xx=w&@fM*0|xi0quZAB~~VO9#%q-*Z0aoX_{1@Av!Y!uGkg
z5AyFl0FMd)0|1TJ>EA|bBejx}9FfWI!A`q-_58E}+l{wvo8*=lVw_|P-x*sZ*v5=;
z>HtuyoE4k6Q#nW9K-EGmr*mpSnQRxcRd*%GqE_wIOBBFL22<5;T&upqxZUJ!FD;<s
ze(mO@rbNON%fh)w0YnAfFojjKIOQvNjpX$Jn34eUDEy7=rZr0;b1-KX?Xfa@qRgJb
z9(hbW#H8FQQrIKhxNNrLXW4pCFLtz=T|BNX^BKw+x76Z&v!j^TdRUGzWvMAmE2Vm2
zIfN=>86*ymwKRCndPwk!H70MBjA0SGY_sh=%Cx40xMv;^4{?nRk_FPj(AIIs*3l$B
z0_^Kp{!@_)5gAJRn(nFjF2oi#*dJrC_CfB_I8%-hN&LW3N3SIIao%x~{Y#E+Lpr2I
zLx7i!cHDFLI>bKPlVK&EubrosEM$uu51+i`Ob^%HlDNvtdbG8cM4Jfh#c@|%{SbNi
z7PIE}2#j9EB%$0bS7ogtWhO@FaK%+8p5S}erCj+DoN!<KFBE+ZeVA#~Z_2O6<<rag
zT^MK=>(bN3XG_n?Q#=yjS8<G#aDBJ@es?j`<m#6`(UKnuH^J$ddsESnex5lWkL(*^
z&U_60=ur<e4{?k0&E?#yuhOsIaExA%u7l3aGvqaslyMgZ`0w0rJ!d89CuTj@gaOA-
zd^xT}VoEp;fvDf7#DeOKI-S69%SL+G+b>$Z@x+YkkNQFZpQ1)0afl}Zu{#N$=1&A6
KswRT50Q><AjNWko

diff --git a/Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-overdrive.dts b/Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-overdrive.dts
index b462910b3bf0..c896bba18056 100644
--- a/Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-overdrive.dts
+++ b/Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-overdrive.dts
@@ -122,12 +122,39 @@ 
 			phandle = <0x3>;
 		};
 
+		sata0_smmu: smmu@e0200000 {
+			compatible = "arm,mmu-401";
+			reg = <0 0xe0200000 0 0x10000>;
+			#global-interrupts = <1>;
+			interrupts = /* Uses combined intr for both
+				       * global and context
+				       */
+				      <0 332 4>,
+				      <0 332 4>;
+			#iommu-cells = <2>;
+			dma-coherent;
+		};
+
+		sata1_smmu: smmu@e0c00000 {
+			compatible = "arm,mmu-401";
+			reg = <0 0xe0c00000 0 0x10000>;
+			#global-interrupts = <1>;
+			interrupts = /* Uses combined intr for both
+				       * global and context
+				       */
+				      <0 331 4>,
+				      <0 331 4>;
+			#iommu-cells = <2>;
+			dma-coherent;
+		};
+
 		sata@e0300000 {
 			compatible = "snps,dwc-ahci";
 			reg = <0x0 0xe0300000 0x0 0xf0000>;
 			interrupts = <0x0 0x163 0x4>;
 			clocks = <0x2>;
 			dma-coherent;
+			iommus = <&sata0_smmu 0x00 0x1f>; /* 0-31 */
 		};
 
 		sata@e0d00000 {
@@ -137,6 +164,7 @@ 
 			interrupts = <0x0 0x162 0x4>;
 			clocks = <0x2>;
 			dma-coherent;
+			iommus = <&sata1_smmu 0x00 0x1f>; /* 0-31 */
 		};
 
 		i2c@e1000000 {
@@ -257,6 +285,7 @@ 
 			#address-cells = <0x3>;
 			#size-cells = <0x2>;
 			#interrupt-cells = <0x1>;
+			iommu-map = <0x0 &pcie_smmu 0x0 0x10000>;
 			device_type = "pci";
 			bus-range = <0x0 0x7f>;
 			msi-parent = <0x4>;
@@ -283,6 +312,19 @@ 
 				 <0x3000000 0x1 0x00000000 0x1 0x00000000 0x7f 0x00000000>; /* 64-bit MMIO (size= 124G) */
 		};
 
+		pcie_smmu: smmu@e0a00000 {
+			compatible = "arm,mmu-401";
+			reg = <0 0xe0a00000 0 0x10000>;
+			#global-interrupts = <1>;
+			interrupts = /* Uses combined intr for both
+				       * global and context
+				       */
+				      <0 333 4>,
+				      <0 333 4>;
+			#iommu-cells = <1>;
+			dma-coherent;
+		};
+
 		ccn@0xe8000000 {
 			compatible = "arm,ccn-504";
 			reg = <0x0 0xe8000000 0x0 0x1000000>;
@@ -382,6 +424,32 @@ 
 			phandle = <0xa>;
 		};
 
+		xgmac0_smmu: smmu@e0600000 {
+			compatible = "arm,mmu-401";
+			reg = <0 0xe0600000 0 0x10000>;
+			#global-interrupts = <1>;
+			interrupts = /* Uses combined intr for both
+				       * global and context
+				       */
+				      <0 336 4>,
+				      <0 336 4>;
+			#iommu-cells = <2>;
+			dma-coherent;
+		};
+
+		xgmac1_smmu: smmu@e0800000 {
+			compatible = "arm,mmu-401";
+			reg = <0 0xe0800000 0 0x10000>;
+			#global-interrupts = <1>;
+			interrupts = /* Uses combined intr for both
+				       * global and context
+				       */
+				      <0 335 4>,
+				      <0 335 4>;
+			#iommu-cells = <2>;
+			dma-coherent;
+		};
+
 		xgmac@e0700000 {
 			status = "disabled";
 			compatible = "amd,xgbe-seattle-v1a";
@@ -397,8 +465,8 @@ 
 			clock-names = "dma_clk", "ptp_clk";
 			phy-handle = <0x9>;
 			phy-mode = "xgmii";
-			#stream-id-cells = <0x18>;
 			dma-coherent;
+			iommus = <&xgmac0_smmu 0x00 0x1f>; /* 0-31 */
 			linux,phandle = <0xb>;
 			phandle = <0xb>;
 		};
@@ -418,8 +486,8 @@ 
 			clock-names = "dma_clk", "ptp_clk";
 			phy-handle = <0xa>;
 			phy-mode = "xgmii";
-			#stream-id-cells = <0x18>;
 			dma-coherent;
+			iommus = <&xgmac1_smmu 0x00 0x1f>; /* 0-31 */
 			linux,phandle = <0xc>;
 			phandle = <0xc>;
 		};