Now that all platforms have been ported over, drive a wooden stake through the heart of FdtDxe and remove it from the tree.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel ard.biesheuvel@linaro.org --- Platforms/AMD/Styx/Drivers/FdtDxe/BdsLinuxFdt.c | 760 -------------------- Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.c | 274 ------- Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.h | 54 -- Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.inf | 76 -- Platforms/AMD/Styx/Drivers/FdtDxe/LinuxLoader.h | 173 ----- Platforms/AMD/Styx/Drivers/FdtDxe/LinuxLoaderHelper.c | 200 ------ 6 files changed, 1537 deletions(-)
diff --git a/Platforms/AMD/Styx/Drivers/FdtDxe/BdsLinuxFdt.c b/Platforms/AMD/Styx/Drivers/FdtDxe/BdsLinuxFdt.c deleted file mode 100644 index aa595045ca3c..000000000000 --- a/Platforms/AMD/Styx/Drivers/FdtDxe/BdsLinuxFdt.c +++ /dev/null @@ -1,760 +0,0 @@ -/** @file -* -* Copyright (c) 2011-2014, ARM Limited. All rights reserved.<BR> -* Copyright (c) 2014 - 2016, 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 <Library/BdsLib/BdsInternal.h> - -#include <Guid/ArmMpCoreInfo.h> -#include <Protocol/AmdMpCoreInfo.h> - -#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 && FixedPcdGet8(PcdSata1PortCount) > 0); - 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_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; - AMD_MP_CORE_INFO_PROTOCOL *AmdMpCoreInfoProtocol; - - // - // 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 - // - Status = gBS->LocateProtocol ( - &gAmdMpCoreInfoProtocolGuid, - NULL, - (VOID **)&AmdMpCoreInfoProtocol - ); - ASSERT_EFI_ERROR (Status); - - // Get pointer to ARM core info table - ArmCoreInfoTable = AmdMpCoreInfoProtocol->GetArmCoreInfoTable (&ArmCoreCount); - ASSERT (ArmCoreInfoTable != NULL); - ASSERT (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 = AmdMpCoreInfoProtocol->GetPmuSpiFromMpId (MpId, &PmuInt.IntId); - if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, "FDT: Error getting PMU interrupt for MpId '0x%x'\n", MpId)); - goto FAIL_COMPLETE_FDT; - } - - PmuInt.Flag = cpu_to_fdt32(PMU_INT_FLAG_SPI); - PmuInt.IntId = cpu_to_fdt32(PmuInt.IntId); - PmuInt.Type = cpu_to_fdt32(PMU_INT_TYPE_HIGH_LEVEL); - fdt_appendprop(fdt, pmu_node, "interrupts", &PmuInt, sizeof(PmuInt)); - } - fdt_setprop_string(fdt, pmu_node, "compatible", "arm,armv8-pmuv3"); - } else { - DEBUG((EFI_D_ERROR,"FDT: Error creating 'pmu' node\n")); - Status = EFI_INVALID_PARAMETER; - goto FAIL_COMPLETE_FDT; - } - - // Remove existing 'psci' node if feature not supported - node = fdt_subnode_offset (fdt, 0, "psci"); - if (node >= 0) { - if (!FixedPcdGetBool (PcdPsciOsSupport)) { - fdt_del_node (fdt, node); - } - } else if (FixedPcdGetBool (PcdPsciOsSupport) && - FixedPcdGetBool (PcdTrustedFWSupport)) { - // Add 'psci' node if not present - node = fdt_add_subnode(fdt, 0, "psci"); - if (node >= 0) { - fdt_setprop_string(fdt, node, "compatible", "arm,psci-0.2"); - fdt_appendprop_string(fdt, node, "compatible", "arm,psci"); - fdt_setprop_string(fdt, node, "method", "smc"); - } else { - DEBUG((EFI_D_ERROR,"FDT: Error creating 'psci' node\n")); - Status = EFI_INVALID_PARAMETER; - goto FAIL_COMPLETE_FDT; - } - } - - // Remove existing 'cpus' node and create a new one - node = fdt_subnode_offset (fdt, 0, "cpus"); - if (node >= 0) { - fdt_del_node (fdt, node); - } - node = fdt_add_subnode(fdt, 0, "cpus"); - if (node >= 0) { - // Configure the 'cpus' node - fdt_setprop_string(fdt, node, "name", "cpus"); - fdt_setprop_cell (fdt, node, "#address-cells", sizeof (UINTN) / 4); - fdt_setprop_cell(fdt, node, "#size-cells", 0); - } else { - DEBUG((EFI_D_ERROR,"FDT: Error creating 'cpus' node\n")); - Status = EFI_INVALID_PARAMETER; - goto FAIL_COMPLETE_FDT; - } - - // - // Walk the processor table in reverse order for proper listing in FDT - // - Index = ArmCoreCount; - while (Index--) { - // Create 'cpu' node - AsciiSPrint (Name, sizeof(Name), "CPU%d", Index); - cpu_node = fdt_add_subnode (fdt, node, Name); - if (cpu_node < 0) { - DEBUG ((EFI_D_ERROR, "FDT: Error on creating '%a' node\n", Name)); - Status = EFI_INVALID_PARAMETER; - goto FAIL_COMPLETE_FDT; - } - phandle[Index] = fdt_alloc_phandle(fdt); - fdt_setprop_cell (fdt, cpu_node, "phandle", phandle[Index]); - fdt_setprop_cell (fdt, cpu_node, "linux,phandle", phandle[Index]); - - if (FixedPcdGetBool (PcdPsciOsSupport) && - FixedPcdGetBool (PcdTrustedFWSupport)) { - fdt_setprop_string(fdt, cpu_node, "enable-method", "psci"); - } else { - fdt_setprop_string(fdt, cpu_node, "enable-method", "spin-table"); - MbAddr = ArmCoreInfoTable[Index].MailboxSetAddress; - MbAddr = cpu_to_fdtn (MbAddr); - fdt_setprop (fdt, cpu_node, "cpu-release-addr", &MbAddr, sizeof (MbAddr)); - } - MpId = (UINTN) GET_MPID (ArmCoreInfoTable[Index].ClusterId, - ArmCoreInfoTable[Index].CoreId); - MpId = cpu_to_fdtn (MpId); - fdt_setprop (fdt, cpu_node, "reg", &MpId, sizeof (MpId)); - fdt_setprop_string(fdt, cpu_node, "compatible", "arm,armv8"); - fdt_setprop_string (fdt, cpu_node, "device_type", "cpu"); - - // If it is not the primary core than the cpu should be disabled - if (((ArmCoreInfoTable[Index].ClusterId != PrimaryClusterId) || - (ArmCoreInfoTable[Index].CoreId != PrimaryCoreId))) { - fdt_setprop_string(fdt, cpu_node, "status", "disabled"); - } - } - - // Remove existing 'cpu-map' node and create a new one - map_node = fdt_subnode_offset (fdt, node, "cpu-map"); - if (map_node >= 0) { - fdt_del_node (fdt, map_node); - } - map_node = fdt_add_subnode(fdt, node, "cpu-map"); - if (map_node >= 0) { - ClusterIndex = ArmCoreCount - 1; - ClusterCount = NumberOfClustersInTable (ArmCoreInfoTable, - ArmCoreCount); - while (ClusterCount--) { - // Create 'cluster' node - AsciiSPrint (Name, sizeof(Name), "cluster%d", ClusterCount); - cluster_node = fdt_add_subnode (fdt, map_node, Name); - if (cluster_node < 0) { - DEBUG ((EFI_D_ERROR, "FDT: Error creating '%a' node\n", Name)); - Status = EFI_INVALID_PARAMETER; - goto FAIL_COMPLETE_FDT; - } - - ClusterId = ArmCoreInfoTable[ClusterIndex].ClusterId; - CoreIndex = ClusterIndex; - CoresInCluster = NumberOfCoresInCluster (ArmCoreInfoTable, - ArmCoreCount, - ClusterId); - while (CoresInCluster--) { - // Create 'core' node - AsciiSPrint (Name, sizeof(Name), "core%d", CoresInCluster); - cpu_node = fdt_add_subnode (fdt, cluster_node, Name); - if (cpu_node < 0) { - DEBUG ((EFI_D_ERROR, "FDT: Error creating '%a' node\n", Name)); - Status = EFI_INVALID_PARAMETER; - goto FAIL_COMPLETE_FDT; - } - fdt_setprop_cell (fdt, cpu_node, "cpu", phandle[CoreIndex]); - - // iterate to next core in cluster - if (CoresInCluster) { - do { - --CoreIndex; - } while (ClusterId != ArmCoreInfoTable[CoreIndex].ClusterId); - } - } - - // iterate to next cluster - if (ClusterCount) { - do { - --ClusterIndex; - } while (ClusterInRange (ArmCoreInfoTable, - ArmCoreInfoTable[ClusterIndex].ClusterId, - ClusterIndex + 1, - ArmCoreCount - 1)); - } - } - } else { - DEBUG((EFI_D_ERROR,"FDT: Error creating 'cpu-map' node\n")); - Status = EFI_INVALID_PARAMETER; - goto FAIL_COMPLETE_FDT; - } - - SetSocIdStatus (fdt); - SetXgbeStatus (fdt); - - DEBUG_CODE_BEGIN(); - // DebugDumpFdt (fdt); - DEBUG_CODE_END(); - - // If we succeeded to generate the new Device Tree then free the old Device Tree - gBS->FreePages (*FdtBlobBase, EFI_SIZE_TO_PAGES (*FdtBlobSize)); - - // Update the real size of the Device Tree - fdt_pack ((VOID*)(UINTN)(NewFdtBlobBase)); - - *FdtBlobBase = NewFdtBlobBase; - *FdtBlobSize = (UINTN)fdt_totalsize ((VOID*)(UINTN)(NewFdtBlobBase)); - return EFI_SUCCESS; - -FAIL_COMPLETE_FDT: - gBS->FreePages (NewFdtBlobAllocation, EFI_SIZE_TO_PAGES (NewFdtBlobSize)); - -FAIL_RELOCATE_FDT: - *FdtBlobSize = (UINTN)fdt_totalsize ((VOID*)(UINTN)(*FdtBlobBase)); - // Return success even if we failed to update the FDT blob. - // The original one is still valid. - return EFI_SUCCESS; -} - diff --git a/Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.c b/Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.c deleted file mode 100644 index 09d650d2b831..000000000000 --- a/Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.c +++ /dev/null @@ -1,274 +0,0 @@ -/** @file - - Copyright (c) 2014 - 2016, 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; - - // Search for FDT blob in EFI partition - Status = FdtOverrideDevicePath(L"fdt.dtb", &FdtDevicePath); - if (!EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, "%a: Loading Override FDT blob...\n", __FUNCTION__)); - - FdtBlobBase = (UINT8 *)(UINTN)LINUX_FDT_MAX_OFFSET; - Status = BdsLoadImage (FdtDevicePath, - AllocateMaxAddress, - (EFI_PHYSICAL_ADDRESS *)&FdtBlobBase, - &FdtBlobSize); - if (!EFI_ERROR (Status) && FdtBlobBase && FdtBlobSize) - goto LOAD_FDT_BLOB; - else - goto LOAD_FDT_ERROR; - } - - DEBUG ((EFI_D_ERROR, "%a: Loading Embedded FDT blob...\n", __FUNCTION__)); - HandleBuffer = NULL; - Status = gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiFirmwareVolume2ProtocolGuid, - NULL, - &HandleCount, - &HandleBuffer - ); - ASSERT_EFI_ERROR (Status); - - for (Index = 0; Index < HandleCount; Index++) { - Status = gBS->HandleProtocol ( - HandleBuffer[Index], - &gEfiFirmwareVolume2ProtocolGuid, - (VOID **) &FvProtocol - ); - if (!EFI_ERROR (Status)) { - Status = FvProtocol->ReadSection ( - FvProtocol, - FdtGuid, - EFI_SECTION_RAW, - 0, - (VOID **)&FdtBlobBase, - &FdtBlobSize, - &AuthenticationStatus - ); - if (!EFI_ERROR (Status) && FdtBlobBase && FdtBlobSize) - goto LOAD_FDT_BLOB; - } - } - -LOAD_FDT_ERROR: - DEBUG ((EFI_D_ERROR, "%a: Error loading FDT blob!\n", __FUNCTION__)); - goto LOAD_FDT_DONE; - -LOAD_FDT_BLOB: - Status = AmdStyxPrepareFdt(NULL, 0, 0, (EFI_PHYSICAL_ADDRESS *)&FdtBlobBase, &FdtBlobSize); - ASSERT_EFI_ERROR (Status); - - // Install the FDT blob into EFI system configuration table - Status = gBS->InstallConfigurationTable (&gFdtTableGuid, (VOID *)FdtBlobBase); - ASSERT_EFI_ERROR (Status); - DEBUG ((EFI_D_ERROR, "%a: FDT ready!\n", __FUNCTION__)); - -LOAD_FDT_DONE: - gBS->CloseEvent (mFdtReadyToBootEvent); - return; -} - -/** -*--------------------------------------------------------------------------------------- -* -* FdtOverrideDevicePath -* -* Description: -* Looks for a user-provided FDT blob to override the default file built with the UEFI image. -* -* Parameters: -* @param[in] FdtFileName Name of the FDT blob located in the EFI partition. -* @param[out] FdtDevicePath EFI Device Path of the FDT blob. -* -* @return EFI_SUCCESS The function completed successfully. -* @return EFI_NOT_FOUND The protocol could not be located. -* @return EFI_OUT_OF_RESOURCES There are not enough resources to find the protocol. -* -*--------------------------------------------------------------------------------------- -**/ -EFI_STATUS -EFIAPI -FdtOverrideDevicePath( - IN CHAR16 *FdtFileName, - OUT EFI_DEVICE_PATH **FdtDevicePath - ) -{ - EFI_DEVICE_PATH_PROTOCOL *DevPathProtocol; - EFI_HANDLE *HandleBuffer; - UINTN HandleCount; - UINTN Index; - EFI_STATUS Status; - CHAR16 *DevPathText; - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *VolProtocol; - EFI_FILE_PROTOCOL *FileProtocol; - EFI_FILE_PROTOCOL *FileHandle; - CHAR16 FilePathText[120]; - - HandleBuffer = NULL; - Status = gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiSimpleFileSystemProtocolGuid, - NULL, - &HandleCount, - &HandleBuffer); - if (EFI_ERROR (Status)) - return Status; - - for (Index = 0; Index < HandleCount; Index++) { - DevPathProtocol = NULL; - Status = gBS->HandleProtocol ( - HandleBuffer[Index], - &gEfiDevicePathProtocolGuid, - (VOID **) &DevPathProtocol); - - if (!EFI_ERROR (Status)) { - VolProtocol = NULL; - Status = gBS->HandleProtocol ( - HandleBuffer[Index], - &gEfiSimpleFileSystemProtocolGuid, - (VOID **) &VolProtocol); - - if (!EFI_ERROR (Status)) { - FileProtocol = NULL; - Status = VolProtocol->OpenVolume(VolProtocol, &FileProtocol); - - if (!EFI_ERROR (Status)) { - FileHandle = NULL; - Status = FileProtocol->Open(FileProtocol, - &FileHandle, - FdtFileName, - EFI_FILE_MODE_READ, - 0); - - if (!EFI_ERROR (Status)) { - FileProtocol->Close(FileHandle); - DevPathText = ConvertDevicePathToText(DevPathProtocol, TRUE, FALSE); - StrCpy(FilePathText, DevPathText); - StrCat(FilePathText, L"/"); - StrCat(FilePathText, FdtFileName); - *FdtDevicePath = ConvertTextToDevicePath (FilePathText); - return EFI_SUCCESS; - } - } - } - } - } - - return Status; -} - diff --git a/Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.h b/Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.h deleted file mode 100644 index c61b7ec7e326..000000000000 --- a/Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.h +++ /dev/null @@ -1,54 +0,0 @@ -/** @file - - Copyright (c) 2014 - 2016, 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 (PcdSystemMemoryBase) + PcdGet32(PcdArmLinuxFdtMaxOffset)) - -VOID -EFIAPI -AmdStyxParkSecondaryCores( - VOID - ); - -EFI_STATUS -AmdStyxPrepareFdt ( - IN CONST CHAR8* CommandLineArguments, - IN EFI_PHYSICAL_ADDRESS InitrdImage, - IN UINTN InitrdImageSize, - IN OUT EFI_PHYSICAL_ADDRESS *FdtBlobBase, - IN OUT UINTN *FdtBlobSize - ); - - -#endif // __FDT_DXE__H_ diff --git a/Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.inf b/Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.inf deleted file mode 100644 index 5479c7b0abfb..000000000000 --- a/Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.inf +++ /dev/null @@ -1,76 +0,0 @@ -#/* @file -# -# Copyright (c) 2014 - 2016, 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 - -[Packages] - ArmPkg/ArmPkg.dec - EmbeddedPkg/EmbeddedPkg.dec - MdePkg/MdePkg.dec - MdeModulePkg/MdeModulePkg.dec - AmdModulePkg/AmdModulePkg.dec - OpenPlatformPkg/Platforms/AMD/Styx/AmdStyx.dec - ShellPkg/ShellPkg.dec - -[LibraryClasses] - UefiDriverEntryPoint - DxeServicesTableLib - BdsLib - FdtLib - PcdLib - DevicePathLib - -[Guids] - gEfiEventReadyToBootGuid ## CONSUMED - gEfiDxeServicesTableGuid ## CONSUMED - gFdtTableGuid ## CONSUMED - -[Protocols] - gEfiFirmwareVolume2ProtocolGuid ## CONSUMED - gAmdMpCoreInfoProtocolGuid ## CONSUMED - -[Pcd] - gAmdStyxTokenSpaceGuid.PcdStyxFdt - gAmdStyxTokenSpaceGuid.PcdSocCpuId - gAmdStyxTokenSpaceGuid.PcdEthMacA - gAmdStyxTokenSpaceGuid.PcdEthMacB - gArmTokenSpaceGuid.PcdSystemMemoryBase - -[FixedPcd] - gArmTokenSpaceGuid.PcdArmLinuxFdtMaxOffset - gArmTokenSpaceGuid.PcdArmLinuxFdtAlignment - gAmdStyxTokenSpaceGuid.PcdPsciOsSupport - gAmdStyxTokenSpaceGuid.PcdTrustedFWSupport - gAmdStyxTokenSpaceGuid.PcdSata1PortCount - -[Depex] - TRUE diff --git a/Platforms/AMD/Styx/Drivers/FdtDxe/LinuxLoader.h b/Platforms/AMD/Styx/Drivers/FdtDxe/LinuxLoader.h deleted file mode 100644 index ff6c72cc76f2..000000000000 --- a/Platforms/AMD/Styx/Drivers/FdtDxe/LinuxLoader.h +++ /dev/null @@ -1,173 +0,0 @@ -/** @file -* -* Copyright (c) 2011-2015, ARM Limited. All rights reserved. -* Copyright (c) 2015 - 2016, 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/LinuxLoader.h - -**/ - -#ifndef __LINUX_LOADER_H__ -#define __LINUX_LOADER_H__ - -#include <Library/BdsLib.h> -#include <Library/DebugLib.h> -#include <Library/HiiLib.h> -#include <Library/MemoryAllocationLib.h> -#include <Library/PerformanceLib.h> -#include <Library/PrintLib.h> -#include <Library/ShellLib.h> -#include <Library/UefiBootServicesTableLib.h> -#include <Library/UefiLib.h> - -#include <Protocol/EfiShellParameters.h> -#include <Protocol/EfiShell.h> - -#include <libfdt.h> - -// -// Definitions -// - -#define MAX_MSG_LEN 80 - -#define LINUX_UIMAGE_SIGNATURE 0x56190527 -#define LINUX_KERNEL_MAX_OFFSET (SystemMemoryBase + PcdGet32(PcdArmLinuxKernelMaxOffset)) -#define LINUX_ATAG_MAX_OFFSET (SystemMemoryBase + PcdGet32(PcdArmLinuxAtagMaxOffset)) -#define LINUX_FDT_MAX_OFFSET (SystemMemoryBase + PcdGet32(PcdArmLinuxFdtMaxOffset)) - -#define ARM_FDT_MACHINE_TYPE 0xFFFFFFFF - -// Additional size that could be used for FDT entries added by the UEFI OS Loader -// Estimation based on: EDID (300bytes) + bootargs (200bytes) + initrd region (20bytes) -// + system memory region (20bytes) + mp_core entries (200 bytes) -#define FDT_ADDITIONAL_ENTRIES_SIZE 0x300 - -// -// Global variables -// -extern CONST EFI_GUID mLinuxLoaderHiiGuid; -extern EFI_HANDLE mLinuxLoaderHiiHandle; - -// -// Local Types -// -typedef struct _SYSTEM_MEMORY_RESOURCE { - LIST_ENTRY Link; // This attribute must be the first entry of this structure (to avoid pointer computation) - EFI_PHYSICAL_ADDRESS PhysicalStart; - UINT64 ResourceLength; -} SYSTEM_MEMORY_RESOURCE; - -typedef VOID (*LINUX_KERNEL)(UINT32 Zero, UINT32 Arch, UINTN ParametersBase); - -// -// Functions -// -EFI_STATUS -PrintHii ( - IN CONST CHAR8 *Language OPTIONAL, - IN CONST EFI_STRING_ID HiiFormatStringId, - ... - ); - -VOID -PrintHelp ( - IN CONST CHAR8 *Language OPTIONAL - ); - -EFI_STATUS -ProcessShellParameters ( - OUT CHAR16 **KernelPath, - OUT CHAR16 **FdtPath, - OUT CHAR16 **InitrdPath, - OUT CHAR16 **LinuxCommandLine, - OUT UINTN *AtagMachineType - ); - -EFI_STATUS -ProcessAppCommandLine ( - OUT CHAR16 **KernelTextDevicePath, - OUT CHAR16 **FdtTextDevicePath, - OUT CHAR16 **InitrdTextDevicePath, - OUT CHAR16 **LinuxCommandLine, - OUT UINTN *AtagMachineType - ); - -VOID -PrintPerformance ( - VOID - ); - -EFI_STATUS -GetSystemMemoryResources ( - IN LIST_ENTRY *ResourceList - ); - -EFI_STATUS -PrepareFdt ( - IN EFI_PHYSICAL_ADDRESS SystemMemoryBase, - IN CONST CHAR8* CommandLineArguments, - IN EFI_PHYSICAL_ADDRESS InitrdImage, - IN UINTN InitrdImageSize, - IN OUT EFI_PHYSICAL_ADDRESS *FdtBlobBase, - IN OUT UINTN *FdtBlobSize - ); - -/** - Start a Linux kernel from a Device Path - - @param SystemMemoryBase Base of the system memory - @param LinuxKernel Device Path to the Linux Kernel - @param Parameters Linux kernel arguments - @param Fdt Device Path to the Flat Device Tree - @param MachineType ARM machine type value - - @retval EFI_SUCCESS All drivers have been connected - @retval EFI_NOT_FOUND The Linux kernel Device Path has not been found - @retval EFI_OUT_OF_RESOURCES There is not enough resource memory to store the matching results. - @retval RETURN_UNSUPPORTED ATAG is not support by this architecture - -**/ -EFI_STATUS -BootLinuxAtag ( - IN EFI_PHYSICAL_ADDRESS SystemMemoryBase, - IN EFI_DEVICE_PATH_PROTOCOL* LinuxKernelDevicePath, - IN EFI_DEVICE_PATH_PROTOCOL* InitrdDevicePath, - IN CONST CHAR8* CommandLineArguments, - IN UINTN MachineType - ); - -/** - Start a Linux kernel from a Device Path - - @param[in] LinuxKernelDevicePath Device Path to the Linux Kernel - @param[in] InitrdDevicePath Device Path to the Initrd - @param[in] Arguments Linux kernel arguments - - @retval EFI_SUCCESS All drivers have been connected - @retval EFI_NOT_FOUND The Linux kernel Device Path has not been found - @retval EFI_OUT_OF_RESOURCES There is not enough resource memory to store the matching results. - -**/ -EFI_STATUS -BootLinuxFdt ( - IN EFI_PHYSICAL_ADDRESS SystemMemoryBase, - IN EFI_DEVICE_PATH_PROTOCOL* LinuxKernelDevicePath, - IN EFI_DEVICE_PATH_PROTOCOL* InitrdDevicePath, - IN EFI_DEVICE_PATH_PROTOCOL* FdtDevicePath, - IN CONST CHAR8* Arguments - ); - -#endif /* __LINUX_LOADER_H__ */ diff --git a/Platforms/AMD/Styx/Drivers/FdtDxe/LinuxLoaderHelper.c b/Platforms/AMD/Styx/Drivers/FdtDxe/LinuxLoaderHelper.c deleted file mode 100644 index 80dce8d545b8..000000000000 --- a/Platforms/AMD/Styx/Drivers/FdtDxe/LinuxLoaderHelper.c +++ /dev/null @@ -1,200 +0,0 @@ -/** @file -* -* Copyright (c) 2011-2015, ARM Limited. All rights reserved. -* Copyright (c) 2014 - 2016, AMD Inc. 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. -* -**/ -/** - - Derived from: - ArmPkg/Application/LinuxLoader/LinuxLoaderHelper.c - -**/ - - -#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; -}