-/** @file
-*
-* Copyright (c) 2011-2012, 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_ATAG_MAX_OFFSET (PcdGet32(PcdSystemMemoryBase) + PcdGet32(PcdArmLinuxAtagMaxOffset))
-#define LINUX_KERNEL_MAX_OFFSET (PcdGet32(PcdSystemMemoryBase) + PcdGet32(PcdArmLinuxKernelMaxOffset))
-
-#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
-
-/* structures for each atag */
-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;
-
-typedef VOID (*LINUX_KERNEL)(UINT32 Zero, UINT32 Arch, UINTN ParametersBase);
-
-#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))
-
-#endif
+/** @file\r
+*\r
+* Copyright (c) 2011-2013, ARM Limited. All rights reserved.\r
+*\r
+* This program and the accompanying materials\r
+* are licensed and made available under the terms and conditions of the BSD License\r
+* which accompanies this distribution. The full text of the license may be found at\r
+* http://opensource.org/licenses/bsd-license.php\r
+*\r
+* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+*\r
+**/\r
+\r
+#ifndef __BDSLINUXLOADER_H\r
+#define __BDSLINUXLOADER_H\r
+\r
+#define LINUX_UIMAGE_SIGNATURE 0x56190527\r
+#define LINUX_KERNEL_MAX_OFFSET (PcdGet64 (PcdSystemMemoryBase) + PcdGet32(PcdArmLinuxKernelMaxOffset))\r
+#define LINUX_ATAG_MAX_OFFSET (PcdGet64 (PcdSystemMemoryBase) + PcdGet32(PcdArmLinuxAtagMaxOffset))\r
+#define LINUX_FDT_MAX_OFFSET (PcdGet64 (PcdSystemMemoryBase) + PcdGet32(PcdArmLinuxFdtMaxOffset))\r
+\r
+// Additional size that could be used for FDT entries added by the UEFI OS Loader\r
+// Estimation based on: EDID (300bytes) + bootargs (200bytes) + initrd region (20bytes)\r
+// + system memory region (20bytes) + mp_core entries (200 bytes)\r
+#define FDT_ADDITIONAL_ENTRIES_SIZE 0x300\r
+\r
+#define ARM_FDT_MACHINE_TYPE 0xFFFFFFFF\r
+\r
+typedef VOID (*LINUX_KERNEL)(UINT32 Zero, UINT32 Arch, UINTN ParametersBase);\r
+\r
+//\r
+// ATAG Definitions\r
+//\r
+\r
+#define ATAG_MAX_SIZE 0x3000\r
+\r
+/* ATAG : list of possible tags */\r
+#define ATAG_NONE 0x00000000\r
+#define ATAG_CORE 0x54410001\r
+#define ATAG_MEM 0x54410002\r
+#define ATAG_VIDEOTEXT 0x54410003\r
+#define ATAG_RAMDISK 0x54410004\r
+#define ATAG_INITRD2 0x54420005\r
+#define ATAG_SERIAL 0x54410006\r
+#define ATAG_REVISION 0x54410007\r
+#define ATAG_VIDEOLFB 0x54410008\r
+#define ATAG_CMDLINE 0x54410009\r
+#define ATAG_ARM_MP_CORE 0x5441000A\r
+\r
+#define next_tag_address(t) ((LINUX_ATAG*)((UINT32)(t) + (((t)->header.size) << 2) ))\r
+#define tag_size(type) ((UINT32)((sizeof(LINUX_ATAG_HEADER) + sizeof(type)) >> 2))\r
+\r
+typedef struct {\r
+ UINT32 size; /* length of tag in words including this header */\r
+ UINT32 type; /* tag type */\r
+} LINUX_ATAG_HEADER;\r
+\r
+typedef struct {\r
+ UINT32 flags;\r
+ UINT32 pagesize;\r
+ UINT32 rootdev;\r
+} LINUX_ATAG_CORE;\r
+\r
+typedef struct {\r
+ UINT32 size;\r
+ UINTN start;\r
+} LINUX_ATAG_MEM;\r
+\r
+typedef struct {\r
+ UINT8 x;\r
+ UINT8 y;\r
+ UINT16 video_page;\r
+ UINT8 video_mode;\r
+ UINT8 video_cols;\r
+ UINT16 video_ega_bx;\r
+ UINT8 video_lines;\r
+ UINT8 video_isvga;\r
+ UINT16 video_points;\r
+} LINUX_ATAG_VIDEOTEXT;\r
+\r
+typedef struct {\r
+ UINT32 flags;\r
+ UINT32 size;\r
+ UINTN start;\r
+} LINUX_ATAG_RAMDISK;\r
+\r
+typedef struct {\r
+ UINT32 start;\r
+ UINT32 size;\r
+} LINUX_ATAG_INITRD2;\r
+\r
+typedef struct {\r
+ UINT32 low;\r
+ UINT32 high;\r
+} LINUX_ATAG_SERIALNR;\r
+\r
+typedef struct {\r
+ UINT32 rev;\r
+} LINUX_ATAG_REVISION;\r
+\r
+typedef struct {\r
+ UINT16 lfb_width;\r
+ UINT16 lfb_height;\r
+ UINT16 lfb_depth;\r
+ UINT16 lfb_linelength;\r
+ UINT32 lfb_base;\r
+ UINT32 lfb_size;\r
+ UINT8 red_size;\r
+ UINT8 red_pos;\r
+ UINT8 green_size;\r
+ UINT8 green_pos;\r
+ UINT8 blue_size;\r
+ UINT8 blue_pos;\r
+ UINT8 rsvd_size;\r
+ UINT8 rsvd_pos;\r
+} LINUX_ATAG_VIDEOLFB;\r
+\r
+typedef struct {\r
+ CHAR8 cmdline[1];\r
+} LINUX_ATAG_CMDLINE;\r
+\r
+typedef struct {\r
+ LINUX_ATAG_HEADER header;\r
+ union {\r
+ LINUX_ATAG_CORE core_tag;\r
+ LINUX_ATAG_MEM mem_tag;\r
+ LINUX_ATAG_VIDEOTEXT videotext_tag;\r
+ LINUX_ATAG_RAMDISK ramdisk_tag;\r
+ LINUX_ATAG_INITRD2 initrd2_tag;\r
+ LINUX_ATAG_SERIALNR serialnr_tag;\r
+ LINUX_ATAG_REVISION revision_tag;\r
+ LINUX_ATAG_VIDEOLFB videolfb_tag;\r
+ LINUX_ATAG_CMDLINE cmdline_tag;\r
+ } body;\r
+} LINUX_ATAG;\r
+\r
+EFI_STATUS\r
+PrepareAtagList (\r
+ IN CONST CHAR8* CommandLineString,\r
+ IN EFI_PHYSICAL_ADDRESS InitrdImage,\r
+ IN UINTN InitrdImageSize,\r
+ OUT EFI_PHYSICAL_ADDRESS *AtagBase,\r
+ OUT UINT32 *AtagSize\r
+ );\r
+\r
+EFI_STATUS\r
+PrepareFdt (\r
+ IN CONST CHAR8* CommandLineArguments,\r
+ IN EFI_PHYSICAL_ADDRESS InitrdImage,\r
+ IN UINTN InitrdImageSize,\r
+ IN OUT EFI_PHYSICAL_ADDRESS *FdtBlobBase,\r
+ IN OUT UINTN *FdtBlobSize\r
+ );\r
+\r
+#endif\r