Wire up the new 96boards mezzanine SSDT loading support, and use it to describe the four GPIO LEDs on the Secure96 mezzanine board.
Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ard Biesheuvel <[email protected]> --- Platform/96Boards/Secure96Dxe/Secure96.asl | 103 ++++++++++++++++++++ Platform/96Boards/Secure96Dxe/Secure96Dxe.c | 59 ++++++++++- Platform/96Boards/Secure96Dxe/Secure96Dxe.inf | 1 + 3 files changed, 158 insertions(+), 5 deletions(-) diff --git a/Platform/96Boards/Secure96Dxe/Secure96.asl b/Platform/96Boards/Secure96Dxe/Secure96.asl new file mode 100644 index 000000000000..bb9dac462a33 --- /dev/null +++ b/Platform/96Boards/Secure96Dxe/Secure96.asl @@ -0,0 +1,103 @@ +/** @file + * Copyright (c) 2019, 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. + */ + +#include "Secure96.h" + +DefinitionBlock ("Secure96.aml", "SSDT", 2, "LINARO", "SECURE96", 1) +{ + External (\_SB.LS96.GPIO) + + Scope (_SB) + { + Device (LD96) + { + Name (_HID, "PRP0001") // _HID: Hardware ID + Name (_UID, 0x00) // _UID: Unique ID + Name (_DSD, Package () { + ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), + Package () { + Package () { "compatible", "gpio-leds" }, + } + }) + + Method (_CRS) + { + Return (\_SB.LS96.GPIO) + } + + Device (LDU1) + { + Name (_ADR, 0x1) + Name (_DSD, Package () { + ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), + Package () { + Package () { "label", "secure96-u1" }, + Package () { "gpios", + Package () { + ^^LD96, 0, 6, FixedPcdGet32 (PcdGpioPolarity) + }, + }, + } + }) + } + + Device (LDU2) + { + Name (_ADR, 0x2) + Name (_DSD, Package () { + ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), + Package () { + Package () { "label", "secure96-u2" }, + Package () { "gpios", + Package () { + ^^LD96, 0, 5, FixedPcdGet32 (PcdGpioPolarity) + }, + }, + } + }) + } + + Device (LDU3) + { + Name (_ADR, 0x3) + Name (_DSD, Package () { + ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), + Package () { + Package () { "label", "secure96-u3" }, + Package () { "gpios", + Package () { + ^^LD96, 0, 8, FixedPcdGet32 (PcdGpioPolarity) + }, + }, + } + }) + } + + Device (LDU4) + { + Name (_ADR, 0x4) + Name (_DSD, Package () { + ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), + Package () { + Package () { "label", "secure96-u4" }, + Package () { "gpios", + Package () { + ^^LD96, 0, 7, FixedPcdGet32 (PcdGpioPolarity) + }, + }, + } + }) + } + } + } +} diff --git a/Platform/96Boards/Secure96Dxe/Secure96Dxe.c b/Platform/96Boards/Secure96Dxe/Secure96Dxe.c index 6c48d7c0b024..68f8ec812b52 100644 --- a/Platform/96Boards/Secure96Dxe/Secure96Dxe.c +++ b/Platform/96Boards/Secure96Dxe/Secure96Dxe.c @@ -24,6 +24,8 @@ #include "Secure96.h" +#define SECURE96_SSDT_OEM_TABLE_ID SIGNATURE_64('S','E','C','U','R','E','9','6') + STATIC CONST UINT32 mI2cAtmelSha204aSlaveAddress[] = { ATSHA204A_SLAVE_ADDRESS, @@ -148,15 +150,20 @@ ApplyDeviceTreeOverlay ( UINTN OverlaySize; EFI_STATUS Status; INT32 Err; + UINTN Index; // // Load the raw overlay DTB image from the raw section of this FFS file. // - Status = GetSectionFromFv (&gEfiCallerIdGuid, - EFI_SECTION_RAW, 0, &Overlay, &OverlaySize); - ASSERT_EFI_ERROR (Status); - if (EFI_ERROR (Status)) { - return EFI_NOT_FOUND; + for (Index = 0;; Index++) { + Status = GetSectionFromFv (&gEfiCallerIdGuid, + EFI_SECTION_RAW, Index, &Overlay, &OverlaySize); + if (EFI_ERROR (Status)) { + return EFI_NOT_FOUND; + } + if (!fdt_check_header (Overlay)) { + break; + } } // @@ -177,8 +184,50 @@ ApplyDeviceTreeOverlay ( return EFI_SUCCESS; } +/** + Install the mezzanine's SSDT table + + @param[in] This Pointer to the MEZZANINE_PROTOCOL instance. + @param[in] Dtb Pointer to the device tree blob + + @return EFI_SUCCESS Operation succeeded. + @return other An error has occurred. +**/ +STATIC +EFI_STATUS +EFIAPI +InstallSsdtTable ( + IN MEZZANINE_PROTOCOL *This, + IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol + ) +{ + EFI_ACPI_DESCRIPTION_HEADER *Ssdt; + UINTN SsdtSize; + EFI_STATUS Status; + UINTN Index; + UINTN TableKey; + + // + // Load SSDT table from the raw section of this FFS file. + // + for (Index = 0;; Index++) { + Status = GetSectionFromFv (&gEfiCallerIdGuid, EFI_SECTION_RAW, Index, + (VOID **)&Ssdt, &SsdtSize); + if (EFI_ERROR (Status)) { + return EFI_NOT_FOUND; + } + if (SsdtSize >= sizeof (EFI_ACPI_DESCRIPTION_HEADER) && + Ssdt->OemTableId == SECURE96_SSDT_OEM_TABLE_ID) { + break; + } + } + return AcpiProtocol->InstallAcpiTable (AcpiProtocol, Ssdt, SsdtSize, + &TableKey); +} + STATIC MEZZANINE_PROTOCOL mMezzanine = { ApplyDeviceTreeOverlay, + InstallSsdtTable, ARRAY_SIZE (mI2c0Devices), 0, mI2c0Devices, diff --git a/Platform/96Boards/Secure96Dxe/Secure96Dxe.inf b/Platform/96Boards/Secure96Dxe/Secure96Dxe.inf index 72dbf1314c15..ce4c8b5f8fa5 100644 --- a/Platform/96Boards/Secure96Dxe/Secure96Dxe.inf +++ b/Platform/96Boards/Secure96Dxe/Secure96Dxe.inf @@ -21,6 +21,7 @@ [Defines] ENTRY_POINT = Secure96DxeEntryPoint [Sources] + Secure96.asl Secure96.dts Secure96.h Secure96Dxe.c -- 2.20.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#39551): https://edk2.groups.io/g/devel/message/39551 Mute This Topic: https://groups.io/mt/31341744/21656 Group Owner: [email protected] Unsubscribe: https://edk2.groups.io/g/devel/unsub [[email protected]] -=-=-=-=-=-=-=-=-=-=-=-
