#include <Pi/PiBootMode.h>\r
#include <Uefi/UefiBaseType.h>\r
#include <Uefi/UefiMultiPhase.h>\r
-#include <Pi/PiHob.h>\r
-#include <Library/HobLib.h>\r
-#include <Guid/EarlyPL011BaseAddress.h>\r
\r
/**\r
Return the current Boot Mode\r
INT32 Node, Prev;\r
UINT64 NewBase;\r
UINT64 NewSize;\r
- BOOLEAN HaveMemory, HaveUART;\r
- UINT64 *HobData;\r
CONST CHAR8 *Type;\r
- CONST CHAR8 *Compatible;\r
- CONST CHAR8 *CompItem;\r
INT32 Len;\r
CONST UINT64 *RegProp;\r
- UINT64 UartBase;\r
\r
NewBase = 0;\r
NewSize = 0;\r
\r
- HaveMemory = FALSE;\r
- HaveUART = FALSE;\r
-\r
- HobData = BuildGuidHob (&gEarlyPL011BaseAddressGuid, sizeof *HobData);\r
- ASSERT (HobData != NULL);\r
- *HobData = 0;\r
-\r
DeviceTreeBase = (VOID *)(UINTN)PcdGet64 (PcdDeviceTreeInitialBaseAddress);\r
ASSERT (DeviceTreeBase != NULL);\r
\r
//\r
// Look for a memory node\r
//\r
- for (Prev = 0; !(HaveMemory && HaveUART); Prev = Node) {\r
+ for (Prev = 0;; Prev = Node) {\r
Node = fdt_next_node (DeviceTreeBase, Prev, NULL);\r
if (Node < 0) {\r
break;\r
DEBUG ((EFI_D_ERROR, "%a: Failed to parse FDT memory node\n",\r
__FUNCTION__));\r
}\r
- HaveMemory = TRUE;\r
- continue;\r
- }\r
-\r
- //\r
- // Check for UART node\r
- //\r
- Compatible = fdt_getprop (DeviceTreeBase, Node, "compatible", &Len);\r
-\r
- //\r
- // Iterate over the NULL-separated items in the compatible string\r
- //\r
- for (CompItem = Compatible; CompItem != NULL && CompItem < Compatible + Len;\r
- CompItem += 1 + AsciiStrLen (CompItem)) {\r
-\r
- if (AsciiStrCmp (CompItem, "arm,pl011") == 0) {\r
- RegProp = fdt_getprop (DeviceTreeBase, Node, "reg", &Len);\r
- ASSERT (Len == 16);\r
-\r
- UartBase = fdt64_to_cpu (ReadUnaligned64 (RegProp));\r
-\r
- DEBUG ((EFI_D_INFO, "%a: PL011 UART @ 0x%lx\n", __FUNCTION__, UartBase));\r
-\r
- *HobData = UartBase;\r
-\r
- HaveUART = TRUE;\r
- continue;\r
- }\r
+ break;\r
}\r
}\r
\r
#include <Library/PcdLib.h>\r
#include <libfdt.h>\r
\r
+#include <Guid/EarlyPL011BaseAddress.h>\r
+\r
EFI_STATUS\r
EFIAPI\r
PlatformPeim (\r
VOID *Base;\r
VOID *NewBase;\r
UINTN FdtSize;\r
+ UINT64 *UartHobData;\r
+ INT32 Node, Prev;\r
+ CONST CHAR8 *Compatible;\r
+ CONST CHAR8 *CompItem;\r
+ INT32 Len;\r
+ CONST UINT64 *RegProp;\r
+ UINT64 UartBase;\r
+\r
\r
Base = (VOID*)(UINTN)FixedPcdGet64 (PcdDeviceTreeInitialBaseAddress);\r
ASSERT (fdt_check_header (Base) == 0);\r
CopyMem (NewBase, Base, FdtSize);\r
PcdSet64 (PcdDeviceTreeBaseAddress, (UINT64)(UINTN)NewBase);\r
\r
+ UartHobData = BuildGuidHob (&gEarlyPL011BaseAddressGuid, sizeof *UartHobData);\r
+ ASSERT (UartHobData != NULL);\r
+ *UartHobData = 0;\r
+\r
+ //\r
+ // Look for a UART node\r
+ //\r
+ for (Prev = 0;; Prev = Node) {\r
+ Node = fdt_next_node (Base, Prev, NULL);\r
+ if (Node < 0) {\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Check for UART node\r
+ //\r
+ Compatible = fdt_getprop (Base, Node, "compatible", &Len);\r
+\r
+ //\r
+ // Iterate over the NULL-separated items in the compatible string\r
+ //\r
+ for (CompItem = Compatible; CompItem != NULL && CompItem < Compatible + Len;\r
+ CompItem += 1 + AsciiStrLen (CompItem)) {\r
+\r
+ if (AsciiStrCmp (CompItem, "arm,pl011") == 0) {\r
+ RegProp = fdt_getprop (Base, Node, "reg", &Len);\r
+ ASSERT (Len == 16);\r
+\r
+ UartBase = fdt64_to_cpu (ReadUnaligned64 (RegProp));\r
+\r
+ DEBUG ((EFI_D_INFO, "%a: PL011 UART @ 0x%lx\n", __FUNCTION__, UartBase));\r
+\r
+ *UartHobData = UartBase;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
BuildFvHob (PcdGet64 (PcdFvBaseAddress), PcdGet32 (PcdFvSize));\r
\r
return EFI_SUCCESS;\r