From nobody Sun May 19 06:05:05 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+81290+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+81290+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1632942308; cv=none; d=zohomail.com; s=zohoarc; b=ZXeFA3hifIvmbckkoFdRHi9/TALqLwws8Jrf59IcEUVimlbW/66Z6bABEyFLzgLr4KJ2WykJuQkaxdsZfck1yLahw9JAE/41jF/NWA7bboSGaOSZoGwMnH2Y3lyt/tIL2Uj3gLtIgwd8Xk/LNiu6gKYqJ5tHr32IaW5M6AqJqiU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1632942308; h=Content-Transfer-Encoding:Cc:Date:From:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Sender:Subject:To; bh=I+w5jtoQr2cnRxUTpILzQZV4nTCuzwAGy8dgLwBB2Js=; b=Z6t9TqVVZPwzXzVbVQ4g2DilC+PDBuxKRZulQAi8p4aFezsXZgErd1HDEr64Sfv7CdczGH53OuKrebXNLUpuNkodTVo5vnn53yLi8J7GvDQxDPOAeNT/iPslKpujYobxwb1RW7IvdUKEcWftOp9bkEFvMJpIJVD+GUbW8ZyUqe4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+81290+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1632942308257496.40685270069457; Wed, 29 Sep 2021 12:05:08 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id zzH1YY1788612xyI5SbQ1ksm; Wed, 29 Sep 2021 12:05:07 -0700 X-Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by mx.groups.io with SMTP id smtpd.web12.1947.1632942306821786141 for ; Wed, 29 Sep 2021 12:05:07 -0700 X-IronPort-AV: E=McAfee;i="6200,9189,10122"; a="225090416" X-IronPort-AV: E=Sophos;i="5.85,334,1624345200"; d="scan'208";a="225090416" X-Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Sep 2021 12:05:05 -0700 X-IronPort-AV: E=Sophos;i="5.85,334,1624345200"; d="scan'208";a="479380205" X-Received: from gdong1-mobl1.amr.corp.intel.com ([10.212.23.61]) by fmsmga007-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Sep 2021 12:05:04 -0700 From: "Guo Dong" To: devel@edk2.groups.io Cc: Cheng-Chieh Huang , Guo Dong , Daniel Schaefer , Trammell Hudson , Maurice Ma , Benjamin You , Ray Ni Subject: [edk2-devel] [`edk2-devel][PATCH] UefiPayloadPkg: Add Linux bootloader support Date: Wed, 29 Sep 2021 12:04:48 -0700 Message-Id: <20210929190448.1612-1-guo.dong@intel.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,guo.dong@intel.com X-Gm-Message-State: 05SoN4UVW4lMUWj3a6hwa8Nex1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1632942307; bh=8Y8zpr5nhbCEAPdhHsNYrQbC6ucTH11qa5XPoaLUihg=; h=Cc:Date:From:Reply-To:Subject:To; b=mLbYi5l9ggotXDNdtjEAJS2ybSoK5VYTEZPKQRroyrOiMKtM+GlvLbGLgn++/zXGOB7 B7i/N0O+4Jy/vgc8AgKo8w2InRU0iS6f5u7JJe206RstZ7gOrXzEEy2sb4Wi7Eyni2j8d wO2Gv0QUsQg487FxLTzVP90TBqlKPmJi450= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1632942309410100001 Content-Type: text/plain; charset="utf-8" From: Cheng-Chieh Huang V4: Update commit message and coding style. Used Linux kernel as a bootloader to boot linux. To boot windows, UEFI service is required for the bootloader. So update UEFI payload to support Linux bootloader in order to boot UEFI OS. Linux bootloader will provide platfrom information at (PcdPayloadFdMemBase - SIZE_64KB), the LbParseLib will parse it and get required informaiton. Update PciHostBridgeLib to avoid run out of IO resources issue for a server platform. Signed-off-by: Cheng-Chieh Huang Reviewed-by: Guo Dong Cc: Cheng-Chieh Huang Cc: Daniel Schaefer Cc: Trammell Hudson Cc: Maurice Ma Cc: Guo Dong Cc: Benjamin You Cc: Ray Ni --- UefiPayloadPkg/Library/LbParseLib/LbParseLib.c | 194 +++++= +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= +++++++++++++++++++++++++++++++++++++++ UefiPayloadPkg/Library/LbParseLib/LbParseLib.inf | 39 +++++= ++++++++++++++++++++++++++++++++++ UefiPayloadPkg/Library/LbParseLib/Linuxboot.h | 47 +++++= ++++++++++++++++++++++++++++++++++++++++++ UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeSupport.c | 6 ++++-- UefiPayloadPkg/UefiPayloadPkg.dsc | 6 ++++++ 5 files changed, 290 insertions(+), 2 deletions(-) diff --git a/UefiPayloadPkg/Library/LbParseLib/LbParseLib.c b/UefiPayloadPk= g/Library/LbParseLib/LbParseLib.c new file mode 100644 index 0000000000..d7d61e14ae --- /dev/null +++ b/UefiPayloadPkg/Library/LbParseLib/LbParseLib.c @@ -0,0 +1,194 @@ +/** @file + This library will parse the linuxboot table in memory and extract those = required + information. + + Copyright (c) 2021, the u-root Authors. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Retrieve UefiPayloadConfig from Linuxboot's uefiboot +UefiPayloadConfig* +GetUefiPayLoadConfig( + VOID + ) +{ + UefiPayloadConfig *Config; + + Config =3D (UefiPayloadConfig*)(UINTN)(PcdGet32(PcdPayloadFdMemBase) - S= IZE_64KB); + if (Config->Version !=3D UEFI_PAYLOAD_CONFIG_VERSION) { + DEBUG((DEBUG_ERROR, "Expect payload Config version: %d, but get %d\n", + UEFI_PAYLOAD_CONFIG_VERSION, Config->Version)); + CpuDeadLoop (); + } + return Config; +} + +// Align the address and add memory rang to MemInfoCallback +VOID +AddMemoryRange ( + IN BL_MEM_INFO_CALLBACK MemInfoCallback, + IN UINT64 Start, + IN UINT64 End, + IN UINT32 Type + ) +{ + MEMROY_MAP_ENTRY MemoryMap; + UINT64 AlignedStart; + UINT64 AlignedEnd; + + AlignedStart =3D ALIGN_VALUE(Start, SIZE_4KB); + AlignedEnd =3D ALIGN_VALUE(End, SIZE_4KB); + // Conservative adjustment on Memory map. This should happen when bootin= g from + // non UEFI bios and it may report a memory region less than 4KB. + if (AlignedStart > Start && Type !=3D LINUXBOOT_MEM_RAM) { + AlignedStart -=3D SIZE_4KB; + } + if (AlignedEnd > End + 1 && Type =3D=3D LINUXBOOT_MEM_RAM) { + AlignedEnd -=3D SIZE_4KB; + } + MemoryMap.Base =3D AlignedStart; + MemoryMap.Size =3D AlignedEnd - AlignedStart; + MemoryMap.Type =3D (UINT8)Type; + MemoryMap.Flag =3D 0; + MemInfoCallback(&MemoryMap, NULL); +} + +/** + Acquire the memory information from the linuxboot table in memory. + + @param MemInfoCallback The callback routine + @param Params Pointer to the callback routine parameter + + @retval RETURN_SUCCESS Successfully find out the memory information. + @retval RETURN_NOT_FOUND Failed to find the memory information. + +**/ +RETURN_STATUS +EFIAPI +ParseMemoryInfo ( + IN BL_MEM_INFO_CALLBACK MemInfoCallback, + IN VOID* Params + ) +{ + UefiPayloadConfig *Config; + MemoryMapEntry *Entry; + UINT32 Index; + + Config =3D GetUefiPayLoadConfig(); + + DEBUG((DEBUG_INFO, "MemoryMap #entries: %d\n", Config->NumMemoryMapEntri= es)); + + Entry =3D &Config->MemoryMapEntries[0]; + for (Index =3D 0; Index < Config->NumMemoryMapEntries; Index++) { + DEBUG((DEBUG_INFO, "Start: 0x%lx End: 0x%lx Type:%d\n", Entry->Start, + Entry->End, Entry->Type)); + AddMemoryRange(MemInfoCallback, Entry->Start, Entry->End, Entry->Type); + Entry++; + } + return RETURN_SUCCESS; +} + +/** + Acquire acpi table and smbios table from linuxboot + + @param SystemTableInfo Pointer to the system table info + + @retval RETURN_SUCCESS Successfully find out the tables. + @retval RETURN_NOT_FOUND Failed to find the tables. + +**/ +RETURN_STATUS +EFIAPI +ParseSystemTable ( + OUT SYSTEM_TABLE_INFO* SystemTableInfo + ) +{ + UefiPayloadConfig *Config; + + Config =3D GetUefiPayLoadConfig(); + SystemTableInfo->AcpiTableBase =3D Config->AcpiBase; + SystemTableInfo->AcpiTableSize =3D (UINT32)(UINTN)Config->AcpiSize; + SystemTableInfo->SmbiosTableBase =3D Config->SmbiosBase; + SystemTableInfo->SmbiosTableSize =3D (UINT32)(UINTN)Config->SmbiosSize; + + return RETURN_SUCCESS; +} + +/** + Find the serial port information + + @param SERIAL_PORT_INFO Pointer to serial port info structure + + @retval RETURN_SUCCESS Successfully find the serial port information. + @retval RETURN_NOT_FOUND Failed to find the serial port information . + +**/ +RETURN_STATUS +EFIAPI +ParseSerialInfo ( + OUT SERIAL_PORT_INFO* SerialPortInfo + ) +{ + UefiPayloadConfig *Config; + + Config =3D GetUefiPayLoadConfig(); + SerialPortInfo->BaseAddr =3D Config->SerialConfig.BaseAddr; + SerialPortInfo->RegWidth =3D Config->SerialConfig.RegWidth; + SerialPortInfo->Type =3D Config->SerialConfig.Type; + SerialPortInfo->Baud =3D Config->SerialConfig.Baud; + SerialPortInfo->InputHertz =3D Config->SerialConfig.InputHertz; + SerialPortInfo->UartPciAddr =3D Config->SerialConfig.UartPciAddr; + + return RETURN_SUCCESS; +} + +/** + Find the video frame buffer information + + @param GfxInfo Pointer to the EFI_PEI_GRAPHICS_INFO_HOB stru= cture + + @retval RETURN_SUCCESS Successfully find the video frame buffer info= rmation. + @retval RETURN_NOT_FOUND Failed to find the video frame buffer informa= tion . + +**/ +RETURN_STATUS +EFIAPI +ParseGfxInfo ( + OUT EFI_PEI_GRAPHICS_INFO_HOB* GfxInfo + ) +{ + // Not supported + return RETURN_NOT_FOUND; +} + + +/** + Find the video frame buffer device information + + @param GfxDeviceInfo Pointer to the EFI_PEI_GRAPHICS_DEVICE_INFO_H= OB structure + + @retval RETURN_SUCCESS Successfully find the video frame buffer info= rmation. + @retval RETURN_NOT_FOUND Failed to find the video frame buffer informa= tion . + +**/ +RETURN_STATUS +EFIAPI +ParseGfxDeviceInfo ( + OUT EFI_PEI_GRAPHICS_DEVICE_INFO_HOB* GfxDeviceInfo + ) +{ + return RETURN_NOT_FOUND; +} diff --git a/UefiPayloadPkg/Library/LbParseLib/LbParseLib.inf b/UefiPayload= Pkg/Library/LbParseLib/LbParseLib.inf new file mode 100644 index 0000000000..d75ba8db8c --- /dev/null +++ b/UefiPayloadPkg/Library/LbParseLib/LbParseLib.inf @@ -0,0 +1,39 @@ +## @file +# Linuxboot Table Parse Library. +# +# Copyright (c) 2021, the u-root Authors. All rights reserved.
+# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION =3D 0x00010005 + BASE_NAME =3D LbParseLib + FILE_GUID =3D DBA15E1E-4C16-47DF-93C0-AB5888ED14C3 + MODULE_TYPE =3D BASE + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D BlParseLib + +# +# The following information is for reference only and not required by the = build tools. +# +# VALID_ARCHITECTURES =3D IA32 X64 +# + +[Sources] + LbParseLib.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + UefiPayloadPkg/UefiPayloadPkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + IoLib + DebugLib + PcdLib + +[Pcd] + gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemBase diff --git a/UefiPayloadPkg/Library/LbParseLib/Linuxboot.h b/UefiPayloadPkg= /Library/LbParseLib/Linuxboot.h new file mode 100644 index 0000000000..b3b7e70a7c --- /dev/null +++ b/UefiPayloadPkg/Library/LbParseLib/Linuxboot.h @@ -0,0 +1,47 @@ +/** @file + LinuxBoot PEI module include file. +**/ +#ifndef __LINUXBOOT_PEI_H_INCLUDED__ +#define __LINUXBOOT_PEI_H_INCLUDED__ + +#if defined(_MSC_VER) +#pragma warning(disable : 4200) +#endif + +#pragma pack(1) +typedef struct SerialPortConfigStruct { + UINT32 Type; + UINT32 BaseAddr; + UINT32 Baud; + UINT32 RegWidth; + UINT32 InputHertz; + UINT32 UartPciAddr; +} SerialPortConfig; + +typedef struct MemoryMapEntryStruct { + UINT64 Start; + UINT64 End; + UINT32 Type; +} MemoryMapEntry; + +typedef struct UefiPayloadConfigStruct { + UINT64 Version; + UINT64 AcpiBase; + UINT64 AcpiSize; + UINT64 SmbiosBase; + UINT64 SmbiosSize; + SerialPortConfig SerialConfig; + UINT32 NumMemoryMapEntries; + MemoryMapEntry MemoryMapEntries[0]; +} UefiPayloadConfig; +#pragma pack() + +#define UEFI_PAYLOAD_CONFIG_VERSION 1 + +#define LINUXBOOT_MEM_RAM 1 +#define LINUXBOOT_MEM_DEFAULT 2 +#define LINUXBOOT_MEM_ACPI 3 +#define LINUXBOOT_MEM_NVS 4 +#define LINUXBOOT_MEM_RESERVED 5 + +#endif // __LINUXBOOT_PEI_H_INCLUDED__ diff --git a/UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeSupport.c= b/UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeSupport.c index b0268f0506..a4f714f765 100644 --- a/UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeSupport.c +++ b/UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeSupport.c @@ -40,8 +40,9 @@ AdjustRootBridgeResource ( IN PCI_ROOT_BRIDGE_APERTURE *PMemAbove4G ) { +#ifndef LINUXBOOT_PAYLOAD UINT64 Mask; - +#endif // // For now try to downgrade everything into MEM32 since // - coreboot does not assign resource above 4GB @@ -80,7 +81,7 @@ AdjustRootBridgeResource ( PMemAbove4G->Base =3D MAX_UINT64; PMemAbove4G->Limit =3D 0; } - +#ifndef LINUXBOOT_PAYLOAD // // Align IO resource at 4K boundary // @@ -98,6 +99,7 @@ AdjustRootBridgeResource ( if (Mem->Base !=3D MAX_UINT64) { Mem->Base &=3D ~Mask; } +#endif } =20 /** diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayload= Pkg.dsc index fb805dc772..c4ae45b94f 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.dsc +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc @@ -35,6 +35,7 @@ # # SBL: UEFI payload for Slim Bootloader # COREBOOT: UEFI payload for coreboot + # LINUXBOOT: UEFI payload for linuxboot # DEFINE BOOTLOADER =3D SBL =20 @@ -105,6 +106,9 @@ =20 [BuildOptions] *_*_*_CC_FLAGS =3D -D DISABLE_NEW_DEPRECATED_INTERFACES +!if $(BOOTLOADER) =3D=3D "LINUXBOOT" + *_*_*_CC_FLAGS =3D -D LINUXBOOT_PAYLOAD +!endif GCC:*_UNIXGCC_*_CC_FLAGS =3D -DMDEPKG_NDEBUG GCC:RELEASE_*_*_CC_FLAGS =3D -DMDEPKG_NDEBUG INTEL:RELEASE_*_*_CC_FLAGS =3D /D MDEPKG_NDEBUG @@ -241,6 +245,8 @@ !if $(UNIVERSAL_PAYLOAD) =3D=3D FALSE !if $(BOOTLOADER) =3D=3D "COREBOOT" BlParseLib|UefiPayloadPkg/Library/CbParseLib/CbParseLib.inf + !elseif $(BOOTLOADER) =3D=3D "LINUXBOOT" + BlParseLib|UefiPayloadPkg/Library/LbParseLib/LbParseLib.inf !else BlParseLib|UefiPayloadPkg/Library/SblParseLib/SblParseLib.inf !endif --=20 2.32.0.windows.2 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#81290): https://edk2.groups.io/g/devel/message/81290 Mute This Topic: https://groups.io/mt/85956902/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-