mirror of https://github.com/acidanthera/audk.git
167 lines
5.0 KiB
C
167 lines
5.0 KiB
C
/** @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/ShellParameters.h>
|
|
#include <Protocol/Shell.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__ */
|