3 * Copyright (c) 2011-2014, ARM Limited. All rights reserved.
4 * Copyright (c) 2014, Linaro Limited. All rights reserved.
6 * This program and the accompanying materials
7 * are licensed and made available under the terms and conditions of the BSD License
8 * which accompanies this distribution. The full text of the license may be found at
9 * http://opensource.org/licenses/bsd-license.php
11 * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 #include <Library/MemoryAllocationLib.h>
19 #include <Library/DebugLib.h>
20 #include <Library/HobLib.h>
21 #include <Library/PcdLib.h>
24 #include <Guid/EarlyPL011BaseAddress.h>
25 #include <Guid/FdtHob.h>
39 CONST CHAR8
*Compatible
;
40 CONST CHAR8
*CompItem
;
42 CONST UINT64
*RegProp
;
46 Base
= (VOID
*)(UINTN
)PcdGet64 (PcdDeviceTreeInitialBaseAddress
);
47 ASSERT (Base
!= NULL
);
48 ASSERT (fdt_check_header (Base
) == 0);
50 FdtSize
= fdt_totalsize (Base
);
51 NewBase
= AllocatePages (EFI_SIZE_TO_PAGES (FdtSize
));
52 ASSERT (NewBase
!= NULL
);
53 CopyMem (NewBase
, Base
, FdtSize
);
55 FdtHobData
= BuildGuidHob (&gFdtHobGuid
, sizeof *FdtHobData
);
56 ASSERT (FdtHobData
!= NULL
);
57 *FdtHobData
= (UINTN
)NewBase
;
59 UartHobData
= BuildGuidHob (&gEarlyPL011BaseAddressGuid
, sizeof *UartHobData
);
60 ASSERT (UartHobData
!= NULL
);
64 // Look for a UART node
66 for (Prev
= 0;; Prev
= Node
) {
67 Node
= fdt_next_node (Base
, Prev
, NULL
);
73 // Check for UART node
75 Compatible
= fdt_getprop (Base
, Node
, "compatible", &Len
);
78 // Iterate over the NULL-separated items in the compatible string
80 for (CompItem
= Compatible
; CompItem
!= NULL
&& CompItem
< Compatible
+ Len
;
81 CompItem
+= 1 + AsciiStrLen (CompItem
)) {
83 if (AsciiStrCmp (CompItem
, "arm,pl011") == 0) {
84 RegProp
= fdt_getprop (Base
, Node
, "reg", &Len
);
87 UartBase
= fdt64_to_cpu (ReadUnaligned64 (RegProp
));
89 DEBUG ((EFI_D_INFO
, "%a: PL011 UART @ 0x%lx\n", __FUNCTION__
, UartBase
));
91 *UartHobData
= UartBase
;
97 BuildFvHob (PcdGet64 (PcdFvBaseAddress
), PcdGet32 (PcdFvSize
));