diff --git a/Platform/96boards/Secure96/DeviceTree/DeviceTree.inf b/Platform/96boards/Secure96/DeviceTree/DeviceTree.inf
new file mode 100644
index 000000000000..4bf087551a80
--- /dev/null
+++ b/Platform/96boards/Secure96/DeviceTree/DeviceTree.inf
@@ -0,0 +1,40 @@
+## @file
+#
+#  Device tree overlay for the 96boards Secure96 Mezzanine board
+#
+#  Copyright (c) 2018, Linaro Ltd. All rights reserved.
+#
+#  This program and the accompanying materials
+#  are licensed and made available under the terms and conditions of the BSD License
+#  which accompanies this distribution.  The full text of the license may be found at
+#  http://opensource.org/licenses/bsd-license.php
+#
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+##
+
+[Defines]
+  INF_VERSION    = 0x0001001A
+  BASE_NAME      = Secure96DeviceTree
+  FILE_GUID      = ae548d4c-9062-4eed-835f-f510f8fc48af # gSecure96DtbFileGuid
+  MODULE_TYPE    = USER_DEFINED
+  VERSION_STRING = 1.0
+
+[Sources]
+  Secure96.dts
+
+[Packages]
+  MdePkg/MdePkg.dec
+  Platform/96boards/Secure96/Secure96.dec
+
+[FixedPcd]
+  gSecure96TokenSpaceGuid.PcdGpioLedPolarity
+  gSecure96TokenSpaceGuid.PcdGpioLedU1
+  gSecure96TokenSpaceGuid.PcdGpioLedU2
+  gSecure96TokenSpaceGuid.PcdGpioLedU3
+  gSecure96TokenSpaceGuid.PcdGpioLedU4
+  gSecure96TokenSpaceGuid.PcdGpioParent
+  gSecure96TokenSpaceGuid.PcdSha204I2cAddress
+  gSecure96TokenSpaceGuid.PcdEcc508I2cAddress
+  gSecure96TokenSpaceGuid.PcdSpiTpmCs
diff --git a/Platform/96boards/Secure96/DeviceTree/Secure96.dts b/Platform/96boards/Secure96/DeviceTree/Secure96.dts
new file mode 100644
index 000000000000..1506a41b98de
--- /dev/null
+++ b/Platform/96boards/Secure96/DeviceTree/Secure96.dts
@@ -0,0 +1,74 @@
+/** @file
+ * Copyright (c) 2018, Linaro Limited. All rights reserved.
+ *
+ * This program and the accompanying materials are licensed and made
+ * available under the terms and conditions of the BSD License which
+ * accompanies this distribution.  The full text of the license may be
+ * found at http://opensource.org/licenses/bsd-license.php
+ *
+ * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR
+ * IMPLIED.
+ */
+
+#define GPIO_PARENT_PLACEHOLDER_PHANDLE     0x0
+
+/dts-v1/;
+/plugin/;
+
+/ {
+    fragment@0 {
+        target-path = "I2C_PARENT_PLACEHOLDER_STRING";
+        __overlay__ {
+            atsha204a {
+                compatible = "atmel,atsha204a";
+                reg = <FixedPcdGet32 (PcdSha204I2cAddress)>;
+            };
+            atecc508a {
+                compatible = "atmel,atecc508a";
+                reg = <FixedPcdGet32 (PcdEcc508I2cAddress)>;
+            };
+        };
+    };
+
+    fragment@1 {
+        target-path = "SPI_PARENT_PLACEHOLDER_STRING";
+        __overlay__ {
+            tpm {
+                compatible = "infineon,slb9670";
+                reg = <FixedPcdGet32 (PcdSpiTpmCs)>;
+                spi-max-frequency = <22500000>;
+            };
+        };
+    };
+
+    fragment@2 {
+        target-path = "/";
+        __overlay__ {
+            gpio-leds {
+                compatible = "gpio-leds";
+
+                secure96-u1 {
+                    gpios = <GPIO_PARENT_PLACEHOLDER_PHANDLE
+                            FixedPcdGet32 (PcdGpioLedU1)
+                            FixedPcdGet32 (PcdGpioLedPolarity)>;
+                };
+                secure96-u2 {
+                    gpios = <GPIO_PARENT_PLACEHOLDER_PHANDLE
+                            FixedPcdGet32 (PcdGpioLedU2)
+                            FixedPcdGet32 (PcdGpioLedPolarity)>;
+                };
+                secure96-u3 {
+                    gpios = <GPIO_PARENT_PLACEHOLDER_PHANDLE
+                            FixedPcdGet32 (PcdGpioLedU3)
+                            FixedPcdGet32 (PcdGpioLedPolarity)>;
+                };
+                secure96-u4 {
+                    gpios = <GPIO_PARENT_PLACEHOLDER_PHANDLE
+                            FixedPcdGet32 (PcdGpioLedU4)
+                            FixedPcdGet32 (PcdGpioLedPolarity)>;
+                };
+            };
+        };
+    };
+};
diff --git a/Platform/96boards/Secure96/Secure96.dec b/Platform/96boards/Secure96/Secure96.dec
new file mode 100644
index 000000000000..e2699eb324d7
--- /dev/null
+++ b/Platform/96boards/Secure96/Secure96.dec
@@ -0,0 +1,56 @@
+## @file
+#
+#  Device tree overlay for the 96boards Secure96 Mezzanine board
+#
+#  Copyright (c) 2018, Linaro Ltd. All rights reserved.
+#
+#  This program and the accompanying materials
+#  are licensed and made available under the terms and conditions of the BSD License
+#  which accompanies this distribution.  The full text of the license may be found at
+#  http://opensource.org/licenses/bsd-license.php
+#
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+##
+
+[Defines]
+  DEC_SPECIFICATION              = 0x0001001A
+  PACKAGE_NAME                   = Secure96
+  PACKAGE_GUID                   = 3e7de94f-01ac-47f1-a8e6-3c4a4ce1338e
+  PACKAGE_VERSION                = 0.1
+
+[Guids]
+  # PCD scope GUID
+  gSecure96TokenSpaceGuid = { 0x76eb3f47, 0x4d9f, 0x455e, { 0x8f, 0xd9, 0xcc, 0x48, 0x03, 0x87, 0xb8, 0x3e } }
+
+  # file GUID of the Secure96 DTB overlay
+  gSecure96DtbFileGuid = { 0xae548d4c, 0x9062, 0x4eed, { 0x83, 0x5f, 0xf5, 0x10, 0xf8, 0xfc, 0x48, 0xaf } }
+
+  # GUID to be installed by the platform as a protocol if the Secure96 mezzanine is present
+  gSecure96HardwarePresent = { 0x87e1c994, 0xebd9, 0x41b7, { 0x82, 0x8a, 0x4a, 0x92, 0x87, 0x14, 0x98, 0xa7 } }
+
+[PcdsFixedAtBuild]
+  # ASCII DT path to the GPIO parent node of the Secure 96 LEDs (e.g., "/gpio@51000000")
+  gSecure96TokenSpaceGuid.PcdGpioParent|""|VOID*|0x00000001
+
+  # GPIO polarity for the Secure96 LEDs (0 == GPIO_ACTIVE_HIGH, 1 == GPIO_ACTIVE_LOW)
+  gSecure96TokenSpaceGuid.PcdGpioLedPolarity|0|UINT32|0x00000002
+
+  # GPIO pin numbers for the Secure96 LEDs
+  gSecure96TokenSpaceGuid.PcdGpioLedU1|0|UINT32|0x00000003
+  gSecure96TokenSpaceGuid.PcdGpioLedU2|0|UINT32|0x00000004
+  gSecure96TokenSpaceGuid.PcdGpioLedU3|0|UINT32|0x00000005
+  gSecure96TokenSpaceGuid.PcdGpioLedU4|0|UINT32|0x00000006
+
+  # ASCII DT path to the I2C parent node of the Secure 96 (e.g., "/i2c@51210000")
+  gSecure96TokenSpaceGuid.PcdI2cParent|""|VOID*|0x00000007
+
+  gSecure96TokenSpaceGuid.PcdSha204I2cAddress|0x60|UINT32|0x00000008
+  gSecure96TokenSpaceGuid.PcdEcc508I2cAddress|0x61|UINT32|0x00000009
+
+  # ASCII DT path to the SPI parent node of the Secure 96 (e.g., "/spi@54810000")
+  gSecure96TokenSpaceGuid.PcdSpiParent|""|VOID*|0x0000000A
+
+  # SPI CS number for the Secure96 TPM
+  gSecure96TokenSpaceGuid.PcdSpiTpmCs|0|UINT32|0x0000000B
diff --git a/Platform/96boards/Secure96/Secure96Dxe/Secure96Dxe.c b/Platform/96boards/Secure96/Secure96Dxe/Secure96Dxe.c
new file mode 100644
index 000000000000..46c63fdfac57
--- /dev/null
+++ b/Platform/96boards/Secure96/Secure96Dxe/Secure96Dxe.c
@@ -0,0 +1,153 @@
+/** @file
+  96boards Secure96 mezzanine board DXE driver.
+
+  Copyright (c) 2018, Linaro, Ltd. All rights reserved.<BR>
+
+  This program and the accompanying materials are licensed and made available
+  under the terms and conditions of the BSD License which accompanies this
+  distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+**/
+
+#include <PiDxe.h>
+#include <libfdt.h>
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/DxeServicesLib.h>
+#include <Library/UefiLib.h>
+
+STATIC CONST CHAR8 mLedNodes[][46] = {
+  "/fragment@2/__overlay__/gpio-leds/secure96-u1",
+  "/fragment@2/__overlay__/gpio-leds/secure96-u2",
+  "/fragment@2/__overlay__/gpio-leds/secure96-u3",
+  "/fragment@2/__overlay__/gpio-leds/secure96-u4",
+};
+
+STATIC
+VOID
+SetOverlayFragmentTarget (
+  VOID            *Overlay,
+  CONST CHAR8     *NodeName,
+  CONST CHAR8     *Target
+  )
+{
+  INT32       Node;
+  INT32       Err;
+
+  Node = fdt_path_offset (Overlay, NodeName);
+  ASSERT (Node > 0);
+
+  Err = fdt_setprop (Overlay, Node, "target-path", Target,
+          AsciiStrLen (Target) + 1);
+  if (Err) {
+    DEBUG ((DEBUG_ERROR, "%a: fdt_setprop() failed - %a\n",
+      __FUNCTION__, fdt_strerror (Err)));
+  }
+}
+
+STATIC
+VOID
+FixupOverlay (
+  VOID        *Dtb,
+  VOID        *Overlay
+  )
+{
+  INT32       Node;
+  UINT32      GpioPhandle;
+  UINTN       Idx;
+  UINT32      *GpioProp;
+  INT32       Err;
+
+  //
+  // Set the correct GPIO phandle in the LED nodes
+  //
+  Node = fdt_path_offset (Dtb, FixedPcdGetPtr (PcdGpioParent));
+  ASSERT (Node > 0);
+
+  GpioPhandle = fdt_get_phandle (Dtb, Node);
+  if (!GpioPhandle) {
+    //
+    // Node has no phandle yet -> create one
+    //
+    GpioPhandle = 1 + fdt_get_max_phandle (Dtb);
+    ASSERT (GpioPhandle >= 1);
+
+    Err = fdt_setprop_u32 (Dtb, Node, "phandle", GpioPhandle);
+    if (Err) {
+      DEBUG ((DEBUG_ERROR,
+        "%a: fdt_setprop_u32(.., .., \"phandle\", 0x%x) failed - %a\n",
+        __FUNCTION__, GpioPhandle, fdt_strerror (Err)));
+    }
+  }
+
+  for (Idx = 0; Idx < ARRAY_SIZE (mLedNodes); Idx++) {
+    Node = fdt_path_offset (Overlay, mLedNodes[Idx]);
+    ASSERT (Node > 0);
+
+    GpioProp = fdt_getprop_w (Overlay, Node, "gpios", NULL);
+    ASSERT (GpioProp != NULL);
+
+    *GpioProp = cpu_to_fdt32 (GpioPhandle);
+  }
+
+  SetOverlayFragmentTarget (Overlay, "/fragment@0",
+    FixedPcdGetPtr (PcdI2cParent));
+
+  SetOverlayFragmentTarget (Overlay, "/fragment@1",
+    FixedPcdGetPtr (PcdSpiParent));
+}
+
+EFI_STATUS
+EFIAPI
+Secure96DxeEntryPoint (
+  IN EFI_HANDLE         ImageHandle,
+  IN EFI_SYSTEM_TABLE   *SystemTable
+  )
+{
+  EFI_STATUS      Status;
+  VOID            *Dtb;
+  VOID            *Overlay;
+  UINTN           OverlaySize;
+  INT32           Err;
+
+  //
+  // Find the DTB in the configuration table array. If it isn't there, just
+  // bail without an error: we may be running on an ACPI platform even if
+  // this driver does not support it [yet].
+  //
+  Status = EfiGetSystemConfigurationTable (&gFdtTableGuid, &Dtb);
+  if (Status == EFI_NOT_FOUND) {
+    return EFI_SUCCESS;
+  }
+  ASSERT_EFI_ERROR (Status);
+
+  //
+  // Load the raw overlay DTB image by its file GUID.
+  //
+  Status = GetSectionFromAnyFv (&gSecure96DtbFileGuid,
+             EFI_SECTION_RAW, 0, &Overlay, &OverlaySize);
+  ASSERT_EFI_ERROR (Status);
+  if (EFI_ERROR (Status)) {
+    return EFI_NOT_FOUND;
+  }
+
+  //
+  // Fix up unresolved references in the overlay.
+  //
+  FixupOverlay (Dtb, Overlay);
+
+  //
+  // Merge the overlay with the DTB
+  //
+  Err = fdt_overlay_apply (Dtb, Overlay);
+  if (Err) {
+    DEBUG ((DEBUG_ERROR, "%a: fdt_overlay_apply() failed - %a\n",
+      __FUNCTION__, fdt_strerror (Err)));
+    return EFI_NOT_FOUND;
+  }
+
+  return EFI_SUCCESS;
+}
diff --git a/Platform/96boards/Secure96/Secure96Dxe/Secure96Dxe.inf b/Platform/96boards/Secure96/Secure96Dxe/Secure96Dxe.inf
new file mode 100644
index 000000000000..9374f7992c25
--- /dev/null
+++ b/Platform/96boards/Secure96/Secure96Dxe/Secure96Dxe.inf
@@ -0,0 +1,51 @@
+## @file
+#
+#  Copyright (c) 2018, Linaro, Ltd. All rights reserved.<BR>
+#
+#  This program and the accompanying materials
+#  are licensed and made available under the terms and conditions of the BSD License
+#  which accompanies this distribution.  The full text of the license may be found at
+#  http://opensource.org/licenses/bsd-license.php
+#
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+##
+
+[Defines]
+  INF_VERSION                    = 0x0001001A
+  BASE_NAME                      = Secure96Dxe
+  FILE_GUID                      = 31519ec4-65f1-4790-b223-aa9330dd75fd
+  MODULE_TYPE                    = DXE_DRIVER
+  VERSION_STRING                 = 1.0
+  ENTRY_POINT                    = Secure96DxeEntryPoint
+
+[Sources]
+  Secure96Dxe.c
+
+[Packages]
+  EmbeddedPkg/EmbeddedPkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  MdePkg/MdePkg.dec
+  Platform/96boards/Secure96/Secure96.dec
+
+[LibraryClasses]
+  BaseLib
+  DebugLib
+  DxeServicesLib
+  FdtLib
+  UefiDriverEntryPoint
+  UefiLib
+
+[Guids]
+  gFdtTableGuid
+  gSecure96DtbFileGuid
+  gSecure96HardwarePresent
+
+[FixedPcd]
+  gSecure96TokenSpaceGuid.PcdGpioParent
+  gSecure96TokenSpaceGuid.PcdI2cParent
+  gSecure96TokenSpaceGuid.PcdSpiParent
+
+[Depex]
+  gSecure96HardwarePresent
