From patchwork Thu Feb 15 17:20:52 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 128487 Delivered-To: patch@linaro.org Received: by 10.46.124.24 with SMTP id x24csp1984726ljc; Thu, 15 Feb 2018 09:21:18 -0800 (PST) X-Google-Smtp-Source: AH8x224ggVLzhH57atu0LTxBX4QsjfjpqR/9dOsjKiXbhQIIDeBKcOg3rYRwl7eNjZXRtkrOe8BR X-Received: by 10.99.176.68 with SMTP id z4mr932831pgo.74.1518715278587; Thu, 15 Feb 2018 09:21:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518715278; cv=none; d=google.com; s=arc-20160816; b=mLeKpPBIbRtyjCnCZQj0IswzJJlcDEG8w6jOe60AcKz5V+wLZMbo65VmJogKcJOHQa lui5NQ78yObeHZvBaGSMeqiFWJvAdLU/HAh22V8z35job/V3R7E2Ljv44piwKqw8s5YI Ct07xnnJ6AseLoHBlBQIk2UBkZlSvHDHhdqb8Mdv6ezMxA0lIbvTdxrZJMTQYThQl7Hq La6PFSzB/pUa7AO81ROXcUewZUsa2Wfmmj85n086QlBdjann1/EO1epU6HOoDNt/BP1k go/AAlH9uchFeU88oQTFLH7pPHDILQKN32vtXcBZKNlTdZ9mhdaW4RD0TYuHKvGJ/Ijh tM+g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=RStfDculwyj2el0j8qwJWoas/piECWEyCBCUyAhbEZ8=; b=SqVDv+LRBB2wNVM+MEezwKZ15NxezcSwqn+4Z16Znm1R0kGyTJpyzXLkp5fiH0BE2g A7QhqlNV8gcBB1aKMJF62tCX67gLY6umLnqojxbNtDOF5XR7Vud83V7b6muiMzD2p/KD ZI/us0ZF4zyzLIoNnie3qWTvSb1pNl0vTdDuuD1h8PYK8UQWBbElLuCMhvyvpDtudEPm njm5wCYBlipDVdjx/BfnDESqYpkJZM9ZUMelF2mN5QkmHkamWD/33+SY53o0gKe4W9tT gLCZt84mcsxDhGZvLVl6QcLsXg7DvyW2z9/lxhg6ndqAV+HED/LuADA03NcGdW509rrb Ip1Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=J8OURmiG; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from ml01.01.org (ml01.01.org. [2001:19d0:306:5::1]) by mx.google.com with ESMTPS id l1si1491340pgn.324.2018.02.15.09.21.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 15 Feb 2018 09:21:18 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) client-ip=2001:19d0:306:5::1; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=J8OURmiG; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 3EB2C21E0B9FA; Thu, 15 Feb 2018 09:15:23 -0800 (PST) X-Original-To: edk2-devel@lists.01.org Delivered-To: edk2-devel@lists.01.org Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2a00:1450:400c:c0c::242; helo=mail-wr0-x242.google.com; envelope-from=ard.biesheuvel@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-wr0-x242.google.com (mail-wr0-x242.google.com [IPv6:2a00:1450:400c:c0c::242]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id CE0442095C73C for ; Thu, 15 Feb 2018 09:15:20 -0800 (PST) Received: by mail-wr0-x242.google.com with SMTP id m5so437271wrg.1 for ; Thu, 15 Feb 2018 09:21:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=CZ4wAcsT+5wWRMMosjNqCDK5dspmhDLlbCKqgfVVz5A=; b=J8OURmiGQy0dgz3F+36nPalRwgM9MAzWMuW5eJC3Ps58W8AWQrCsXiWehqj2I/mLsP P5CZgpiDYiZNy4QhWZjbxQCJK5zqsvZS2rw3IKOHLNWf2iEC2G7k6FCgtv858h9hXGMR CV9zcZhtse+qQSg9buITLyvVOONvZe1qB17/o= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=CZ4wAcsT+5wWRMMosjNqCDK5dspmhDLlbCKqgfVVz5A=; b=dBmHWB7nGvNm21xdqIQBFQmCMQ279U3wxDHstolLZ6fTSw3W2GlbPDj3ofNu2BFPHH tJgItOeI63QES02/WAbspxoNv+5cgBF7/PyoMCFUaJfSkVil6Wyv6t2gfG2YbeCR2f4/ DF1zgT0yhXQ4phKCrvJRZ9hxnzNFs8a8R72eL76Ap2MN/kSP63s/8uUaidVUX94yy6Rh cwkhqUmZoWLeHyryojkg5QPkb1MfYYIfM6Yu4CrlwF3wE3i3GjSoHq+XX95dyq0tnL+S p4eE5wzOtrr1j/5HdYYpSOgcE68wnX9rwwyCzpTvlLmGX0/QEeawQlexrzE3++ZuG5EL 98mA== X-Gm-Message-State: APf1xPDDBoIrK4NyPZgRsAzECnWNPDGGe+Qlz9UPRiuQaUzA9wHRbyuN zdhBZEppH/XcPDxjfI2NBJEq7AVEQtw= X-Received: by 10.223.175.235 with SMTP id y43mr3071031wrd.41.1518715271893; Thu, 15 Feb 2018 09:21:11 -0800 (PST) Received: from localhost.localdomain ([154.145.114.50]) by smtp.gmail.com with ESMTPSA id j125sm14142363wmd.19.2018.02.15.09.21.10 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 15 Feb 2018 09:21:10 -0800 (PST) From: Ard Biesheuvel To: edk2-devel@lists.01.org Date: Thu, 15 Feb 2018 17:20:52 +0000 Message-Id: <20180215172054.27452-4-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180215172054.27452-1-ard.biesheuvel@linaro.org> References: <20180215172054.27452-1-ard.biesheuvel@linaro.org> Subject: [edk2] [PATCH edk2-platforms 3/5] Platform: add support for 96boards Secure96 mezzanine adapter X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: joakim.bech@linaro.org, leif.lindholm@linaro.org, Ard Biesheuvel MIME-Version: 1.0 Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" 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 --- 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(+) -- 2.11.0 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel 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 = ; + }; + atecc508a { + compatible = "atmel,atecc508a"; + reg = ; + }; + }; + }; + + fragment@1 { + target-path = "SPI_PARENT_PLACEHOLDER_STRING"; + __overlay__ { + tpm { + compatible = "infineon,slb9670"; + reg = ; + spi-max-frequency = <22500000>; + }; + }; + }; + + fragment@2 { + target-path = "/"; + __overlay__ { + gpio-leds { + compatible = "gpio-leds"; + + secure96-u1 { + gpios = ; + }; + secure96-u2 { + gpios = ; + }; + secure96-u3 { + gpios = ; + }; + secure96-u4 { + gpios = ; + }; + }; + }; + }; +}; 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.
+ + 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 +#include +#include +#include +#include +#include + +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.
+# +# 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