deleted file mode 100644
@@ -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.doc
- //
- 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));
-}
-
deleted file mode 100644
@@ -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:
deleted file mode 100644
@@ -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;
-}
-
deleted file mode 100644
@@ -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;
-}
-
deleted file mode 100644
@@ -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_
deleted file mode 100644
@@ -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
-
deleted file mode 100644
@@ -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__ */
deleted file mode 100644
@@ -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;
-}
deleted file mode 100644
GIT binary patch
literal 0
HcmV?d00001
literal 8093
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
SIz!?l$ooN5=z1{DqW=NKelU9g
deleted file mode 100644
@@ -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";
- };
-};
-
-
deleted file mode 100644
GIT binary patch
literal 0
HcmV?d00001
literal 8089
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
JJ(?uJ{{StXEo}e*
deleted file mode 100644
@@ -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";
- };
-};
-
-
new file mode 100644
GIT binary patch
literal 8093
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
SIz!?l$ooN5=z1{DqW=NKelU9g
literal 0
HcmV?d00001
new file mode 100644
@@ -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";
+ };
+};
+
+
new file mode 100644
GIT binary patch
literal 8089
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
JJ(?uJ{{StXEo}e*
literal 0
HcmV?d00001
new file mode 100644
@@ -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";
+ };
+};
+
+
new file mode 100644
@@ -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.doc
+ //
+ 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));
+}
+
new file mode 100644
@@ -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:
new file mode 100644
@@ -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;
+}
+
new file mode 100644
@@ -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;
+}
+
new file mode 100644
@@ -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_
new file mode 100644
@@ -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
+
new file mode 100644
@@ -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__ */
new file mode 100644
@@ -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;
+}
@@ -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
@@ -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
}
#
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