| /** @file | |
| Define DebugLibFdtPL011UartWrite() for modules that can only run from RAM. | |
| Copyright (C) Red Hat | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #include <Uefi/UefiBaseType.h> | |
| #include <Uefi/UefiMultiPhase.h> | |
| #include <Pi/PiBootMode.h> | |
| #include <Pi/PiHob.h> | |
| #include <Library/HobLib.h> | |
| #include <Library/PL011UartLib.h> | |
| #include <Library/PcdLib.h> | |
| #include <Guid/EarlyPL011BaseAddress.h> | |
| #include "Ram.h" | |
| #include "Write.h" | |
| UINTN mDebugLibFdtPL011UartAddress; | |
| RETURN_STATUS mDebugLibFdtPL011UartPermanentStatus = RETURN_SUCCESS; | |
| /** | |
| Statefully initialize both the library instance and the debug PL011 UART. | |
| **/ | |
| STATIC | |
| RETURN_STATUS | |
| Initialize ( | |
| VOID | |
| ) | |
| { | |
| CONST VOID *Hob; | |
| CONST EARLY_PL011_BASE_ADDRESS *UartBase; | |
| RETURN_STATUS Status; | |
| UINTN DebugAddress; | |
| UINT64 BaudRate; | |
| UINT32 ReceiveFifoDepth; | |
| EFI_PARITY_TYPE Parity; | |
| UINT8 DataBits; | |
| EFI_STOP_BITS_TYPE StopBits; | |
| if (mDebugLibFdtPL011UartAddress != 0) { | |
| return RETURN_SUCCESS; | |
| } | |
| if (RETURN_ERROR (mDebugLibFdtPL011UartPermanentStatus)) { | |
| return mDebugLibFdtPL011UartPermanentStatus; | |
| } | |
| Hob = GetFirstGuidHob (&gEarlyPL011BaseAddressGuid); | |
| if ((Hob == NULL) || (GET_GUID_HOB_DATA_SIZE (Hob) != sizeof *UartBase)) { | |
| Status = RETURN_NOT_FOUND; | |
| goto Failed; | |
| } | |
| UartBase = GET_GUID_HOB_DATA (Hob); | |
| DebugAddress = (UINTN)UartBase->DebugAddress; | |
| if (DebugAddress == 0) { | |
| Status = RETURN_NOT_FOUND; | |
| goto Failed; | |
| } | |
| BaudRate = (UINTN)PcdGet64 (PcdUartDefaultBaudRate); | |
| ReceiveFifoDepth = 0; // Use the default value for Fifo depth | |
| Parity = (EFI_PARITY_TYPE)PcdGet8 (PcdUartDefaultParity); | |
| DataBits = PcdGet8 (PcdUartDefaultDataBits); | |
| StopBits = (EFI_STOP_BITS_TYPE)PcdGet8 (PcdUartDefaultStopBits); | |
| Status = PL011UartInitializePort ( | |
| DebugAddress, | |
| FixedPcdGet32 (PL011UartClkInHz), | |
| &BaudRate, | |
| &ReceiveFifoDepth, | |
| &Parity, | |
| &DataBits, | |
| &StopBits | |
| ); | |
| if (RETURN_ERROR (Status)) { | |
| goto Failed; | |
| } | |
| mDebugLibFdtPL011UartAddress = DebugAddress; | |
| return RETURN_SUCCESS; | |
| Failed: | |
| mDebugLibFdtPL011UartPermanentStatus = Status; | |
| return Status; | |
| } | |
| /** | |
| (Copied from SerialPortWrite() in "MdePkg/Include/Library/SerialPortLib.h" at | |
| commit c4547aefb3d0, with the Buffer non-nullity assertion removed:) | |
| Write data from buffer to serial device. | |
| Writes NumberOfBytes data bytes from Buffer to the serial device. | |
| The number of bytes actually written to the serial device is returned. | |
| If the return value is less than NumberOfBytes, then the write operation failed. | |
| If NumberOfBytes is zero, then return 0. | |
| @param Buffer Pointer to the data buffer to be written. | |
| @param NumberOfBytes Number of bytes to written to the serial device. | |
| @retval 0 NumberOfBytes is 0. | |
| @retval >0 The number of bytes written to the serial device. | |
| If this value is less than NumberOfBytes, then the write operation failed. | |
| **/ | |
| UINTN | |
| DebugLibFdtPL011UartWrite ( | |
| IN UINT8 *Buffer, | |
| IN UINTN NumberOfBytes | |
| ) | |
| { | |
| RETURN_STATUS Status; | |
| Status = Initialize (); | |
| if (RETURN_ERROR (Status)) { | |
| return 0; | |
| } | |
| return PL011UartWrite (mDebugLibFdtPL011UartAddress, Buffer, NumberOfBytes); | |
| } |