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