public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Ard Biesheuvel <ard.biesheuvel@linaro.org>
To: edk2-devel@lists.01.org
Cc: leif.lindholm@linaro.org, joakim.bech@linaro.org,
	Ard Biesheuvel <ard.biesheuvel@linaro.org>
Subject: [PATCH edk2-platforms 3/5] Platform: add support for 96boards Secure96 mezzanine adapter
Date: Thu, 15 Feb 2018 17:20:52 +0000	[thread overview]
Message-ID: <20180215172054.27452-4-ard.biesheuvel@linaro.org> (raw)
In-Reply-To: <20180215172054.27452-1-ard.biesheuvel@linaro.org>

Add an overlay device tree describing the Secure96 mezzanine adapter,
parameterised using PCDs. This allows this image, and the accompanying
driver to be incorporated into any platform that may have such a board
connected to its 96board low speed (LS) connector.

Note that this relies on runtime support for overlays, which is part of
our FdtLib implementation. However, no overlay support is required in
the device tree compiler, since this support is fairly new (and it is
rather hard to pass phandle names via PCDs anyway). So instead, the
accompanying driver retrieves the phandle of the GPIO programmatically,
and pokes it into the overlay before applying it.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
 Platform/96boards/Secure96/DeviceTree/DeviceTree.inf   |  40 +++++
 Platform/96boards/Secure96/DeviceTree/Secure96.dts     |  74 ++++++++++
 Platform/96boards/Secure96/Secure96.dec                |  56 +++++++
 Platform/96boards/Secure96/Secure96Dxe/Secure96Dxe.c   | 153 ++++++++++++++++++++
 Platform/96boards/Secure96/Secure96Dxe/Secure96Dxe.inf |  51 +++++++
 5 files changed, 374 insertions(+)

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
-- 
2.11.0



  parent reply	other threads:[~2018-02-15 17:15 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-15 17:20 [PATCH edk2-platforms 0/5] Add Secure96 mezzanine support Ard Biesheuvel
2018-02-15 17:20 ` [PATCH edk2-platforms 1/5] Silicon/SynQuaver/DeviceTree: add node for SPI controller Ard Biesheuvel
2018-02-16 17:00   ` Leif Lindholm
2018-02-16 18:34     ` Ard Biesheuvel
2018-02-18 11:39       ` Leif Lindholm
2018-02-19  8:20         ` Ard Biesheuvel
2018-02-19 11:48           ` Leif Lindholm
2018-02-15 17:20 ` [PATCH edk2-platforms 2/5] Silicon/SynQuaver/DeviceTree: add node for I2C controller Ard Biesheuvel
2018-02-15 17:20 ` Ard Biesheuvel [this message]
2018-02-15 17:20 ` [PATCH edk2-platforms 4/5] Silicon/SynQuacer/PlatformDxe: add menu option to select mezzanine Ard Biesheuvel
2018-02-15 17:20 ` [PATCH edk2-platforms 5/5] Platform/Socionext/DeveloperBox: add Secure96 support Ard Biesheuvel
2018-02-16 17:35 ` [PATCH edk2-platforms 0/5] Add Secure96 mezzanine support Leif Lindholm
2018-02-16 18:41   ` Ard Biesheuvel
2018-02-21 12:10 ` Ard Biesheuvel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180215172054.27452-4-ard.biesheuvel@linaro.org \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox