/** @file | |
* | |
* Copyright (c) 2011-2013, 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 __BDSLINUXLOADER_H | |
#define __BDSLINUXLOADER_H | |
#define LINUX_UIMAGE_SIGNATURE 0x56190527 | |
#define LINUX_KERNEL_MAX_OFFSET (PcdGet64 (PcdSystemMemoryBase) + PcdGet32(PcdArmLinuxKernelMaxOffset)) | |
#define LINUX_ATAG_MAX_OFFSET (PcdGet64 (PcdSystemMemoryBase) + PcdGet32(PcdArmLinuxAtagMaxOffset)) | |
#define LINUX_FDT_MAX_OFFSET (PcdGet64 (PcdSystemMemoryBase) + PcdGet32(PcdArmLinuxFdtMaxOffset)) | |
// 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 | |
#define ARM_FDT_MACHINE_TYPE 0xFFFFFFFF | |
typedef VOID (*LINUX_KERNEL)(UINT32 Zero, UINT32 Arch, UINTN ParametersBase); | |
// | |
// ATAG Definitions | |
// | |
#define ATAG_MAX_SIZE 0x3000 | |
/* ATAG : list of possible tags */ | |
#define ATAG_NONE 0x00000000 | |
#define ATAG_CORE 0x54410001 | |
#define ATAG_MEM 0x54410002 | |
#define ATAG_VIDEOTEXT 0x54410003 | |
#define ATAG_RAMDISK 0x54410004 | |
#define ATAG_INITRD2 0x54420005 | |
#define ATAG_SERIAL 0x54410006 | |
#define ATAG_REVISION 0x54410007 | |
#define ATAG_VIDEOLFB 0x54410008 | |
#define ATAG_CMDLINE 0x54410009 | |
#define ATAG_ARM_MP_CORE 0x5441000A | |
#define next_tag_address(t) ((LINUX_ATAG*)((UINT32)(t) + (((t)->header.size) << 2) )) | |
#define tag_size(type) ((UINT32)((sizeof(LINUX_ATAG_HEADER) + sizeof(type)) >> 2)) | |
typedef struct { | |
UINT32 size; /* length of tag in words including this header */ | |
UINT32 type; /* tag type */ | |
} LINUX_ATAG_HEADER; | |
typedef struct { | |
UINT32 flags; | |
UINT32 pagesize; | |
UINT32 rootdev; | |
} LINUX_ATAG_CORE; | |
typedef struct { | |
UINT32 size; | |
UINTN start; | |
} LINUX_ATAG_MEM; | |
typedef struct { | |
UINT8 x; | |
UINT8 y; | |
UINT16 video_page; | |
UINT8 video_mode; | |
UINT8 video_cols; | |
UINT16 video_ega_bx; | |
UINT8 video_lines; | |
UINT8 video_isvga; | |
UINT16 video_points; | |
} LINUX_ATAG_VIDEOTEXT; | |
typedef struct { | |
UINT32 flags; | |
UINT32 size; | |
UINTN start; | |
} LINUX_ATAG_RAMDISK; | |
typedef struct { | |
UINT32 start; | |
UINT32 size; | |
} LINUX_ATAG_INITRD2; | |
typedef struct { | |
UINT32 low; | |
UINT32 high; | |
} LINUX_ATAG_SERIALNR; | |
typedef struct { | |
UINT32 rev; | |
} LINUX_ATAG_REVISION; | |
typedef struct { | |
UINT16 lfb_width; | |
UINT16 lfb_height; | |
UINT16 lfb_depth; | |
UINT16 lfb_linelength; | |
UINT32 lfb_base; | |
UINT32 lfb_size; | |
UINT8 red_size; | |
UINT8 red_pos; | |
UINT8 green_size; | |
UINT8 green_pos; | |
UINT8 blue_size; | |
UINT8 blue_pos; | |
UINT8 rsvd_size; | |
UINT8 rsvd_pos; | |
} LINUX_ATAG_VIDEOLFB; | |
typedef struct { | |
CHAR8 cmdline[1]; | |
} LINUX_ATAG_CMDLINE; | |
typedef struct { | |
LINUX_ATAG_HEADER header; | |
union { | |
LINUX_ATAG_CORE core_tag; | |
LINUX_ATAG_MEM mem_tag; | |
LINUX_ATAG_VIDEOTEXT videotext_tag; | |
LINUX_ATAG_RAMDISK ramdisk_tag; | |
LINUX_ATAG_INITRD2 initrd2_tag; | |
LINUX_ATAG_SERIALNR serialnr_tag; | |
LINUX_ATAG_REVISION revision_tag; | |
LINUX_ATAG_VIDEOLFB videolfb_tag; | |
LINUX_ATAG_CMDLINE cmdline_tag; | |
} body; | |
} LINUX_ATAG; | |
EFI_STATUS | |
PrepareAtagList ( | |
IN CONST CHAR8* CommandLineString, | |
IN EFI_PHYSICAL_ADDRESS InitrdImage, | |
IN UINTN InitrdImageSize, | |
OUT EFI_PHYSICAL_ADDRESS *AtagBase, | |
OUT UINT32 *AtagSize | |
); | |
EFI_STATUS | |
PrepareFdt ( | |
IN CONST CHAR8* CommandLineArguments, | |
IN EFI_PHYSICAL_ADDRESS InitrdImage, | |
IN UINTN InitrdImageSize, | |
IN OUT EFI_PHYSICAL_ADDRESS *FdtBlobBase, | |
IN OUT UINTN *FdtBlobSize | |
); | |
#endif |