/** @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__ */