/** @file
  Load/boot UEFI Linux.

  Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef __LOAD_LINUX_LIB__
#define __LOAD_LINUX_LIB__


/**
  Verifies that the kernel setup image is valid and supported.
  The kernel setup image should be checked before using other library
  routines which take the kernel setup as an input.

  @param[in]     KernelSetup - The kernel setup image
  @param[in]     KernelSetupSize - The kernel setup size

  @retval    EFI_SUCCESS - The Linux kernel setup is valid and supported
  @retval    EFI_INVALID_PARAMETER - KernelSetup was NULL
  @retval    EFI_UNSUPPORTED - The Linux kernel is not supported

**/
EFI_STATUS
EFIAPI
LoadLinuxCheckKernelSetup (
  IN VOID        *KernelSetup,
  IN UINTN       KernelSetupSize
  );


/**
  Gets the initial runtime size of the Linux kernel image by examining
  the kernel setup image.

  @param[in]     KernelSetup - The kernel setup image
  @param[in]     KernelSize - The kernel size on disk.

  @retval    0                An error occurred
  @retval    !0               The initial size required by the kernel to
                              begin execution.

**/
UINTN
EFIAPI
LoadLinuxGetKernelSize (
  IN VOID        *KernelSetup,
  IN UINTN       KernelSize
  );


/**
  Loads and boots UEFI Linux.

  Note: If successful, then this routine will not return

  @param[in]     Kernel - The main kernel image
  @param[in,out] KernelSetup - The kernel setup image

  @retval    EFI_NOT_FOUND - The Linux kernel was not found
  @retval    EFI_INVALID_PARAMETER - Kernel or KernelSetup was NULL
  @retval    EFI_UNSUPPORTED - The Linux kernel version is not supported

**/
EFI_STATUS
EFIAPI
LoadLinux (
  IN VOID      *Kernel,
  IN OUT VOID  *KernelSetup
  );


/**
  Allocates pages for the kernel setup image.

  @param[in]     Pages - The number of pages

  @retval    NULL - Unable to allocate pages
  @retval    !NULL - The address of the pages allocated

**/
VOID*
EFIAPI
LoadLinuxAllocateKernelSetupPages (
  IN UINTN                  Pages
  );


/**
  Clears the uninitialised space before and after the struct setup_header
  in the kernel setup image. The kernel requires that these be zeroed
  unless explicitly initialised, so this function should be called after
  the setup_header has been copied in from a bzImage, before setting up
  anything else.

  @param[in]     KernelSetup - The kernel setup image

  @retval    EFI_SUCCESS - The Linux kernel setup was successfully initialized
  @retval    EFI_INVALID_PARAMETER - KernelSetup was NULL
  @retval    EFI_UNSUPPORTED - The Linux kernel is not supported

**/
EFI_STATUS
EFIAPI
LoadLinuxInitializeKernelSetup (
  IN VOID        *KernelSetup
  );

/**
  Allocates pages for the kernel.

  @param[in]     KernelSetup - The kernel setup image
  @param[in]     Pages - The number of pages. (It is recommended to use the
                         size returned from LoadLinuxGetKernelSize.)

  @retval    NULL - Unable to allocate pages
  @retval    !NULL - The address of the pages allocated

**/
VOID*
EFIAPI
LoadLinuxAllocateKernelPages (
  IN VOID                   *KernelSetup,
  IN UINTN                  Pages
  );


/**
  Allocates pages for the kernel command line.

  @param[in]     Pages - The number of pages.

  @retval    NULL - Unable to allocate pages
  @retval    !NULL - The address of the pages allocated

**/
VOID*
EFIAPI
LoadLinuxAllocateCommandLinePages (
  IN UINTN                  Pages
  );


/**
  Allocates pages for the initrd image.

  @param[in,out] KernelSetup - The kernel setup image
  @param[in]     Pages - The number of pages.

  @retval    NULL - Unable to allocate pages
  @retval    !NULL - The address of the pages allocated

**/
VOID*
EFIAPI
LoadLinuxAllocateInitrdPages (
  IN VOID                   *KernelSetup,
  IN UINTN                  Pages
  );


/**
  Sets the kernel command line parameter within the setup image.

  @param[in,out] KernelSetup - The kernel setup image
  @param[in]     CommandLine - The kernel command line

  @retval    EFI_SUCCESS - The Linux kernel setup is valid and supported
  @retval    EFI_INVALID_PARAMETER - KernelSetup was NULL
  @retval    EFI_UNSUPPORTED - The Linux kernel is not supported

**/
EFI_STATUS
EFIAPI
LoadLinuxSetCommandLine (
  IN OUT VOID    *KernelSetup,
  IN CHAR8       *CommandLine
  );


/**
  Sets the kernel initial ram disk pointer within the setup image.

  @param[in,out] KernelSetup - The kernel setup image
  @param[in]     Initrd - Pointer to the initial ram disk
  @param[in]     InitrdSize - The initial ram disk image size

  @retval    EFI_SUCCESS - The Linux kernel setup is valid and supported
  @retval    EFI_INVALID_PARAMETER - KernelSetup was NULL
  @retval    EFI_UNSUPPORTED - The Linux kernel is not supported

**/
EFI_STATUS
EFIAPI
LoadLinuxSetInitrd (
  IN OUT VOID    *KernelSetup,
  IN VOID        *Initrd,
  IN UINTN       InitrdSize
  );


#endif