123b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron/** @file 223b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron* 323b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron* Copyright (c) 2011-2015, ARM Limited. All rights reserved. 423b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron* 523b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron* This program and the accompanying materials 623b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron* are licensed and made available under the terms and conditions of the BSD License 723b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron* which accompanies this distribution. The full text of the license may be found at 823b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron* http://opensource.org/licenses/bsd-license.php 923b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron* 1023b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 1123b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 1223b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron* 1323b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron**/ 1423b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron 1523b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron#ifndef __LINUX_LOADER_H__ 1623b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron#define __LINUX_LOADER_H__ 1723b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron 1823b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron#include <Library/BdsLib.h> 1923b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron#include <Library/DebugLib.h> 2023b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron#include <Library/HiiLib.h> 2123b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron#include <Library/MemoryAllocationLib.h> 2223b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron#include <Library/PerformanceLib.h> 2323b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron#include <Library/PrintLib.h> 2423b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron#include <Library/ShellLib.h> 2523b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron#include <Library/UefiBootServicesTableLib.h> 2623b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron#include <Library/UefiLib.h> 2723b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron 2823b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron#include <Protocol/EfiShellParameters.h> 2923b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron#include <Protocol/EfiShell.h> 3023b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron 3123b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron#include <libfdt.h> 3223b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron 3323b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron// 3423b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron// Definitions 3523b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron// 3623b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron 3723b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron#define MAX_MSG_LEN 80 3823b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron 3923b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron#define LINUX_UIMAGE_SIGNATURE 0x56190527 4023b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron#define LINUX_KERNEL_MAX_OFFSET (SystemMemoryBase + PcdGet32(PcdArmLinuxKernelMaxOffset)) 4123b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron#define LINUX_ATAG_MAX_OFFSET (SystemMemoryBase + PcdGet32(PcdArmLinuxAtagMaxOffset)) 4223b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron#define LINUX_FDT_MAX_OFFSET (SystemMemoryBase + PcdGet32(PcdArmLinuxFdtMaxOffset)) 4323b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron 4423b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron#define ARM_FDT_MACHINE_TYPE 0xFFFFFFFF 4523b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron 4623b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron// Additional size that could be used for FDT entries added by the UEFI OS Loader 4723b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron// Estimation based on: EDID (300bytes) + bootargs (200bytes) + initrd region (20bytes) 4823b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron// + system memory region (20bytes) + mp_core entries (200 bytes) 4923b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron#define FDT_ADDITIONAL_ENTRIES_SIZE 0x300 5023b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron 5123b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron// 5223b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron// Global variables 5323b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron// 5423b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cronextern CONST EFI_GUID mLinuxLoaderHiiGuid; 5523b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cronextern EFI_HANDLE mLinuxLoaderHiiHandle; 5623b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron 5723b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron// 5823b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron// Local Types 5923b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron// 6023b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Crontypedef struct _SYSTEM_MEMORY_RESOURCE { 6123b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron LIST_ENTRY Link; // This attribute must be the first entry of this structure (to avoid pointer computation) 6223b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron EFI_PHYSICAL_ADDRESS PhysicalStart; 6323b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron UINT64 ResourceLength; 6423b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron} SYSTEM_MEMORY_RESOURCE; 6523b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron 6623b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Crontypedef VOID (*LINUX_KERNEL)(UINT32 Zero, UINT32 Arch, UINTN ParametersBase); 6723b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron 6823b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron// 6923b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron// Functions 7023b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron// 7123b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald CronEFI_STATUS 7223b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald CronPrintHii ( 7323b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron IN CONST CHAR8 *Language OPTIONAL, 7423b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron IN CONST EFI_STRING_ID HiiFormatStringId, 7523b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron ... 7623b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron ); 7723b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron 7823b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald CronVOID 7923b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald CronPrintHelp ( 8023b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron IN CONST CHAR8 *Language OPTIONAL 8123b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron ); 8223b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron 8323b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald CronEFI_STATUS 8423b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald CronProcessShellParameters ( 8523b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron OUT CHAR16 **KernelPath, 8623b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron OUT CHAR16 **FdtPath, 8723b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron OUT CHAR16 **InitrdPath, 8823b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron OUT CHAR16 **LinuxCommandLine, 8923b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron OUT UINTN *AtagMachineType 9023b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron ); 9123b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron 9223b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald CronEFI_STATUS 9323b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald CronProcessAppCommandLine ( 9423b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron OUT CHAR16 **KernelTextDevicePath, 9523b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron OUT CHAR16 **FdtTextDevicePath, 9623b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron OUT CHAR16 **InitrdTextDevicePath, 9723b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron OUT CHAR16 **LinuxCommandLine, 9823b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron OUT UINTN *AtagMachineType 9923b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron ); 10023b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron 10123b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald CronVOID 10223b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald CronPrintPerformance ( 10323b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron VOID 10423b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron ); 10523b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron 10623b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald CronEFI_STATUS 10723b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald CronGetSystemMemoryResources ( 10823b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron IN LIST_ENTRY *ResourceList 10923b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron ); 11023b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron 11123b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald CronEFI_STATUS 11223b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald CronPrepareFdt ( 11323b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron IN EFI_PHYSICAL_ADDRESS SystemMemoryBase, 11423b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron IN CONST CHAR8* CommandLineArguments, 11523b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron IN EFI_PHYSICAL_ADDRESS InitrdImage, 11623b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron IN UINTN InitrdImageSize, 11723b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron IN OUT EFI_PHYSICAL_ADDRESS *FdtBlobBase, 11823b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron IN OUT UINTN *FdtBlobSize 11923b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron ); 12023b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron 12123b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron/** 12223b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron Start a Linux kernel from a Device Path 12323b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron 12423b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron @param SystemMemoryBase Base of the system memory 12523b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron @param LinuxKernel Device Path to the Linux Kernel 12623b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron @param Parameters Linux kernel arguments 12723b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron @param Fdt Device Path to the Flat Device Tree 12823b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron @param MachineType ARM machine type value 12923b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron 13023b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron @retval EFI_SUCCESS All drivers have been connected 13123b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron @retval EFI_NOT_FOUND The Linux kernel Device Path has not been found 13223b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron @retval EFI_OUT_OF_RESOURCES There is not enough resource memory to store the matching results. 13323b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron @retval RETURN_UNSUPPORTED ATAG is not support by this architecture 13423b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron 13523b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron**/ 13623b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald CronEFI_STATUS 13723b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald CronBootLinuxAtag ( 13823b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron IN EFI_PHYSICAL_ADDRESS SystemMemoryBase, 13923b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron IN EFI_DEVICE_PATH_PROTOCOL* LinuxKernelDevicePath, 14023b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron IN EFI_DEVICE_PATH_PROTOCOL* InitrdDevicePath, 14123b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron IN CONST CHAR8* CommandLineArguments, 14223b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron IN UINTN MachineType 14323b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron ); 14423b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron 14523b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron/** 14623b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron Start a Linux kernel from a Device Path 14723b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron 14823b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron @param[in] LinuxKernelDevicePath Device Path to the Linux Kernel 14923b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron @param[in] InitrdDevicePath Device Path to the Initrd 15023b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron @param[in] Arguments Linux kernel arguments 15123b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron 15223b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron @retval EFI_SUCCESS All drivers have been connected 15323b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron @retval EFI_NOT_FOUND The Linux kernel Device Path has not been found 15423b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron @retval EFI_OUT_OF_RESOURCES There is not enough resource memory to store the matching results. 15523b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron 15623b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron**/ 15723b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald CronEFI_STATUS 15823b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald CronBootLinuxFdt ( 15923b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron IN EFI_PHYSICAL_ADDRESS SystemMemoryBase, 16023b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron IN EFI_DEVICE_PATH_PROTOCOL* LinuxKernelDevicePath, 16123b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron IN EFI_DEVICE_PATH_PROTOCOL* InitrdDevicePath, 16223b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron IN EFI_DEVICE_PATH_PROTOCOL* FdtDevicePath, 16323b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron IN CONST CHAR8* Arguments 16423b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron ); 16523b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron 16623b01c83b28a7cb8f7eea7af679aecd39f782f1eRonald Cron#endif /* __LINUX_LOADER_H__ */ 167