Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add FDT support . Hsd-es-id: <HSD-ES bug/ise id> #4969

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -41,4 +41,3 @@
gEfiMdePkgTokenSpaceGuid.PcdDebugClearMemoryValue ## SOMETIMES_CONSUMES
gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask ## CONSUMES
gEfiMdePkgTokenSpaceGuid.PcdFixedDebugPrintErrorLevel ## CONSUMES

7 changes: 5 additions & 2 deletions MdePkg/Library/BaseFdtLib/BaseFdtLib.inf
Expand Up @@ -57,6 +57,9 @@
BaseMemoryLib

[BuildOptions]
MSFT:*_*_IA32_CC_FLAGS = /wd4146 /wd4245
MSFT:*_*_X64_CC_FLAGS = /wd4146 /wd4244 /wd4245 /wd4267
# warning C4706: assignment within conditional expression
# if ((err = fdt_splice_(fdt, p, oldlen, newlen)))
# in BaseFdtLib\libfdt\libfdt\fdt_rw.c (wait for sub module update to remove this)
MSFT:*_*_IA32_CC_FLAGS = /wd4146 /wd4245 /wd4706
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please check if we really need to bypass warnings or could we resolve them?

MSFT:*_*_X64_CC_FLAGS = /wd4146 /wd4244 /wd4245 /wd4267 /wd4706

2 changes: 2 additions & 0 deletions UefiPayloadPkg/Include/Guid/UniversalPayloadBase.h
Expand Up @@ -16,4 +16,6 @@ typedef struct {
EFI_PHYSICAL_ADDRESS Entry;
} UNIVERSAL_PAYLOAD_BASE;

#define UNIVERSAL_PAYLOAD_BASE_REVISION 1

#endif // UNIVERSAL_PAYLOAD_BASE_H_
64 changes: 64 additions & 0 deletions UefiPayloadPkg/Include/Library/FdtParserLib.h
@@ -0,0 +1,64 @@
/** @file
This library will parse the FDT (flat device tree) table information.

Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/

#ifndef FDT_PARSER_LIB_H_
#define FDT_PARSER_LIB_H_

/**
It will parse FDT based on DTB.

@param[in] FdtBase Address of the Fdt data.

@retval EFI_SUCCESS If it completed successfully.
@retval Others If it failed to parse DTB.
**/
UINTN
EFIAPI
ParseDtb (
IN VOID *FdtBase
);

/**
It will Parse FDT -node based on information.
@param[in] FdtBase The starting memory address of FdtBase
@retval HobList The base address of Hoblist.

**/
UINT64
EFIAPI
FdtNodeParser (
IN VOID *FdtBase
);

/**
It will Parse FDT -custom node based on information.
@param[in] FdtBase The starting memory address of FdtBase
@param[in] HostList The starting memory address of New Hob list.

**/
UINTN
EFIAPI
CustomFdtNodeParser (
IN VOID *FdtBase,
IN VOID *HostList
);

/**
It will initialize HOBs for UPL.

@param[in] FdtBase Address of the Fdt data.

@retval EFI_SUCCESS If it completed successfully.
@retval Others If it failed to initialize HOBs.
**/
UINTN
EFIAPI
UplInitHob (
IN VOID *FdtBase
);

#endif
30 changes: 30 additions & 0 deletions UefiPayloadPkg/Include/UniversalPayload/DeviceTree.h
@@ -0,0 +1,30 @@
/** @file
This file defines the structure for the PCI Root Bridges.

Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

@par Revision Reference:
- Universal Payload Specification 0.75 (https://universalpayload.github.io/documentation/)
**/

#ifndef UNIVERSAL_PAYLOAD_DEVICE_TREE_H_
#define UNIVERSAL_PAYLOAD_DEVICE_TREE_H_

#include <Uefi.h>
#include <UniversalPayload/UniversalPayload.h>

#pragma pack (1)

typedef struct {
UNIVERSAL_PAYLOAD_GENERIC_HEADER Header;
EFI_PHYSICAL_ADDRESS DeviceTreeAddress;
} UNIVERSAL_PAYLOAD_DEVICE_TREE;

#pragma pack()

#define UNIVERSAL_PAYLOAD_DEVICE_TREE_REVISION 1

extern GUID gUniversalPayloadDeviceTreeGuid;

#endif // UNIVERSAL_PAYLOAD_SMBIOS_TABLE_H_
69 changes: 69 additions & 0 deletions UefiPayloadPkg/Library/BaseSerialPortLibHob/BaseSerialPortLibHob.c
Expand Up @@ -143,6 +143,75 @@ SerialPortInitialize (
return RETURN_SUCCESS;
}

if (GetHobList () == NULL) {
mUartCount = 0;
SerialRegisterBase = PcdGet64 (PcdSerialRegisterBase);
MmioEnable = PcdGetBool (PcdSerialUseMmio);
BaudRate = PcdGet32 (PcdSerialBaudRate);
RegisterStride = (UINT8)PcdGet32 (PcdSerialRegisterStride);

mUartInfo[mUartCount].BaseAddress = SerialRegisterBase;
mUartInfo[mUartCount].UseMmio = MmioEnable;
mUartInfo[mUartCount].BaudRate = BaudRate;
mUartInfo[mUartCount].RegisterStride = RegisterStride;
mUartCount++;

Divisor = PcdGet32 (PcdSerialClockRate) / (BaudRate * 16);
if ((PcdGet32 (PcdSerialClockRate) % (BaudRate * 16)) >= BaudRate * 8) {
Divisor++;
}

//
// See if the serial port is already initialized
//
Initialized = TRUE;
if ((SerialPortReadRegister (SerialRegisterBase, R_UART_LCR, MmioEnable, RegisterStride) & 0x3F) != (PcdGet8 (PcdSerialLineControl) & 0x3F)) {
Initialized = FALSE;
}

Value = (UINT8)(SerialPortReadRegister (SerialRegisterBase, R_UART_LCR, MmioEnable, RegisterStride) | B_UART_LCR_DLAB);
SerialPortWriteRegister (SerialRegisterBase, R_UART_LCR, Value, MmioEnable, RegisterStride);
CurrentDivisor = SerialPortReadRegister (SerialRegisterBase, R_UART_BAUD_HIGH, MmioEnable, RegisterStride) << 8;
CurrentDivisor |= (UINT32)SerialPortReadRegister (SerialRegisterBase, R_UART_BAUD_LOW, MmioEnable, RegisterStride);
Value = (UINT8)(SerialPortReadRegister (SerialRegisterBase, R_UART_LCR, MmioEnable, RegisterStride) & ~B_UART_LCR_DLAB);
SerialPortWriteRegister (SerialRegisterBase, R_UART_LCR, Value, MmioEnable, RegisterStride);
if (CurrentDivisor != Divisor) {
Initialized = FALSE;
}

//
// Configure baud rate
//
SerialPortWriteRegister (SerialRegisterBase, R_UART_LCR, B_UART_LCR_DLAB, MmioEnable, RegisterStride);
SerialPortWriteRegister (SerialRegisterBase, R_UART_BAUD_HIGH, (UINT8)(Divisor >> 8), MmioEnable, RegisterStride);
SerialPortWriteRegister (SerialRegisterBase, R_UART_BAUD_LOW, (UINT8)(Divisor & 0xff), MmioEnable, RegisterStride);

//
// Clear DLAB and configure Data Bits, Parity, and Stop Bits.
// Strip reserved bits from PcdSerialLineControl
//
SerialPortWriteRegister (SerialRegisterBase, R_UART_LCR, (UINT8)(PcdGet8 (PcdSerialLineControl) & 0x3F), MmioEnable, RegisterStride);

//
// Enable and reset FIFOs
// Strip reserved bits from PcdSerialFifoControl
//
SerialPortWriteRegister (SerialRegisterBase, R_UART_FCR, 0x00, MmioEnable, RegisterStride);
SerialPortWriteRegister (SerialRegisterBase, R_UART_FCR, (UINT8)(PcdGet8 (PcdSerialFifoControl) & (B_UART_FCR_FIFOE | B_UART_FCR_FIFO64)), MmioEnable, RegisterStride);

//
// Set FIFO Polled Mode by clearing IER after setting FCR
//
SerialPortWriteRegister (SerialRegisterBase, R_UART_IER, 0x00, MmioEnable, RegisterStride);

//
// Put Modem Control Register(MCR) into its reset state of 0x00.
//
SerialPortWriteRegister (SerialRegisterBase, R_UART_MCR, 0x00, MmioEnable, RegisterStride);

return RETURN_SUCCESS;
}

GuidHob = GetFirstGuidHob (&gUniversalPayloadSerialPortInfoGuid);
while (GuidHob != NULL) {
SerialPortInfo = (UNIVERSAL_PAYLOAD_SERIAL_PORT_INFO *)GET_GUID_HOB_DATA (GuidHob);
Expand Down
Expand Up @@ -18,6 +18,7 @@
[Packages]
MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec
UefiPayloadPkg/UefiPayloadPkg.dec

[LibraryClasses]
PcdLib
Expand All @@ -34,6 +35,15 @@
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialClockRate
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialExtendedTxFifoSize
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseHardwareFlowControl
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseMmio ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialDetectCable ## SOMETIMES_CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialBaudRate ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialPciDeviceInfo ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterStride ## CONSUMES
gUefiPayloadPkgTokenSpaceGuid.PcdHandOffFdtEnable



[Guids]
gUniversalPayloadSerialPortInfoGuid
Expand Up @@ -6,7 +6,6 @@
# SPDX-License-Identifier: BSD-2-Clause-Patent
#
##

[Defines]
INF_VERSION = 0x00010005
BASE_NAME = DxeBaseSerialPortLibHob
Expand All @@ -15,27 +14,33 @@
VERSION_STRING = 1.0
LIBRARY_CLASS = SerialPortLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER
CONSTRUCTOR = DxeBaseSerialPortLibHobConstructor

[Packages]
MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec
UefiPayloadPkg/UefiPayloadPkg.dec

[LibraryClasses]
PcdLib
IoLib
HobLib
TimerLib

PlatformHookLib
[Sources]
DxeBaseSerialPortLibHob.c
BaseSerialPortLibHob.c

[Pcd]
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialLineControl
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialFifoControl
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialClockRate
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialExtendedTxFifoSize
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseHardwareFlowControl
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseMmio ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialDetectCable ## SOMETIMES_CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialBaudRate ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialPciDeviceInfo ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterStride ## CONSUMES
gUefiPayloadPkgTokenSpaceGuid.PcdHandOffFdtEnable

[Guids]
gUniversalPayloadSerialPortInfoGuid