Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Leo Duran leo.duran@amd.com --- .../Styx/Drivers/FdtDxe/AArch64/BdsLinuxLoader.c | 122 ---- .../Drivers/FdtDxe/AArch64/BdsLinuxLoaderHelper.S | 87 --- Platforms/AMD/Styx/Drivers/FdtDxe/BdsLinuxFdt.c | 754 --------------------- Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.c | 279 -------- Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.h | 55 -- Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.inf | 90 --- Platforms/AMD/Styx/Drivers/FdtDxe/LinuxLoader.h | 166 ----- .../AMD/Styx/Drivers/FdtDxe/LinuxLoaderHelper.c | 192 ------ Platforms/AMD/Styx/FdtBlob/styx-husky.dtb | Bin 8093 -> 0 bytes Platforms/AMD/Styx/FdtBlob/styx-husky.dts | 435 ------------ Platforms/AMD/Styx/FdtBlob/styx-overdrive.dtb | Bin 8089 -> 0 bytes Platforms/AMD/Styx/FdtBlob/styx-overdrive.dts | 435 ------------ .../AMD/Styx/OverdriveBoard/FdtBlob/styx-husky.dtb | Bin 0 -> 8093 bytes .../AMD/Styx/OverdriveBoard/FdtBlob/styx-husky.dts | 435 ++++++++++++ .../Styx/OverdriveBoard/FdtBlob/styx-overdrive.dtb | Bin 0 -> 8089 bytes .../Styx/OverdriveBoard/FdtBlob/styx-overdrive.dts | 435 ++++++++++++ .../OverdriveBoard/FdtDxe/AArch64/BdsLinuxLoader.c | 122 ++++ .../FdtDxe/AArch64/BdsLinuxLoaderHelper.S | 87 +++ .../AMD/Styx/OverdriveBoard/FdtDxe/BdsLinuxFdt.c | 754 +++++++++++++++++++++ Platforms/AMD/Styx/OverdriveBoard/FdtDxe/FdtDxe.c | 279 ++++++++ Platforms/AMD/Styx/OverdriveBoard/FdtDxe/FdtDxe.h | 55 ++ .../AMD/Styx/OverdriveBoard/FdtDxe/FdtDxe.inf | 90 +++ .../AMD/Styx/OverdriveBoard/FdtDxe/LinuxLoader.h | 166 +++++ .../Styx/OverdriveBoard/FdtDxe/LinuxLoaderHelper.c | 192 ++++++ .../AMD/Styx/OverdriveBoard/OverdriveBoard.dsc | 2 +- .../AMD/Styx/OverdriveBoard/OverdriveBoard.fdf | 4 +- 26 files changed, 2618 insertions(+), 2618 deletions(-) delete mode 100644 Platforms/AMD/Styx/Drivers/FdtDxe/AArch64/BdsLinuxLoader.c delete mode 100644 Platforms/AMD/Styx/Drivers/FdtDxe/AArch64/BdsLinuxLoaderHelper.S delete mode 100644 Platforms/AMD/Styx/Drivers/FdtDxe/BdsLinuxFdt.c delete mode 100644 Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.c delete mode 100644 Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.h delete mode 100644 Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.inf delete mode 100644 Platforms/AMD/Styx/Drivers/FdtDxe/LinuxLoader.h delete mode 100644 Platforms/AMD/Styx/Drivers/FdtDxe/LinuxLoaderHelper.c delete mode 100644 Platforms/AMD/Styx/FdtBlob/styx-husky.dtb delete mode 100644 Platforms/AMD/Styx/FdtBlob/styx-husky.dts delete mode 100644 Platforms/AMD/Styx/FdtBlob/styx-overdrive.dtb delete mode 100644 Platforms/AMD/Styx/FdtBlob/styx-overdrive.dts create mode 100644 Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-husky.dtb create mode 100644 Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-husky.dts create mode 100644 Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-overdrive.dtb create mode 100644 Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-overdrive.dts create mode 100644 Platforms/AMD/Styx/OverdriveBoard/FdtDxe/AArch64/BdsLinuxLoader.c create mode 100644 Platforms/AMD/Styx/OverdriveBoard/FdtDxe/AArch64/BdsLinuxLoaderHelper.S create mode 100644 Platforms/AMD/Styx/OverdriveBoard/FdtDxe/BdsLinuxFdt.c create mode 100644 Platforms/AMD/Styx/OverdriveBoard/FdtDxe/FdtDxe.c create mode 100644 Platforms/AMD/Styx/OverdriveBoard/FdtDxe/FdtDxe.h create mode 100644 Platforms/AMD/Styx/OverdriveBoard/FdtDxe/FdtDxe.inf create mode 100644 Platforms/AMD/Styx/OverdriveBoard/FdtDxe/LinuxLoader.h create mode 100644 Platforms/AMD/Styx/OverdriveBoard/FdtDxe/LinuxLoaderHelper.c
diff --git a/Platforms/AMD/Styx/Drivers/FdtDxe/AArch64/BdsLinuxLoader.c b/Platforms/AMD/Styx/Drivers/FdtDxe/AArch64/BdsLinuxLoader.c deleted file mode 100644 index 8e6fbfc..0000000 --- a/Platforms/AMD/Styx/Drivers/FdtDxe/AArch64/BdsLinuxLoader.c +++ /dev/null @@ -1,122 +0,0 @@ -/** @file -* -* Copyright (c) 2011-2014, ARM Limited. All rights reserved.<BR> -* Copyright (c) 2014 - 2015, AMD Inc. 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. -* -**/ -/** - Derived from: - ArmPkg/Library/BdsLib/AArch64/BdsLinuxLoader.c - -**/ - -#include <Library/PcdLib.h> -#include <Base.h> -#include <BdsLib/BdsInternal.h> -#include <Library/ArmGicLib.h> -#include <Library/IoLib.h> - -#include <AmdStyxHelperLib.h> - -/* These externs are used to relocate some ASM code into Linux memory. */ -extern VOID *SecondariesPenStart; -extern VOID *SecondariesPenEnd; -extern UINTN *AsmParkingBase; -extern UINTN *AsmMailboxBase; - -extern EFI_BOOT_SERVICES *gBS; - -VOID -EFIAPI -AmdStyxMoveParkedCores( - VOID - ) -{ - EFI_STATUS Status; - EFI_PHYSICAL_ADDRESS MpParkingBase; - UINTN MpParkingSize; - EFI_PHYSICAL_ADDRESS PenBase; - UINTN PenSize; - UINTN MailboxBase; - ARM_PROCESSOR_TABLE *ArmProcessorTable; - ARM_CORE_INFO *ArmCoreInfoTable; - UINTN ArmCoreCount; - UINTN CoreNum; - UINTN CoreMailbox; - UINTN CoreParking; - - // Get core information - ArmProcessorTable = AmdStyxGetArmProcessorTable(); - ASSERT_EFI_ERROR (ArmProcessorTable == NULL); - ArmCoreInfoTable = ArmProcessorTable->ArmCpus; - ArmCoreCount = ArmProcessorTable->NumberOfEntries; - - // Get Parking area (4KB-aligned, 4KB per core) - MpParkingBase = FixedPcdGet64 (PcdParkingProtocolBase); - ASSERT_EFI_ERROR (MpParkingBase & (SIZE_4KB - 1)); - MpParkingSize = ArmCoreCount * SIZE_4KB; - ASSERT_EFI_ERROR (MpParkingSize > FixedPcdGet64 (PcdParkingProtocolSize)); - - // - // Set Pen at the 2K-offset of the Parking area, skipping an 8-byte slot for the Core#. - // For details, refer to the "Multi-processor Startup for ARM Platforms" document: - // https://acpica.org/sites/acpica/files/MP%20Startup%20for%20ARM%20platforms.d... - // - PenBase = (EFI_PHYSICAL_ADDRESS)((UINTN)MpParkingBase + SIZE_2KB + sizeof(UINT64)); - PenSize = (UINTN)&SecondariesPenEnd - (UINTN)&SecondariesPenStart; - - // Reserve the memory as RuntimeServices - Status = gBS->AllocatePages (AllocateAddress, EfiRuntimeServicesCode, - EFI_SIZE_TO_PAGES (MpParkingSize ), &MpParkingBase ); - if (EFI_ERROR (Status)) { - Print (L"Warning: Failed to reserve memory for MP-Parking protocol at 0x%lX, Status = %r\n", - MpParkingBase, Status); - // Even if there is a risk of memory corruption we carry on - } - - // Relocate the Pen code - CopyMem ((VOID*)(PenBase), (VOID*)&SecondariesPenStart, PenSize); - - // Put spin-table mailboxes below the pen code so we know where they are relative to code. - // Make sure this is 8 byte aligned. - MailboxBase = (UINTN)PenBase + ((UINTN)&SecondariesPenEnd - (UINTN)&SecondariesPenStart); - if (MailboxBase % sizeof(UINT64) != 0) { - MailboxBase += sizeof(UINT64) - MailboxBase % sizeof(UINT64); - } - - // Update variables used in the Pen code - *(UINTN*)(PenBase + ((UINTN)&AsmMailboxBase - (UINTN)&SecondariesPenStart)) = MailboxBase; - *(UINTN*)(PenBase + ((UINTN)&AsmParkingBase - (UINTN)&SecondariesPenStart)) = (UINTN)MpParkingBase; - - for (CoreNum = 0; CoreNum < ArmCoreCount; CoreNum++) { - // Clear the jump address at spin-table slot - CoreMailbox = MailboxBase + CoreNum * sizeof (UINT64); - *((UINTN*)(CoreMailbox)) = 0x0; - - // Clear the jump address and set Core# at mp-parking slot - CoreParking = (UINTN)MpParkingBase + CoreNum * SIZE_4KB; - *((UINTN*)(CoreParking + sizeof (UINT64))) = 0x0; - *((UINTN*)(CoreParking + SIZE_2KB)) = CoreNum; - - // Move secondary core to our new Pen - MmioWrite64(ArmCoreInfoTable[CoreNum].MailboxSetAddress, (UINTN)PenBase); - - // Update table entry to be consumed by FDT parser. - ArmCoreInfoTable[CoreNum].MailboxSetAddress = CoreMailbox; - } - - // Flush caches to make sure our pen gets to memory before we release secondary cores. - ArmCleanDataCache(); - - // Send msg to secondary cores to jump to our new Pen. - ArmGicSendSgiTo (PcdGet32(PcdGicDistributorBase), ARM_GIC_ICDSGIR_FILTER_EVERYONEELSE, 0x0E, PcdGet32 (PcdGicSgiIntId)); -} - diff --git a/Platforms/AMD/Styx/Drivers/FdtDxe/AArch64/BdsLinuxLoaderHelper.S b/Platforms/AMD/Styx/Drivers/FdtDxe/AArch64/BdsLinuxLoaderHelper.S deleted file mode 100644 index d400a9c..0000000 --- a/Platforms/AMD/Styx/Drivers/FdtDxe/AArch64/BdsLinuxLoaderHelper.S +++ /dev/null @@ -1,87 +0,0 @@ -// -// Copyright (c) 2011-2013, ARM Limited. All rights reserved. -// Copyright (c) 2014 - 2015, AMD Inc. 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. -// -//** -// Derived from: -// ArmPkg/Library/BdsLib/AArch64/BdsLinuxLoaderHelper.S -// -//** - -/* Secondary core pens for AArch64 Linux booting. - - This code is placed in Linux kernel memory and marked reserved. UEFI ensures - that the secondary cores get to this pen and the kernel can then start the - cores from here. - NOTE: This code must be self-contained. -*/ - -#include <Library/ArmLib.h> - -.text -.align 3 - -GCC_ASM_EXPORT(SecondariesPenStart) -ASM_GLOBAL SecondariesPenEnd - -ASM_PFX(SecondariesPenStart): - // Registers x0-x3 are reserved for future use and should be set to zero. - mov x0, xzr - mov x1, xzr - mov x2, xzr - mov x3, xzr - - mrs x4, mpidr_el1 // Get MPCore register - and x5, x4, #ARM_CORE_MASK // Get core number - and x4, x4, #ARM_CLUSTER_MASK // Get cluster number - - add x4, x5, x4, LSR #7 // Add scaled cluster number to core number - mov x6, x4 // Save a copy to compute mp-parking offset - - ldr x5, AsmMailboxBase // Get mailbox addr relative to PC - lsl x4, x4, 3 // Add 8-byte offset for this core - add x4, x4, x5 // - - ldr x5, AsmParkingBase // Get mp-parking addr relative to PC - lsl x6, x6, 12 // Add 4K-byte offset for this core - add x6, x6, x5 // - - mov x5, 1 // Get mp-parking id# at 2K offset - lsl x5, x5, 11 // - add x5, x5, x6 // - ldr x10, [x5] // - -1: ldr x5, [x4] // Load jump-addr from spin-table mailbox - cmp xzr, x5 // Has the value been set? - b.ne 4f // If so, break out of loop - - ldr x5, [x6] // Load mp-parking id# - cmp w10, w5 // Is it my id? - b.ne 2f // If not, continue polling - - ldr x5, [x6, 8] // Load jump-addr from mp-parking - cmp xzr, x5 // Has the value been set? - b.ne 3f // If so, break out of loop - -2: wfe // Wait a bit - b 1b // Wait over, check again - -3: str xzr, [x6, 8] // Clear to acknowledge - mov x0, x6 // Return mp-parking address -4: br x5 // Jump to new addr - -.align 3 // Make sure the variable below is 8 byte aligned. - .global AsmParkingBase -AsmParkingBase: .xword 0xdeaddeadbeefbeef - .global AsmMailboxBase -AsmMailboxBase: .xword 0xdeaddeadbeefbeef - -SecondariesPenEnd: diff --git a/Platforms/AMD/Styx/Drivers/FdtDxe/BdsLinuxFdt.c b/Platforms/AMD/Styx/Drivers/FdtDxe/BdsLinuxFdt.c deleted file mode 100644 index 0d03bd7..0000000 --- a/Platforms/AMD/Styx/Drivers/FdtDxe/BdsLinuxFdt.c +++ /dev/null @@ -1,754 +0,0 @@ -/** @file -* -* Copyright (c) 2011-2014, ARM Limited. All rights reserved.<BR> -* Copyright (c) 2014 - 2015, AMD Inc. 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. -* -**/ -/** - Derived from: - ArmPkg/Library/BdsLib/BdsLinuxFdt.c - -**/ - -#include <Library/PcdLib.h> -#include <libfdt.h> - -#include <BdsLib/BdsInternal.h> - -#include <AmdStyxHelperLib.h> - -//#define LINUX_FDT_MAX_OFFSET (PcdGet64 (PcdUefiEntryAddress) + PcdGet32(PcdArmLinuxFdtMaxOffset)) -#define LINUX_FDT_MAX_OFFSET (PcdGet64 (PcdSystemMemoryBase) + PcdGet32(PcdArmLinuxFdtMaxOffset)) - - -// Additional size that could be used for FDT entries added by the UEFI OS Loader -// Estimation based on: EDID (300bytes) + bootargs (200bytes) + initrd region (20bytes) -// + system memory region (20bytes) + mp_core entries (200 bytes) -#define FDT_ADDITIONAL_ENTRIES_SIZE 0x300 - - -EFI_STATUS -GetSystemMemoryResources ( - IN LIST_ENTRY *ResourceList - ); - -VOID -DebugDumpFdt ( - IN VOID* FdtBlob - ); - -#define ALIGN(x, a) (((x) + ((a) - 1)) & ~((a) - 1)) -#define PALIGN(p, a) ((void *)(ALIGN((unsigned long)(p), (a)))) -#define GET_CELL(p) (p += 4, *((const UINT32 *)(p-4))) - -// -// PMU interrupts per core -// -#pragma pack(push, 1) -typedef struct { - UINT32 Flag; // 0 == SPI - UINT32 IntId; // GSIV == IntId+32 - UINT32 Type; // 4 == Level-Sensitive, Active-High -} PMU_INTERRUPT; -#pragma pack(pop) - -#define PMU_INT_FLAG_SPI 0 -#define PMU_INT_TYPE_HIGH_LEVEL 4 - - -typedef struct { - UINTN Base; - UINTN Size; -} FdtRegion; - - -STATIC -UINTN -cpu_to_fdtn (UINTN x) { - if (sizeof (UINTN) == sizeof (UINT32)) { - return cpu_to_fdt32 (x); - } else { - return cpu_to_fdt64 (x); - } -} - - -STATIC -BOOLEAN -ClusterInRange( - IN ARM_CORE_INFO *ArmCoreInfoTable, - IN UINTN ClusterId, - IN UINTN LowIndex, - IN UINTN HighIndex - ) -{ - do { - if (ClusterId == ArmCoreInfoTable[LowIndex].ClusterId) - return TRUE; - } while (++LowIndex <= HighIndex); - - return FALSE; -} - - -STATIC -UINTN -NumberOfCoresInCluster( - IN ARM_CORE_INFO *ArmCoreInfoTable, - IN UINTN NumberOfEntries, - IN UINTN ClusterId - ) -{ - UINTN Index, Cores; - - Cores = 0; - for (Index = 0; Index < NumberOfEntries; ++Index) { - if (ClusterId == ArmCoreInfoTable[Index].ClusterId) - ++Cores; - } - - return Cores; -} - - -STATIC -UINTN -NumberOfClustersInTable( - IN ARM_CORE_INFO *ArmCoreInfoTable, - IN UINTN NumberOfEntries - ) -{ - UINTN Index, Cores, Clusters, ClusterId; - - Index = 0; - Clusters = 0; - Cores = NumberOfEntries; - while (Cores) { - ++Clusters; - ClusterId = ArmCoreInfoTable[Index].ClusterId; - Cores -= NumberOfCoresInCluster (ArmCoreInfoTable, - NumberOfEntries, - ClusterId); - if (Cores) { - do { - ++Index; - } while (ClusterInRange (ArmCoreInfoTable, - ArmCoreInfoTable[Index].ClusterId, - 0, Index-1)); - } - } - - return Clusters; -} - - -STATIC -int -fdt_alloc_phandle( - IN VOID *blob - ) -{ - - int offset, phandle = 0; - - for (offset = fdt_next_node(blob, -1, NULL); offset >= 0; - offset = fdt_next_node(blob, offset, NULL)) { - phandle = MAX(phandle, fdt_get_phandle(blob, offset)); - } - - return phandle + 1; -} - - -STATIC -BOOLEAN -IsLinuxReservedRegion ( - IN EFI_MEMORY_TYPE MemoryType - ) -{ - switch(MemoryType) { - case EfiRuntimeServicesCode: - case EfiRuntimeServicesData: - case EfiUnusableMemory: - case EfiACPIReclaimMemory: - case EfiACPIMemoryNVS: - case EfiReservedMemoryType: - return TRUE; - default: - return FALSE; - } -} - -STATIC -VOID -SetDeviceStatus ( - IN VOID *fdt, - IN CHAR8 *device, - IN BOOLEAN enable - ) -{ - int node, subnode, rc; - - node = fdt_subnode_offset (fdt, 0, "smb"); - if (node >= 0) { - subnode = fdt_subnode_offset (fdt, node, device); - if (subnode >= 0) { - rc = fdt_setprop_string(fdt, subnode, "status", enable ? "ok" : "disabled"); - if (rc) { - DEBUG((EFI_D_ERROR,"%a: Could not set 'status' property for '%a' node\n", - __FUNCTION__, device)); - } - } - } -} - -#if DO_XGBE -STATIC -VOID -SetMacAddress ( - IN VOID *fdt, - IN CHAR8 *device, - IN UINT64 mac_addr - ) -{ - int node, subnode, rc; - - node = fdt_subnode_offset (fdt, 0, "smb"); - if (node >= 0) { - subnode = fdt_subnode_offset (fdt, node, device); - if (subnode >= 0) { - rc = fdt_setprop(fdt, subnode, "mac-address", (void *)&mac_addr, 6); - if (rc) { - DEBUG((EFI_D_ERROR,"%a: Could not set 'mac-address' property for '%a' node\n", - __FUNCTION__, device)); - } - } - } -} -#endif - -VOID -SetSocIdStatus ( - IN VOID *fdt - ) -{ - UINT32 SocId; - BOOLEAN IsRevB1; - - SocId = PcdGet32 (PcdSocCpuId); - IsRevB1 = (SocId & 0xFF0) && (SocId & 0x00F); - - SetDeviceStatus (fdt, "sata@e0d00000", IsRevB1); - SetDeviceStatus (fdt, "gpio@e0020000", IsRevB1); - SetDeviceStatus (fdt, "gpio@e0030000", IsRevB1); - SetDeviceStatus (fdt, "gwdt@e0bb0000", IsRevB1); -#if DO_KCS - SetDeviceStatus (fdt, "kcs@e0010000", IsRevB1); -#else - SetDeviceStatus (fdt, "kcs@e0010000", FALSE); -#endif -} - -VOID -SetXgbeStatus ( - IN VOID *fdt - ) -{ -#if DO_XGBE - SetDeviceStatus (fdt, "xgmac@e0700000", TRUE); - SetDeviceStatus (fdt, "phy@e1240800", TRUE); - SetDeviceStatus (fdt, "xgmac@e0900000", TRUE); - SetDeviceStatus (fdt, "phy@e1240c00", TRUE); - - SetMacAddress (fdt, "xgmac@e0700000", PcdGet64 (PcdEthMacA)); - SetMacAddress (fdt, "xgmac@e0900000", PcdGet64 (PcdEthMacB)); -#else - SetDeviceStatus (fdt, "xgmac@e0700000", FALSE); - SetDeviceStatus (fdt, "phy@e1240800", FALSE); - SetDeviceStatus (fdt, "xgmac@e0900000", FALSE); - SetDeviceStatus (fdt, "phy@e1240c00", FALSE); -#endif -} - - -/** -** Relocate the FDT blob to a more appropriate location for the Linux kernel. -** This function will allocate memory for the relocated FDT blob. -** -** @retval EFI_SUCCESS on success. -** @retval EFI_OUT_OF_RESOURCES or EFI_INVALID_PARAMETER on failure. -*/ -STATIC -EFI_STATUS -RelocateFdt ( - EFI_PHYSICAL_ADDRESS OriginalFdt, - UINTN OriginalFdtSize, - EFI_PHYSICAL_ADDRESS *RelocatedFdt, - UINTN *RelocatedFdtSize, - EFI_PHYSICAL_ADDRESS *RelocatedFdtAlloc - ) -{ - EFI_STATUS Status; - INTN Error; - UINT64 FdtAlignment; - - *RelocatedFdtSize = OriginalFdtSize + FDT_ADDITIONAL_ENTRIES_SIZE; - - // If FDT load address needs to be aligned, allocate more space. - FdtAlignment = PcdGet32 (PcdArmLinuxFdtAlignment); - if (FdtAlignment != 0) { - *RelocatedFdtSize += FdtAlignment; - } - - // Try below a watermark address. - Status = EFI_NOT_FOUND; - if (PcdGet32 (PcdArmLinuxFdtMaxOffset) != 0) { - *RelocatedFdt = LINUX_FDT_MAX_OFFSET; - Status = gBS->AllocatePages (AllocateMaxAddress, EfiBootServicesData, - EFI_SIZE_TO_PAGES (*RelocatedFdtSize), RelocatedFdt); - if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_WARN, "Warning: Failed to load FDT below address 0x%lX (%r). Will try again at a random address anywhere.\n", *RelocatedFdt, Status)); - } - } - - // Try anywhere there is available space. - if (EFI_ERROR (Status)) { - Status = gBS->AllocatePages (AllocateAnyPages, EfiBootServicesData, - EFI_SIZE_TO_PAGES (*RelocatedFdtSize), RelocatedFdt); - if (EFI_ERROR (Status)) { - ASSERT_EFI_ERROR (Status); - return EFI_OUT_OF_RESOURCES; - } else { - DEBUG ((EFI_D_WARN, "WARNING: Loaded FDT at random address 0x%lX.\nWARNING: There is a risk of accidental overwriting by other code/data.\n", *RelocatedFdt)); - } - } - - *RelocatedFdtAlloc = *RelocatedFdt; - if (FdtAlignment != 0) { - *RelocatedFdt = ALIGN (*RelocatedFdt, FdtAlignment); - } - - // Load the Original FDT tree into the new region - Error = fdt_open_into ((VOID*)(UINTN) OriginalFdt, - (VOID*)(UINTN)(*RelocatedFdt), *RelocatedFdtSize); - if (Error) { - DEBUG ((EFI_D_ERROR, "fdt_open_into(): %a\n", fdt_strerror (Error))); - gBS->FreePages (*RelocatedFdtAlloc, EFI_SIZE_TO_PAGES (*RelocatedFdtSize)); - return EFI_INVALID_PARAMETER; - } - - DEBUG_CODE_BEGIN(); - // DebugDumpFdt ((VOID*)(UINTN)(*RelocatedFdt)); - DEBUG_CODE_END(); - - return EFI_SUCCESS; -} - - -EFI_STATUS -AmdStyxPrepareFdt ( - IN CONST CHAR8* CommandLineArguments, - IN EFI_PHYSICAL_ADDRESS InitrdImage, - IN UINTN InitrdImageSize, - IN OUT EFI_PHYSICAL_ADDRESS *FdtBlobBase, - IN OUT UINTN *FdtBlobSize - ) -{ - EFI_STATUS Status; - EFI_PHYSICAL_ADDRESS NewFdtBlobBase; - EFI_PHYSICAL_ADDRESS NewFdtBlobAllocation; - UINTN NewFdtBlobSize; - VOID *fdt; - int err; - int node; - int cpu_node; - int lenp; - CONST VOID *BootArg; - EFI_PHYSICAL_ADDRESS InitrdImageStart; - EFI_PHYSICAL_ADDRESS InitrdImageEnd; - FdtRegion Region; - UINTN Index; - CHAR8 Name[10]; - LIST_ENTRY ResourceList; - BDS_SYSTEM_MEMORY_RESOURCE *Resource; - ARM_PROCESSOR_TABLE *ArmProcessorTable; - ARM_CORE_INFO *ArmCoreInfoTable; - UINTN ArmCoreCount; - UINT32 PrimaryClusterId; - UINT32 PrimaryCoreId; - UINTN MemoryMapSize; - EFI_MEMORY_DESCRIPTOR *MemoryMap; - EFI_MEMORY_DESCRIPTOR *MemoryMapPtr; - UINTN MapKey; - UINTN DescriptorSize; - UINT32 DescriptorVersion; - UINTN Pages; - UINTN OriginalFdtSize; - int map_node; - int cluster_node; - int pmu_node; - PMU_INTERRUPT PmuInt; - int phandle[NUM_CORES]; - UINT32 ClusterIndex, CoreIndex; - UINT32 ClusterCount, CoresInCluster; - UINT32 ClusterId; - UINTN MpId, MbAddr; - - // - // Sanity checks on the original FDT blob. - // - err = fdt_check_header ((VOID*)(UINTN)(*FdtBlobBase)); - if (err != 0) { - Print (L"ERROR: Device Tree header not valid (err:%d)\n", err); - return EFI_INVALID_PARAMETER; - } - - // The original FDT blob might have been loaded partially. - // Check that it is not the case. - OriginalFdtSize = (UINTN)fdt_totalsize ((VOID*)(UINTN)(*FdtBlobBase)); - if (OriginalFdtSize > *FdtBlobSize) { - Print (L"ERROR: Incomplete FDT. Only %d/%d bytes have been loaded.\n", - *FdtBlobSize, OriginalFdtSize); - return EFI_INVALID_PARAMETER; - } - - // - // Relocate the FDT to its final location. - // - NewFdtBlobAllocation = 0; - Status = RelocateFdt (*FdtBlobBase, OriginalFdtSize, - &NewFdtBlobBase, &NewFdtBlobSize, &NewFdtBlobAllocation); - if (EFI_ERROR (Status)) { - goto FAIL_RELOCATE_FDT; - } - fdt = (VOID*)(UINTN)NewFdtBlobBase; - - node = fdt_subnode_offset (fdt, 0, "chosen"); - if (node < 0) { - // The 'chosen' node does not exist, create it - node = fdt_add_subnode(fdt, 0, "chosen"); - if (node < 0) { - DEBUG((EFI_D_ERROR,"Error on finding 'chosen' node\n")); - Status = EFI_INVALID_PARAMETER; - goto FAIL_COMPLETE_FDT; - } - } - - DEBUG_CODE_BEGIN(); - BootArg = fdt_getprop(fdt, node, "bootargs", &lenp); - if (BootArg != NULL) { - DEBUG((EFI_D_ERROR,"BootArg: %a\n",BootArg)); - } - DEBUG_CODE_END(); - - // - // Set Linux CmdLine - // - if ((CommandLineArguments != NULL) && (AsciiStrLen (CommandLineArguments) > 0)) { - err = fdt_setprop(fdt, node, "bootargs", CommandLineArguments, AsciiStrSize(CommandLineArguments)); - if (err) { - DEBUG((EFI_D_ERROR,"Fail to set new 'bootarg' (err:%d)\n",err)); - } - } - - // - // Set Linux Initrd - // - if (InitrdImageSize != 0) { - InitrdImageStart = cpu_to_fdt64 (InitrdImage); - err = fdt_setprop(fdt, node, "linux,initrd-start", &InitrdImageStart, sizeof(EFI_PHYSICAL_ADDRESS)); - if (err) { - DEBUG((EFI_D_ERROR,"Fail to set new 'linux,initrd-start' (err:%d)\n",err)); - } - InitrdImageEnd = cpu_to_fdt64 (InitrdImage + InitrdImageSize); - err = fdt_setprop(fdt, node, "linux,initrd-end", &InitrdImageEnd, sizeof(EFI_PHYSICAL_ADDRESS)); - if (err) { - DEBUG((EFI_D_ERROR,"Fail to set new 'linux,initrd-start' (err:%d)\n",err)); - } - } - - // - // Set Physical memory setup if does not exist - // - node = fdt_subnode_offset(fdt, 0, "memory"); - if (node < 0) { - // The 'memory' node does not exist, create it - node = fdt_add_subnode(fdt, 0, "memory"); - if (node >= 0) { - fdt_setprop_string(fdt, node, "name", "memory"); - fdt_setprop_string(fdt, node, "device_type", "memory"); - - GetSystemMemoryResources (&ResourceList); - Resource = (BDS_SYSTEM_MEMORY_RESOURCE*)ResourceList.ForwardLink; - - Region.Base = cpu_to_fdtn ((UINTN)Resource->PhysicalStart); - Region.Size = cpu_to_fdtn ((UINTN)Resource->ResourceLength); - - err = fdt_setprop(fdt, node, "reg", &Region, sizeof(Region)); - if (err) { - DEBUG((EFI_D_ERROR,"Fail to set new 'memory region' (err:%d)\n",err)); - } - } - } - - // - // Add the memory regions reserved by the UEFI Firmware - // - - // Retrieve the UEFI Memory Map - MemoryMap = NULL; - MemoryMapSize = 0; - Status = gBS->GetMemoryMap (&MemoryMapSize, MemoryMap, &MapKey, &DescriptorSize, &DescriptorVersion); - if (Status == EFI_BUFFER_TOO_SMALL) { - // The UEFI specification advises to allocate more memory for the MemoryMap buffer between successive - // calls to GetMemoryMap(), since allocation of the new buffer may potentially increase memory map size. - Pages = EFI_SIZE_TO_PAGES (MemoryMapSize) + 1; - MemoryMap = AllocatePages (Pages); - if (MemoryMap == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto FAIL_COMPLETE_FDT; - } - Status = gBS->GetMemoryMap (&MemoryMapSize, MemoryMap, &MapKey, &DescriptorSize, &DescriptorVersion); - } - - // Go through the list and add the reserved region to the Device Tree - if (!EFI_ERROR(Status)) { - MemoryMapPtr = MemoryMap; - for (Index = 0; Index < (MemoryMapSize / DescriptorSize); Index++) { - if (IsLinuxReservedRegion ((EFI_MEMORY_TYPE)MemoryMapPtr->Type)) { - DEBUG((DEBUG_VERBOSE, "Reserved region of type %d [0x%lX, 0x%lX]\n", - MemoryMapPtr->Type, - (UINTN)MemoryMapPtr->PhysicalStart, - (UINTN)(MemoryMapPtr->PhysicalStart + MemoryMapPtr->NumberOfPages * EFI_PAGE_SIZE))); - err = fdt_add_mem_rsv(fdt, MemoryMapPtr->PhysicalStart, MemoryMapPtr->NumberOfPages * EFI_PAGE_SIZE); - if (err != 0) { - Print(L"Warning: Fail to add 'memreserve' (err:%d)\n", err); - } - } - MemoryMapPtr = (EFI_MEMORY_DESCRIPTOR*)((UINTN)MemoryMapPtr + DescriptorSize); - } - } - - // - // Setup Arm Mpcore Info if it is a multi-core or multi-cluster platforms. - // - // For 'cpus' and 'cpu' device tree nodes bindings, refer to this file - // in the kernel documentation: - // Documentation/devicetree/bindings/arm/cpus.txt - // - ArmProcessorTable = AmdStyxGetArmProcessorTable(); - ASSERT_EFI_ERROR (ArmProcessorTable == NULL); - ArmCoreInfoTable = ArmProcessorTable->ArmCpus; - - // Make sure SoC's core count does not exceed what we want to build - ArmCoreCount = ArmProcessorTable->NumberOfEntries; - ASSERT_EFI_ERROR (ArmCoreCount > NUM_CORES); - - // Get Id from primary CPU - MpId = (UINTN) ArmReadMpidr (); - PrimaryClusterId = GET_CLUSTER_ID((UINT32) MpId); - PrimaryCoreId = GET_CORE_ID((UINT32) MpId); - - // Remove existing 'pmu' node and create a new one - pmu_node = fdt_subnode_offset (fdt, 0, "pmu"); - if (pmu_node >= 0) { - fdt_del_node (fdt, pmu_node); - } - pmu_node = fdt_add_subnode(fdt, 0, "pmu"); - if (pmu_node >= 0) { - // append PMU interrupts - for (Index = 0; Index < ArmCoreCount; Index++) { - MpId = (UINTN) GET_MPID (ArmCoreInfoTable[Index].ClusterId, - ArmCoreInfoTable[Index].CoreId); - - Status = AmdStyxGetPmuSpiFromMpId (MpId, &PmuInt.IntId); - if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, "FDT: Error getting PMU interrupt for MpId '0x%x'\n", MpId)); - goto FAIL_COMPLETE_FDT; - } - - PmuInt.Flag = cpu_to_fdt32(PMU_INT_FLAG_SPI); - PmuInt.IntId = cpu_to_fdt32(PmuInt.IntId); - PmuInt.Type = cpu_to_fdt32(PMU_INT_TYPE_HIGH_LEVEL); - fdt_appendprop(fdt, pmu_node, "interrupts", &PmuInt, sizeof(PmuInt)); - } - fdt_setprop_string(fdt, pmu_node, "compatible", "arm,armv8-pmuv3"); - } else { - DEBUG((EFI_D_ERROR,"FDT: Error creating 'pmu' node\n")); - Status = EFI_INVALID_PARAMETER; - goto FAIL_COMPLETE_FDT; - } - - // Remove existing 'psci' node if feature not supported - node = fdt_subnode_offset (fdt, 0, "psci"); - if (node >= 0) { - if (!FixedPcdGetBool (PcdPsciOsSupport)) { - fdt_del_node (fdt, node); - } - } else if (FixedPcdGetBool (PcdPsciOsSupport) && - FixedPcdGetBool (PcdTrustedFWSupport)) { - // Add 'psci' node if not present - node = fdt_add_subnode(fdt, 0, "psci"); - if (node >= 0) { - fdt_setprop_string(fdt, node, "compatible", "arm,psci-0.2"); - fdt_appendprop_string(fdt, node, "compatible", "arm,psci"); - fdt_setprop_string(fdt, node, "method", "smc"); - } else { - DEBUG((EFI_D_ERROR,"FDT: Error creating 'psci' node\n")); - Status = EFI_INVALID_PARAMETER; - goto FAIL_COMPLETE_FDT; - } - } - - // Remove existing 'cpus' node and create a new one - node = fdt_subnode_offset (fdt, 0, "cpus"); - if (node >= 0) { - fdt_del_node (fdt, node); - } - node = fdt_add_subnode(fdt, 0, "cpus"); - if (node >= 0) { - // Configure the 'cpus' node - fdt_setprop_string(fdt, node, "name", "cpus"); - fdt_setprop_cell (fdt, node, "#address-cells", sizeof (UINTN) / 4); - fdt_setprop_cell(fdt, node, "#size-cells", 0); - } else { - DEBUG((EFI_D_ERROR,"FDT: Error creating 'cpus' node\n")); - Status = EFI_INVALID_PARAMETER; - goto FAIL_COMPLETE_FDT; - } - - // - // Walk the processor table in reverse order for proper listing in FDT - // - Index = ArmCoreCount; - while (Index--) { - // Create 'cpu' node - AsciiSPrint (Name, sizeof(Name), "CPU%d", Index); - cpu_node = fdt_add_subnode (fdt, node, Name); - if (cpu_node < 0) { - DEBUG ((EFI_D_ERROR, "FDT: Error on creating '%a' node\n", Name)); - Status = EFI_INVALID_PARAMETER; - goto FAIL_COMPLETE_FDT; - } - phandle[Index] = fdt_alloc_phandle(fdt); - fdt_setprop_cell (fdt, cpu_node, "phandle", phandle[Index]); - fdt_setprop_cell (fdt, cpu_node, "linux,phandle", phandle[Index]); - - if (FixedPcdGetBool (PcdPsciOsSupport) && - FixedPcdGetBool (PcdTrustedFWSupport)) { - fdt_setprop_string(fdt, cpu_node, "enable-method", "psci"); - } else { - fdt_setprop_string(fdt, cpu_node, "enable-method", "spin-table"); - MbAddr = ArmCoreInfoTable[Index].MailboxSetAddress; - MbAddr = cpu_to_fdtn (MbAddr); - fdt_setprop (fdt, cpu_node, "cpu-release-addr", &MbAddr, sizeof (MbAddr)); - } - MpId = (UINTN) GET_MPID (ArmCoreInfoTable[Index].ClusterId, - ArmCoreInfoTable[Index].CoreId); - MpId = cpu_to_fdtn (MpId); - fdt_setprop (fdt, cpu_node, "reg", &MpId, sizeof (MpId)); - fdt_setprop_string(fdt, cpu_node, "compatible", "arm,armv8"); - fdt_setprop_string (fdt, cpu_node, "device_type", "cpu"); - - // If it is not the primary core than the cpu should be disabled - if (((ArmCoreInfoTable[Index].ClusterId != PrimaryClusterId) || - (ArmCoreInfoTable[Index].CoreId != PrimaryCoreId))) { - fdt_setprop_string(fdt, cpu_node, "status", "disabled"); - } - } - - // Remove existing 'cpu-map' node and create a new one - map_node = fdt_subnode_offset (fdt, node, "cpu-map"); - if (map_node >= 0) { - fdt_del_node (fdt, map_node); - } - map_node = fdt_add_subnode(fdt, node, "cpu-map"); - if (map_node >= 0) { - ClusterIndex = ArmCoreCount - 1; - ClusterCount = NumberOfClustersInTable (ArmCoreInfoTable, - ArmCoreCount); - while (ClusterCount--) { - // Create 'cluster' node - AsciiSPrint (Name, sizeof(Name), "cluster%d", ClusterCount); - cluster_node = fdt_add_subnode (fdt, map_node, Name); - if (cluster_node < 0) { - DEBUG ((EFI_D_ERROR, "FDT: Error creating '%a' node\n", Name)); - Status = EFI_INVALID_PARAMETER; - goto FAIL_COMPLETE_FDT; - } - - ClusterId = ArmCoreInfoTable[ClusterIndex].ClusterId; - CoreIndex = ClusterIndex; - CoresInCluster = NumberOfCoresInCluster (ArmCoreInfoTable, - ArmCoreCount, - ClusterId); - while (CoresInCluster--) { - // Create 'core' node - AsciiSPrint (Name, sizeof(Name), "core%d", CoresInCluster); - cpu_node = fdt_add_subnode (fdt, cluster_node, Name); - if (cpu_node < 0) { - DEBUG ((EFI_D_ERROR, "FDT: Error creating '%a' node\n", Name)); - Status = EFI_INVALID_PARAMETER; - goto FAIL_COMPLETE_FDT; - } - fdt_setprop_cell (fdt, cpu_node, "cpu", phandle[CoreIndex]); - - // iterate to next core in cluster - if (CoresInCluster) { - do { - --CoreIndex; - } while (ClusterId != ArmCoreInfoTable[CoreIndex].ClusterId); - } - } - - // iterate to next cluster - if (ClusterCount) { - do { - --ClusterIndex; - } while (ClusterInRange (ArmCoreInfoTable, - ArmCoreInfoTable[ClusterIndex].ClusterId, - ClusterIndex + 1, - ArmCoreCount - 1)); - } - } - } else { - DEBUG((EFI_D_ERROR,"FDT: Error creating 'cpu-map' node\n")); - Status = EFI_INVALID_PARAMETER; - goto FAIL_COMPLETE_FDT; - } - - SetSocIdStatus (fdt); - SetXgbeStatus (fdt); - - DEBUG_CODE_BEGIN(); - // DebugDumpFdt (fdt); - DEBUG_CODE_END(); - - // If we succeeded to generate the new Device Tree then free the old Device Tree - gBS->FreePages (*FdtBlobBase, EFI_SIZE_TO_PAGES (*FdtBlobSize)); - - // Update the real size of the Device Tree - fdt_pack ((VOID*)(UINTN)(NewFdtBlobBase)); - - *FdtBlobBase = NewFdtBlobBase; - *FdtBlobSize = (UINTN)fdt_totalsize ((VOID*)(UINTN)(NewFdtBlobBase)); - return EFI_SUCCESS; - -FAIL_COMPLETE_FDT: - gBS->FreePages (NewFdtBlobAllocation, EFI_SIZE_TO_PAGES (NewFdtBlobSize)); - -FAIL_RELOCATE_FDT: - *FdtBlobSize = (UINTN)fdt_totalsize ((VOID*)(UINTN)(*FdtBlobBase)); - // Return success even if we failed to update the FDT blob. - // The original one is still valid. - return EFI_SUCCESS; -} - diff --git a/Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.c b/Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.c deleted file mode 100644 index 2559762..0000000 --- a/Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.c +++ /dev/null @@ -1,279 +0,0 @@ -/** @file - - Copyright (c) 2014 - 2015, AMD Inc. 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 "FdtDxe.h" - -extern EFI_BOOT_SERVICES *gBS; - -EFI_EVENT mFdtReadyToBootEvent; - -VOID -EFIAPI -FdtReadyToBoot ( - IN EFI_EVENT Event, - IN VOID *Context - ); - -EFI_STATUS -EFIAPI -FdtOverrideDevicePath( - IN CHAR16 *FdtFileName, - OUT EFI_DEVICE_PATH **FdtDevicePath - ); - - -/** - *--------------------------------------------------------------------------------------- - * - * FdtDxeEntryPoint - * - * Description: - * Entry point of the FDT Runtime Driver. - * - * Control flow: - * Configure reserved regions. - * - * Parameters: - * @param[in] ImageHandle The firmware allocate handle for the - * EFI image. - * @param[in] *SystemTable Pointer to the EFI System Table. - * - * @return EFI_STATUS - * - *------------------------------------------------------------------------------------ - **/ -EFI_STATUS -EFIAPI -FdtDxeEntryPoint ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - EFI_STATUS Status; - - DEBUG ((EFI_D_ERROR, "FdtDxe Loaded\n")); - - // - // Ready-To-Boot callback - // - Status = EfiCreateEventReadyToBootEx( - TPL_CALLBACK, - FdtReadyToBoot, - NULL, - &mFdtReadyToBootEvent - ); - ASSERT_EFI_ERROR (Status); - - return Status; -} - -/** - *--------------------------------------------------------------------------------------- - * - * FdtReadyToBoot - * - * Description: - * Ready-2-Boot Event Callback for EFI_EVENT_SIGNAL_READY_TO_BOOT. - * - * Control flow: - * 1. Read FDT blob - * 2. Edit FDT table - * 3. Submit FDT to EFI system table - * - * Parameters: - * @param[in] Event EFI_EVENT notification. - * @param[in] *Context Pointer to the Event Context. - * - * @return VOID - * - *--------------------------------------------------------------------------------------- - **/ -VOID -EFIAPI -FdtReadyToBoot ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - EFI_FIRMWARE_VOLUME2_PROTOCOL *FvProtocol; - EFI_HANDLE *HandleBuffer; - UINTN HandleCount; - UINTN Index; - EFI_STATUS Status; - UINT32 AuthenticationStatus; - EFI_GUID *FdtGuid = FixedPcdGetPtr(PcdStyxFdt); - UINT8 *FdtBlobBase = NULL; - UINTN FdtBlobSize = 0; - EFI_DEVICE_PATH *FdtDevicePath; - - // Move secondary core to a Pen complaint with MP-Parking protocol - if (!FixedPcdGetBool (PcdPsciOsSupport)) { - AmdStyxMoveParkedCores(); - } - - // Search for FDT blob in EFI partition - Status = FdtOverrideDevicePath(L"fdt.dtb", &FdtDevicePath); - if (!EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, "%a: Loading Override FDT blob...\n", __FUNCTION__)); - - FdtBlobBase = (UINT8 *)(UINTN)LINUX_FDT_MAX_OFFSET; - Status = BdsLoadImage (FdtDevicePath, - AllocateMaxAddress, - (EFI_PHYSICAL_ADDRESS *)&FdtBlobBase, - &FdtBlobSize); - if (!EFI_ERROR (Status) && FdtBlobBase && FdtBlobSize) - goto LOAD_FDT_BLOB; - else - goto LOAD_FDT_ERROR; - } - - DEBUG ((EFI_D_ERROR, "%a: Loading Embedded FDT blob...\n", __FUNCTION__)); - HandleBuffer = NULL; - Status = gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiFirmwareVolume2ProtocolGuid, - NULL, - &HandleCount, - &HandleBuffer - ); - ASSERT_EFI_ERROR (Status); - - for (Index = 0; Index < HandleCount; Index++) { - Status = gBS->HandleProtocol ( - HandleBuffer[Index], - &gEfiFirmwareVolume2ProtocolGuid, - (VOID **) &FvProtocol - ); - if (!EFI_ERROR (Status)) { - Status = FvProtocol->ReadSection ( - FvProtocol, - FdtGuid, - EFI_SECTION_RAW, - 0, - (VOID **)&FdtBlobBase, - &FdtBlobSize, - &AuthenticationStatus - ); - if (!EFI_ERROR (Status) && FdtBlobBase && FdtBlobSize) - goto LOAD_FDT_BLOB; - } - } - -LOAD_FDT_ERROR: - DEBUG ((EFI_D_ERROR, "%a: Error loading FDT blob!\n", __FUNCTION__)); - goto LOAD_FDT_DONE; - -LOAD_FDT_BLOB: - Status = AmdStyxPrepareFdt(NULL, 0, 0, (EFI_PHYSICAL_ADDRESS *)&FdtBlobBase, &FdtBlobSize); - ASSERT_EFI_ERROR (Status); - - // Install the FDT blob into EFI system configuration table - Status = gBS->InstallConfigurationTable (&gFdtTableGuid, (VOID *)FdtBlobBase); - ASSERT_EFI_ERROR (Status); - DEBUG ((EFI_D_ERROR, "%a: FDT ready!\n", __FUNCTION__)); - -LOAD_FDT_DONE: - gBS->CloseEvent (mFdtReadyToBootEvent); - return; -} - -/** -*--------------------------------------------------------------------------------------- -* -* FdtOverrideDevicePath -* -* Description: -* Looks for a user-provided FDT blob to override the default file built with the UEFI image. -* -* Parameters: -* @param[in] FdtFileName Name of the FDT blob located in the EFI partition. -* @param[out] FdtDevicePath EFI Device Path of the FDT blob. -* -* @return EFI_SUCCESS The function completed successfully. -* @return EFI_NOT_FOUND The protocol could not be located. -* @return EFI_OUT_OF_RESOURCES There are not enough resources to find the protocol. -* -*--------------------------------------------------------------------------------------- -**/ -EFI_STATUS -EFIAPI -FdtOverrideDevicePath( - IN CHAR16 *FdtFileName, - OUT EFI_DEVICE_PATH **FdtDevicePath - ) -{ - EFI_DEVICE_PATH_PROTOCOL *DevPathProtocol; - EFI_HANDLE *HandleBuffer; - UINTN HandleCount; - UINTN Index; - EFI_STATUS Status; - CHAR16 *DevPathText; - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *VolProtocol; - EFI_FILE_PROTOCOL *FileProtocol; - EFI_FILE_PROTOCOL *FileHandle; - CHAR16 FilePathText[120]; - - HandleBuffer = NULL; - Status = gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiSimpleFileSystemProtocolGuid, - NULL, - &HandleCount, - &HandleBuffer); - if (EFI_ERROR (Status)) - return Status; - - for (Index = 0; Index < HandleCount; Index++) { - DevPathProtocol = NULL; - Status = gBS->HandleProtocol ( - HandleBuffer[Index], - &gEfiDevicePathProtocolGuid, - (VOID **) &DevPathProtocol); - - if (!EFI_ERROR (Status)) { - VolProtocol = NULL; - Status = gBS->HandleProtocol ( - HandleBuffer[Index], - &gEfiSimpleFileSystemProtocolGuid, - (VOID **) &VolProtocol); - - if (!EFI_ERROR (Status)) { - FileProtocol = NULL; - Status = VolProtocol->OpenVolume(VolProtocol, &FileProtocol); - - if (!EFI_ERROR (Status)) { - FileHandle = NULL; - Status = FileProtocol->Open(FileProtocol, - &FileHandle, - FdtFileName, - EFI_FILE_MODE_READ, - 0); - - if (!EFI_ERROR (Status)) { - FileProtocol->Close(FileHandle); - DevPathText = ConvertDevicePathToText(DevPathProtocol, TRUE, FALSE); - StrCpy(FilePathText, DevPathText); - StrCat(FilePathText, L"/"); - StrCat(FilePathText, FdtFileName); - *FdtDevicePath = ConvertTextToDevicePath (FilePathText); - return EFI_SUCCESS; - } - } - } - } - } - - return Status; -} - diff --git a/Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.h b/Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.h deleted file mode 100644 index 7d17206..0000000 --- a/Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.h +++ /dev/null @@ -1,55 +0,0 @@ -/** @file - - Copyright (c) 2014 - 2015, AMD Inc. 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. - -**/ - -#ifndef __FDT_DXE__H_ -#define __FDT_DXE__H_ - -#include <Uefi.h> -#include <Library/UefiLib.h> -#include <Library/UefiDriverEntryPoint.h> - -#include <Library/BaseLib.h> -#include <Library/BdsLib.h> -#include <Library/PcdLib.h> -#include <Library/DebugLib.h> -#include <Library/DevicePathLib.h> -#include <Guid/DxeServices.h> -#include <Library/DxeServicesTableLib.h> - -#include <Protocol/FirmwareVolume2.h> -#include <Protocol/SimpleFileSystem.h> -#include <Protocol/LoadFile.h> -#include <Protocol/DevicePath.h> -#include <Protocol/DevicePathFromText.h> - -//#define LINUX_FDT_MAX_OFFSET (PcdGet64 (PcdUefiEntryAddress) + PcdGet32(PcdArmLinuxFdtMaxOffset)) -#define LINUX_FDT_MAX_OFFSET (PcdGet64 (PcdSystemMemoryBase) + PcdGet32(PcdArmLinuxFdtMaxOffset)) - -VOID -EFIAPI -AmdStyxMoveParkedCores( - VOID - ); - -EFI_STATUS -AmdStyxPrepareFdt ( - IN CONST CHAR8* CommandLineArguments, - IN EFI_PHYSICAL_ADDRESS InitrdImage, - IN UINTN InitrdImageSize, - IN OUT EFI_PHYSICAL_ADDRESS *FdtBlobBase, - IN OUT UINTN *FdtBlobSize - ); - - -#endif // __FDT_DXE__H_ diff --git a/Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.inf b/Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.inf deleted file mode 100644 index 5ac210b..0000000 --- a/Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.inf +++ /dev/null @@ -1,90 +0,0 @@ -#/* @file -# -# Copyright (c) 2014 - 2015, AMD Inc. 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 = 0x00010005 - BASE_NAME = FdtDxe - FILE_GUID = 17f50855-6484-4b56-814b-1a88702d88e1 - MODULE_TYPE = DXE_DRIVER - VERSION_STRING = 1.0 - ENTRY_POINT = FdtDxeEntryPoint - -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = AARCH64 -# -# - -[Sources.common] - FdtDxe.c - BdsLinuxFdt.c - LinuxLoaderHelper.c - -[Sources.AARCH64] - AArch64/BdsLinuxLoader.c - AArch64/BdsLinuxLoaderHelper.S | GCC - -[Packages] - ArmPkg/ArmPkg.dec - EmbeddedPkg/EmbeddedPkg.dec - MdePkg/MdePkg.dec - AmdModulePkg/AmdModulePkg.dec - OpenPlatformPkg/Platforms/AMD/Styx/AmdStyx.dec - -[LibraryClasses] - UefiDriverEntryPoint - DxeServicesTableLib - BdsLib - FdtLib - DevicePathLib - AmdStyxHelperLib - -[LibraryClasses.AARCH64] - ArmGicLib - PcdLib - -[Guids] - gEfiEventReadyToBootGuid ##CONSUMED - gEfiDxeServicesTableGuid ##CONSUMED - gArmMpCoreInfoGuid ##CONSUMED - gFdtTableGuid ##CONSUMED - -[Protocols] - gEfiFirmwareVolume2ProtocolGuid ##CONSUMED - -[Pcd] - gAmdStyxTokenSpaceGuid.PcdStyxFdt - gAmdStyxTokenSpaceGuid.PcdSocCpuId - gAmdModulePkgTokenSpaceGuid.PcdEthMacA - gAmdModulePkgTokenSpaceGuid.PcdEthMacB - gAmdModulePkgTokenSpaceGuid.PcdEthMacB - gArmTokenSpaceGuid.PcdSystemMemoryBase - -[FixedPcd] - gArmTokenSpaceGuid.PcdArmLinuxFdtMaxOffset - gArmTokenSpaceGuid.PcdArmLinuxFdtAlignment - gAmdStyxTokenSpaceGuid.PcdUefiEntryAddress - gAmdStyxTokenSpaceGuid.PcdPsciOsSupport - gAmdStyxTokenSpaceGuid.PcdTrustedFWSupport - gAmdStyxTokenSpaceGuid.PcdParkingProtocolBase - gAmdStyxTokenSpaceGuid.PcdParkingProtocolSize - -[Pcd.AARCH64] - gArmTokenSpaceGuid.PcdGicDistributorBase - gArmTokenSpaceGuid.PcdGicSgiIntId - -[Depex] - TRUE - diff --git a/Platforms/AMD/Styx/Drivers/FdtDxe/LinuxLoader.h b/Platforms/AMD/Styx/Drivers/FdtDxe/LinuxLoader.h deleted file mode 100644 index 8a23d7f..0000000 --- a/Platforms/AMD/Styx/Drivers/FdtDxe/LinuxLoader.h +++ /dev/null @@ -1,166 +0,0 @@ -/** @file -* -* Copyright (c) 2011-2015, ARM 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. -* -**/ - -#ifndef __LINUX_LOADER_H__ -#define __LINUX_LOADER_H__ - -#include <Library/BdsLib.h> -#include <Library/DebugLib.h> -#include <Library/HiiLib.h> -#include <Library/MemoryAllocationLib.h> -#include <Library/PerformanceLib.h> -#include <Library/PrintLib.h> -#include <Library/ShellLib.h> -#include <Library/UefiBootServicesTableLib.h> -#include <Library/UefiLib.h> - -#include <Protocol/EfiShellParameters.h> -#include <Protocol/EfiShell.h> - -#include <libfdt.h> - -// -// Definitions -// - -#define MAX_MSG_LEN 80 - -#define LINUX_UIMAGE_SIGNATURE 0x56190527 -#define LINUX_KERNEL_MAX_OFFSET (SystemMemoryBase + PcdGet32(PcdArmLinuxKernelMaxOffset)) -#define LINUX_ATAG_MAX_OFFSET (SystemMemoryBase + PcdGet32(PcdArmLinuxAtagMaxOffset)) -#define LINUX_FDT_MAX_OFFSET (SystemMemoryBase + PcdGet32(PcdArmLinuxFdtMaxOffset)) - -#define ARM_FDT_MACHINE_TYPE 0xFFFFFFFF - -// Additional size that could be used for FDT entries added by the UEFI OS Loader -// Estimation based on: EDID (300bytes) + bootargs (200bytes) + initrd region (20bytes) -// + system memory region (20bytes) + mp_core entries (200 bytes) -#define FDT_ADDITIONAL_ENTRIES_SIZE 0x300 - -// -// Global variables -// -extern CONST EFI_GUID mLinuxLoaderHiiGuid; -extern EFI_HANDLE mLinuxLoaderHiiHandle; - -// -// Local Types -// -typedef struct _SYSTEM_MEMORY_RESOURCE { - LIST_ENTRY Link; // This attribute must be the first entry of this structure (to avoid pointer computation) - EFI_PHYSICAL_ADDRESS PhysicalStart; - UINT64 ResourceLength; -} SYSTEM_MEMORY_RESOURCE; - -typedef VOID (*LINUX_KERNEL)(UINT32 Zero, UINT32 Arch, UINTN ParametersBase); - -// -// Functions -// -EFI_STATUS -PrintHii ( - IN CONST CHAR8 *Language OPTIONAL, - IN CONST EFI_STRING_ID HiiFormatStringId, - ... - ); - -VOID -PrintHelp ( - IN CONST CHAR8 *Language OPTIONAL - ); - -EFI_STATUS -ProcessShellParameters ( - OUT CHAR16 **KernelPath, - OUT CHAR16 **FdtPath, - OUT CHAR16 **InitrdPath, - OUT CHAR16 **LinuxCommandLine, - OUT UINTN *AtagMachineType - ); - -EFI_STATUS -ProcessAppCommandLine ( - OUT CHAR16 **KernelTextDevicePath, - OUT CHAR16 **FdtTextDevicePath, - OUT CHAR16 **InitrdTextDevicePath, - OUT CHAR16 **LinuxCommandLine, - OUT UINTN *AtagMachineType - ); - -VOID -PrintPerformance ( - VOID - ); - -EFI_STATUS -GetSystemMemoryResources ( - IN LIST_ENTRY *ResourceList - ); - -EFI_STATUS -PrepareFdt ( - IN EFI_PHYSICAL_ADDRESS SystemMemoryBase, - IN CONST CHAR8* CommandLineArguments, - IN EFI_PHYSICAL_ADDRESS InitrdImage, - IN UINTN InitrdImageSize, - IN OUT EFI_PHYSICAL_ADDRESS *FdtBlobBase, - IN OUT UINTN *FdtBlobSize - ); - -/** - Start a Linux kernel from a Device Path - - @param SystemMemoryBase Base of the system memory - @param LinuxKernel Device Path to the Linux Kernel - @param Parameters Linux kernel arguments - @param Fdt Device Path to the Flat Device Tree - @param MachineType ARM machine type value - - @retval EFI_SUCCESS All drivers have been connected - @retval EFI_NOT_FOUND The Linux kernel Device Path has not been found - @retval EFI_OUT_OF_RESOURCES There is not enough resource memory to store the matching results. - @retval RETURN_UNSUPPORTED ATAG is not support by this architecture - -**/ -EFI_STATUS -BootLinuxAtag ( - IN EFI_PHYSICAL_ADDRESS SystemMemoryBase, - IN EFI_DEVICE_PATH_PROTOCOL* LinuxKernelDevicePath, - IN EFI_DEVICE_PATH_PROTOCOL* InitrdDevicePath, - IN CONST CHAR8* CommandLineArguments, - IN UINTN MachineType - ); - -/** - Start a Linux kernel from a Device Path - - @param[in] LinuxKernelDevicePath Device Path to the Linux Kernel - @param[in] InitrdDevicePath Device Path to the Initrd - @param[in] Arguments Linux kernel arguments - - @retval EFI_SUCCESS All drivers have been connected - @retval EFI_NOT_FOUND The Linux kernel Device Path has not been found - @retval EFI_OUT_OF_RESOURCES There is not enough resource memory to store the matching results. - -**/ -EFI_STATUS -BootLinuxFdt ( - IN EFI_PHYSICAL_ADDRESS SystemMemoryBase, - IN EFI_DEVICE_PATH_PROTOCOL* LinuxKernelDevicePath, - IN EFI_DEVICE_PATH_PROTOCOL* InitrdDevicePath, - IN EFI_DEVICE_PATH_PROTOCOL* FdtDevicePath, - IN CONST CHAR8* Arguments - ); - -#endif /* __LINUX_LOADER_H__ */ diff --git a/Platforms/AMD/Styx/Drivers/FdtDxe/LinuxLoaderHelper.c b/Platforms/AMD/Styx/Drivers/FdtDxe/LinuxLoaderHelper.c deleted file mode 100644 index 4d7a844..0000000 --- a/Platforms/AMD/Styx/Drivers/FdtDxe/LinuxLoaderHelper.c +++ /dev/null @@ -1,192 +0,0 @@ -/** @file -* -* Copyright (c) 2011-2015, ARM 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 <PiDxe.h> -#include <Library/HobLib.h> -#include <Library/TimerLib.h> -#include <Library/SerialPortLib.h> - -#include "LinuxLoader.h" - -STATIC CONST CHAR8 *mTokenList[] = { - /*"SEC",*/ - "PEI", - "DXE", - "BDS", - NULL -}; - -VOID -PrintPerformance ( - VOID - ) -{ - UINTN Key; - CONST VOID *Handle; - CONST CHAR8 *Token, *Module; - UINT64 Start, Stop, TimeStamp; - UINT64 Delta, TicksPerSecond, Milliseconds; - UINTN Index; - CHAR8 Buffer[100]; - UINTN CharCount; - BOOLEAN CountUp; - - TicksPerSecond = GetPerformanceCounterProperties (&Start, &Stop); - if (Start < Stop) { - CountUp = TRUE; - } else { - CountUp = FALSE; - } - - TimeStamp = 0; - Key = 0; - do { - Key = GetPerformanceMeasurement (Key, (CONST VOID **)&Handle, &Token, &Module, &Start, &Stop); - if (Key != 0) { - for (Index = 0; mTokenList[Index] != NULL; Index++) { - if (AsciiStriCmp (mTokenList[Index], Token) == 0) { - Delta = CountUp ? (Stop - Start) : (Start - Stop); - TimeStamp += Delta; - Milliseconds = DivU64x64Remainder (MultU64x32 (Delta, 1000), TicksPerSecond, NULL); - CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "%6a %6ld ms\n", Token, Milliseconds); - SerialPortWrite ((UINT8 *) Buffer, CharCount); - break; - } - } - } - } while (Key != 0); - - CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "Total Time = %ld ms\n\n", - DivU64x64Remainder (MultU64x32 (TimeStamp, 1000), TicksPerSecond, NULL)); - SerialPortWrite ((UINT8 *) Buffer, CharCount); -} - -STATIC -EFI_STATUS -InsertSystemMemoryResources ( - LIST_ENTRY *ResourceList, - EFI_HOB_RESOURCE_DESCRIPTOR *ResHob - ) -{ - SYSTEM_MEMORY_RESOURCE *NewResource; - LIST_ENTRY *Link; - LIST_ENTRY *NextLink; - LIST_ENTRY AttachedResources; - SYSTEM_MEMORY_RESOURCE *Resource; - EFI_PHYSICAL_ADDRESS NewResourceEnd; - - if (IsListEmpty (ResourceList)) { - NewResource = AllocateZeroPool (sizeof (SYSTEM_MEMORY_RESOURCE)); - NewResource->PhysicalStart = ResHob->PhysicalStart; - NewResource->ResourceLength = ResHob->ResourceLength; - InsertTailList (ResourceList, &NewResource->Link); - return EFI_SUCCESS; - } - - InitializeListHead (&AttachedResources); - - Link = ResourceList->ForwardLink; - ASSERT (Link != NULL); - while (Link != ResourceList) { - Resource = (SYSTEM_MEMORY_RESOURCE*)Link; - - // Sanity Check. The resources should not overlapped. - ASSERT (!((ResHob->PhysicalStart >= Resource->PhysicalStart) && (ResHob->PhysicalStart < (Resource->PhysicalStart + Resource->ResourceLength)))); - ASSERT (!((ResHob->PhysicalStart + ResHob->ResourceLength - 1 >= Resource->PhysicalStart) && - ((ResHob->PhysicalStart + ResHob->ResourceLength - 1) < (Resource->PhysicalStart + Resource->ResourceLength)))); - - // The new resource is attached after this resource descriptor - if (ResHob->PhysicalStart == Resource->PhysicalStart + Resource->ResourceLength) { - Resource->ResourceLength = Resource->ResourceLength + ResHob->ResourceLength; - - NextLink = RemoveEntryList (&Resource->Link); - InsertTailList (&AttachedResources, &Resource->Link); - Link = NextLink; - } - // The new resource is attached before this resource descriptor - else if (ResHob->PhysicalStart + ResHob->ResourceLength == Resource->PhysicalStart) { - Resource->PhysicalStart = ResHob->PhysicalStart; - Resource->ResourceLength = Resource->ResourceLength + ResHob->ResourceLength; - - NextLink = RemoveEntryList (&Resource->Link); - InsertTailList (&AttachedResources, &Resource->Link); - Link = NextLink; - } else { - Link = Link->ForwardLink; - } - } - - if (!IsListEmpty (&AttachedResources)) { - // See if we can merge the attached resource with other resources - - NewResource = (SYSTEM_MEMORY_RESOURCE*)GetFirstNode (&AttachedResources); - Link = RemoveEntryList (&NewResource->Link); - while (!IsListEmpty (&AttachedResources)) { - // Merge resources - Resource = (SYSTEM_MEMORY_RESOURCE*)Link; - - // Ensure they overlap each other - ASSERT ( - ((NewResource->PhysicalStart >= Resource->PhysicalStart) && (NewResource->PhysicalStart < (Resource->PhysicalStart + Resource->ResourceLength))) || - (((NewResource->PhysicalStart + NewResource->ResourceLength) >= Resource->PhysicalStart) && ((NewResource->PhysicalStart + NewResource->ResourceLength) < (Resource->PhysicalStart + Resource->ResourceLength))) - ); - - NewResourceEnd = MAX (NewResource->PhysicalStart + NewResource->ResourceLength, Resource->PhysicalStart + Resource->ResourceLength); - NewResource->PhysicalStart = MIN (NewResource->PhysicalStart, Resource->PhysicalStart); - NewResource->ResourceLength = NewResourceEnd - NewResource->PhysicalStart; - - Link = RemoveEntryList (Link); - } - } else { - // None of the Resource of the list is attached to this ResHob. Create a new entry for it - NewResource = AllocateZeroPool (sizeof (SYSTEM_MEMORY_RESOURCE)); - NewResource->PhysicalStart = ResHob->PhysicalStart; - NewResource->ResourceLength = ResHob->ResourceLength; - } - InsertTailList (ResourceList, &NewResource->Link); - return EFI_SUCCESS; -} - -EFI_STATUS -GetSystemMemoryResources ( - IN LIST_ENTRY *ResourceList - ) -{ - EFI_HOB_RESOURCE_DESCRIPTOR *ResHob; - - InitializeListHead (ResourceList); - - // Find the first System Memory Resource Descriptor - ResHob = (EFI_HOB_RESOURCE_DESCRIPTOR *)GetFirstHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR); - while ((ResHob != NULL) && (ResHob->ResourceType != EFI_RESOURCE_SYSTEM_MEMORY)) { - ResHob = (EFI_HOB_RESOURCE_DESCRIPTOR *)GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, (VOID *)((UINTN)ResHob + ResHob->Header.HobLength)); - } - - // Did not find any - if (ResHob == NULL) { - return EFI_NOT_FOUND; - } else { - InsertSystemMemoryResources (ResourceList, ResHob); - } - - ResHob = (EFI_HOB_RESOURCE_DESCRIPTOR *)GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, (VOID *)((UINTN)ResHob + ResHob->Header.HobLength)); - while (ResHob != NULL) { - if (ResHob->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) { - InsertSystemMemoryResources (ResourceList, ResHob); - } - ResHob = (EFI_HOB_RESOURCE_DESCRIPTOR *)GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, (VOID *)((UINTN)ResHob + ResHob->Header.HobLength)); - } - - return EFI_SUCCESS; -} diff --git a/Platforms/AMD/Styx/FdtBlob/styx-husky.dtb b/Platforms/AMD/Styx/FdtBlob/styx-husky.dtb deleted file mode 100644 index 3427c5aa66fff6e4916044203acb4fdc876d76c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001
literal 8093 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 SIz!?l$ooN5=z1{DqW=NKelU9g
diff --git a/Platforms/AMD/Styx/FdtBlob/styx-husky.dts b/Platforms/AMD/Styx/FdtBlob/styx-husky.dts deleted file mode 100644 index a2af73f..0000000 --- a/Platforms/AMD/Styx/FdtBlob/styx-husky.dts +++ /dev/null @@ -1,435 +0,0 @@ -/* - * DTS file for AMD/Linaro 96Boards Enterprise Edition Server (Husky) Board - * Note: Based-on AMD Seattle Rev.B - * - * Copyright (C) 2015 Advanced Micro Devices, Inc. - */ - -/dts-v1/; - -/ { - model = "Linaro 96Boards Enterprise Edition Server (Husky) Board"; - compatible = "amd,seattle-overdrive", "amd,seattle"; - interrupt-parent = <0x1>; - #address-cells = <0x2>; - #size-cells = <0x2>; - - interrupt-controller@e1101000 { - compatible = "arm,gic-400", "arm,cortex-a15-gic"; - interrupt-controller; - #interrupt-cells = <0x3>; - #address-cells = <0x2>; - #size-cells = <0x2>; - reg = <0x0 0xe1110000 0x0 0x1000>, - <0x0 0xe112f000 0x0 0x2000>, - <0x0 0xe1140000 0x0 0x10000>, - <0x0 0xe1160000 0x0 0x10000>; - interrupts = <0x1 0x9 0xf04>; - ranges = <0x0 0x0 0x0 0xe1100000 0x0 0x100000>; - linux,phandle = <0x1>; - phandle = <0x1>; - - v2m@e0080000 { - compatible = "arm,gic-v2m-frame"; - msi-controller; - reg = <0x0 0x80000 0x0 0x1000>; - linux,phandle = <0x4>; - phandle = <0x4>; - }; - }; - - timer { - compatible = "arm,armv8-timer"; - interrupts = <0x1 0xd 0xff04>, - <0x1 0xe 0xff04>, - <0x1 0xb 0xff04>, - <0x1 0xa 0xff04>; - }; - - pmu { - compatible = "arm,armv8-pmuv3"; - interrupts = <0x0 0x7 0x4>, - <0x0 0x8 0x4>, - <0x0 0x9 0x4>, - <0x0 0xa 0x4>, - <0x0 0xb 0x4>, - <0x0 0xc 0x4>, - <0x0 0xd 0x4>, - <0x0 0xe 0x4>; - }; - - smb { - compatible = "simple-bus"; - #address-cells = <0x2>; - #size-cells = <0x2>; - ranges; - /* - * dma-ranges is 40-bit address space containing: - * - GICv2m MSI register is at 0xe0080000 - * - DRAM range [0x8000000000 to 0xffffffffff] - */ - dma-ranges = <0x0 0x0 0x0 0x0 0x100 0x0>; - - clk100mhz_0 { - compatible = "fixed-clock"; - #clock-cells = <0x0>; - clock-frequency = <100000000>; - clock-output-names = "adl3clk_100mhz"; - }; - - clk375mhz { - compatible = "fixed-clock"; - #clock-cells = <0x0>; - clock-frequency = <375000000>; - clock-output-names = "ccpclk_375mhz"; - }; - - clk333mhz { - compatible = "fixed-clock"; - #clock-cells = <0x0>; - clock-frequency = <333000000>; - clock-output-names = "sataclk_333mhz"; - linux,phandle = <0x2>; - phandle = <0x2>; - }; - - clk500mhz_0 { - compatible = "fixed-clock"; - #clock-cells = <0x0>; - clock-frequency = <500000000>; - clock-output-names = "pcieclk_500mhz"; - }; - - clk500mhz_1 { - compatible = "fixed-clock"; - #clock-cells = <0x0>; - clock-frequency = <500000000>; - clock-output-names = "dmaclk_500mhz"; - }; - - clk250mhz_4 { - compatible = "fixed-clock"; - #clock-cells = <0x0>; - clock-frequency = <250000000>; - clock-output-names = "miscclk_250mhz"; - }; - - clk100mhz_1 { - compatible = "fixed-clock"; - #clock-cells = <0x0>; - clock-frequency = <100000000>; - clock-output-names = "uartspiclk_100mhz"; - linux,phandle = <0x3>; - phandle = <0x3>; - }; - - sata@e0300000 { - compatible = "snps,dwc-ahci"; - reg = <0x0 0xe0300000 0x0 0xf0000>; - interrupts = <0x0 0x163 0x4>; - clocks = <0x2>; - dma-coherent; - }; - - sata@e0d00000 { - status = "disabled"; - compatible = "snps,dwc-ahci"; - reg = <0x0 0xe0d00000 0x0 0xf0000>; - interrupts = <0x0 0x162 0x4>; - clocks = <0x2>; - dma-coherent; - }; - - i2c@e1000000 { - compatible = "snps,designware-i2c"; - reg = <0x0 0xe1000000 0x0 0x1000>; - interrupts = <0x0 0x165 0x4>; - clocks = <0x3>; - }; - - i2c@e0050000 { - compatible = "snps,designware-i2c"; - reg = <0x0 0xe0050000 0x0 0x1000>; - interrupts = <0x0 0x154 0x4>; - clocks = <0x3>; - }; - - serial@e1010000 { - compatible = "arm,pl011", "arm,primecell"; - reg = <0x0 0xe1010000 0x0 0x1000>; - interrupts = <0x0 0x148 0x4>; - clocks = <0x3 0x3>; - clock-names = "uartclk", "apb_pclk"; - }; - - ssp@e1020000 { - compatible = "arm,pl022", "arm,primecell"; - reg = <0x0 0xe1020000 0x0 0x1000>; - spi-controller; - interrupts = <0x0 0x14a 0x4>; - clocks = <0x3>; - clock-names = "apb_pclk"; - }; - - ssp@e1030000 { - compatible = "arm,pl022", "arm,primecell"; - reg = <0x0 0xe1030000 0x0 0x1000>; - spi-controller; - interrupts = <0x0 0x149 0x4>; - clocks = <0x3>; - clock-names = "apb_pclk"; - num-cs = <0x1>; - #address-cells = <0x1>; - #size-cells = <0x0>; - - sdcard@0 { - compatible = "mmc-spi-slot"; - reg = <0x0>; - spi-max-frequency = <20000000>; - voltage-ranges = <3200 3400>; - pl022,hierarchy = <0x0>; - pl022,interface = <0x0>; - pl022,com-mode = <0x0>; - pl022,rx-level-trig = <0x0>; - pl022,tx-level-trig = <0x0>; - }; - }; - - gpio@e1050000 { /* [0 : 7] */ - compatible = "arm,pl061", "arm,primecell"; - #gpio-cells = <0x2>; - reg = <0x0 0xe1050000 0x0 0x1000>; - gpio-controller; - interrupt-controller; - #interrupt-cells = <0x2>; - interrupts = <0x0 0x166 0x4>; - clocks = <0x3>; - clock-names = "apb_pclk"; - }; - - gpio@e0020000 { /* [8 : 15] */ - status = "disabled"; - compatible = "arm,pl061", "arm,primecell"; - #gpio-cells = <0x2>; - reg = <0x0 0xe0020000 0x0 0x1000>; - gpio-controller; - interrupt-controller; - #interrupt-cells = <0x2>; - interrupts = <0x0 0x16e 0x4>; - clocks = <0x3>; - clock-names = "apb_pclk"; - }; - - gpio@e0030000 { /* [16 : 23] */ - status = "disabled"; - compatible = "arm,pl061", "arm,primecell"; - #gpio-cells = <0x2>; - reg = <0x0 0xe0030000 0x0 0x1000>; - gpio-controller; - interrupt-controller; - #interrupt-cells = <0x2>; - interrupts = <0x0 0x16d 0x4>; - clocks = <0x3>; - clock-names = "apb_pclk"; - }; - - gpio@e0080000 { /* [24] */ - compatible = "arm,pl061", "arm,primecell"; - #gpio-cells = <0x2>; - reg = <0x0 0xe0080000 0x0 0x1000>; - gpio-controller; - interrupt-controller; - #interrupt-cells = <0x2>; - interrupts = <0x0 0x169 0x4>; - clocks = <0x3>; - clock-names = "apb_pclk"; - }; - - ccp: ccp@e0100000 { - compatible = "amd,ccp-seattle-v1a"; - reg = <0x0 0xe0100000 0x0 0x10000>; - interrupts = <0x0 0x3 0x4>; - dma-coherent; - amd,zlib-support = <0x1>; - }; - - pcie: pcie@f0000000 { - compatible = "pci-host-ecam-generic"; - #address-cells = <0x3>; - #size-cells = <0x2>; - #interrupt-cells = <0x1>; - device_type = "pci"; - bus-range = <0x0 0x7f>; - msi-parent = <0x4>; - reg = <0x0 0xf0000000 0x0 0x10000000>; - interrupt-map-mask = <0xf800 0x0 0x0 0x7>; - interrupt-map = <0x1000 0x0 0x0 0x1 0x1 0x0 0x0 0x0 0x120 0x1>, - <0x1000 0x0 0x0 0x2 0x1 0x0 0x0 0x0 0x121 0x1>, - <0x1000 0x0 0x0 0x3 0x1 0x0 0x0 0x0 0x122 0x1>, - <0x1000 0x0 0x0 0x4 0x1 0x0 0x0 0x0 0x123 0x1>; - dma-coherent; - dma-ranges = <0x43000000 0x0 0x0 0x0 0x0 0x100 0x0>; - ranges = <0x1000000 0x0 0x00000000 0x0 0xefff0000 0x00 0x00010000>, /* I/O Memory (size=64K) */ - <0x2000000 0x0 0x40000000 0x0 0x40000000 0x00 0x80000000>, /* 32-bit MMIO (size=2G) */ - <0x3000000 0x1 0x00000000 0x1 0x00000000 0x7f 0x00000000>; /* 64-bit MMIO (size= 124G) */ - }; - - ccn@0xe8000000 { - compatible = "arm,ccn-504"; - reg = <0x0 0xe8000000 0x0 0x1000000>; - interrupts = <0x0 0x17c 0x4>; - }; - - gwdt@e0bb0000 { - status = "disabled"; - compatible = "arm,sbsa-gwdt"; - reg = <0x0 0xe0bb0000 0x0 0x10000 - 0x0 0xe0bc0000 0x0 0x10000>; - reg-names = "refresh", "control"; - interrupts = <0x0 0x151 0x4>; - interrupt-names = "ws0"; - }; - - kcs@e0010000 { - status = "disabled"; - compatible = "ipmi-kcs"; - device_type = "ipmi"; - reg = <0x0 0xe0010000 0 0x8>; - interrupts = <0 389 4>; - interrupt-names = "ipmi_kcs"; - reg-size = <1>; - reg-spacing = <4>; - }; - - clk250mhz_0 { - compatible = "fixed-clock"; - #clock-cells = <0x0>; - clock-frequency = <250000000>; - clock-output-names = "xgmacclk0_dma_250mhz"; - linux,phandle = <0x5>; - phandle = <0x5>; - }; - - clk250mhz_1 { - compatible = "fixed-clock"; - #clock-cells = <0x0>; - clock-frequency = <250000000>; - clock-output-names = "xgmacclk0_ptp_250mhz"; - linux,phandle = <0x6>; - phandle = <0x6>; - }; - - clk250mhz_2 { - compatible = "fixed-clock"; - #clock-cells = <0x0>; - clock-frequency = <250000000>; - clock-output-names = "xgmacclk1_dma_250mhz"; - linux,phandle = <0x7>; - phandle = <0x7>; - }; - - clk250mhz_3 { - compatible = "fixed-clock"; - #clock-cells = <0x0>; - clock-frequency = <250000000>; - clock-output-names = "xgmacclk1_ptp_250mhz"; - linux,phandle = <0x8>; - phandle = <0x8>; - }; - - phy@e1240800 { - status = "disabled"; - compatible = "amd,xgbe-phy-seattle-v1a"; - reg = <0x0 0xe1240800 0x0 0x0400>, /* SERDES RX/TX0 */ - <0x0 0xe1250000 0x0 0x0060>, /* SERDES IR 1/2 */ - <0x0 0xe12500f8 0x0 0x0004>; /* SERDES IR 2/2 */ - interrupts = <0x0 0x143 0x4>; - amd,speed-set = <0x0>; - amd,serdes-blwc = <0x1 0x1 0x0>; - amd,serdes-cdr-rate = <0x2 0x2 0x7>; - amd,serdes-pq-skew = <0xa 0xa 0x12>; - amd,serdes-tx-amp = <0xf 0xf 0xa>; - amd,serdes-dfe-tap-config = <0x3 0x3 0x1>; - amd,serdes-dfe-tap-enable = <0x0 0x0 0x7f>; - linux,phandle = <0x9>; - phandle = <0x9>; - }; - - phy@e1240c00 { - status = "disabled"; - compatible = "amd,xgbe-phy-seattle-v1a"; - reg = <0x0 0xe1240c00 0x0 0x0400>, /* SERDES RX/TX0 */ - <0x0 0xe1250080 0x0 0x0060>, /* SERDES IR 1/2 */ - <0x0 0xe12500fc 0x0 0x0004>; /* SERDES IR 2/2 */ - interrupts = <0x0 0x142 0x4>; - amd,speed-set = <0x0>; - amd,serdes-blwc = <0x1 0x1 0x0>; - amd,serdes-cdr-rate = <0x2 0x2 0x7>; - amd,serdes-pq-skew = <0xa 0xa 0x12>; - amd,serdes-tx-amp = <0xf 0xf 0xa>; - amd,serdes-dfe-tap-config = <0x3 0x3 0x1>; - amd,serdes-dfe-tap-enable = <0x0 0x0 0x7f>; - linux,phandle = <0xa>; - phandle = <0xa>; - }; - - xgmac@e0700000 { - status = "disabled"; - compatible = "amd,xgbe-seattle-v1a"; - reg = <0x0 0xe0700000 0x0 0x80000 0x0 0xe0780000 0x0 0x80000>; - interrupts = <0x0 0x145 0x4>, - <0x0 0x15a 0x1>, - <0x0 0x15b 0x1>, - <0x0 0x15c 0x1>, - <0x0 0x15d 0x1>; - amd,per-channel-interrupt; - mac-address = [02 a1 a2 a3 a4 a5]; - clocks = <0x5 0x6>; - clock-names = "dma_clk", "ptp_clk"; - phy-handle = <0x9>; - phy-mode = "xgmii"; - #stream-id-cells = <0x18>; - dma-coherent; - linux,phandle = <0xb>; - phandle = <0xb>; - }; - - xgmac@e0900000 { - status = "disabled"; - compatible = "amd,xgbe-seattle-v1a"; - reg = <0x0 0xe0900000 0x0 0x80000 0x0 0xe0980000 0x0 0x80000>; - interrupts = <0x0 0x144 0x4>, - <0x0 0x155 0x1>, - <0x0 0x156 0x1>, - <0x0 0x157 0x1>, - <0x0 0x158 0x1>; - amd,per-channel-interrupt; - mac-address = [02 b1 b2 b3 b4 b5]; - clocks = <0x7 0x8>; - clock-names = "dma_clk", "ptp_clk"; - phy-handle = <0xa>; - phy-mode = "xgmii"; - #stream-id-cells = <0x18>; - dma-coherent; - linux,phandle = <0xc>; - phandle = <0xc>; - }; - }; - - chosen { - stdout-path = "/smb/serial@e1010000"; - /* Note: - * Linux support for pci-probe-only DT is not - * stable. Disable this for now and let Linux - * take care of the resource assignment. - */ - // linux,pci-probe-only; - }; - - psci { - compatible = "arm,psci-0.2", "arm,psci"; - method = "smc"; - }; -}; - - diff --git a/Platforms/AMD/Styx/FdtBlob/styx-overdrive.dtb b/Platforms/AMD/Styx/FdtBlob/styx-overdrive.dtb deleted file mode 100644 index 0c0468d89d60faf6c461b0e2e1c67098b063c7a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001
literal 8089 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 JJ(?uJ{{StXEo}e*
diff --git a/Platforms/AMD/Styx/FdtBlob/styx-overdrive.dts b/Platforms/AMD/Styx/FdtBlob/styx-overdrive.dts deleted file mode 100644 index e1a3a98..0000000 --- a/Platforms/AMD/Styx/FdtBlob/styx-overdrive.dts +++ /dev/null @@ -1,435 +0,0 @@ -/* - * DTS file for AMD Seattle (RevB) Overdrive Development Board - * Note: Based-on AMD Seattle Rev.B - * - * Copyright (C) 2015 Advanced Micro Devices, Inc. - */ - -/dts-v1/; - -/ { - model = "AMD Seattle (Rev.B) Development Board (Overdrive)"; - compatible = "amd,seattle-overdrive", "amd,seattle"; - interrupt-parent = <0x1>; - #address-cells = <0x2>; - #size-cells = <0x2>; - - interrupt-controller@e1101000 { - compatible = "arm,gic-400", "arm,cortex-a15-gic"; - interrupt-controller; - #interrupt-cells = <0x3>; - #address-cells = <0x2>; - #size-cells = <0x2>; - reg = <0x0 0xe1110000 0x0 0x1000>, - <0x0 0xe112f000 0x0 0x2000>, - <0x0 0xe1140000 0x0 0x10000>, - <0x0 0xe1160000 0x0 0x10000>; - interrupts = <0x1 0x9 0xf04>; - ranges = <0x0 0x0 0x0 0xe1100000 0x0 0x100000>; - linux,phandle = <0x1>; - phandle = <0x1>; - - v2m@e0080000 { - compatible = "arm,gic-v2m-frame"; - msi-controller; - reg = <0x0 0x80000 0x0 0x1000>; - linux,phandle = <0x4>; - phandle = <0x4>; - }; - }; - - timer { - compatible = "arm,armv8-timer"; - interrupts = <0x1 0xd 0xff04>, - <0x1 0xe 0xff04>, - <0x1 0xb 0xff04>, - <0x1 0xa 0xff04>; - }; - - pmu { - compatible = "arm,armv8-pmuv3"; - interrupts = <0x0 0x7 0x4>, - <0x0 0x8 0x4>, - <0x0 0x9 0x4>, - <0x0 0xa 0x4>, - <0x0 0xb 0x4>, - <0x0 0xc 0x4>, - <0x0 0xd 0x4>, - <0x0 0xe 0x4>; - }; - - smb { - compatible = "simple-bus"; - #address-cells = <0x2>; - #size-cells = <0x2>; - ranges; - /* - * dma-ranges is 40-bit address space containing: - * - GICv2m MSI register is at 0xe0080000 - * - DRAM range [0x8000000000 to 0xffffffffff] - */ - dma-ranges = <0x0 0x0 0x0 0x0 0x100 0x0>; - - clk100mhz_0 { - compatible = "fixed-clock"; - #clock-cells = <0x0>; - clock-frequency = <100000000>; - clock-output-names = "adl3clk_100mhz"; - }; - - clk375mhz { - compatible = "fixed-clock"; - #clock-cells = <0x0>; - clock-frequency = <375000000>; - clock-output-names = "ccpclk_375mhz"; - }; - - clk333mhz { - compatible = "fixed-clock"; - #clock-cells = <0x0>; - clock-frequency = <333000000>; - clock-output-names = "sataclk_333mhz"; - linux,phandle = <0x2>; - phandle = <0x2>; - }; - - clk500mhz_0 { - compatible = "fixed-clock"; - #clock-cells = <0x0>; - clock-frequency = <500000000>; - clock-output-names = "pcieclk_500mhz"; - }; - - clk500mhz_1 { - compatible = "fixed-clock"; - #clock-cells = <0x0>; - clock-frequency = <500000000>; - clock-output-names = "dmaclk_500mhz"; - }; - - clk250mhz_4 { - compatible = "fixed-clock"; - #clock-cells = <0x0>; - clock-frequency = <250000000>; - clock-output-names = "miscclk_250mhz"; - }; - - clk100mhz_1 { - compatible = "fixed-clock"; - #clock-cells = <0x0>; - clock-frequency = <100000000>; - clock-output-names = "uartspiclk_100mhz"; - linux,phandle = <0x3>; - phandle = <0x3>; - }; - - sata@e0300000 { - compatible = "snps,dwc-ahci"; - reg = <0x0 0xe0300000 0x0 0xf0000>; - interrupts = <0x0 0x163 0x4>; - clocks = <0x2>; - dma-coherent; - }; - - sata@e0d00000 { - status = "disabled"; - compatible = "snps,dwc-ahci"; - reg = <0x0 0xe0d00000 0x0 0xf0000>; - interrupts = <0x0 0x162 0x4>; - clocks = <0x2>; - dma-coherent; - }; - - i2c@e1000000 { - compatible = "snps,designware-i2c"; - reg = <0x0 0xe1000000 0x0 0x1000>; - interrupts = <0x0 0x165 0x4>; - clocks = <0x3>; - }; - - i2c@e0050000 { - compatible = "snps,designware-i2c"; - reg = <0x0 0xe0050000 0x0 0x1000>; - interrupts = <0x0 0x154 0x4>; - clocks = <0x3>; - }; - - serial@e1010000 { - compatible = "arm,pl011", "arm,primecell"; - reg = <0x0 0xe1010000 0x0 0x1000>; - interrupts = <0x0 0x148 0x4>; - clocks = <0x3 0x3>; - clock-names = "uartclk", "apb_pclk"; - }; - - ssp@e1020000 { - compatible = "arm,pl022", "arm,primecell"; - reg = <0x0 0xe1020000 0x0 0x1000>; - spi-controller; - interrupts = <0x0 0x14a 0x4>; - clocks = <0x3>; - clock-names = "apb_pclk"; - }; - - ssp@e1030000 { - compatible = "arm,pl022", "arm,primecell"; - reg = <0x0 0xe1030000 0x0 0x1000>; - spi-controller; - interrupts = <0x0 0x149 0x4>; - clocks = <0x3>; - clock-names = "apb_pclk"; - num-cs = <0x1>; - #address-cells = <0x1>; - #size-cells = <0x0>; - - sdcard@0 { - compatible = "mmc-spi-slot"; - reg = <0x0>; - spi-max-frequency = <20000000>; - voltage-ranges = <3200 3400>; - pl022,hierarchy = <0x0>; - pl022,interface = <0x0>; - pl022,com-mode = <0x0>; - pl022,rx-level-trig = <0x0>; - pl022,tx-level-trig = <0x0>; - }; - }; - - gpio@e1050000 { /* [0 : 7] */ - compatible = "arm,pl061", "arm,primecell"; - #gpio-cells = <0x2>; - reg = <0x0 0xe1050000 0x0 0x1000>; - gpio-controller; - interrupt-controller; - #interrupt-cells = <0x2>; - interrupts = <0x0 0x166 0x4>; - clocks = <0x3>; - clock-names = "apb_pclk"; - }; - - gpio@e0020000 { /* [8 : 15] */ - status = "disabled"; - compatible = "arm,pl061", "arm,primecell"; - #gpio-cells = <0x2>; - reg = <0x0 0xe0020000 0x0 0x1000>; - gpio-controller; - interrupt-controller; - #interrupt-cells = <0x2>; - interrupts = <0x0 0x16e 0x4>; - clocks = <0x3>; - clock-names = "apb_pclk"; - }; - - gpio@e0030000 { /* [16 : 23] */ - status = "disabled"; - compatible = "arm,pl061", "arm,primecell"; - #gpio-cells = <0x2>; - reg = <0x0 0xe0030000 0x0 0x1000>; - gpio-controller; - interrupt-controller; - #interrupt-cells = <0x2>; - interrupts = <0x0 0x16d 0x4>; - clocks = <0x3>; - clock-names = "apb_pclk"; - }; - - gpio@e0080000 { /* [24] */ - compatible = "arm,pl061", "arm,primecell"; - #gpio-cells = <0x2>; - reg = <0x0 0xe0080000 0x0 0x1000>; - gpio-controller; - interrupt-controller; - #interrupt-cells = <0x2>; - interrupts = <0x0 0x169 0x4>; - clocks = <0x3>; - clock-names = "apb_pclk"; - }; - - ccp: ccp@e0100000 { - compatible = "amd,ccp-seattle-v1a"; - reg = <0x0 0xe0100000 0x0 0x10000>; - interrupts = <0x0 0x3 0x4>; - dma-coherent; - amd,zlib-support = <0x1>; - }; - - pcie: pcie@f0000000 { - compatible = "pci-host-ecam-generic"; - #address-cells = <0x3>; - #size-cells = <0x2>; - #interrupt-cells = <0x1>; - device_type = "pci"; - bus-range = <0x0 0x7f>; - msi-parent = <0x4>; - reg = <0x0 0xf0000000 0x0 0x10000000>; - interrupt-map-mask = <0xf800 0x0 0x0 0x7>; - interrupt-map = <0x1000 0x0 0x0 0x1 0x1 0x0 0x0 0x0 0x120 0x1>, - <0x1000 0x0 0x0 0x2 0x1 0x0 0x0 0x0 0x121 0x1>, - <0x1000 0x0 0x0 0x3 0x1 0x0 0x0 0x0 0x122 0x1>, - <0x1000 0x0 0x0 0x4 0x1 0x0 0x0 0x0 0x123 0x1>; - dma-coherent; - dma-ranges = <0x43000000 0x0 0x0 0x0 0x0 0x100 0x0>; - ranges = <0x1000000 0x0 0x00000000 0x0 0xefff0000 0x00 0x00010000>, /* I/O Memory (size=64K) */ - <0x2000000 0x0 0x40000000 0x0 0x40000000 0x00 0x80000000>, /* 32-bit MMIO (size=2G) */ - <0x3000000 0x1 0x00000000 0x1 0x00000000 0x7f 0x00000000>; /* 64-bit MMIO (size= 124G) */ - }; - - ccn@0xe8000000 { - compatible = "arm,ccn-504"; - reg = <0x0 0xe8000000 0x0 0x1000000>; - interrupts = <0x0 0x17c 0x4>; - }; - - gwdt@e0bb0000 { - status = "disabled"; - compatible = "arm,sbsa-gwdt"; - reg = <0x0 0xe0bb0000 0x0 0x10000 - 0x0 0xe0bc0000 0x0 0x10000>; - reg-names = "refresh", "control"; - interrupts = <0x0 0x151 0x4>; - interrupt-names = "ws0"; - }; - - kcs@e0010000 { - status = "disabled"; - compatible = "ipmi-kcs"; - device_type = "ipmi"; - reg = <0x0 0xe0010000 0 0x8>; - interrupts = <0 389 4>; - interrupt-names = "ipmi_kcs"; - reg-size = <1>; - reg-spacing = <4>; - }; - - clk250mhz_0 { - compatible = "fixed-clock"; - #clock-cells = <0x0>; - clock-frequency = <250000000>; - clock-output-names = "xgmacclk0_dma_250mhz"; - linux,phandle = <0x5>; - phandle = <0x5>; - }; - - clk250mhz_1 { - compatible = "fixed-clock"; - #clock-cells = <0x0>; - clock-frequency = <250000000>; - clock-output-names = "xgmacclk0_ptp_250mhz"; - linux,phandle = <0x6>; - phandle = <0x6>; - }; - - clk250mhz_2 { - compatible = "fixed-clock"; - #clock-cells = <0x0>; - clock-frequency = <250000000>; - clock-output-names = "xgmacclk1_dma_250mhz"; - linux,phandle = <0x7>; - phandle = <0x7>; - }; - - clk250mhz_3 { - compatible = "fixed-clock"; - #clock-cells = <0x0>; - clock-frequency = <250000000>; - clock-output-names = "xgmacclk1_ptp_250mhz"; - linux,phandle = <0x8>; - phandle = <0x8>; - }; - - phy@e1240800 { - status = "disabled"; - compatible = "amd,xgbe-phy-seattle-v1a"; - reg = <0x0 0xe1240800 0x0 0x0400>, /* SERDES RX/TX0 */ - <0x0 0xe1250000 0x0 0x0060>, /* SERDES IR 1/2 */ - <0x0 0xe12500f8 0x0 0x0004>; /* SERDES IR 2/2 */ - interrupts = <0x0 0x143 0x4>; - amd,speed-set = <0x0>; - amd,serdes-blwc = <0x1 0x1 0x0>; - amd,serdes-cdr-rate = <0x2 0x2 0x7>; - amd,serdes-pq-skew = <0xa 0xa 0x12>; - amd,serdes-tx-amp = <0xf 0xf 0xa>; - amd,serdes-dfe-tap-config = <0x3 0x3 0x1>; - amd,serdes-dfe-tap-enable = <0x0 0x0 0x7f>; - linux,phandle = <0x9>; - phandle = <0x9>; - }; - - phy@e1240c00 { - status = "disabled"; - compatible = "amd,xgbe-phy-seattle-v1a"; - reg = <0x0 0xe1240c00 0x0 0x0400>, /* SERDES RX/TX0 */ - <0x0 0xe1250080 0x0 0x0060>, /* SERDES IR 1/2 */ - <0x0 0xe12500fc 0x0 0x0004>; /* SERDES IR 2/2 */ - interrupts = <0x0 0x142 0x4>; - amd,speed-set = <0x0>; - amd,serdes-blwc = <0x1 0x1 0x0>; - amd,serdes-cdr-rate = <0x2 0x2 0x7>; - amd,serdes-pq-skew = <0xa 0xa 0x12>; - amd,serdes-tx-amp = <0xf 0xf 0xa>; - amd,serdes-dfe-tap-config = <0x3 0x3 0x1>; - amd,serdes-dfe-tap-enable = <0x0 0x0 0x7f>; - linux,phandle = <0xa>; - phandle = <0xa>; - }; - - xgmac@e0700000 { - status = "disabled"; - compatible = "amd,xgbe-seattle-v1a"; - reg = <0x0 0xe0700000 0x0 0x80000 0x0 0xe0780000 0x0 0x80000>; - interrupts = <0x0 0x145 0x4>, - <0x0 0x15a 0x1>, - <0x0 0x15b 0x1>, - <0x0 0x15c 0x1>, - <0x0 0x15d 0x1>; - amd,per-channel-interrupt; - mac-address = [02 a1 a2 a3 a4 a5]; - clocks = <0x5 0x6>; - clock-names = "dma_clk", "ptp_clk"; - phy-handle = <0x9>; - phy-mode = "xgmii"; - #stream-id-cells = <0x18>; - dma-coherent; - linux,phandle = <0xb>; - phandle = <0xb>; - }; - - xgmac@e0900000 { - status = "disabled"; - compatible = "amd,xgbe-seattle-v1a"; - reg = <0x0 0xe0900000 0x0 0x80000 0x0 0xe0980000 0x0 0x80000>; - interrupts = <0x0 0x144 0x4>, - <0x0 0x155 0x1>, - <0x0 0x156 0x1>, - <0x0 0x157 0x1>, - <0x0 0x158 0x1>; - amd,per-channel-interrupt; - mac-address = [02 b1 b2 b3 b4 b5]; - clocks = <0x7 0x8>; - clock-names = "dma_clk", "ptp_clk"; - phy-handle = <0xa>; - phy-mode = "xgmii"; - #stream-id-cells = <0x18>; - dma-coherent; - linux,phandle = <0xc>; - phandle = <0xc>; - }; - }; - - chosen { - stdout-path = "/smb/serial@e1010000"; - /* Note: - * Linux support for pci-probe-only DT is not - * stable. Disable this for now and let Linux - * take care of the resource assignment. - */ - // linux,pci-probe-only; - }; - - psci { - compatible = "arm,psci-0.2", "arm,psci"; - method = "smc"; - }; -}; - - diff --git a/Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-husky.dtb b/Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-husky.dtb new file mode 100644 index 0000000000000000000000000000000000000000..3427c5aa66fff6e4916044203acb4fdc876d76c3 GIT binary patch literal 8093 zcmdT}U5F(|74DujqcLWatQr&|x$Z=WFzw!%*-18_I3zAa5yTiZ#Gl!|)iw7vbNk*- zSKs+r1@}dL4T8ZJ!9;yk%<7Y}`kIG80t)eM=D|N$F)x82;`)83s`}RS?(EJ__Q3<y zea@*<=bSoq>Zhw;yZgWYjG_mB97WN&D0<*|ydOrn59MAIz=^xTf5zf_p0T4&;ElFX z^!a?0R^!fNk32q3tITxHk7`|&Rc>_We3sYwc+~llt~PYldHBhRS>OJ6M+DiFI!>d^ zrbRYybXwO#os1!xRr!XF0xqSk{JZd`pY((6NmIv6Krc8t&gn}vDeFXyM|CwG4t2Gn z7Z$n;-EJ2`0P1)UWj3vf`F^gFv#24i##ODil5}A?0h^*C%lD@oPTNm8{8qlOeg#D| z?Xm{~Hr%_X-gI<F-n$=gq>J|M{d;KYdLK$3g%Wp0(LMBq{12g2C=Kko5p^R=8Om;> zgfaY%qvMUmVnuhm=MW(mBGG#a^-YW*ldM%~p}_=DC*k`j#A#8XMA3WXiHA55+V=kP zP1}5P3|ZnjFSP4~*C)0yE*s~Prj~W|(Z>NfdyRV7uag0OSAf6Q;bNyOCJ=3W4s4)i zW69TD074stccah-fxYuM#-PDrqrqXj!8vAL9=<j>d=*@LGDQ!h_{6reCND}%i{8YL zEqv-YjY4@JQ=jvs2@D@`=EDmpEpUm2SgGMUW<xQ!xGKZVHuQ6LE#J~vqK0F&&bHpp zizEP^{>2?{?RxqiAXn0CxCEW6Rw=9On1Z+T=rZgGOWGgG&i&8c^#?SiUB>H*QYFoV zIwgLzv$S+{JMaH<vf}JWe@t4ZVrZ(=_nmVn90TStY46AKapL-sS7mn5miSSsT+<J$ z6x{3VFa-`D*T9a%H7lgMftjX1i_4NHXOCp(<X>OD<ouKV6uD9Ck5x*QjUAVdN9#|J zk6g2^Owy`0WlmE;N;dh+F=UMWm~sq>%NTO(u^29KEtJ_|>lmk5Gb+t|wyBbIpmHz( zY{!L8k=St!Wb|yEU$apgQ-<@HZTNm2#pe>x=nY55&WEh!1J|3sWVuOuL!Ge!fVvLm z+iN0kGwXWadZ;~+Z~3Cab}F9v-qHu|UM@b`<o(fRTImF`G|KuWMzV5{JKZ0`7;yr$ z{a||;8?oK(B2WF$i0%X1-noNz33Nx=hPIyuZ(rL+S9v;Q*QN8mJ=a><L&{-yVL?t2 zI0zM5>EY1JO#9v}!8f%3WMH5B4D*A1_vJp|SDD*L>?kdJt6UAiBiP(EB^_LB#V7P} zaq(6@Qj<XABdNDh=tmf@&w;*CyeP+9y?PTLWqv`1K>5S@$QA;(^zpM0JB*Li4EdOQ zK1a*ZviF9xEL4;+nZg-(r3;)udG7PGMWGU`L5UfTYgPcfE@eqi$0y^3#Mfio;|{`n z32K-Ru1$OfIKk7Owq!$pp+$eQMZ2Sw<cZ`;zs$!>mS8ebcQ_7@?32%o&-WlpJ#524 zP$<#v_45nd_y>4Uj?g|wdmUk3twHWEV;1zM8zw((?zd(htDifxC=lk~q5C<4iX-<k zm_WC$pMKP)>m^)1bU%yZ^fUM<p*P1HH?FDz#~QaBDh@qvN?~obdq=od$lk@TUeqW4 zdw63ZrI+k)Gq-lcWpL~s!n$D2_;sL}XK%RnoU1RnRx(d`rd(OG`?qt1y7;v@i@Ibm zHg%#^S|oiv!k(v40iX=~eA?lj<~m5do_-2=uujI8p%W~r=i2sr5&(bZqJOV|_VH}` z`=*H5005<a)Wv_aTal}@-)5})3F`jVNZV@qVWVYfk{v!;auOHt1BgEgqAf=|ZGDVK zTaJBc%gs3+brAgcJOKQKCxq30G%DDJXOpVoIMIJya|kNf3Brmzr|(Okol)Q1zc~g3 z>AzB=mF||7>E=#XY{ndu^9|~g<?dO^li!Tf-^l?urM`{(c8<S|D#k->^f$8_lc3j| z9#AO1-x@9FTHec;o=FonhA@C_Iw%Sy+W9S?0O!EY?=0zP$}(@>s`Of=%^-5OLKI?M zFo)tVg7$fccYJNrbSWpkuPehllIHLSKHKl-JNdJDS>y>C0w+)&J7j#BeBoGL6U!Yx zGWMRK?caCN#`_2T@ippM-K!t<GyK+~CblQdHIwb^I1ks|H=Xp&+c@yIfACHBLFl}) z)yKyp&Y|5^d_{&|c8z_xcjC#w`6F|mbju$(QoV!zly$kkKeH`=NVoi11WSCDIdIUs zk^SPcaP#=^ycx!abjzRSZt5NK=ce)DP8s?`TKp*o+c-8Zp5<*Jcm&GrHxE9HI=SoJ z>i2Yl#_dhcwWltH674=jQv{|g=#R;Zj|+T&ew%Lq1!y~*!%qZ!=Ke#V2~KW?gUY$# zXPW0f4j%i*;>QAdXTAcOcY7?SP`o_nFXtHx>pcHk4kzvBAoctZw1;5tlexjzQJ(!_ z9qGNXR<|qG3>|@{CAOCYiJ}X9Bi8?MGzDBA{k>?+n0Y?l{}-|LV@1CiYtj;HS;w%# zKPpEfaBYA0%WJNE)4XmS++5oZ-U=n!DftAr)ZW>$q@x+vPonre^E`0+2Z*2LL(nMx zT7Z8&z`x;e>H*CB5)a~7(`H_odGV#6{_N-E3y&VWj>7fVuYvahzsl8{*9lw|+_eIA za9sa{x6e`P+(E4J987?h`3G?BGtP(Re8Yb5zK!?VPFCVhdQaRRyB%?V9##lG?mx2R zK5_pHYJJ?l4BW?^Yk<eU8sN`3-1WH?_g}qy`PaXJ#NN1bZJ{@8bC9_Ed_8L1Il;rY zlV;o{_6mo6&96`^gPflE_Zj?*ICF!`F5jj!$_>5fmG1_g(a2A_pK#YpjgYf_V%8Lj zcD(I7i*crhIE@u$TIaaXjHW;CO57ce>S!*_G91}V!n-sR&6)h7cKB3w`jao33%Jsv z(*3Dc6IJP`uT3<}N0Y7ja*&QPSS?H*{3wht3lb+cC;vg5L5t%A`P@X0)OKX)@uV&% zbuz+VF=JUqG^p`FOBYO?*7%8IrL7q6gaW5WlOn+Zk=!EP!XGwoVPib3)4ulJ;CgX! zaek2NDy`IDJF>L&cr8`h(FkY4z&f(pN``tv50kpe`;J%d;mz?H$o0{p%}-PL7khD- z_YyNHOZ*v)GQE*2y;^UVI>Nsx>zYK+jo5SminK(3%=$F`Aj=3N;-WPbwP9fm2UtW* znW}u$w||36jek-`*Y4kNm1&dohMOv+RaU{9+W$Wmnew^Btn1BC41G_FGUQ}yI;r6+ zMq~{kvcI3Dxv$Y9Ubjn4sjEaGZ$^k{<9~$XZ{jjF;`zoU7Eu|BIa5~}pVK-1tVvp$ SIz!?l$ooN5=z1{DqW=NKelU9g
literal 0 HcmV?d00001
diff --git a/Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-husky.dts b/Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-husky.dts new file mode 100644 index 0000000..a2af73f --- /dev/null +++ b/Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-husky.dts @@ -0,0 +1,435 @@ +/* + * DTS file for AMD/Linaro 96Boards Enterprise Edition Server (Husky) Board + * Note: Based-on AMD Seattle Rev.B + * + * Copyright (C) 2015 Advanced Micro Devices, Inc. + */ + +/dts-v1/; + +/ { + model = "Linaro 96Boards Enterprise Edition Server (Husky) Board"; + compatible = "amd,seattle-overdrive", "amd,seattle"; + interrupt-parent = <0x1>; + #address-cells = <0x2>; + #size-cells = <0x2>; + + interrupt-controller@e1101000 { + compatible = "arm,gic-400", "arm,cortex-a15-gic"; + interrupt-controller; + #interrupt-cells = <0x3>; + #address-cells = <0x2>; + #size-cells = <0x2>; + reg = <0x0 0xe1110000 0x0 0x1000>, + <0x0 0xe112f000 0x0 0x2000>, + <0x0 0xe1140000 0x0 0x10000>, + <0x0 0xe1160000 0x0 0x10000>; + interrupts = <0x1 0x9 0xf04>; + ranges = <0x0 0x0 0x0 0xe1100000 0x0 0x100000>; + linux,phandle = <0x1>; + phandle = <0x1>; + + v2m@e0080000 { + compatible = "arm,gic-v2m-frame"; + msi-controller; + reg = <0x0 0x80000 0x0 0x1000>; + linux,phandle = <0x4>; + phandle = <0x4>; + }; + }; + + timer { + compatible = "arm,armv8-timer"; + interrupts = <0x1 0xd 0xff04>, + <0x1 0xe 0xff04>, + <0x1 0xb 0xff04>, + <0x1 0xa 0xff04>; + }; + + pmu { + compatible = "arm,armv8-pmuv3"; + interrupts = <0x0 0x7 0x4>, + <0x0 0x8 0x4>, + <0x0 0x9 0x4>, + <0x0 0xa 0x4>, + <0x0 0xb 0x4>, + <0x0 0xc 0x4>, + <0x0 0xd 0x4>, + <0x0 0xe 0x4>; + }; + + smb { + compatible = "simple-bus"; + #address-cells = <0x2>; + #size-cells = <0x2>; + ranges; + /* + * dma-ranges is 40-bit address space containing: + * - GICv2m MSI register is at 0xe0080000 + * - DRAM range [0x8000000000 to 0xffffffffff] + */ + dma-ranges = <0x0 0x0 0x0 0x0 0x100 0x0>; + + clk100mhz_0 { + compatible = "fixed-clock"; + #clock-cells = <0x0>; + clock-frequency = <100000000>; + clock-output-names = "adl3clk_100mhz"; + }; + + clk375mhz { + compatible = "fixed-clock"; + #clock-cells = <0x0>; + clock-frequency = <375000000>; + clock-output-names = "ccpclk_375mhz"; + }; + + clk333mhz { + compatible = "fixed-clock"; + #clock-cells = <0x0>; + clock-frequency = <333000000>; + clock-output-names = "sataclk_333mhz"; + linux,phandle = <0x2>; + phandle = <0x2>; + }; + + clk500mhz_0 { + compatible = "fixed-clock"; + #clock-cells = <0x0>; + clock-frequency = <500000000>; + clock-output-names = "pcieclk_500mhz"; + }; + + clk500mhz_1 { + compatible = "fixed-clock"; + #clock-cells = <0x0>; + clock-frequency = <500000000>; + clock-output-names = "dmaclk_500mhz"; + }; + + clk250mhz_4 { + compatible = "fixed-clock"; + #clock-cells = <0x0>; + clock-frequency = <250000000>; + clock-output-names = "miscclk_250mhz"; + }; + + clk100mhz_1 { + compatible = "fixed-clock"; + #clock-cells = <0x0>; + clock-frequency = <100000000>; + clock-output-names = "uartspiclk_100mhz"; + linux,phandle = <0x3>; + phandle = <0x3>; + }; + + sata@e0300000 { + compatible = "snps,dwc-ahci"; + reg = <0x0 0xe0300000 0x0 0xf0000>; + interrupts = <0x0 0x163 0x4>; + clocks = <0x2>; + dma-coherent; + }; + + sata@e0d00000 { + status = "disabled"; + compatible = "snps,dwc-ahci"; + reg = <0x0 0xe0d00000 0x0 0xf0000>; + interrupts = <0x0 0x162 0x4>; + clocks = <0x2>; + dma-coherent; + }; + + i2c@e1000000 { + compatible = "snps,designware-i2c"; + reg = <0x0 0xe1000000 0x0 0x1000>; + interrupts = <0x0 0x165 0x4>; + clocks = <0x3>; + }; + + i2c@e0050000 { + compatible = "snps,designware-i2c"; + reg = <0x0 0xe0050000 0x0 0x1000>; + interrupts = <0x0 0x154 0x4>; + clocks = <0x3>; + }; + + serial@e1010000 { + compatible = "arm,pl011", "arm,primecell"; + reg = <0x0 0xe1010000 0x0 0x1000>; + interrupts = <0x0 0x148 0x4>; + clocks = <0x3 0x3>; + clock-names = "uartclk", "apb_pclk"; + }; + + ssp@e1020000 { + compatible = "arm,pl022", "arm,primecell"; + reg = <0x0 0xe1020000 0x0 0x1000>; + spi-controller; + interrupts = <0x0 0x14a 0x4>; + clocks = <0x3>; + clock-names = "apb_pclk"; + }; + + ssp@e1030000 { + compatible = "arm,pl022", "arm,primecell"; + reg = <0x0 0xe1030000 0x0 0x1000>; + spi-controller; + interrupts = <0x0 0x149 0x4>; + clocks = <0x3>; + clock-names = "apb_pclk"; + num-cs = <0x1>; + #address-cells = <0x1>; + #size-cells = <0x0>; + + sdcard@0 { + compatible = "mmc-spi-slot"; + reg = <0x0>; + spi-max-frequency = <20000000>; + voltage-ranges = <3200 3400>; + pl022,hierarchy = <0x0>; + pl022,interface = <0x0>; + pl022,com-mode = <0x0>; + pl022,rx-level-trig = <0x0>; + pl022,tx-level-trig = <0x0>; + }; + }; + + gpio@e1050000 { /* [0 : 7] */ + compatible = "arm,pl061", "arm,primecell"; + #gpio-cells = <0x2>; + reg = <0x0 0xe1050000 0x0 0x1000>; + gpio-controller; + interrupt-controller; + #interrupt-cells = <0x2>; + interrupts = <0x0 0x166 0x4>; + clocks = <0x3>; + clock-names = "apb_pclk"; + }; + + gpio@e0020000 { /* [8 : 15] */ + status = "disabled"; + compatible = "arm,pl061", "arm,primecell"; + #gpio-cells = <0x2>; + reg = <0x0 0xe0020000 0x0 0x1000>; + gpio-controller; + interrupt-controller; + #interrupt-cells = <0x2>; + interrupts = <0x0 0x16e 0x4>; + clocks = <0x3>; + clock-names = "apb_pclk"; + }; + + gpio@e0030000 { /* [16 : 23] */ + status = "disabled"; + compatible = "arm,pl061", "arm,primecell"; + #gpio-cells = <0x2>; + reg = <0x0 0xe0030000 0x0 0x1000>; + gpio-controller; + interrupt-controller; + #interrupt-cells = <0x2>; + interrupts = <0x0 0x16d 0x4>; + clocks = <0x3>; + clock-names = "apb_pclk"; + }; + + gpio@e0080000 { /* [24] */ + compatible = "arm,pl061", "arm,primecell"; + #gpio-cells = <0x2>; + reg = <0x0 0xe0080000 0x0 0x1000>; + gpio-controller; + interrupt-controller; + #interrupt-cells = <0x2>; + interrupts = <0x0 0x169 0x4>; + clocks = <0x3>; + clock-names = "apb_pclk"; + }; + + ccp: ccp@e0100000 { + compatible = "amd,ccp-seattle-v1a"; + reg = <0x0 0xe0100000 0x0 0x10000>; + interrupts = <0x0 0x3 0x4>; + dma-coherent; + amd,zlib-support = <0x1>; + }; + + pcie: pcie@f0000000 { + compatible = "pci-host-ecam-generic"; + #address-cells = <0x3>; + #size-cells = <0x2>; + #interrupt-cells = <0x1>; + device_type = "pci"; + bus-range = <0x0 0x7f>; + msi-parent = <0x4>; + reg = <0x0 0xf0000000 0x0 0x10000000>; + interrupt-map-mask = <0xf800 0x0 0x0 0x7>; + interrupt-map = <0x1000 0x0 0x0 0x1 0x1 0x0 0x0 0x0 0x120 0x1>, + <0x1000 0x0 0x0 0x2 0x1 0x0 0x0 0x0 0x121 0x1>, + <0x1000 0x0 0x0 0x3 0x1 0x0 0x0 0x0 0x122 0x1>, + <0x1000 0x0 0x0 0x4 0x1 0x0 0x0 0x0 0x123 0x1>; + dma-coherent; + dma-ranges = <0x43000000 0x0 0x0 0x0 0x0 0x100 0x0>; + ranges = <0x1000000 0x0 0x00000000 0x0 0xefff0000 0x00 0x00010000>, /* I/O Memory (size=64K) */ + <0x2000000 0x0 0x40000000 0x0 0x40000000 0x00 0x80000000>, /* 32-bit MMIO (size=2G) */ + <0x3000000 0x1 0x00000000 0x1 0x00000000 0x7f 0x00000000>; /* 64-bit MMIO (size= 124G) */ + }; + + ccn@0xe8000000 { + compatible = "arm,ccn-504"; + reg = <0x0 0xe8000000 0x0 0x1000000>; + interrupts = <0x0 0x17c 0x4>; + }; + + gwdt@e0bb0000 { + status = "disabled"; + compatible = "arm,sbsa-gwdt"; + reg = <0x0 0xe0bb0000 0x0 0x10000 + 0x0 0xe0bc0000 0x0 0x10000>; + reg-names = "refresh", "control"; + interrupts = <0x0 0x151 0x4>; + interrupt-names = "ws0"; + }; + + kcs@e0010000 { + status = "disabled"; + compatible = "ipmi-kcs"; + device_type = "ipmi"; + reg = <0x0 0xe0010000 0 0x8>; + interrupts = <0 389 4>; + interrupt-names = "ipmi_kcs"; + reg-size = <1>; + reg-spacing = <4>; + }; + + clk250mhz_0 { + compatible = "fixed-clock"; + #clock-cells = <0x0>; + clock-frequency = <250000000>; + clock-output-names = "xgmacclk0_dma_250mhz"; + linux,phandle = <0x5>; + phandle = <0x5>; + }; + + clk250mhz_1 { + compatible = "fixed-clock"; + #clock-cells = <0x0>; + clock-frequency = <250000000>; + clock-output-names = "xgmacclk0_ptp_250mhz"; + linux,phandle = <0x6>; + phandle = <0x6>; + }; + + clk250mhz_2 { + compatible = "fixed-clock"; + #clock-cells = <0x0>; + clock-frequency = <250000000>; + clock-output-names = "xgmacclk1_dma_250mhz"; + linux,phandle = <0x7>; + phandle = <0x7>; + }; + + clk250mhz_3 { + compatible = "fixed-clock"; + #clock-cells = <0x0>; + clock-frequency = <250000000>; + clock-output-names = "xgmacclk1_ptp_250mhz"; + linux,phandle = <0x8>; + phandle = <0x8>; + }; + + phy@e1240800 { + status = "disabled"; + compatible = "amd,xgbe-phy-seattle-v1a"; + reg = <0x0 0xe1240800 0x0 0x0400>, /* SERDES RX/TX0 */ + <0x0 0xe1250000 0x0 0x0060>, /* SERDES IR 1/2 */ + <0x0 0xe12500f8 0x0 0x0004>; /* SERDES IR 2/2 */ + interrupts = <0x0 0x143 0x4>; + amd,speed-set = <0x0>; + amd,serdes-blwc = <0x1 0x1 0x0>; + amd,serdes-cdr-rate = <0x2 0x2 0x7>; + amd,serdes-pq-skew = <0xa 0xa 0x12>; + amd,serdes-tx-amp = <0xf 0xf 0xa>; + amd,serdes-dfe-tap-config = <0x3 0x3 0x1>; + amd,serdes-dfe-tap-enable = <0x0 0x0 0x7f>; + linux,phandle = <0x9>; + phandle = <0x9>; + }; + + phy@e1240c00 { + status = "disabled"; + compatible = "amd,xgbe-phy-seattle-v1a"; + reg = <0x0 0xe1240c00 0x0 0x0400>, /* SERDES RX/TX0 */ + <0x0 0xe1250080 0x0 0x0060>, /* SERDES IR 1/2 */ + <0x0 0xe12500fc 0x0 0x0004>; /* SERDES IR 2/2 */ + interrupts = <0x0 0x142 0x4>; + amd,speed-set = <0x0>; + amd,serdes-blwc = <0x1 0x1 0x0>; + amd,serdes-cdr-rate = <0x2 0x2 0x7>; + amd,serdes-pq-skew = <0xa 0xa 0x12>; + amd,serdes-tx-amp = <0xf 0xf 0xa>; + amd,serdes-dfe-tap-config = <0x3 0x3 0x1>; + amd,serdes-dfe-tap-enable = <0x0 0x0 0x7f>; + linux,phandle = <0xa>; + phandle = <0xa>; + }; + + xgmac@e0700000 { + status = "disabled"; + compatible = "amd,xgbe-seattle-v1a"; + reg = <0x0 0xe0700000 0x0 0x80000 0x0 0xe0780000 0x0 0x80000>; + interrupts = <0x0 0x145 0x4>, + <0x0 0x15a 0x1>, + <0x0 0x15b 0x1>, + <0x0 0x15c 0x1>, + <0x0 0x15d 0x1>; + amd,per-channel-interrupt; + mac-address = [02 a1 a2 a3 a4 a5]; + clocks = <0x5 0x6>; + clock-names = "dma_clk", "ptp_clk"; + phy-handle = <0x9>; + phy-mode = "xgmii"; + #stream-id-cells = <0x18>; + dma-coherent; + linux,phandle = <0xb>; + phandle = <0xb>; + }; + + xgmac@e0900000 { + status = "disabled"; + compatible = "amd,xgbe-seattle-v1a"; + reg = <0x0 0xe0900000 0x0 0x80000 0x0 0xe0980000 0x0 0x80000>; + interrupts = <0x0 0x144 0x4>, + <0x0 0x155 0x1>, + <0x0 0x156 0x1>, + <0x0 0x157 0x1>, + <0x0 0x158 0x1>; + amd,per-channel-interrupt; + mac-address = [02 b1 b2 b3 b4 b5]; + clocks = <0x7 0x8>; + clock-names = "dma_clk", "ptp_clk"; + phy-handle = <0xa>; + phy-mode = "xgmii"; + #stream-id-cells = <0x18>; + dma-coherent; + linux,phandle = <0xc>; + phandle = <0xc>; + }; + }; + + chosen { + stdout-path = "/smb/serial@e1010000"; + /* Note: + * Linux support for pci-probe-only DT is not + * stable. Disable this for now and let Linux + * take care of the resource assignment. + */ + // linux,pci-probe-only; + }; + + psci { + compatible = "arm,psci-0.2", "arm,psci"; + method = "smc"; + }; +}; + + diff --git a/Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-overdrive.dtb b/Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-overdrive.dtb new file mode 100644 index 0000000000000000000000000000000000000000..0c0468d89d60faf6c461b0e2e1c67098b063c7a9 GIT binary patch literal 8089 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 JJ(?uJ{{StXEo}e*
literal 0 HcmV?d00001
diff --git a/Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-overdrive.dts b/Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-overdrive.dts new file mode 100644 index 0000000..e1a3a98 --- /dev/null +++ b/Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-overdrive.dts @@ -0,0 +1,435 @@ +/* + * DTS file for AMD Seattle (RevB) Overdrive Development Board + * Note: Based-on AMD Seattle Rev.B + * + * Copyright (C) 2015 Advanced Micro Devices, Inc. + */ + +/dts-v1/; + +/ { + model = "AMD Seattle (Rev.B) Development Board (Overdrive)"; + compatible = "amd,seattle-overdrive", "amd,seattle"; + interrupt-parent = <0x1>; + #address-cells = <0x2>; + #size-cells = <0x2>; + + interrupt-controller@e1101000 { + compatible = "arm,gic-400", "arm,cortex-a15-gic"; + interrupt-controller; + #interrupt-cells = <0x3>; + #address-cells = <0x2>; + #size-cells = <0x2>; + reg = <0x0 0xe1110000 0x0 0x1000>, + <0x0 0xe112f000 0x0 0x2000>, + <0x0 0xe1140000 0x0 0x10000>, + <0x0 0xe1160000 0x0 0x10000>; + interrupts = <0x1 0x9 0xf04>; + ranges = <0x0 0x0 0x0 0xe1100000 0x0 0x100000>; + linux,phandle = <0x1>; + phandle = <0x1>; + + v2m@e0080000 { + compatible = "arm,gic-v2m-frame"; + msi-controller; + reg = <0x0 0x80000 0x0 0x1000>; + linux,phandle = <0x4>; + phandle = <0x4>; + }; + }; + + timer { + compatible = "arm,armv8-timer"; + interrupts = <0x1 0xd 0xff04>, + <0x1 0xe 0xff04>, + <0x1 0xb 0xff04>, + <0x1 0xa 0xff04>; + }; + + pmu { + compatible = "arm,armv8-pmuv3"; + interrupts = <0x0 0x7 0x4>, + <0x0 0x8 0x4>, + <0x0 0x9 0x4>, + <0x0 0xa 0x4>, + <0x0 0xb 0x4>, + <0x0 0xc 0x4>, + <0x0 0xd 0x4>, + <0x0 0xe 0x4>; + }; + + smb { + compatible = "simple-bus"; + #address-cells = <0x2>; + #size-cells = <0x2>; + ranges; + /* + * dma-ranges is 40-bit address space containing: + * - GICv2m MSI register is at 0xe0080000 + * - DRAM range [0x8000000000 to 0xffffffffff] + */ + dma-ranges = <0x0 0x0 0x0 0x0 0x100 0x0>; + + clk100mhz_0 { + compatible = "fixed-clock"; + #clock-cells = <0x0>; + clock-frequency = <100000000>; + clock-output-names = "adl3clk_100mhz"; + }; + + clk375mhz { + compatible = "fixed-clock"; + #clock-cells = <0x0>; + clock-frequency = <375000000>; + clock-output-names = "ccpclk_375mhz"; + }; + + clk333mhz { + compatible = "fixed-clock"; + #clock-cells = <0x0>; + clock-frequency = <333000000>; + clock-output-names = "sataclk_333mhz"; + linux,phandle = <0x2>; + phandle = <0x2>; + }; + + clk500mhz_0 { + compatible = "fixed-clock"; + #clock-cells = <0x0>; + clock-frequency = <500000000>; + clock-output-names = "pcieclk_500mhz"; + }; + + clk500mhz_1 { + compatible = "fixed-clock"; + #clock-cells = <0x0>; + clock-frequency = <500000000>; + clock-output-names = "dmaclk_500mhz"; + }; + + clk250mhz_4 { + compatible = "fixed-clock"; + #clock-cells = <0x0>; + clock-frequency = <250000000>; + clock-output-names = "miscclk_250mhz"; + }; + + clk100mhz_1 { + compatible = "fixed-clock"; + #clock-cells = <0x0>; + clock-frequency = <100000000>; + clock-output-names = "uartspiclk_100mhz"; + linux,phandle = <0x3>; + phandle = <0x3>; + }; + + sata@e0300000 { + compatible = "snps,dwc-ahci"; + reg = <0x0 0xe0300000 0x0 0xf0000>; + interrupts = <0x0 0x163 0x4>; + clocks = <0x2>; + dma-coherent; + }; + + sata@e0d00000 { + status = "disabled"; + compatible = "snps,dwc-ahci"; + reg = <0x0 0xe0d00000 0x0 0xf0000>; + interrupts = <0x0 0x162 0x4>; + clocks = <0x2>; + dma-coherent; + }; + + i2c@e1000000 { + compatible = "snps,designware-i2c"; + reg = <0x0 0xe1000000 0x0 0x1000>; + interrupts = <0x0 0x165 0x4>; + clocks = <0x3>; + }; + + i2c@e0050000 { + compatible = "snps,designware-i2c"; + reg = <0x0 0xe0050000 0x0 0x1000>; + interrupts = <0x0 0x154 0x4>; + clocks = <0x3>; + }; + + serial@e1010000 { + compatible = "arm,pl011", "arm,primecell"; + reg = <0x0 0xe1010000 0x0 0x1000>; + interrupts = <0x0 0x148 0x4>; + clocks = <0x3 0x3>; + clock-names = "uartclk", "apb_pclk"; + }; + + ssp@e1020000 { + compatible = "arm,pl022", "arm,primecell"; + reg = <0x0 0xe1020000 0x0 0x1000>; + spi-controller; + interrupts = <0x0 0x14a 0x4>; + clocks = <0x3>; + clock-names = "apb_pclk"; + }; + + ssp@e1030000 { + compatible = "arm,pl022", "arm,primecell"; + reg = <0x0 0xe1030000 0x0 0x1000>; + spi-controller; + interrupts = <0x0 0x149 0x4>; + clocks = <0x3>; + clock-names = "apb_pclk"; + num-cs = <0x1>; + #address-cells = <0x1>; + #size-cells = <0x0>; + + sdcard@0 { + compatible = "mmc-spi-slot"; + reg = <0x0>; + spi-max-frequency = <20000000>; + voltage-ranges = <3200 3400>; + pl022,hierarchy = <0x0>; + pl022,interface = <0x0>; + pl022,com-mode = <0x0>; + pl022,rx-level-trig = <0x0>; + pl022,tx-level-trig = <0x0>; + }; + }; + + gpio@e1050000 { /* [0 : 7] */ + compatible = "arm,pl061", "arm,primecell"; + #gpio-cells = <0x2>; + reg = <0x0 0xe1050000 0x0 0x1000>; + gpio-controller; + interrupt-controller; + #interrupt-cells = <0x2>; + interrupts = <0x0 0x166 0x4>; + clocks = <0x3>; + clock-names = "apb_pclk"; + }; + + gpio@e0020000 { /* [8 : 15] */ + status = "disabled"; + compatible = "arm,pl061", "arm,primecell"; + #gpio-cells = <0x2>; + reg = <0x0 0xe0020000 0x0 0x1000>; + gpio-controller; + interrupt-controller; + #interrupt-cells = <0x2>; + interrupts = <0x0 0x16e 0x4>; + clocks = <0x3>; + clock-names = "apb_pclk"; + }; + + gpio@e0030000 { /* [16 : 23] */ + status = "disabled"; + compatible = "arm,pl061", "arm,primecell"; + #gpio-cells = <0x2>; + reg = <0x0 0xe0030000 0x0 0x1000>; + gpio-controller; + interrupt-controller; + #interrupt-cells = <0x2>; + interrupts = <0x0 0x16d 0x4>; + clocks = <0x3>; + clock-names = "apb_pclk"; + }; + + gpio@e0080000 { /* [24] */ + compatible = "arm,pl061", "arm,primecell"; + #gpio-cells = <0x2>; + reg = <0x0 0xe0080000 0x0 0x1000>; + gpio-controller; + interrupt-controller; + #interrupt-cells = <0x2>; + interrupts = <0x0 0x169 0x4>; + clocks = <0x3>; + clock-names = "apb_pclk"; + }; + + ccp: ccp@e0100000 { + compatible = "amd,ccp-seattle-v1a"; + reg = <0x0 0xe0100000 0x0 0x10000>; + interrupts = <0x0 0x3 0x4>; + dma-coherent; + amd,zlib-support = <0x1>; + }; + + pcie: pcie@f0000000 { + compatible = "pci-host-ecam-generic"; + #address-cells = <0x3>; + #size-cells = <0x2>; + #interrupt-cells = <0x1>; + device_type = "pci"; + bus-range = <0x0 0x7f>; + msi-parent = <0x4>; + reg = <0x0 0xf0000000 0x0 0x10000000>; + interrupt-map-mask = <0xf800 0x0 0x0 0x7>; + interrupt-map = <0x1000 0x0 0x0 0x1 0x1 0x0 0x0 0x0 0x120 0x1>, + <0x1000 0x0 0x0 0x2 0x1 0x0 0x0 0x0 0x121 0x1>, + <0x1000 0x0 0x0 0x3 0x1 0x0 0x0 0x0 0x122 0x1>, + <0x1000 0x0 0x0 0x4 0x1 0x0 0x0 0x0 0x123 0x1>; + dma-coherent; + dma-ranges = <0x43000000 0x0 0x0 0x0 0x0 0x100 0x0>; + ranges = <0x1000000 0x0 0x00000000 0x0 0xefff0000 0x00 0x00010000>, /* I/O Memory (size=64K) */ + <0x2000000 0x0 0x40000000 0x0 0x40000000 0x00 0x80000000>, /* 32-bit MMIO (size=2G) */ + <0x3000000 0x1 0x00000000 0x1 0x00000000 0x7f 0x00000000>; /* 64-bit MMIO (size= 124G) */ + }; + + ccn@0xe8000000 { + compatible = "arm,ccn-504"; + reg = <0x0 0xe8000000 0x0 0x1000000>; + interrupts = <0x0 0x17c 0x4>; + }; + + gwdt@e0bb0000 { + status = "disabled"; + compatible = "arm,sbsa-gwdt"; + reg = <0x0 0xe0bb0000 0x0 0x10000 + 0x0 0xe0bc0000 0x0 0x10000>; + reg-names = "refresh", "control"; + interrupts = <0x0 0x151 0x4>; + interrupt-names = "ws0"; + }; + + kcs@e0010000 { + status = "disabled"; + compatible = "ipmi-kcs"; + device_type = "ipmi"; + reg = <0x0 0xe0010000 0 0x8>; + interrupts = <0 389 4>; + interrupt-names = "ipmi_kcs"; + reg-size = <1>; + reg-spacing = <4>; + }; + + clk250mhz_0 { + compatible = "fixed-clock"; + #clock-cells = <0x0>; + clock-frequency = <250000000>; + clock-output-names = "xgmacclk0_dma_250mhz"; + linux,phandle = <0x5>; + phandle = <0x5>; + }; + + clk250mhz_1 { + compatible = "fixed-clock"; + #clock-cells = <0x0>; + clock-frequency = <250000000>; + clock-output-names = "xgmacclk0_ptp_250mhz"; + linux,phandle = <0x6>; + phandle = <0x6>; + }; + + clk250mhz_2 { + compatible = "fixed-clock"; + #clock-cells = <0x0>; + clock-frequency = <250000000>; + clock-output-names = "xgmacclk1_dma_250mhz"; + linux,phandle = <0x7>; + phandle = <0x7>; + }; + + clk250mhz_3 { + compatible = "fixed-clock"; + #clock-cells = <0x0>; + clock-frequency = <250000000>; + clock-output-names = "xgmacclk1_ptp_250mhz"; + linux,phandle = <0x8>; + phandle = <0x8>; + }; + + phy@e1240800 { + status = "disabled"; + compatible = "amd,xgbe-phy-seattle-v1a"; + reg = <0x0 0xe1240800 0x0 0x0400>, /* SERDES RX/TX0 */ + <0x0 0xe1250000 0x0 0x0060>, /* SERDES IR 1/2 */ + <0x0 0xe12500f8 0x0 0x0004>; /* SERDES IR 2/2 */ + interrupts = <0x0 0x143 0x4>; + amd,speed-set = <0x0>; + amd,serdes-blwc = <0x1 0x1 0x0>; + amd,serdes-cdr-rate = <0x2 0x2 0x7>; + amd,serdes-pq-skew = <0xa 0xa 0x12>; + amd,serdes-tx-amp = <0xf 0xf 0xa>; + amd,serdes-dfe-tap-config = <0x3 0x3 0x1>; + amd,serdes-dfe-tap-enable = <0x0 0x0 0x7f>; + linux,phandle = <0x9>; + phandle = <0x9>; + }; + + phy@e1240c00 { + status = "disabled"; + compatible = "amd,xgbe-phy-seattle-v1a"; + reg = <0x0 0xe1240c00 0x0 0x0400>, /* SERDES RX/TX0 */ + <0x0 0xe1250080 0x0 0x0060>, /* SERDES IR 1/2 */ + <0x0 0xe12500fc 0x0 0x0004>; /* SERDES IR 2/2 */ + interrupts = <0x0 0x142 0x4>; + amd,speed-set = <0x0>; + amd,serdes-blwc = <0x1 0x1 0x0>; + amd,serdes-cdr-rate = <0x2 0x2 0x7>; + amd,serdes-pq-skew = <0xa 0xa 0x12>; + amd,serdes-tx-amp = <0xf 0xf 0xa>; + amd,serdes-dfe-tap-config = <0x3 0x3 0x1>; + amd,serdes-dfe-tap-enable = <0x0 0x0 0x7f>; + linux,phandle = <0xa>; + phandle = <0xa>; + }; + + xgmac@e0700000 { + status = "disabled"; + compatible = "amd,xgbe-seattle-v1a"; + reg = <0x0 0xe0700000 0x0 0x80000 0x0 0xe0780000 0x0 0x80000>; + interrupts = <0x0 0x145 0x4>, + <0x0 0x15a 0x1>, + <0x0 0x15b 0x1>, + <0x0 0x15c 0x1>, + <0x0 0x15d 0x1>; + amd,per-channel-interrupt; + mac-address = [02 a1 a2 a3 a4 a5]; + clocks = <0x5 0x6>; + clock-names = "dma_clk", "ptp_clk"; + phy-handle = <0x9>; + phy-mode = "xgmii"; + #stream-id-cells = <0x18>; + dma-coherent; + linux,phandle = <0xb>; + phandle = <0xb>; + }; + + xgmac@e0900000 { + status = "disabled"; + compatible = "amd,xgbe-seattle-v1a"; + reg = <0x0 0xe0900000 0x0 0x80000 0x0 0xe0980000 0x0 0x80000>; + interrupts = <0x0 0x144 0x4>, + <0x0 0x155 0x1>, + <0x0 0x156 0x1>, + <0x0 0x157 0x1>, + <0x0 0x158 0x1>; + amd,per-channel-interrupt; + mac-address = [02 b1 b2 b3 b4 b5]; + clocks = <0x7 0x8>; + clock-names = "dma_clk", "ptp_clk"; + phy-handle = <0xa>; + phy-mode = "xgmii"; + #stream-id-cells = <0x18>; + dma-coherent; + linux,phandle = <0xc>; + phandle = <0xc>; + }; + }; + + chosen { + stdout-path = "/smb/serial@e1010000"; + /* Note: + * Linux support for pci-probe-only DT is not + * stable. Disable this for now and let Linux + * take care of the resource assignment. + */ + // linux,pci-probe-only; + }; + + psci { + compatible = "arm,psci-0.2", "arm,psci"; + method = "smc"; + }; +}; + + diff --git a/Platforms/AMD/Styx/OverdriveBoard/FdtDxe/AArch64/BdsLinuxLoader.c b/Platforms/AMD/Styx/OverdriveBoard/FdtDxe/AArch64/BdsLinuxLoader.c new file mode 100644 index 0000000..8e6fbfc --- /dev/null +++ b/Platforms/AMD/Styx/OverdriveBoard/FdtDxe/AArch64/BdsLinuxLoader.c @@ -0,0 +1,122 @@ +/** @file +* +* Copyright (c) 2011-2014, ARM Limited. All rights reserved.<BR> +* Copyright (c) 2014 - 2015, AMD Inc. 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. +* +**/ +/** + Derived from: + ArmPkg/Library/BdsLib/AArch64/BdsLinuxLoader.c + +**/ + +#include <Library/PcdLib.h> +#include <Base.h> +#include <BdsLib/BdsInternal.h> +#include <Library/ArmGicLib.h> +#include <Library/IoLib.h> + +#include <AmdStyxHelperLib.h> + +/* These externs are used to relocate some ASM code into Linux memory. */ +extern VOID *SecondariesPenStart; +extern VOID *SecondariesPenEnd; +extern UINTN *AsmParkingBase; +extern UINTN *AsmMailboxBase; + +extern EFI_BOOT_SERVICES *gBS; + +VOID +EFIAPI +AmdStyxMoveParkedCores( + VOID + ) +{ + EFI_STATUS Status; + EFI_PHYSICAL_ADDRESS MpParkingBase; + UINTN MpParkingSize; + EFI_PHYSICAL_ADDRESS PenBase; + UINTN PenSize; + UINTN MailboxBase; + ARM_PROCESSOR_TABLE *ArmProcessorTable; + ARM_CORE_INFO *ArmCoreInfoTable; + UINTN ArmCoreCount; + UINTN CoreNum; + UINTN CoreMailbox; + UINTN CoreParking; + + // Get core information + ArmProcessorTable = AmdStyxGetArmProcessorTable(); + ASSERT_EFI_ERROR (ArmProcessorTable == NULL); + ArmCoreInfoTable = ArmProcessorTable->ArmCpus; + ArmCoreCount = ArmProcessorTable->NumberOfEntries; + + // Get Parking area (4KB-aligned, 4KB per core) + MpParkingBase = FixedPcdGet64 (PcdParkingProtocolBase); + ASSERT_EFI_ERROR (MpParkingBase & (SIZE_4KB - 1)); + MpParkingSize = ArmCoreCount * SIZE_4KB; + ASSERT_EFI_ERROR (MpParkingSize > FixedPcdGet64 (PcdParkingProtocolSize)); + + // + // Set Pen at the 2K-offset of the Parking area, skipping an 8-byte slot for the Core#. + // For details, refer to the "Multi-processor Startup for ARM Platforms" document: + // https://acpica.org/sites/acpica/files/MP%20Startup%20for%20ARM%20platforms.d... + // + PenBase = (EFI_PHYSICAL_ADDRESS)((UINTN)MpParkingBase + SIZE_2KB + sizeof(UINT64)); + PenSize = (UINTN)&SecondariesPenEnd - (UINTN)&SecondariesPenStart; + + // Reserve the memory as RuntimeServices + Status = gBS->AllocatePages (AllocateAddress, EfiRuntimeServicesCode, + EFI_SIZE_TO_PAGES (MpParkingSize ), &MpParkingBase ); + if (EFI_ERROR (Status)) { + Print (L"Warning: Failed to reserve memory for MP-Parking protocol at 0x%lX, Status = %r\n", + MpParkingBase, Status); + // Even if there is a risk of memory corruption we carry on + } + + // Relocate the Pen code + CopyMem ((VOID*)(PenBase), (VOID*)&SecondariesPenStart, PenSize); + + // Put spin-table mailboxes below the pen code so we know where they are relative to code. + // Make sure this is 8 byte aligned. + MailboxBase = (UINTN)PenBase + ((UINTN)&SecondariesPenEnd - (UINTN)&SecondariesPenStart); + if (MailboxBase % sizeof(UINT64) != 0) { + MailboxBase += sizeof(UINT64) - MailboxBase % sizeof(UINT64); + } + + // Update variables used in the Pen code + *(UINTN*)(PenBase + ((UINTN)&AsmMailboxBase - (UINTN)&SecondariesPenStart)) = MailboxBase; + *(UINTN*)(PenBase + ((UINTN)&AsmParkingBase - (UINTN)&SecondariesPenStart)) = (UINTN)MpParkingBase; + + for (CoreNum = 0; CoreNum < ArmCoreCount; CoreNum++) { + // Clear the jump address at spin-table slot + CoreMailbox = MailboxBase + CoreNum * sizeof (UINT64); + *((UINTN*)(CoreMailbox)) = 0x0; + + // Clear the jump address and set Core# at mp-parking slot + CoreParking = (UINTN)MpParkingBase + CoreNum * SIZE_4KB; + *((UINTN*)(CoreParking + sizeof (UINT64))) = 0x0; + *((UINTN*)(CoreParking + SIZE_2KB)) = CoreNum; + + // Move secondary core to our new Pen + MmioWrite64(ArmCoreInfoTable[CoreNum].MailboxSetAddress, (UINTN)PenBase); + + // Update table entry to be consumed by FDT parser. + ArmCoreInfoTable[CoreNum].MailboxSetAddress = CoreMailbox; + } + + // Flush caches to make sure our pen gets to memory before we release secondary cores. + ArmCleanDataCache(); + + // Send msg to secondary cores to jump to our new Pen. + ArmGicSendSgiTo (PcdGet32(PcdGicDistributorBase), ARM_GIC_ICDSGIR_FILTER_EVERYONEELSE, 0x0E, PcdGet32 (PcdGicSgiIntId)); +} + diff --git a/Platforms/AMD/Styx/OverdriveBoard/FdtDxe/AArch64/BdsLinuxLoaderHelper.S b/Platforms/AMD/Styx/OverdriveBoard/FdtDxe/AArch64/BdsLinuxLoaderHelper.S new file mode 100644 index 0000000..d400a9c --- /dev/null +++ b/Platforms/AMD/Styx/OverdriveBoard/FdtDxe/AArch64/BdsLinuxLoaderHelper.S @@ -0,0 +1,87 @@ +// +// Copyright (c) 2011-2013, ARM Limited. All rights reserved. +// Copyright (c) 2014 - 2015, AMD Inc. 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. +// +//** +// Derived from: +// ArmPkg/Library/BdsLib/AArch64/BdsLinuxLoaderHelper.S +// +//** + +/* Secondary core pens for AArch64 Linux booting. + + This code is placed in Linux kernel memory and marked reserved. UEFI ensures + that the secondary cores get to this pen and the kernel can then start the + cores from here. + NOTE: This code must be self-contained. +*/ + +#include <Library/ArmLib.h> + +.text +.align 3 + +GCC_ASM_EXPORT(SecondariesPenStart) +ASM_GLOBAL SecondariesPenEnd + +ASM_PFX(SecondariesPenStart): + // Registers x0-x3 are reserved for future use and should be set to zero. + mov x0, xzr + mov x1, xzr + mov x2, xzr + mov x3, xzr + + mrs x4, mpidr_el1 // Get MPCore register + and x5, x4, #ARM_CORE_MASK // Get core number + and x4, x4, #ARM_CLUSTER_MASK // Get cluster number + + add x4, x5, x4, LSR #7 // Add scaled cluster number to core number + mov x6, x4 // Save a copy to compute mp-parking offset + + ldr x5, AsmMailboxBase // Get mailbox addr relative to PC + lsl x4, x4, 3 // Add 8-byte offset for this core + add x4, x4, x5 // + + ldr x5, AsmParkingBase // Get mp-parking addr relative to PC + lsl x6, x6, 12 // Add 4K-byte offset for this core + add x6, x6, x5 // + + mov x5, 1 // Get mp-parking id# at 2K offset + lsl x5, x5, 11 // + add x5, x5, x6 // + ldr x10, [x5] // + +1: ldr x5, [x4] // Load jump-addr from spin-table mailbox + cmp xzr, x5 // Has the value been set? + b.ne 4f // If so, break out of loop + + ldr x5, [x6] // Load mp-parking id# + cmp w10, w5 // Is it my id? + b.ne 2f // If not, continue polling + + ldr x5, [x6, 8] // Load jump-addr from mp-parking + cmp xzr, x5 // Has the value been set? + b.ne 3f // If so, break out of loop + +2: wfe // Wait a bit + b 1b // Wait over, check again + +3: str xzr, [x6, 8] // Clear to acknowledge + mov x0, x6 // Return mp-parking address +4: br x5 // Jump to new addr + +.align 3 // Make sure the variable below is 8 byte aligned. + .global AsmParkingBase +AsmParkingBase: .xword 0xdeaddeadbeefbeef + .global AsmMailboxBase +AsmMailboxBase: .xword 0xdeaddeadbeefbeef + +SecondariesPenEnd: diff --git a/Platforms/AMD/Styx/OverdriveBoard/FdtDxe/BdsLinuxFdt.c b/Platforms/AMD/Styx/OverdriveBoard/FdtDxe/BdsLinuxFdt.c new file mode 100644 index 0000000..0d03bd7 --- /dev/null +++ b/Platforms/AMD/Styx/OverdriveBoard/FdtDxe/BdsLinuxFdt.c @@ -0,0 +1,754 @@ +/** @file +* +* Copyright (c) 2011-2014, ARM Limited. All rights reserved.<BR> +* Copyright (c) 2014 - 2015, AMD Inc. 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. +* +**/ +/** + Derived from: + ArmPkg/Library/BdsLib/BdsLinuxFdt.c + +**/ + +#include <Library/PcdLib.h> +#include <libfdt.h> + +#include <BdsLib/BdsInternal.h> + +#include <AmdStyxHelperLib.h> + +//#define LINUX_FDT_MAX_OFFSET (PcdGet64 (PcdUefiEntryAddress) + PcdGet32(PcdArmLinuxFdtMaxOffset)) +#define LINUX_FDT_MAX_OFFSET (PcdGet64 (PcdSystemMemoryBase) + PcdGet32(PcdArmLinuxFdtMaxOffset)) + + +// Additional size that could be used for FDT entries added by the UEFI OS Loader +// Estimation based on: EDID (300bytes) + bootargs (200bytes) + initrd region (20bytes) +// + system memory region (20bytes) + mp_core entries (200 bytes) +#define FDT_ADDITIONAL_ENTRIES_SIZE 0x300 + + +EFI_STATUS +GetSystemMemoryResources ( + IN LIST_ENTRY *ResourceList + ); + +VOID +DebugDumpFdt ( + IN VOID* FdtBlob + ); + +#define ALIGN(x, a) (((x) + ((a) - 1)) & ~((a) - 1)) +#define PALIGN(p, a) ((void *)(ALIGN((unsigned long)(p), (a)))) +#define GET_CELL(p) (p += 4, *((const UINT32 *)(p-4))) + +// +// PMU interrupts per core +// +#pragma pack(push, 1) +typedef struct { + UINT32 Flag; // 0 == SPI + UINT32 IntId; // GSIV == IntId+32 + UINT32 Type; // 4 == Level-Sensitive, Active-High +} PMU_INTERRUPT; +#pragma pack(pop) + +#define PMU_INT_FLAG_SPI 0 +#define PMU_INT_TYPE_HIGH_LEVEL 4 + + +typedef struct { + UINTN Base; + UINTN Size; +} FdtRegion; + + +STATIC +UINTN +cpu_to_fdtn (UINTN x) { + if (sizeof (UINTN) == sizeof (UINT32)) { + return cpu_to_fdt32 (x); + } else { + return cpu_to_fdt64 (x); + } +} + + +STATIC +BOOLEAN +ClusterInRange( + IN ARM_CORE_INFO *ArmCoreInfoTable, + IN UINTN ClusterId, + IN UINTN LowIndex, + IN UINTN HighIndex + ) +{ + do { + if (ClusterId == ArmCoreInfoTable[LowIndex].ClusterId) + return TRUE; + } while (++LowIndex <= HighIndex); + + return FALSE; +} + + +STATIC +UINTN +NumberOfCoresInCluster( + IN ARM_CORE_INFO *ArmCoreInfoTable, + IN UINTN NumberOfEntries, + IN UINTN ClusterId + ) +{ + UINTN Index, Cores; + + Cores = 0; + for (Index = 0; Index < NumberOfEntries; ++Index) { + if (ClusterId == ArmCoreInfoTable[Index].ClusterId) + ++Cores; + } + + return Cores; +} + + +STATIC +UINTN +NumberOfClustersInTable( + IN ARM_CORE_INFO *ArmCoreInfoTable, + IN UINTN NumberOfEntries + ) +{ + UINTN Index, Cores, Clusters, ClusterId; + + Index = 0; + Clusters = 0; + Cores = NumberOfEntries; + while (Cores) { + ++Clusters; + ClusterId = ArmCoreInfoTable[Index].ClusterId; + Cores -= NumberOfCoresInCluster (ArmCoreInfoTable, + NumberOfEntries, + ClusterId); + if (Cores) { + do { + ++Index; + } while (ClusterInRange (ArmCoreInfoTable, + ArmCoreInfoTable[Index].ClusterId, + 0, Index-1)); + } + } + + return Clusters; +} + + +STATIC +int +fdt_alloc_phandle( + IN VOID *blob + ) +{ + + int offset, phandle = 0; + + for (offset = fdt_next_node(blob, -1, NULL); offset >= 0; + offset = fdt_next_node(blob, offset, NULL)) { + phandle = MAX(phandle, fdt_get_phandle(blob, offset)); + } + + return phandle + 1; +} + + +STATIC +BOOLEAN +IsLinuxReservedRegion ( + IN EFI_MEMORY_TYPE MemoryType + ) +{ + switch(MemoryType) { + case EfiRuntimeServicesCode: + case EfiRuntimeServicesData: + case EfiUnusableMemory: + case EfiACPIReclaimMemory: + case EfiACPIMemoryNVS: + case EfiReservedMemoryType: + return TRUE; + default: + return FALSE; + } +} + +STATIC +VOID +SetDeviceStatus ( + IN VOID *fdt, + IN CHAR8 *device, + IN BOOLEAN enable + ) +{ + int node, subnode, rc; + + node = fdt_subnode_offset (fdt, 0, "smb"); + if (node >= 0) { + subnode = fdt_subnode_offset (fdt, node, device); + if (subnode >= 0) { + rc = fdt_setprop_string(fdt, subnode, "status", enable ? "ok" : "disabled"); + if (rc) { + DEBUG((EFI_D_ERROR,"%a: Could not set 'status' property for '%a' node\n", + __FUNCTION__, device)); + } + } + } +} + +#if DO_XGBE +STATIC +VOID +SetMacAddress ( + IN VOID *fdt, + IN CHAR8 *device, + IN UINT64 mac_addr + ) +{ + int node, subnode, rc; + + node = fdt_subnode_offset (fdt, 0, "smb"); + if (node >= 0) { + subnode = fdt_subnode_offset (fdt, node, device); + if (subnode >= 0) { + rc = fdt_setprop(fdt, subnode, "mac-address", (void *)&mac_addr, 6); + if (rc) { + DEBUG((EFI_D_ERROR,"%a: Could not set 'mac-address' property for '%a' node\n", + __FUNCTION__, device)); + } + } + } +} +#endif + +VOID +SetSocIdStatus ( + IN VOID *fdt + ) +{ + UINT32 SocId; + BOOLEAN IsRevB1; + + SocId = PcdGet32 (PcdSocCpuId); + IsRevB1 = (SocId & 0xFF0) && (SocId & 0x00F); + + SetDeviceStatus (fdt, "sata@e0d00000", IsRevB1); + SetDeviceStatus (fdt, "gpio@e0020000", IsRevB1); + SetDeviceStatus (fdt, "gpio@e0030000", IsRevB1); + SetDeviceStatus (fdt, "gwdt@e0bb0000", IsRevB1); +#if DO_KCS + SetDeviceStatus (fdt, "kcs@e0010000", IsRevB1); +#else + SetDeviceStatus (fdt, "kcs@e0010000", FALSE); +#endif +} + +VOID +SetXgbeStatus ( + IN VOID *fdt + ) +{ +#if DO_XGBE + SetDeviceStatus (fdt, "xgmac@e0700000", TRUE); + SetDeviceStatus (fdt, "phy@e1240800", TRUE); + SetDeviceStatus (fdt, "xgmac@e0900000", TRUE); + SetDeviceStatus (fdt, "phy@e1240c00", TRUE); + + SetMacAddress (fdt, "xgmac@e0700000", PcdGet64 (PcdEthMacA)); + SetMacAddress (fdt, "xgmac@e0900000", PcdGet64 (PcdEthMacB)); +#else + SetDeviceStatus (fdt, "xgmac@e0700000", FALSE); + SetDeviceStatus (fdt, "phy@e1240800", FALSE); + SetDeviceStatus (fdt, "xgmac@e0900000", FALSE); + SetDeviceStatus (fdt, "phy@e1240c00", FALSE); +#endif +} + + +/** +** Relocate the FDT blob to a more appropriate location for the Linux kernel. +** This function will allocate memory for the relocated FDT blob. +** +** @retval EFI_SUCCESS on success. +** @retval EFI_OUT_OF_RESOURCES or EFI_INVALID_PARAMETER on failure. +*/ +STATIC +EFI_STATUS +RelocateFdt ( + EFI_PHYSICAL_ADDRESS OriginalFdt, + UINTN OriginalFdtSize, + EFI_PHYSICAL_ADDRESS *RelocatedFdt, + UINTN *RelocatedFdtSize, + EFI_PHYSICAL_ADDRESS *RelocatedFdtAlloc + ) +{ + EFI_STATUS Status; + INTN Error; + UINT64 FdtAlignment; + + *RelocatedFdtSize = OriginalFdtSize + FDT_ADDITIONAL_ENTRIES_SIZE; + + // If FDT load address needs to be aligned, allocate more space. + FdtAlignment = PcdGet32 (PcdArmLinuxFdtAlignment); + if (FdtAlignment != 0) { + *RelocatedFdtSize += FdtAlignment; + } + + // Try below a watermark address. + Status = EFI_NOT_FOUND; + if (PcdGet32 (PcdArmLinuxFdtMaxOffset) != 0) { + *RelocatedFdt = LINUX_FDT_MAX_OFFSET; + Status = gBS->AllocatePages (AllocateMaxAddress, EfiBootServicesData, + EFI_SIZE_TO_PAGES (*RelocatedFdtSize), RelocatedFdt); + if (EFI_ERROR (Status)) { + DEBUG ((EFI_D_WARN, "Warning: Failed to load FDT below address 0x%lX (%r). Will try again at a random address anywhere.\n", *RelocatedFdt, Status)); + } + } + + // Try anywhere there is available space. + if (EFI_ERROR (Status)) { + Status = gBS->AllocatePages (AllocateAnyPages, EfiBootServicesData, + EFI_SIZE_TO_PAGES (*RelocatedFdtSize), RelocatedFdt); + if (EFI_ERROR (Status)) { + ASSERT_EFI_ERROR (Status); + return EFI_OUT_OF_RESOURCES; + } else { + DEBUG ((EFI_D_WARN, "WARNING: Loaded FDT at random address 0x%lX.\nWARNING: There is a risk of accidental overwriting by other code/data.\n", *RelocatedFdt)); + } + } + + *RelocatedFdtAlloc = *RelocatedFdt; + if (FdtAlignment != 0) { + *RelocatedFdt = ALIGN (*RelocatedFdt, FdtAlignment); + } + + // Load the Original FDT tree into the new region + Error = fdt_open_into ((VOID*)(UINTN) OriginalFdt, + (VOID*)(UINTN)(*RelocatedFdt), *RelocatedFdtSize); + if (Error) { + DEBUG ((EFI_D_ERROR, "fdt_open_into(): %a\n", fdt_strerror (Error))); + gBS->FreePages (*RelocatedFdtAlloc, EFI_SIZE_TO_PAGES (*RelocatedFdtSize)); + return EFI_INVALID_PARAMETER; + } + + DEBUG_CODE_BEGIN(); + // DebugDumpFdt ((VOID*)(UINTN)(*RelocatedFdt)); + DEBUG_CODE_END(); + + return EFI_SUCCESS; +} + + +EFI_STATUS +AmdStyxPrepareFdt ( + IN CONST CHAR8* CommandLineArguments, + IN EFI_PHYSICAL_ADDRESS InitrdImage, + IN UINTN InitrdImageSize, + IN OUT EFI_PHYSICAL_ADDRESS *FdtBlobBase, + IN OUT UINTN *FdtBlobSize + ) +{ + EFI_STATUS Status; + EFI_PHYSICAL_ADDRESS NewFdtBlobBase; + EFI_PHYSICAL_ADDRESS NewFdtBlobAllocation; + UINTN NewFdtBlobSize; + VOID *fdt; + int err; + int node; + int cpu_node; + int lenp; + CONST VOID *BootArg; + EFI_PHYSICAL_ADDRESS InitrdImageStart; + EFI_PHYSICAL_ADDRESS InitrdImageEnd; + FdtRegion Region; + UINTN Index; + CHAR8 Name[10]; + LIST_ENTRY ResourceList; + BDS_SYSTEM_MEMORY_RESOURCE *Resource; + ARM_PROCESSOR_TABLE *ArmProcessorTable; + ARM_CORE_INFO *ArmCoreInfoTable; + UINTN ArmCoreCount; + UINT32 PrimaryClusterId; + UINT32 PrimaryCoreId; + UINTN MemoryMapSize; + EFI_MEMORY_DESCRIPTOR *MemoryMap; + EFI_MEMORY_DESCRIPTOR *MemoryMapPtr; + UINTN MapKey; + UINTN DescriptorSize; + UINT32 DescriptorVersion; + UINTN Pages; + UINTN OriginalFdtSize; + int map_node; + int cluster_node; + int pmu_node; + PMU_INTERRUPT PmuInt; + int phandle[NUM_CORES]; + UINT32 ClusterIndex, CoreIndex; + UINT32 ClusterCount, CoresInCluster; + UINT32 ClusterId; + UINTN MpId, MbAddr; + + // + // Sanity checks on the original FDT blob. + // + err = fdt_check_header ((VOID*)(UINTN)(*FdtBlobBase)); + if (err != 0) { + Print (L"ERROR: Device Tree header not valid (err:%d)\n", err); + return EFI_INVALID_PARAMETER; + } + + // The original FDT blob might have been loaded partially. + // Check that it is not the case. + OriginalFdtSize = (UINTN)fdt_totalsize ((VOID*)(UINTN)(*FdtBlobBase)); + if (OriginalFdtSize > *FdtBlobSize) { + Print (L"ERROR: Incomplete FDT. Only %d/%d bytes have been loaded.\n", + *FdtBlobSize, OriginalFdtSize); + return EFI_INVALID_PARAMETER; + } + + // + // Relocate the FDT to its final location. + // + NewFdtBlobAllocation = 0; + Status = RelocateFdt (*FdtBlobBase, OriginalFdtSize, + &NewFdtBlobBase, &NewFdtBlobSize, &NewFdtBlobAllocation); + if (EFI_ERROR (Status)) { + goto FAIL_RELOCATE_FDT; + } + fdt = (VOID*)(UINTN)NewFdtBlobBase; + + node = fdt_subnode_offset (fdt, 0, "chosen"); + if (node < 0) { + // The 'chosen' node does not exist, create it + node = fdt_add_subnode(fdt, 0, "chosen"); + if (node < 0) { + DEBUG((EFI_D_ERROR,"Error on finding 'chosen' node\n")); + Status = EFI_INVALID_PARAMETER; + goto FAIL_COMPLETE_FDT; + } + } + + DEBUG_CODE_BEGIN(); + BootArg = fdt_getprop(fdt, node, "bootargs", &lenp); + if (BootArg != NULL) { + DEBUG((EFI_D_ERROR,"BootArg: %a\n",BootArg)); + } + DEBUG_CODE_END(); + + // + // Set Linux CmdLine + // + if ((CommandLineArguments != NULL) && (AsciiStrLen (CommandLineArguments) > 0)) { + err = fdt_setprop(fdt, node, "bootargs", CommandLineArguments, AsciiStrSize(CommandLineArguments)); + if (err) { + DEBUG((EFI_D_ERROR,"Fail to set new 'bootarg' (err:%d)\n",err)); + } + } + + // + // Set Linux Initrd + // + if (InitrdImageSize != 0) { + InitrdImageStart = cpu_to_fdt64 (InitrdImage); + err = fdt_setprop(fdt, node, "linux,initrd-start", &InitrdImageStart, sizeof(EFI_PHYSICAL_ADDRESS)); + if (err) { + DEBUG((EFI_D_ERROR,"Fail to set new 'linux,initrd-start' (err:%d)\n",err)); + } + InitrdImageEnd = cpu_to_fdt64 (InitrdImage + InitrdImageSize); + err = fdt_setprop(fdt, node, "linux,initrd-end", &InitrdImageEnd, sizeof(EFI_PHYSICAL_ADDRESS)); + if (err) { + DEBUG((EFI_D_ERROR,"Fail to set new 'linux,initrd-start' (err:%d)\n",err)); + } + } + + // + // Set Physical memory setup if does not exist + // + node = fdt_subnode_offset(fdt, 0, "memory"); + if (node < 0) { + // The 'memory' node does not exist, create it + node = fdt_add_subnode(fdt, 0, "memory"); + if (node >= 0) { + fdt_setprop_string(fdt, node, "name", "memory"); + fdt_setprop_string(fdt, node, "device_type", "memory"); + + GetSystemMemoryResources (&ResourceList); + Resource = (BDS_SYSTEM_MEMORY_RESOURCE*)ResourceList.ForwardLink; + + Region.Base = cpu_to_fdtn ((UINTN)Resource->PhysicalStart); + Region.Size = cpu_to_fdtn ((UINTN)Resource->ResourceLength); + + err = fdt_setprop(fdt, node, "reg", &Region, sizeof(Region)); + if (err) { + DEBUG((EFI_D_ERROR,"Fail to set new 'memory region' (err:%d)\n",err)); + } + } + } + + // + // Add the memory regions reserved by the UEFI Firmware + // + + // Retrieve the UEFI Memory Map + MemoryMap = NULL; + MemoryMapSize = 0; + Status = gBS->GetMemoryMap (&MemoryMapSize, MemoryMap, &MapKey, &DescriptorSize, &DescriptorVersion); + if (Status == EFI_BUFFER_TOO_SMALL) { + // The UEFI specification advises to allocate more memory for the MemoryMap buffer between successive + // calls to GetMemoryMap(), since allocation of the new buffer may potentially increase memory map size. + Pages = EFI_SIZE_TO_PAGES (MemoryMapSize) + 1; + MemoryMap = AllocatePages (Pages); + if (MemoryMap == NULL) { + Status = EFI_OUT_OF_RESOURCES; + goto FAIL_COMPLETE_FDT; + } + Status = gBS->GetMemoryMap (&MemoryMapSize, MemoryMap, &MapKey, &DescriptorSize, &DescriptorVersion); + } + + // Go through the list and add the reserved region to the Device Tree + if (!EFI_ERROR(Status)) { + MemoryMapPtr = MemoryMap; + for (Index = 0; Index < (MemoryMapSize / DescriptorSize); Index++) { + if (IsLinuxReservedRegion ((EFI_MEMORY_TYPE)MemoryMapPtr->Type)) { + DEBUG((DEBUG_VERBOSE, "Reserved region of type %d [0x%lX, 0x%lX]\n", + MemoryMapPtr->Type, + (UINTN)MemoryMapPtr->PhysicalStart, + (UINTN)(MemoryMapPtr->PhysicalStart + MemoryMapPtr->NumberOfPages * EFI_PAGE_SIZE))); + err = fdt_add_mem_rsv(fdt, MemoryMapPtr->PhysicalStart, MemoryMapPtr->NumberOfPages * EFI_PAGE_SIZE); + if (err != 0) { + Print(L"Warning: Fail to add 'memreserve' (err:%d)\n", err); + } + } + MemoryMapPtr = (EFI_MEMORY_DESCRIPTOR*)((UINTN)MemoryMapPtr + DescriptorSize); + } + } + + // + // Setup Arm Mpcore Info if it is a multi-core or multi-cluster platforms. + // + // For 'cpus' and 'cpu' device tree nodes bindings, refer to this file + // in the kernel documentation: + // Documentation/devicetree/bindings/arm/cpus.txt + // + ArmProcessorTable = AmdStyxGetArmProcessorTable(); + ASSERT_EFI_ERROR (ArmProcessorTable == NULL); + ArmCoreInfoTable = ArmProcessorTable->ArmCpus; + + // Make sure SoC's core count does not exceed what we want to build + ArmCoreCount = ArmProcessorTable->NumberOfEntries; + ASSERT_EFI_ERROR (ArmCoreCount > NUM_CORES); + + // Get Id from primary CPU + MpId = (UINTN) ArmReadMpidr (); + PrimaryClusterId = GET_CLUSTER_ID((UINT32) MpId); + PrimaryCoreId = GET_CORE_ID((UINT32) MpId); + + // Remove existing 'pmu' node and create a new one + pmu_node = fdt_subnode_offset (fdt, 0, "pmu"); + if (pmu_node >= 0) { + fdt_del_node (fdt, pmu_node); + } + pmu_node = fdt_add_subnode(fdt, 0, "pmu"); + if (pmu_node >= 0) { + // append PMU interrupts + for (Index = 0; Index < ArmCoreCount; Index++) { + MpId = (UINTN) GET_MPID (ArmCoreInfoTable[Index].ClusterId, + ArmCoreInfoTable[Index].CoreId); + + Status = AmdStyxGetPmuSpiFromMpId (MpId, &PmuInt.IntId); + if (EFI_ERROR (Status)) { + DEBUG ((EFI_D_ERROR, "FDT: Error getting PMU interrupt for MpId '0x%x'\n", MpId)); + goto FAIL_COMPLETE_FDT; + } + + PmuInt.Flag = cpu_to_fdt32(PMU_INT_FLAG_SPI); + PmuInt.IntId = cpu_to_fdt32(PmuInt.IntId); + PmuInt.Type = cpu_to_fdt32(PMU_INT_TYPE_HIGH_LEVEL); + fdt_appendprop(fdt, pmu_node, "interrupts", &PmuInt, sizeof(PmuInt)); + } + fdt_setprop_string(fdt, pmu_node, "compatible", "arm,armv8-pmuv3"); + } else { + DEBUG((EFI_D_ERROR,"FDT: Error creating 'pmu' node\n")); + Status = EFI_INVALID_PARAMETER; + goto FAIL_COMPLETE_FDT; + } + + // Remove existing 'psci' node if feature not supported + node = fdt_subnode_offset (fdt, 0, "psci"); + if (node >= 0) { + if (!FixedPcdGetBool (PcdPsciOsSupport)) { + fdt_del_node (fdt, node); + } + } else if (FixedPcdGetBool (PcdPsciOsSupport) && + FixedPcdGetBool (PcdTrustedFWSupport)) { + // Add 'psci' node if not present + node = fdt_add_subnode(fdt, 0, "psci"); + if (node >= 0) { + fdt_setprop_string(fdt, node, "compatible", "arm,psci-0.2"); + fdt_appendprop_string(fdt, node, "compatible", "arm,psci"); + fdt_setprop_string(fdt, node, "method", "smc"); + } else { + DEBUG((EFI_D_ERROR,"FDT: Error creating 'psci' node\n")); + Status = EFI_INVALID_PARAMETER; + goto FAIL_COMPLETE_FDT; + } + } + + // Remove existing 'cpus' node and create a new one + node = fdt_subnode_offset (fdt, 0, "cpus"); + if (node >= 0) { + fdt_del_node (fdt, node); + } + node = fdt_add_subnode(fdt, 0, "cpus"); + if (node >= 0) { + // Configure the 'cpus' node + fdt_setprop_string(fdt, node, "name", "cpus"); + fdt_setprop_cell (fdt, node, "#address-cells", sizeof (UINTN) / 4); + fdt_setprop_cell(fdt, node, "#size-cells", 0); + } else { + DEBUG((EFI_D_ERROR,"FDT: Error creating 'cpus' node\n")); + Status = EFI_INVALID_PARAMETER; + goto FAIL_COMPLETE_FDT; + } + + // + // Walk the processor table in reverse order for proper listing in FDT + // + Index = ArmCoreCount; + while (Index--) { + // Create 'cpu' node + AsciiSPrint (Name, sizeof(Name), "CPU%d", Index); + cpu_node = fdt_add_subnode (fdt, node, Name); + if (cpu_node < 0) { + DEBUG ((EFI_D_ERROR, "FDT: Error on creating '%a' node\n", Name)); + Status = EFI_INVALID_PARAMETER; + goto FAIL_COMPLETE_FDT; + } + phandle[Index] = fdt_alloc_phandle(fdt); + fdt_setprop_cell (fdt, cpu_node, "phandle", phandle[Index]); + fdt_setprop_cell (fdt, cpu_node, "linux,phandle", phandle[Index]); + + if (FixedPcdGetBool (PcdPsciOsSupport) && + FixedPcdGetBool (PcdTrustedFWSupport)) { + fdt_setprop_string(fdt, cpu_node, "enable-method", "psci"); + } else { + fdt_setprop_string(fdt, cpu_node, "enable-method", "spin-table"); + MbAddr = ArmCoreInfoTable[Index].MailboxSetAddress; + MbAddr = cpu_to_fdtn (MbAddr); + fdt_setprop (fdt, cpu_node, "cpu-release-addr", &MbAddr, sizeof (MbAddr)); + } + MpId = (UINTN) GET_MPID (ArmCoreInfoTable[Index].ClusterId, + ArmCoreInfoTable[Index].CoreId); + MpId = cpu_to_fdtn (MpId); + fdt_setprop (fdt, cpu_node, "reg", &MpId, sizeof (MpId)); + fdt_setprop_string(fdt, cpu_node, "compatible", "arm,armv8"); + fdt_setprop_string (fdt, cpu_node, "device_type", "cpu"); + + // If it is not the primary core than the cpu should be disabled + if (((ArmCoreInfoTable[Index].ClusterId != PrimaryClusterId) || + (ArmCoreInfoTable[Index].CoreId != PrimaryCoreId))) { + fdt_setprop_string(fdt, cpu_node, "status", "disabled"); + } + } + + // Remove existing 'cpu-map' node and create a new one + map_node = fdt_subnode_offset (fdt, node, "cpu-map"); + if (map_node >= 0) { + fdt_del_node (fdt, map_node); + } + map_node = fdt_add_subnode(fdt, node, "cpu-map"); + if (map_node >= 0) { + ClusterIndex = ArmCoreCount - 1; + ClusterCount = NumberOfClustersInTable (ArmCoreInfoTable, + ArmCoreCount); + while (ClusterCount--) { + // Create 'cluster' node + AsciiSPrint (Name, sizeof(Name), "cluster%d", ClusterCount); + cluster_node = fdt_add_subnode (fdt, map_node, Name); + if (cluster_node < 0) { + DEBUG ((EFI_D_ERROR, "FDT: Error creating '%a' node\n", Name)); + Status = EFI_INVALID_PARAMETER; + goto FAIL_COMPLETE_FDT; + } + + ClusterId = ArmCoreInfoTable[ClusterIndex].ClusterId; + CoreIndex = ClusterIndex; + CoresInCluster = NumberOfCoresInCluster (ArmCoreInfoTable, + ArmCoreCount, + ClusterId); + while (CoresInCluster--) { + // Create 'core' node + AsciiSPrint (Name, sizeof(Name), "core%d", CoresInCluster); + cpu_node = fdt_add_subnode (fdt, cluster_node, Name); + if (cpu_node < 0) { + DEBUG ((EFI_D_ERROR, "FDT: Error creating '%a' node\n", Name)); + Status = EFI_INVALID_PARAMETER; + goto FAIL_COMPLETE_FDT; + } + fdt_setprop_cell (fdt, cpu_node, "cpu", phandle[CoreIndex]); + + // iterate to next core in cluster + if (CoresInCluster) { + do { + --CoreIndex; + } while (ClusterId != ArmCoreInfoTable[CoreIndex].ClusterId); + } + } + + // iterate to next cluster + if (ClusterCount) { + do { + --ClusterIndex; + } while (ClusterInRange (ArmCoreInfoTable, + ArmCoreInfoTable[ClusterIndex].ClusterId, + ClusterIndex + 1, + ArmCoreCount - 1)); + } + } + } else { + DEBUG((EFI_D_ERROR,"FDT: Error creating 'cpu-map' node\n")); + Status = EFI_INVALID_PARAMETER; + goto FAIL_COMPLETE_FDT; + } + + SetSocIdStatus (fdt); + SetXgbeStatus (fdt); + + DEBUG_CODE_BEGIN(); + // DebugDumpFdt (fdt); + DEBUG_CODE_END(); + + // If we succeeded to generate the new Device Tree then free the old Device Tree + gBS->FreePages (*FdtBlobBase, EFI_SIZE_TO_PAGES (*FdtBlobSize)); + + // Update the real size of the Device Tree + fdt_pack ((VOID*)(UINTN)(NewFdtBlobBase)); + + *FdtBlobBase = NewFdtBlobBase; + *FdtBlobSize = (UINTN)fdt_totalsize ((VOID*)(UINTN)(NewFdtBlobBase)); + return EFI_SUCCESS; + +FAIL_COMPLETE_FDT: + gBS->FreePages (NewFdtBlobAllocation, EFI_SIZE_TO_PAGES (NewFdtBlobSize)); + +FAIL_RELOCATE_FDT: + *FdtBlobSize = (UINTN)fdt_totalsize ((VOID*)(UINTN)(*FdtBlobBase)); + // Return success even if we failed to update the FDT blob. + // The original one is still valid. + return EFI_SUCCESS; +} + diff --git a/Platforms/AMD/Styx/OverdriveBoard/FdtDxe/FdtDxe.c b/Platforms/AMD/Styx/OverdriveBoard/FdtDxe/FdtDxe.c new file mode 100644 index 0000000..2559762 --- /dev/null +++ b/Platforms/AMD/Styx/OverdriveBoard/FdtDxe/FdtDxe.c @@ -0,0 +1,279 @@ +/** @file + + Copyright (c) 2014 - 2015, AMD Inc. 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 "FdtDxe.h" + +extern EFI_BOOT_SERVICES *gBS; + +EFI_EVENT mFdtReadyToBootEvent; + +VOID +EFIAPI +FdtReadyToBoot ( + IN EFI_EVENT Event, + IN VOID *Context + ); + +EFI_STATUS +EFIAPI +FdtOverrideDevicePath( + IN CHAR16 *FdtFileName, + OUT EFI_DEVICE_PATH **FdtDevicePath + ); + + +/** + *--------------------------------------------------------------------------------------- + * + * FdtDxeEntryPoint + * + * Description: + * Entry point of the FDT Runtime Driver. + * + * Control flow: + * Configure reserved regions. + * + * Parameters: + * @param[in] ImageHandle The firmware allocate handle for the + * EFI image. + * @param[in] *SystemTable Pointer to the EFI System Table. + * + * @return EFI_STATUS + * + *------------------------------------------------------------------------------------ + **/ +EFI_STATUS +EFIAPI +FdtDxeEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + DEBUG ((EFI_D_ERROR, "FdtDxe Loaded\n")); + + // + // Ready-To-Boot callback + // + Status = EfiCreateEventReadyToBootEx( + TPL_CALLBACK, + FdtReadyToBoot, + NULL, + &mFdtReadyToBootEvent + ); + ASSERT_EFI_ERROR (Status); + + return Status; +} + +/** + *--------------------------------------------------------------------------------------- + * + * FdtReadyToBoot + * + * Description: + * Ready-2-Boot Event Callback for EFI_EVENT_SIGNAL_READY_TO_BOOT. + * + * Control flow: + * 1. Read FDT blob + * 2. Edit FDT table + * 3. Submit FDT to EFI system table + * + * Parameters: + * @param[in] Event EFI_EVENT notification. + * @param[in] *Context Pointer to the Event Context. + * + * @return VOID + * + *--------------------------------------------------------------------------------------- + **/ +VOID +EFIAPI +FdtReadyToBoot ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + EFI_FIRMWARE_VOLUME2_PROTOCOL *FvProtocol; + EFI_HANDLE *HandleBuffer; + UINTN HandleCount; + UINTN Index; + EFI_STATUS Status; + UINT32 AuthenticationStatus; + EFI_GUID *FdtGuid = FixedPcdGetPtr(PcdStyxFdt); + UINT8 *FdtBlobBase = NULL; + UINTN FdtBlobSize = 0; + EFI_DEVICE_PATH *FdtDevicePath; + + // Move secondary core to a Pen complaint with MP-Parking protocol + if (!FixedPcdGetBool (PcdPsciOsSupport)) { + AmdStyxMoveParkedCores(); + } + + // Search for FDT blob in EFI partition + Status = FdtOverrideDevicePath(L"fdt.dtb", &FdtDevicePath); + if (!EFI_ERROR (Status)) { + DEBUG ((EFI_D_ERROR, "%a: Loading Override FDT blob...\n", __FUNCTION__)); + + FdtBlobBase = (UINT8 *)(UINTN)LINUX_FDT_MAX_OFFSET; + Status = BdsLoadImage (FdtDevicePath, + AllocateMaxAddress, + (EFI_PHYSICAL_ADDRESS *)&FdtBlobBase, + &FdtBlobSize); + if (!EFI_ERROR (Status) && FdtBlobBase && FdtBlobSize) + goto LOAD_FDT_BLOB; + else + goto LOAD_FDT_ERROR; + } + + DEBUG ((EFI_D_ERROR, "%a: Loading Embedded FDT blob...\n", __FUNCTION__)); + HandleBuffer = NULL; + Status = gBS->LocateHandleBuffer ( + ByProtocol, + &gEfiFirmwareVolume2ProtocolGuid, + NULL, + &HandleCount, + &HandleBuffer + ); + ASSERT_EFI_ERROR (Status); + + for (Index = 0; Index < HandleCount; Index++) { + Status = gBS->HandleProtocol ( + HandleBuffer[Index], + &gEfiFirmwareVolume2ProtocolGuid, + (VOID **) &FvProtocol + ); + if (!EFI_ERROR (Status)) { + Status = FvProtocol->ReadSection ( + FvProtocol, + FdtGuid, + EFI_SECTION_RAW, + 0, + (VOID **)&FdtBlobBase, + &FdtBlobSize, + &AuthenticationStatus + ); + if (!EFI_ERROR (Status) && FdtBlobBase && FdtBlobSize) + goto LOAD_FDT_BLOB; + } + } + +LOAD_FDT_ERROR: + DEBUG ((EFI_D_ERROR, "%a: Error loading FDT blob!\n", __FUNCTION__)); + goto LOAD_FDT_DONE; + +LOAD_FDT_BLOB: + Status = AmdStyxPrepareFdt(NULL, 0, 0, (EFI_PHYSICAL_ADDRESS *)&FdtBlobBase, &FdtBlobSize); + ASSERT_EFI_ERROR (Status); + + // Install the FDT blob into EFI system configuration table + Status = gBS->InstallConfigurationTable (&gFdtTableGuid, (VOID *)FdtBlobBase); + ASSERT_EFI_ERROR (Status); + DEBUG ((EFI_D_ERROR, "%a: FDT ready!\n", __FUNCTION__)); + +LOAD_FDT_DONE: + gBS->CloseEvent (mFdtReadyToBootEvent); + return; +} + +/** +*--------------------------------------------------------------------------------------- +* +* FdtOverrideDevicePath +* +* Description: +* Looks for a user-provided FDT blob to override the default file built with the UEFI image. +* +* Parameters: +* @param[in] FdtFileName Name of the FDT blob located in the EFI partition. +* @param[out] FdtDevicePath EFI Device Path of the FDT blob. +* +* @return EFI_SUCCESS The function completed successfully. +* @return EFI_NOT_FOUND The protocol could not be located. +* @return EFI_OUT_OF_RESOURCES There are not enough resources to find the protocol. +* +*--------------------------------------------------------------------------------------- +**/ +EFI_STATUS +EFIAPI +FdtOverrideDevicePath( + IN CHAR16 *FdtFileName, + OUT EFI_DEVICE_PATH **FdtDevicePath + ) +{ + EFI_DEVICE_PATH_PROTOCOL *DevPathProtocol; + EFI_HANDLE *HandleBuffer; + UINTN HandleCount; + UINTN Index; + EFI_STATUS Status; + CHAR16 *DevPathText; + EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *VolProtocol; + EFI_FILE_PROTOCOL *FileProtocol; + EFI_FILE_PROTOCOL *FileHandle; + CHAR16 FilePathText[120]; + + HandleBuffer = NULL; + Status = gBS->LocateHandleBuffer ( + ByProtocol, + &gEfiSimpleFileSystemProtocolGuid, + NULL, + &HandleCount, + &HandleBuffer); + if (EFI_ERROR (Status)) + return Status; + + for (Index = 0; Index < HandleCount; Index++) { + DevPathProtocol = NULL; + Status = gBS->HandleProtocol ( + HandleBuffer[Index], + &gEfiDevicePathProtocolGuid, + (VOID **) &DevPathProtocol); + + if (!EFI_ERROR (Status)) { + VolProtocol = NULL; + Status = gBS->HandleProtocol ( + HandleBuffer[Index], + &gEfiSimpleFileSystemProtocolGuid, + (VOID **) &VolProtocol); + + if (!EFI_ERROR (Status)) { + FileProtocol = NULL; + Status = VolProtocol->OpenVolume(VolProtocol, &FileProtocol); + + if (!EFI_ERROR (Status)) { + FileHandle = NULL; + Status = FileProtocol->Open(FileProtocol, + &FileHandle, + FdtFileName, + EFI_FILE_MODE_READ, + 0); + + if (!EFI_ERROR (Status)) { + FileProtocol->Close(FileHandle); + DevPathText = ConvertDevicePathToText(DevPathProtocol, TRUE, FALSE); + StrCpy(FilePathText, DevPathText); + StrCat(FilePathText, L"/"); + StrCat(FilePathText, FdtFileName); + *FdtDevicePath = ConvertTextToDevicePath (FilePathText); + return EFI_SUCCESS; + } + } + } + } + } + + return Status; +} + diff --git a/Platforms/AMD/Styx/OverdriveBoard/FdtDxe/FdtDxe.h b/Platforms/AMD/Styx/OverdriveBoard/FdtDxe/FdtDxe.h new file mode 100644 index 0000000..7d17206 --- /dev/null +++ b/Platforms/AMD/Styx/OverdriveBoard/FdtDxe/FdtDxe.h @@ -0,0 +1,55 @@ +/** @file + + Copyright (c) 2014 - 2015, AMD Inc. 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. + +**/ + +#ifndef __FDT_DXE__H_ +#define __FDT_DXE__H_ + +#include <Uefi.h> +#include <Library/UefiLib.h> +#include <Library/UefiDriverEntryPoint.h> + +#include <Library/BaseLib.h> +#include <Library/BdsLib.h> +#include <Library/PcdLib.h> +#include <Library/DebugLib.h> +#include <Library/DevicePathLib.h> +#include <Guid/DxeServices.h> +#include <Library/DxeServicesTableLib.h> + +#include <Protocol/FirmwareVolume2.h> +#include <Protocol/SimpleFileSystem.h> +#include <Protocol/LoadFile.h> +#include <Protocol/DevicePath.h> +#include <Protocol/DevicePathFromText.h> + +//#define LINUX_FDT_MAX_OFFSET (PcdGet64 (PcdUefiEntryAddress) + PcdGet32(PcdArmLinuxFdtMaxOffset)) +#define LINUX_FDT_MAX_OFFSET (PcdGet64 (PcdSystemMemoryBase) + PcdGet32(PcdArmLinuxFdtMaxOffset)) + +VOID +EFIAPI +AmdStyxMoveParkedCores( + VOID + ); + +EFI_STATUS +AmdStyxPrepareFdt ( + IN CONST CHAR8* CommandLineArguments, + IN EFI_PHYSICAL_ADDRESS InitrdImage, + IN UINTN InitrdImageSize, + IN OUT EFI_PHYSICAL_ADDRESS *FdtBlobBase, + IN OUT UINTN *FdtBlobSize + ); + + +#endif // __FDT_DXE__H_ diff --git a/Platforms/AMD/Styx/OverdriveBoard/FdtDxe/FdtDxe.inf b/Platforms/AMD/Styx/OverdriveBoard/FdtDxe/FdtDxe.inf new file mode 100644 index 0000000..5ac210b --- /dev/null +++ b/Platforms/AMD/Styx/OverdriveBoard/FdtDxe/FdtDxe.inf @@ -0,0 +1,90 @@ +#/* @file +# +# Copyright (c) 2014 - 2015, AMD Inc. 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 = 0x00010005 + BASE_NAME = FdtDxe + FILE_GUID = 17f50855-6484-4b56-814b-1a88702d88e1 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = FdtDxeEntryPoint + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = AARCH64 +# +# + +[Sources.common] + FdtDxe.c + BdsLinuxFdt.c + LinuxLoaderHelper.c + +[Sources.AARCH64] + AArch64/BdsLinuxLoader.c + AArch64/BdsLinuxLoaderHelper.S | GCC + +[Packages] + ArmPkg/ArmPkg.dec + EmbeddedPkg/EmbeddedPkg.dec + MdePkg/MdePkg.dec + AmdModulePkg/AmdModulePkg.dec + OpenPlatformPkg/Platforms/AMD/Styx/AmdStyx.dec + +[LibraryClasses] + UefiDriverEntryPoint + DxeServicesTableLib + BdsLib + FdtLib + DevicePathLib + AmdStyxHelperLib + +[LibraryClasses.AARCH64] + ArmGicLib + PcdLib + +[Guids] + gEfiEventReadyToBootGuid ##CONSUMED + gEfiDxeServicesTableGuid ##CONSUMED + gArmMpCoreInfoGuid ##CONSUMED + gFdtTableGuid ##CONSUMED + +[Protocols] + gEfiFirmwareVolume2ProtocolGuid ##CONSUMED + +[Pcd] + gAmdStyxTokenSpaceGuid.PcdStyxFdt + gAmdStyxTokenSpaceGuid.PcdSocCpuId + gAmdModulePkgTokenSpaceGuid.PcdEthMacA + gAmdModulePkgTokenSpaceGuid.PcdEthMacB + gAmdModulePkgTokenSpaceGuid.PcdEthMacB + gArmTokenSpaceGuid.PcdSystemMemoryBase + +[FixedPcd] + gArmTokenSpaceGuid.PcdArmLinuxFdtMaxOffset + gArmTokenSpaceGuid.PcdArmLinuxFdtAlignment + gAmdStyxTokenSpaceGuid.PcdUefiEntryAddress + gAmdStyxTokenSpaceGuid.PcdPsciOsSupport + gAmdStyxTokenSpaceGuid.PcdTrustedFWSupport + gAmdStyxTokenSpaceGuid.PcdParkingProtocolBase + gAmdStyxTokenSpaceGuid.PcdParkingProtocolSize + +[Pcd.AARCH64] + gArmTokenSpaceGuid.PcdGicDistributorBase + gArmTokenSpaceGuid.PcdGicSgiIntId + +[Depex] + TRUE + diff --git a/Platforms/AMD/Styx/OverdriveBoard/FdtDxe/LinuxLoader.h b/Platforms/AMD/Styx/OverdriveBoard/FdtDxe/LinuxLoader.h new file mode 100644 index 0000000..8a23d7f --- /dev/null +++ b/Platforms/AMD/Styx/OverdriveBoard/FdtDxe/LinuxLoader.h @@ -0,0 +1,166 @@ +/** @file +* +* Copyright (c) 2011-2015, ARM 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. +* +**/ + +#ifndef __LINUX_LOADER_H__ +#define __LINUX_LOADER_H__ + +#include <Library/BdsLib.h> +#include <Library/DebugLib.h> +#include <Library/HiiLib.h> +#include <Library/MemoryAllocationLib.h> +#include <Library/PerformanceLib.h> +#include <Library/PrintLib.h> +#include <Library/ShellLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/UefiLib.h> + +#include <Protocol/EfiShellParameters.h> +#include <Protocol/EfiShell.h> + +#include <libfdt.h> + +// +// Definitions +// + +#define MAX_MSG_LEN 80 + +#define LINUX_UIMAGE_SIGNATURE 0x56190527 +#define LINUX_KERNEL_MAX_OFFSET (SystemMemoryBase + PcdGet32(PcdArmLinuxKernelMaxOffset)) +#define LINUX_ATAG_MAX_OFFSET (SystemMemoryBase + PcdGet32(PcdArmLinuxAtagMaxOffset)) +#define LINUX_FDT_MAX_OFFSET (SystemMemoryBase + PcdGet32(PcdArmLinuxFdtMaxOffset)) + +#define ARM_FDT_MACHINE_TYPE 0xFFFFFFFF + +// Additional size that could be used for FDT entries added by the UEFI OS Loader +// Estimation based on: EDID (300bytes) + bootargs (200bytes) + initrd region (20bytes) +// + system memory region (20bytes) + mp_core entries (200 bytes) +#define FDT_ADDITIONAL_ENTRIES_SIZE 0x300 + +// +// Global variables +// +extern CONST EFI_GUID mLinuxLoaderHiiGuid; +extern EFI_HANDLE mLinuxLoaderHiiHandle; + +// +// Local Types +// +typedef struct _SYSTEM_MEMORY_RESOURCE { + LIST_ENTRY Link; // This attribute must be the first entry of this structure (to avoid pointer computation) + EFI_PHYSICAL_ADDRESS PhysicalStart; + UINT64 ResourceLength; +} SYSTEM_MEMORY_RESOURCE; + +typedef VOID (*LINUX_KERNEL)(UINT32 Zero, UINT32 Arch, UINTN ParametersBase); + +// +// Functions +// +EFI_STATUS +PrintHii ( + IN CONST CHAR8 *Language OPTIONAL, + IN CONST EFI_STRING_ID HiiFormatStringId, + ... + ); + +VOID +PrintHelp ( + IN CONST CHAR8 *Language OPTIONAL + ); + +EFI_STATUS +ProcessShellParameters ( + OUT CHAR16 **KernelPath, + OUT CHAR16 **FdtPath, + OUT CHAR16 **InitrdPath, + OUT CHAR16 **LinuxCommandLine, + OUT UINTN *AtagMachineType + ); + +EFI_STATUS +ProcessAppCommandLine ( + OUT CHAR16 **KernelTextDevicePath, + OUT CHAR16 **FdtTextDevicePath, + OUT CHAR16 **InitrdTextDevicePath, + OUT CHAR16 **LinuxCommandLine, + OUT UINTN *AtagMachineType + ); + +VOID +PrintPerformance ( + VOID + ); + +EFI_STATUS +GetSystemMemoryResources ( + IN LIST_ENTRY *ResourceList + ); + +EFI_STATUS +PrepareFdt ( + IN EFI_PHYSICAL_ADDRESS SystemMemoryBase, + IN CONST CHAR8* CommandLineArguments, + IN EFI_PHYSICAL_ADDRESS InitrdImage, + IN UINTN InitrdImageSize, + IN OUT EFI_PHYSICAL_ADDRESS *FdtBlobBase, + IN OUT UINTN *FdtBlobSize + ); + +/** + Start a Linux kernel from a Device Path + + @param SystemMemoryBase Base of the system memory + @param LinuxKernel Device Path to the Linux Kernel + @param Parameters Linux kernel arguments + @param Fdt Device Path to the Flat Device Tree + @param MachineType ARM machine type value + + @retval EFI_SUCCESS All drivers have been connected + @retval EFI_NOT_FOUND The Linux kernel Device Path has not been found + @retval EFI_OUT_OF_RESOURCES There is not enough resource memory to store the matching results. + @retval RETURN_UNSUPPORTED ATAG is not support by this architecture + +**/ +EFI_STATUS +BootLinuxAtag ( + IN EFI_PHYSICAL_ADDRESS SystemMemoryBase, + IN EFI_DEVICE_PATH_PROTOCOL* LinuxKernelDevicePath, + IN EFI_DEVICE_PATH_PROTOCOL* InitrdDevicePath, + IN CONST CHAR8* CommandLineArguments, + IN UINTN MachineType + ); + +/** + Start a Linux kernel from a Device Path + + @param[in] LinuxKernelDevicePath Device Path to the Linux Kernel + @param[in] InitrdDevicePath Device Path to the Initrd + @param[in] Arguments Linux kernel arguments + + @retval EFI_SUCCESS All drivers have been connected + @retval EFI_NOT_FOUND The Linux kernel Device Path has not been found + @retval EFI_OUT_OF_RESOURCES There is not enough resource memory to store the matching results. + +**/ +EFI_STATUS +BootLinuxFdt ( + IN EFI_PHYSICAL_ADDRESS SystemMemoryBase, + IN EFI_DEVICE_PATH_PROTOCOL* LinuxKernelDevicePath, + IN EFI_DEVICE_PATH_PROTOCOL* InitrdDevicePath, + IN EFI_DEVICE_PATH_PROTOCOL* FdtDevicePath, + IN CONST CHAR8* Arguments + ); + +#endif /* __LINUX_LOADER_H__ */ diff --git a/Platforms/AMD/Styx/OverdriveBoard/FdtDxe/LinuxLoaderHelper.c b/Platforms/AMD/Styx/OverdriveBoard/FdtDxe/LinuxLoaderHelper.c new file mode 100644 index 0000000..4d7a844 --- /dev/null +++ b/Platforms/AMD/Styx/OverdriveBoard/FdtDxe/LinuxLoaderHelper.c @@ -0,0 +1,192 @@ +/** @file +* +* Copyright (c) 2011-2015, ARM 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 <PiDxe.h> +#include <Library/HobLib.h> +#include <Library/TimerLib.h> +#include <Library/SerialPortLib.h> + +#include "LinuxLoader.h" + +STATIC CONST CHAR8 *mTokenList[] = { + /*"SEC",*/ + "PEI", + "DXE", + "BDS", + NULL +}; + +VOID +PrintPerformance ( + VOID + ) +{ + UINTN Key; + CONST VOID *Handle; + CONST CHAR8 *Token, *Module; + UINT64 Start, Stop, TimeStamp; + UINT64 Delta, TicksPerSecond, Milliseconds; + UINTN Index; + CHAR8 Buffer[100]; + UINTN CharCount; + BOOLEAN CountUp; + + TicksPerSecond = GetPerformanceCounterProperties (&Start, &Stop); + if (Start < Stop) { + CountUp = TRUE; + } else { + CountUp = FALSE; + } + + TimeStamp = 0; + Key = 0; + do { + Key = GetPerformanceMeasurement (Key, (CONST VOID **)&Handle, &Token, &Module, &Start, &Stop); + if (Key != 0) { + for (Index = 0; mTokenList[Index] != NULL; Index++) { + if (AsciiStriCmp (mTokenList[Index], Token) == 0) { + Delta = CountUp ? (Stop - Start) : (Start - Stop); + TimeStamp += Delta; + Milliseconds = DivU64x64Remainder (MultU64x32 (Delta, 1000), TicksPerSecond, NULL); + CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "%6a %6ld ms\n", Token, Milliseconds); + SerialPortWrite ((UINT8 *) Buffer, CharCount); + break; + } + } + } + } while (Key != 0); + + CharCount = AsciiSPrint (Buffer, sizeof (Buffer), "Total Time = %ld ms\n\n", + DivU64x64Remainder (MultU64x32 (TimeStamp, 1000), TicksPerSecond, NULL)); + SerialPortWrite ((UINT8 *) Buffer, CharCount); +} + +STATIC +EFI_STATUS +InsertSystemMemoryResources ( + LIST_ENTRY *ResourceList, + EFI_HOB_RESOURCE_DESCRIPTOR *ResHob + ) +{ + SYSTEM_MEMORY_RESOURCE *NewResource; + LIST_ENTRY *Link; + LIST_ENTRY *NextLink; + LIST_ENTRY AttachedResources; + SYSTEM_MEMORY_RESOURCE *Resource; + EFI_PHYSICAL_ADDRESS NewResourceEnd; + + if (IsListEmpty (ResourceList)) { + NewResource = AllocateZeroPool (sizeof (SYSTEM_MEMORY_RESOURCE)); + NewResource->PhysicalStart = ResHob->PhysicalStart; + NewResource->ResourceLength = ResHob->ResourceLength; + InsertTailList (ResourceList, &NewResource->Link); + return EFI_SUCCESS; + } + + InitializeListHead (&AttachedResources); + + Link = ResourceList->ForwardLink; + ASSERT (Link != NULL); + while (Link != ResourceList) { + Resource = (SYSTEM_MEMORY_RESOURCE*)Link; + + // Sanity Check. The resources should not overlapped. + ASSERT (!((ResHob->PhysicalStart >= Resource->PhysicalStart) && (ResHob->PhysicalStart < (Resource->PhysicalStart + Resource->ResourceLength)))); + ASSERT (!((ResHob->PhysicalStart + ResHob->ResourceLength - 1 >= Resource->PhysicalStart) && + ((ResHob->PhysicalStart + ResHob->ResourceLength - 1) < (Resource->PhysicalStart + Resource->ResourceLength)))); + + // The new resource is attached after this resource descriptor + if (ResHob->PhysicalStart == Resource->PhysicalStart + Resource->ResourceLength) { + Resource->ResourceLength = Resource->ResourceLength + ResHob->ResourceLength; + + NextLink = RemoveEntryList (&Resource->Link); + InsertTailList (&AttachedResources, &Resource->Link); + Link = NextLink; + } + // The new resource is attached before this resource descriptor + else if (ResHob->PhysicalStart + ResHob->ResourceLength == Resource->PhysicalStart) { + Resource->PhysicalStart = ResHob->PhysicalStart; + Resource->ResourceLength = Resource->ResourceLength + ResHob->ResourceLength; + + NextLink = RemoveEntryList (&Resource->Link); + InsertTailList (&AttachedResources, &Resource->Link); + Link = NextLink; + } else { + Link = Link->ForwardLink; + } + } + + if (!IsListEmpty (&AttachedResources)) { + // See if we can merge the attached resource with other resources + + NewResource = (SYSTEM_MEMORY_RESOURCE*)GetFirstNode (&AttachedResources); + Link = RemoveEntryList (&NewResource->Link); + while (!IsListEmpty (&AttachedResources)) { + // Merge resources + Resource = (SYSTEM_MEMORY_RESOURCE*)Link; + + // Ensure they overlap each other + ASSERT ( + ((NewResource->PhysicalStart >= Resource->PhysicalStart) && (NewResource->PhysicalStart < (Resource->PhysicalStart + Resource->ResourceLength))) || + (((NewResource->PhysicalStart + NewResource->ResourceLength) >= Resource->PhysicalStart) && ((NewResource->PhysicalStart + NewResource->ResourceLength) < (Resource->PhysicalStart + Resource->ResourceLength))) + ); + + NewResourceEnd = MAX (NewResource->PhysicalStart + NewResource->ResourceLength, Resource->PhysicalStart + Resource->ResourceLength); + NewResource->PhysicalStart = MIN (NewResource->PhysicalStart, Resource->PhysicalStart); + NewResource->ResourceLength = NewResourceEnd - NewResource->PhysicalStart; + + Link = RemoveEntryList (Link); + } + } else { + // None of the Resource of the list is attached to this ResHob. Create a new entry for it + NewResource = AllocateZeroPool (sizeof (SYSTEM_MEMORY_RESOURCE)); + NewResource->PhysicalStart = ResHob->PhysicalStart; + NewResource->ResourceLength = ResHob->ResourceLength; + } + InsertTailList (ResourceList, &NewResource->Link); + return EFI_SUCCESS; +} + +EFI_STATUS +GetSystemMemoryResources ( + IN LIST_ENTRY *ResourceList + ) +{ + EFI_HOB_RESOURCE_DESCRIPTOR *ResHob; + + InitializeListHead (ResourceList); + + // Find the first System Memory Resource Descriptor + ResHob = (EFI_HOB_RESOURCE_DESCRIPTOR *)GetFirstHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR); + while ((ResHob != NULL) && (ResHob->ResourceType != EFI_RESOURCE_SYSTEM_MEMORY)) { + ResHob = (EFI_HOB_RESOURCE_DESCRIPTOR *)GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, (VOID *)((UINTN)ResHob + ResHob->Header.HobLength)); + } + + // Did not find any + if (ResHob == NULL) { + return EFI_NOT_FOUND; + } else { + InsertSystemMemoryResources (ResourceList, ResHob); + } + + ResHob = (EFI_HOB_RESOURCE_DESCRIPTOR *)GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, (VOID *)((UINTN)ResHob + ResHob->Header.HobLength)); + while (ResHob != NULL) { + if (ResHob->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) { + InsertSystemMemoryResources (ResourceList, ResHob); + } + ResHob = (EFI_HOB_RESOURCE_DESCRIPTOR *)GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, (VOID *)((UINTN)ResHob + ResHob->Header.HobLength)); + } + + return EFI_SUCCESS; +} diff --git a/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.dsc b/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.dsc index 6bb40a0..e83a8ef 100644 --- a/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.dsc +++ b/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.dsc @@ -631,7 +631,7 @@ DEFINE TRANS_CODE = $(EL3_TO_EL2) # # FDT support # - OpenPlatformPkg/Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.inf + OpenPlatformPkg/Platforms/AMD/Styx/OverdriveBoard/FdtDxe/FdtDxe.inf
# # PCI support diff --git a/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.fdf b/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.fdf index 263a267..cbfb6c3 100644 --- a/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.fdf +++ b/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.fdf @@ -134,10 +134,10 @@ READ_LOCK_STATUS = TRUE # # FDT support # - INF OpenPlatformPkg/Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.inf + INF OpenPlatformPkg/Platforms/AMD/Styx/OverdriveBoard/FdtDxe/FdtDxe.inf
FILE FREEFORM = PCD(gAmdStyxTokenSpaceGuid.PcdStyxFdt) { - SECTION RAW = OpenPlatformPkg/Platforms/AMD/Styx/FdtBlob/styx-overdrive.dtb + SECTION RAW = OpenPlatformPkg/Platforms/AMD/Styx/OverdriveBoard/FdtBlob/styx-overdrive.dtb }
#