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>
37 CONST CHAR8
*Compatible
;
38 CONST CHAR8
*CompItem
;
40 CONST UINT64
*RegProp
;
44 Base
= (VOID
*)(UINTN
)FixedPcdGet64 (PcdDeviceTreeInitialBaseAddress
);
45 ASSERT (fdt_check_header (Base
) == 0);
47 FdtSize
= fdt_totalsize (Base
);
48 NewBase
= AllocatePages (EFI_SIZE_TO_PAGES (FdtSize
));
49 ASSERT (NewBase
!= NULL
);
51 CopyMem (NewBase
, Base
, FdtSize
);
52 PcdSet64 (PcdDeviceTreeBaseAddress
, (UINT64
)(UINTN
)NewBase
);
54 UartHobData
= BuildGuidHob (&gEarlyPL011BaseAddressGuid
, sizeof *UartHobData
);
55 ASSERT (UartHobData
!= NULL
);
59 // Look for a UART node
61 for (Prev
= 0;; Prev
= Node
) {
62 Node
= fdt_next_node (Base
, Prev
, NULL
);
68 // Check for UART node
70 Compatible
= fdt_getprop (Base
, Node
, "compatible", &Len
);
73 // Iterate over the NULL-separated items in the compatible string
75 for (CompItem
= Compatible
; CompItem
!= NULL
&& CompItem
< Compatible
+ Len
;
76 CompItem
+= 1 + AsciiStrLen (CompItem
)) {
78 if (AsciiStrCmp (CompItem
, "arm,pl011") == 0) {
79 RegProp
= fdt_getprop (Base
, Node
, "reg", &Len
);
82 UartBase
= fdt64_to_cpu (ReadUnaligned64 (RegProp
));
84 DEBUG ((EFI_D_INFO
, "%a: PL011 UART @ 0x%lx\n", __FUNCTION__
, UartBase
));
86 *UartHobData
= UartBase
;
92 BuildFvHob (PcdGet64 (PcdFvBaseAddress
), PcdGet32 (PcdFvSize
));