diff --git a/ArmVirtPkg/Library/Fdt16550SerialPortHookLib/EarlyFdt16550SerialPortHookLib.c b/ArmVirtPkg/Library/Fdt16550SerialPortHookLib/EarlyFdt16550SerialPortHookLib.c index c1b8192021..03d28b9282 100644 --- a/ArmVirtPkg/Library/Fdt16550SerialPortHookLib/EarlyFdt16550SerialPortHookLib.c +++ b/ArmVirtPkg/Library/Fdt16550SerialPortHookLib/EarlyFdt16550SerialPortHookLib.c @@ -17,90 +17,7 @@ #include #include #include -#include - -/** Get the UART base address of the console serial-port from the DT. - - This function fetches the node referenced in the "stdout-path" - property of the "chosen" node and returns the base address of - the console UART. - - @param [in] Fdt Pointer to a Flattened Device Tree (Fdt). - @param [out] SerialConsoleAddress If success, contains the base address - of the console serial-port. - - @retval EFI_SUCCESS The function completed successfully. - @retval EFI_NOT_FOUND Console serial-port info not found in DT. - @retval EFI_INVALID_PARAMETER Invalid parameter. -**/ -STATIC -EFI_STATUS -EFIAPI -GetSerialConsolePortAddress ( - IN CONST VOID *Fdt, - OUT UINT64 *SerialConsoleAddress - ) -{ - CONST CHAR8 *Prop; - INT32 PropSize; - CONST CHAR8 *Path; - INT32 PathLen; - INT32 ChosenNode; - INT32 SerialConsoleNode; - INT32 Len; - CONST CHAR8 *NodeStatus; - CONST UINT64 *RegProperty; - - if ((Fdt == NULL) || (fdt_check_header (Fdt) != 0)) { - return EFI_INVALID_PARAMETER; - } - - // The "chosen" node resides at the root of the DT. Fetch it. - ChosenNode = fdt_path_offset (Fdt, "/chosen"); - if (ChosenNode < 0) { - return EFI_NOT_FOUND; - } - - Prop = fdt_getprop (Fdt, ChosenNode, "stdout-path", &PropSize); - if (PropSize < 0) { - return EFI_NOT_FOUND; - } - - // Determine the actual path length, as a colon terminates the path. - Path = ScanMem8 (Prop, PropSize, ':'); - if (Path == NULL) { - PathLen = AsciiStrLen (Prop); - } else { - PathLen = Path - Prop; - } - - // Aliases cannot start with a '/', so it must be the actual path. - if (Prop[0] == '/') { - SerialConsoleNode = fdt_path_offset_namelen (Fdt, Prop, PathLen); - } else { - // Lookup the alias, as this contains the actual path. - Path = fdt_get_alias_namelen (Fdt, Prop, PathLen); - if (Path == NULL) { - return EFI_NOT_FOUND; - } - - SerialConsoleNode = fdt_path_offset (Fdt, Path); - } - - NodeStatus = fdt_getprop (Fdt, SerialConsoleNode, "status", &Len); - if ((NodeStatus != NULL) && (AsciiStrCmp (NodeStatus, "okay") != 0)) { - return EFI_NOT_FOUND; - } - - RegProperty = fdt_getprop (Fdt, SerialConsoleNode, "reg", &Len); - if (Len != 16) { - return EFI_INVALID_PARAMETER; - } - - *SerialConsoleAddress = fdt64_to_cpu (ReadUnaligned64 (RegProperty)); - - return EFI_SUCCESS; -} +#include /** Platform hook to retrieve the 16550 UART base address from the platform Device tree and store it in PcdSerialRegisterBase. @@ -108,6 +25,7 @@ GetSerialConsolePortAddress ( @retval RETURN_SUCCESS Success. @retval RETURN_INVALID_PARAMETER A parameter was invalid. @retval RETURN_NOT_FOUND Serial port information not found. + @retval RETURN_PROTOCOL_ERROR Invalid information in the Device Tree. **/ RETURN_STATUS @@ -129,7 +47,7 @@ PlatformHookSerialPortInitialize ( return RETURN_NOT_FOUND; } - Status = GetSerialConsolePortAddress (DeviceTreeBase, &SerialConsoleAddress); + Status = FdtSerialGetConsolePort (DeviceTreeBase, &SerialConsoleAddress); if (RETURN_ERROR (Status)) { return Status; } diff --git a/ArmVirtPkg/Library/Fdt16550SerialPortHookLib/EarlyFdt16550SerialPortHookLib.inf b/ArmVirtPkg/Library/Fdt16550SerialPortHookLib/EarlyFdt16550SerialPortHookLib.inf index 007a45eca2..22aba53d9b 100644 --- a/ArmVirtPkg/Library/Fdt16550SerialPortHookLib/EarlyFdt16550SerialPortHookLib.inf +++ b/ArmVirtPkg/Library/Fdt16550SerialPortHookLib/EarlyFdt16550SerialPortHookLib.inf @@ -22,12 +22,11 @@ [LibraryClasses] BaseLib PcdLib - FdtLib + FdtSerialPortAddressLib HobLib [Packages] ArmVirtPkg/ArmVirtPkg.dec - EmbeddedPkg/EmbeddedPkg.dec MdeModulePkg/MdeModulePkg.dec MdePkg/MdePkg.dec