[PATCH 03/12] UefiPayloadPkg: Add a separate PlatformHookLib for Universal Payload


Zhiguang Liu
 

Add a new separate PlatformHookLib for Universal Payload to consume Guid
Hob gUniversalPayloadSerialPortInfoGuid to get serial port information

Cc: Maurice Ma <maurice.ma@...>
Cc: Guo Dong <guo.dong@...>
Cc: Benjamin You <benjamin.you@...>
Signed-off-by: Zhiguang Liu <zhiguang.liu@...>
---
UefiPayloadPkg/Library/UniversalPayloadPlatformHookLib/PlatformHookLib.c =
| 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
+++++++++++++
UefiPayloadPkg/Library/UniversalPayloadPlatformHookLib/PlatformHookLib.inf=
| 41 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 123 insertions(+)

diff --git a/UefiPayloadPkg/Library/UniversalPayloadPlatformHookLib/Platfor=
mHookLib.c b/UefiPayloadPkg/Library/UniversalPayloadPlatformHookLib/Platfor=
mHookLib.c
new file mode 100644
index 0000000000..6705f29505
--- /dev/null
+++ b/UefiPayloadPkg/Library/UniversalPayloadPlatformHookLib/PlatformHookLi=
b.c
@@ -0,0 +1,82 @@
+/** @file=0D
+ Platform Hook Library instance for UART device.=0D
+=0D
+ Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>=0D
+ SPDX-License-Identifier: BSD-2-Clause-Patent=0D
+=0D
+**/=0D
+=0D
+#include <Base.h>=0D
+#include <PiDxe.h>=0D
+#include <UniversalPayload/SerialPortInfo.h>=0D
+#include <Library/PlatformHookLib.h>=0D
+#include <Library/PcdLib.h>=0D
+#include <Library/HobLib.h>=0D
+=0D
+/**=0D
+ Performs platform specific initialization required for the CPU to access=
=0D
+ the hardware associated with a SerialPortLib instance. This function do=
es=0D
+ not initialize the serial port hardware itself. Instead, it initializes=
=0D
+ hardware devices that are required for the CPU to access the serial port=
=0D
+ hardware. This function may be called more than once.=0D
+=0D
+ @retval RETURN_SUCCESS The platform specific initialization succee=
ded.=0D
+ @retval RETURN_DEVICE_ERROR The platform specific initialization could =
not be completed.=0D
+=0D
+**/=0D
+RETURN_STATUS=0D
+EFIAPI=0D
+PlatformHookSerialPortInitialize (=0D
+ VOID=0D
+ )=0D
+{=0D
+ RETURN_STATUS Status;=0D
+ UNIVERSAL_PAYLOAD_SERIAL_PORT_INFO *SerialPortInfo;=0D
+ UINT8 *GuidHob;=0D
+ UNIVERSAL_PAYLOAD_GENERIC_HEADER *GenericHeader;=0D
+=0D
+ GuidHob =3D GetFirstGuidHob (&gUniversalPayloadSerialPortInfoGuid);=0D
+ if (GuidHob =3D=3D NULL) {=0D
+ return EFI_NOT_FOUND;=0D
+ }=0D
+=0D
+ GenericHeader =3D (UNIVERSAL_PAYLOAD_GENERIC_HEADER *) GET_GUID_HOB_DATA=
(GuidHob);=0D
+ if ((sizeof (UNIVERSAL_PAYLOAD_GENERIC_HEADER) > GET_GUID_HOB_DATA_SIZE =
(GuidHob)) || (GenericHeader->Length > GET_GUID_HOB_DATA_SIZE (GuidHob))) {=
=0D
+ return EFI_NOT_FOUND;=0D
+ }=0D
+=0D
+ if (GenericHeader->Revision =3D=3D UNIVERSAL_PAYLOAD_SERIAL_PORT_INFO_RE=
VISION) {=0D
+ SerialPortInfo =3D (UNIVERSAL_PAYLOAD_SERIAL_PORT_INFO *) GET_GUID_HOB=
_DATA (GuidHob);=0D
+ if (GenericHeader->Length < UNIVERSAL_PAYLOAD_SIZEOF_THROUGH_FIELD (UN=
IVERSAL_PAYLOAD_SERIAL_PORT_INFO, RegisterBase)) {=0D
+ //=0D
+ // Return if can't find the Serial Port Info Hob with enough length=
=0D
+ //=0D
+ return EFI_NOT_FOUND;=0D
+ }=0D
+=0D
+ Status =3D PcdSetBoolS (PcdSerialUseMmio, SerialPortInfo->UseMmio);=0D
+ if (RETURN_ERROR (Status)) {=0D
+ return Status;=0D
+ }=0D
+ Status =3D PcdSet64S (PcdSerialRegisterBase, SerialPortInfo->RegisterB=
ase);=0D
+ if (RETURN_ERROR (Status)) {=0D
+ return Status;=0D
+ }=0D
+ Status =3D PcdSet32S (PcdSerialRegisterStride, SerialPortInfo->Registe=
rStride);=0D
+ if (RETURN_ERROR (Status)) {=0D
+ return Status;=0D
+ }=0D
+ Status =3D PcdSet32S (PcdSerialBaudRate, SerialPortInfo->BaudRate);=0D
+ if (RETURN_ERROR (Status)) {=0D
+ return Status;=0D
+ }=0D
+ Status =3D PcdSet64S (PcdUartDefaultBaudRate, SerialPortInfo->BaudRate=
);=0D
+ if (RETURN_ERROR (Status)) {=0D
+ return Status;=0D
+ }=0D
+=0D
+ return RETURN_SUCCESS;=0D
+ }=0D
+=0D
+ return EFI_NOT_FOUND;=0D
+}=0D
diff --git a/UefiPayloadPkg/Library/UniversalPayloadPlatformHookLib/Platfor=
mHookLib.inf b/UefiPayloadPkg/Library/UniversalPayloadPlatformHookLib/Platf=
ormHookLib.inf
new file mode 100644
index 0000000000..41e05ddf54
--- /dev/null
+++ b/UefiPayloadPkg/Library/UniversalPayloadPlatformHookLib/PlatformHookLi=
b.inf
@@ -0,0 +1,41 @@
+## @file=0D
+# Platform Hook Library instance for UART device for Universal Payload.=0D
+#=0D
+# Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>=0D
+#=0D
+# SPDX-License-Identifier: BSD-2-Clause-Patent=0D
+#=0D
+##=0D
+=0D
+[Defines]=0D
+ INF_VERSION =3D 0x00010005=0D
+ BASE_NAME =3D PlatformHookLib=0D
+ FILE_GUID =3D 807E05AB-9411-429F-97F0-FE425BF6B094=
=0D
+ MODULE_TYPE =3D BASE=0D
+ VERSION_STRING =3D 1.0=0D
+ LIBRARY_CLASS =3D PlatformHookLib=0D
+ CONSTRUCTOR =3D PlatformHookSerialPortInitialize=0D
+=0D
+[Sources]=0D
+ PlatformHookLib.c=0D
+=0D
+[LibraryClasses]=0D
+ PcdLib=0D
+ BaseLib=0D
+ HobLib=0D
+ DxeHobListLib=0D
+=0D
+[Packages]=0D
+ MdePkg/MdePkg.dec=0D
+ MdeModulePkg/MdeModulePkg.dec=0D
+ UefiPayloadPkg/UefiPayloadPkg.dec=0D
+=0D
+[Guids]=0D
+ gUniversalPayloadSerialPortInfoGuid=0D
+=0D
+[Pcd]=0D
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseMmio ## PRODUCES=0D
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase ## PRODUCES=0D
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialBaudRate ## PRODUCES=0D
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterStride ## PRODUCES=0D
+ gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate ## PRODUCES=0D
--=20
2.16.2.windows.1

Join devel@edk2.groups.io to automatically receive all group messages.