3 Copyright (c) 2013-2014, ARM Ltd. All rights reserved.<BR>
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
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.
15 #include "AndroidFastbootApp.h"
17 #include <Protocol/DevicePath.h>
19 #include <Library/BdsLib.h>
20 #include <Library/DevicePathLib.h>
22 #include <Guid/ArmGlobalVariableHob.h>
24 // Device Path representing an image in memory
27 MEMMAP_DEVICE_PATH Node1
;
28 EFI_DEVICE_PATH_PROTOCOL End
;
32 STATIC CONST MEMORY_DEVICE_PATH MemoryDevicePathTemplate
=
39 (UINT8
)(sizeof (MEMMAP_DEVICE_PATH
)),
40 (UINT8
)((sizeof (MEMMAP_DEVICE_PATH
)) >> 8),
43 0, // StartingAddress (set at runtime)
44 0 // EndingAddress (set at runtime)
48 END_ENTIRE_DEVICE_PATH_SUBTYPE
,
49 { sizeof (EFI_DEVICE_PATH_PROTOCOL
), 0 }
59 EFI_DEVICE_PATH_PROTOCOL
*FdtDevicePath
;
61 CHAR8 KernelArgs
[BOOTIMG_KERNEL_ARGS_SIZE
];
66 MEMORY_DEVICE_PATH KernelDevicePath
;
67 MEMORY_DEVICE_PATH
* RamdiskDevicePath
;
69 Status
= ParseAndroidBootImg (
77 if (EFI_ERROR (Status
)) {
81 KernelDevicePath
= MemoryDevicePathTemplate
;
83 // Have to cast to UINTN before casting to EFI_PHYSICAL_ADDRESS in order to
85 KernelDevicePath
.Node1
.StartingAddress
= (EFI_PHYSICAL_ADDRESS
)(UINTN
) Kernel
;
86 KernelDevicePath
.Node1
.EndingAddress
= (EFI_PHYSICAL_ADDRESS
)(UINTN
) Kernel
+ KernelSize
;
88 RamdiskDevicePath
= NULL
;
89 if (RamdiskSize
!= 0) {
90 RamdiskDevicePath
= (MEMORY_DEVICE_PATH
*)DuplicateDevicePath ((EFI_DEVICE_PATH_PROTOCOL
*) &MemoryDevicePathTemplate
);
92 RamdiskDevicePath
->Node1
.StartingAddress
= (EFI_PHYSICAL_ADDRESS
)(UINTN
) Ramdisk
;
93 RamdiskDevicePath
->Node1
.EndingAddress
= ((EFI_PHYSICAL_ADDRESS
)(UINTN
) Ramdisk
) + RamdiskSize
;
96 // Get the default FDT device path
97 Status
= GetEnvironmentVariable ((CHAR16
*)L
"Fdt", &gArmGlobalVariableGuid
,
98 NULL
, 0, (VOID
**)&FdtDevicePath
);
99 if (Status
== EFI_NOT_FOUND
) {
100 DEBUG ((EFI_D_ERROR
, "Error: Please update FDT path in boot manager\n"));
101 return EFI_DEVICE_ERROR
;
103 ASSERT_EFI_ERROR (Status
);
105 Status
= BdsBootLinuxFdt (
106 (EFI_DEVICE_PATH_PROTOCOL
*) &KernelDevicePath
,
107 (EFI_DEVICE_PATH_PROTOCOL
*) RamdiskDevicePath
,
111 if (EFI_ERROR (Status
)) {
112 DEBUG ((EFI_D_ERROR
, "Couldn't Boot Linux: %d\n", Status
));
113 return EFI_DEVICE_ERROR
;
116 if (RamdiskDevicePath
) {
117 FreePool (RamdiskDevicePath
);
120 FreePool (FdtDevicePath
);
122 // If we got here we do a confused face because BootLinuxFdt returned,
123 // reporting success.
124 DEBUG ((EFI_D_ERROR
, "WARNING: BdsBootLinuxFdt returned EFI_SUCCESS.\n"));