[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@intel.com>
Cc: Guo Dong <guo.dong@intel.com>
Cc: Benjamin You <benjamin.you@intel.com>
Signed-off-by: Zhiguang Liu <zhiguang.liu@intel.com>
---
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


Guo Dong
 

Reviewed-by: Guo Dong <guo.dong@intel.com>

-----Original Message-----
From: Liu, Zhiguang <zhiguang.liu@intel.com>
Sent: Sunday, June 20, 2021 8:47 AM
To: devel@edk2.groups.io
Cc: Ma, Maurice <maurice.ma@intel.com>; Dong, Guo
<guo.dong@intel.com>; You, Benjamin <benjamin.you@intel.com>
Subject: [PATCH 03/12] UefiPayloadPkg: Add a separate PlatformHookLib for
Universal Payload

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

Cc: Maurice Ma <maurice.ma@intel.com>
Cc: Guo Dong <guo.dong@intel.com>
Cc: Benjamin You <benjamin.you@intel.com>
Signed-off-by: Zhiguang Liu <zhiguang.liu@intel.com>
---

UefiPayloadPkg/Library/UniversalPayloadPlatformHookLib/PlatformHookLib.
c | 82
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++

UefiPayloadPkg/Library/UniversalPayloadPlatformHookLib/PlatformHookLib.
inf | 41 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 123 insertions(+)

diff --git
a/UefiPayloadPkg/Library/UniversalPayloadPlatformHookLib/PlatformHookLi
b.c
b/UefiPayloadPkg/Library/UniversalPayloadPlatformHookLib/PlatformHookLi
b.c
new file mode 100644
index 0000000000..6705f29505
--- /dev/null
+++
b/UefiPayloadPkg/Library/UniversalPayloadPlatformHookLib/PlatformHookLi
b.c
@@ -0,0 +1,82 @@
+/** @file

+ Platform Hook Library instance for UART device.

+

+ Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>

+ SPDX-License-Identifier: BSD-2-Clause-Patent

+

+**/

+

+#include <Base.h>

+#include <PiDxe.h>

+#include <UniversalPayload/SerialPortInfo.h>

+#include <Library/PlatformHookLib.h>

+#include <Library/PcdLib.h>

+#include <Library/HobLib.h>

+

+/**

+ Performs platform specific initialization required for the CPU to access

+ the hardware associated with a SerialPortLib instance. This function does

+ not initialize the serial port hardware itself. Instead, it initializes

+ hardware devices that are required for the CPU to access the serial port

+ hardware. This function may be called more than once.

+

+ @retval RETURN_SUCCESS The platform specific initialization succeeded.

+ @retval RETURN_DEVICE_ERROR The platform specific initialization could
not be completed.

+

+**/

+RETURN_STATUS

+EFIAPI

+PlatformHookSerialPortInitialize (

+ VOID

+ )

+{

+ RETURN_STATUS Status;

+ UNIVERSAL_PAYLOAD_SERIAL_PORT_INFO *SerialPortInfo;

+ UINT8 *GuidHob;

+ UNIVERSAL_PAYLOAD_GENERIC_HEADER *GenericHeader;

+

+ GuidHob = GetFirstGuidHob (&gUniversalPayloadSerialPortInfoGuid);

+ if (GuidHob == NULL) {

+ return EFI_NOT_FOUND;

+ }

+

+ GenericHeader = (UNIVERSAL_PAYLOAD_GENERIC_HEADER *)
GET_GUID_HOB_DATA (GuidHob);

+ if ((sizeof (UNIVERSAL_PAYLOAD_GENERIC_HEADER) >
GET_GUID_HOB_DATA_SIZE (GuidHob)) || (GenericHeader->Length >
GET_GUID_HOB_DATA_SIZE (GuidHob))) {

+ return EFI_NOT_FOUND;

+ }

+

+ if (GenericHeader->Revision ==
UNIVERSAL_PAYLOAD_SERIAL_PORT_INFO_REVISION) {

+ SerialPortInfo = (UNIVERSAL_PAYLOAD_SERIAL_PORT_INFO *)
GET_GUID_HOB_DATA (GuidHob);

+ if (GenericHeader->Length <
UNIVERSAL_PAYLOAD_SIZEOF_THROUGH_FIELD
(UNIVERSAL_PAYLOAD_SERIAL_PORT_INFO, RegisterBase)) {

+ //

+ // Return if can't find the Serial Port Info Hob with enough length

+ //

+ return EFI_NOT_FOUND;

+ }

+

+ Status = PcdSetBoolS (PcdSerialUseMmio, SerialPortInfo->UseMmio);

+ if (RETURN_ERROR (Status)) {

+ return Status;

+ }

+ Status = PcdSet64S (PcdSerialRegisterBase, SerialPortInfo->RegisterBase);

+ if (RETURN_ERROR (Status)) {

+ return Status;

+ }

+ Status = PcdSet32S (PcdSerialRegisterStride, SerialPortInfo-
RegisterStride);
+ if (RETURN_ERROR (Status)) {

+ return Status;

+ }

+ Status = PcdSet32S (PcdSerialBaudRate, SerialPortInfo->BaudRate);

+ if (RETURN_ERROR (Status)) {

+ return Status;

+ }

+ Status = PcdSet64S (PcdUartDefaultBaudRate, SerialPortInfo->BaudRate);

+ if (RETURN_ERROR (Status)) {

+ return Status;

+ }

+

+ return RETURN_SUCCESS;

+ }

+

+ return EFI_NOT_FOUND;

+}

diff --git
a/UefiPayloadPkg/Library/UniversalPayloadPlatformHookLib/PlatformHookLi
b.inf
b/UefiPayloadPkg/Library/UniversalPayloadPlatformHookLib/PlatformHookLi
b.inf
new file mode 100644
index 0000000000..41e05ddf54
--- /dev/null
+++
b/UefiPayloadPkg/Library/UniversalPayloadPlatformHookLib/PlatformHookLi
b.inf
@@ -0,0 +1,41 @@
+## @file

+# Platform Hook Library instance for UART device for Universal Payload.

+#

+# Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>

+#

+# SPDX-License-Identifier: BSD-2-Clause-Patent

+#

+##

+

+[Defines]

+ INF_VERSION = 0x00010005

+ BASE_NAME = PlatformHookLib

+ FILE_GUID = 807E05AB-9411-429F-97F0-FE425BF6B094

+ MODULE_TYPE = BASE

+ VERSION_STRING = 1.0

+ LIBRARY_CLASS = PlatformHookLib

+ CONSTRUCTOR = PlatformHookSerialPortInitialize

+

+[Sources]

+ PlatformHookLib.c

+

+[LibraryClasses]

+ PcdLib

+ BaseLib

+ HobLib

+ DxeHobListLib

+

+[Packages]

+ MdePkg/MdePkg.dec

+ MdeModulePkg/MdeModulePkg.dec

+ UefiPayloadPkg/UefiPayloadPkg.dec

+

+[Guids]

+ gUniversalPayloadSerialPortInfoGuid

+

+[Pcd]

+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseMmio ## PRODUCES

+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase ##
PRODUCES

+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialBaudRate ## PRODUCES

+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterStride ##
PRODUCES

+ gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate ## PRODUCES

--
2.16.2.windows.1