Ronald Cron | 23b01c8 | 2015-07-06 16:49:40 +0000 | [diff] [blame] | 1 | /** @file
|
| 2 | *
|
| 3 | * Copyright (c) 2011-2015, ARM Limited. All rights reserved.
|
| 4 | *
|
| 5 | * This program and the accompanying materials
|
| 6 | * are licensed and made available under the terms and conditions of the BSD License
|
| 7 | * which accompanies this distribution. The full text of the license may be found at
|
| 8 | * http://opensource.org/licenses/bsd-license.php
|
| 9 | *
|
| 10 | * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
| 11 | * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
| 12 | *
|
| 13 | **/
|
| 14 |
|
| 15 | #ifndef __LINUX_LOADER_H__
|
| 16 | #define __LINUX_LOADER_H__
|
| 17 |
|
| 18 | #include <Library/BdsLib.h>
|
| 19 | #include <Library/DebugLib.h>
|
| 20 | #include <Library/HiiLib.h>
|
| 21 | #include <Library/MemoryAllocationLib.h>
|
| 22 | #include <Library/PerformanceLib.h>
|
| 23 | #include <Library/PrintLib.h>
|
| 24 | #include <Library/ShellLib.h>
|
| 25 | #include <Library/UefiBootServicesTableLib.h>
|
| 26 | #include <Library/UefiLib.h>
|
| 27 |
|
| 28 | #include <Protocol/EfiShellParameters.h>
|
| 29 | #include <Protocol/EfiShell.h>
|
| 30 |
|
| 31 | #include <libfdt.h>
|
| 32 |
|
| 33 | //
|
| 34 | // Definitions
|
| 35 | //
|
| 36 |
|
| 37 | #define MAX_MSG_LEN 80
|
| 38 |
|
| 39 | #define LINUX_UIMAGE_SIGNATURE 0x56190527
|
| 40 | #define LINUX_KERNEL_MAX_OFFSET (SystemMemoryBase + PcdGet32(PcdArmLinuxKernelMaxOffset))
|
| 41 | #define LINUX_ATAG_MAX_OFFSET (SystemMemoryBase + PcdGet32(PcdArmLinuxAtagMaxOffset))
|
| 42 | #define LINUX_FDT_MAX_OFFSET (SystemMemoryBase + PcdGet32(PcdArmLinuxFdtMaxOffset))
|
| 43 |
|
| 44 | #define ARM_FDT_MACHINE_TYPE 0xFFFFFFFF
|
| 45 |
|
| 46 | // Additional size that could be used for FDT entries added by the UEFI OS Loader
|
| 47 | // Estimation based on: EDID (300bytes) + bootargs (200bytes) + initrd region (20bytes)
|
| 48 | // + system memory region (20bytes) + mp_core entries (200 bytes)
|
| 49 | #define FDT_ADDITIONAL_ENTRIES_SIZE 0x300
|
| 50 |
|
| 51 | //
|
| 52 | // Global variables
|
| 53 | //
|
| 54 | extern CONST EFI_GUID mLinuxLoaderHiiGuid;
|
| 55 | extern EFI_HANDLE mLinuxLoaderHiiHandle;
|
| 56 |
|
| 57 | //
|
| 58 | // Local Types
|
| 59 | //
|
| 60 | typedef struct _SYSTEM_MEMORY_RESOURCE {
|
| 61 | LIST_ENTRY Link; // This attribute must be the first entry of this structure (to avoid pointer computation)
|
| 62 | EFI_PHYSICAL_ADDRESS PhysicalStart;
|
| 63 | UINT64 ResourceLength;
|
| 64 | } SYSTEM_MEMORY_RESOURCE;
|
| 65 |
|
| 66 | typedef VOID (*LINUX_KERNEL)(UINT32 Zero, UINT32 Arch, UINTN ParametersBase);
|
| 67 |
|
| 68 | //
|
| 69 | // Functions
|
| 70 | //
|
| 71 | EFI_STATUS
|
| 72 | PrintHii (
|
| 73 | IN CONST CHAR8 *Language OPTIONAL,
|
| 74 | IN CONST EFI_STRING_ID HiiFormatStringId,
|
| 75 | ...
|
| 76 | );
|
| 77 |
|
| 78 | VOID
|
| 79 | PrintHelp (
|
| 80 | IN CONST CHAR8 *Language OPTIONAL
|
| 81 | );
|
| 82 |
|
| 83 | EFI_STATUS
|
| 84 | ProcessShellParameters (
|
| 85 | OUT CHAR16 **KernelPath,
|
| 86 | OUT CHAR16 **FdtPath,
|
| 87 | OUT CHAR16 **InitrdPath,
|
| 88 | OUT CHAR16 **LinuxCommandLine,
|
| 89 | OUT UINTN *AtagMachineType
|
| 90 | );
|
| 91 |
|
| 92 | EFI_STATUS
|
| 93 | ProcessAppCommandLine (
|
| 94 | OUT CHAR16 **KernelTextDevicePath,
|
| 95 | OUT CHAR16 **FdtTextDevicePath,
|
| 96 | OUT CHAR16 **InitrdTextDevicePath,
|
| 97 | OUT CHAR16 **LinuxCommandLine,
|
| 98 | OUT UINTN *AtagMachineType
|
| 99 | );
|
| 100 |
|
| 101 | VOID
|
| 102 | PrintPerformance (
|
| 103 | VOID
|
| 104 | );
|
| 105 |
|
| 106 | EFI_STATUS
|
| 107 | GetSystemMemoryResources (
|
| 108 | IN LIST_ENTRY *ResourceList
|
| 109 | );
|
| 110 |
|
| 111 | EFI_STATUS
|
| 112 | PrepareFdt (
|
| 113 | IN EFI_PHYSICAL_ADDRESS SystemMemoryBase,
|
| 114 | IN CONST CHAR8* CommandLineArguments,
|
| 115 | IN EFI_PHYSICAL_ADDRESS InitrdImage,
|
| 116 | IN UINTN InitrdImageSize,
|
| 117 | IN OUT EFI_PHYSICAL_ADDRESS *FdtBlobBase,
|
| 118 | IN OUT UINTN *FdtBlobSize
|
| 119 | );
|
| 120 |
|
| 121 | /**
|
| 122 | Start a Linux kernel from a Device Path
|
| 123 |
|
| 124 | @param SystemMemoryBase Base of the system memory
|
| 125 | @param LinuxKernel Device Path to the Linux Kernel
|
| 126 | @param Parameters Linux kernel arguments
|
| 127 | @param Fdt Device Path to the Flat Device Tree
|
| 128 | @param MachineType ARM machine type value
|
| 129 |
|
| 130 | @retval EFI_SUCCESS All drivers have been connected
|
| 131 | @retval EFI_NOT_FOUND The Linux kernel Device Path has not been found
|
| 132 | @retval EFI_OUT_OF_RESOURCES There is not enough resource memory to store the matching results.
|
| 133 | @retval RETURN_UNSUPPORTED ATAG is not support by this architecture
|
| 134 |
|
| 135 | **/
|
| 136 | EFI_STATUS
|
| 137 | BootLinuxAtag (
|
| 138 | IN EFI_PHYSICAL_ADDRESS SystemMemoryBase,
|
| 139 | IN EFI_DEVICE_PATH_PROTOCOL* LinuxKernelDevicePath,
|
| 140 | IN EFI_DEVICE_PATH_PROTOCOL* InitrdDevicePath,
|
| 141 | IN CONST CHAR8* CommandLineArguments,
|
| 142 | IN UINTN MachineType
|
| 143 | );
|
| 144 |
|
| 145 | /**
|
| 146 | Start a Linux kernel from a Device Path
|
| 147 |
|
| 148 | @param[in] LinuxKernelDevicePath Device Path to the Linux Kernel
|
| 149 | @param[in] InitrdDevicePath Device Path to the Initrd
|
| 150 | @param[in] Arguments Linux kernel arguments
|
| 151 |
|
| 152 | @retval EFI_SUCCESS All drivers have been connected
|
| 153 | @retval EFI_NOT_FOUND The Linux kernel Device Path has not been found
|
| 154 | @retval EFI_OUT_OF_RESOURCES There is not enough resource memory to store the matching results.
|
| 155 |
|
| 156 | **/
|
| 157 | EFI_STATUS
|
| 158 | BootLinuxFdt (
|
| 159 | IN EFI_PHYSICAL_ADDRESS SystemMemoryBase,
|
| 160 | IN EFI_DEVICE_PATH_PROTOCOL* LinuxKernelDevicePath,
|
| 161 | IN EFI_DEVICE_PATH_PROTOCOL* InitrdDevicePath,
|
| 162 | IN EFI_DEVICE_PATH_PROTOCOL* FdtDevicePath,
|
| 163 | IN CONST CHAR8* Arguments
|
| 164 | );
|
| 165 |
|
| 166 | #endif /* __LINUX_LOADER_H__ */
|