From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from atlmailgw2.ami.com (atlmailgw2.ami.com [63.147.10.42]) by mx.groups.io with SMTP id smtpd.web08.110.1623880118072110246 for ; Wed, 16 Jun 2021 14:48:38 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: ami.com, ip: 63.147.10.42, mailfrom: manickavasakamk@ami.com) X-AuditID: ac10606f-8edff70000006d35-a3-60ca71b41433 Received: from atlms1.us.megatrends.com (atlms1.us.megatrends.com [172.16.96.144]) (using TLS with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (Client did not present a certificate) by atlmailgw2.ami.com (Symantec Messaging Gateway) with SMTP id 82.69.27957.5B17AC06; Wed, 16 Jun 2021 17:48:37 -0400 (EDT) Received: from MANIC-WIN10.us.megatrends.com (172.16.98.169) by atlms1.us.megatrends.com (172.16.96.144) with Microsoft SMTP Server id 14.3.498.0; Wed, 16 Jun 2021 17:48:36 -0400 From: "manickavasakam karpagavinayagam" To: CC: , , , , , , Subject: [edk2-platforms] [PATCH V1] PurleyOpenBoardPkg : Support for LINUX Boot Date: Wed, 16 Jun 2021 17:48:36 -0400 Message-ID: <20210616214836.10959-1-manickavasakamk@ami.com> X-Mailer: git-send-email 2.25.0.windows.1 MIME-Version: 1.0 Return-Path: manickavasakamk@ami.com X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrEIsWRmVeSWpSXmKPExsWyRiBhgu7WwlMJBh9XiFm0T5jNZtG/4hir xfFfH5gdmD22f7/A6LF4z0umAKaoBkabxLy8/JLEklSFlNTiZFulgKLMssTkSiWFzBRbJUMl hYKcxOTU3NS8ElulxIKC1LwUJTsuBQxgA1SWmaeQmpecn5KZl26r5Bnsr2thYWqpa6hkF5KR qpCZl5ZflJtYkpmfp5Ccn1cCVJ2aAhRVSOjmzNhwvo2pYMd7poot8zYyNTD+W8zUxcjJISFg IjHlxgr2LkYuDiGBXUwS2/o/skI42xglbkzdywJSxSZgL7F96mx2EFtEQEpiyoGZTCBFzALr GCV2Ns4AGyUsECCxY/JBMJtFQFVief9KsAZeARuJ23eWs0Gs05S4OvMaG0RcUOLkzCdgC5gF tCWWLXzNDGFLSBx88QLI5gC6QkXiyTGHCYx8s5B0zELSMQtJxwJG5lWMQoklObmJmTnp5UZ6 ibmZesn5uZsYIRGWv4Px40fzQ4xMHIyHGCU4mJVEeHWLTyQI8aYkVlalFuXHF5XmpBYfYnQC un8isxQ3KAyBkRJvbGAgJQrjGJqYmZgbmRtampgbGyuJ865yPxovJJAOjNzs1NSC1CKYIUwc nFINjBPu7E4o7zr2+9Hch7daI9u1jgbazr++ZvHb9z0q239IByVzTBfJkl+/jWW/CsOHhX57 Pv36134keWHMGcUNATd0t1bkyU3kTZd+vK60zKz9UghrtPocvYnm5tu6s3KU/8c9+B9XdCfI +9q21zN9KlQWMVzMaazVWBjRniNo9v1y5LSfsr93ZSmxFGckGmoxFxUnAgCpioZoxQIAAA== Content-Transfer-Encoding: quoted-printable Content-Type: text/plain Support for LINUX Boot To enable/disable feature, PcdLinuxBootEnable can be used 1. Follow directions on http://osresearch.net/Building/ to compile the heads= kernel and initrd for qemu-system_x86_64 2. Copy the following built files (1) initrd.cpio.xz to LinuxBootPkg/LinuxBinaries/initrd.cpio.xz (2) bzimage to LinuxBootPkg/LinuxBinaries/linux.efi --- .../BoardTiogaPass/CoreDxeInclude.dsc | 5 +- .../BoardTiogaPass/CoreUefiBootInclude.fdf | 5 +- .../BoardTiogaPass/OpenBoardPkg.dsc | 7 + .../BoardTiogaPass/OpenBoardPkg.fdf | 57 ++- .../BoardTiogaPass/PlatformPkgConfig.dsc | 7 + .../LinuxBinaries/LinuxKernel.inf | 9 + .../LinuxBootPkg/LinuxBinaries/initrd.cpio.xz | Bin 0 -> 16 bytes .../LinuxBootPkg/LinuxBinaries/linux.efi | Bin 0 -> 16 bytes .../LinuxBootPkg/LinuxBoot.c | 422 ++++++++++++++++++ .../LinuxBootPkg/LinuxBoot.h | 193 ++++++++ .../LinuxBootPkg/LinuxBoot.inf | 46 ++ .../LinuxBootPkg/LinuxBootNull.c | 43 ++ .../LinuxBootPkg/LinuxBootNull.inf | 31 ++ .../Intel/PurleyOpenBoardPkg/OpenBoardPkg.dec | 2 + .../DxePlatformBootManagerLib/BdsPlatform.c | 9 + .../DxePlatformBootManagerLib.inf | 2 + Platform/Intel/Readme.md | 42 ++ 17 files changed, 872 insertions(+), 8 deletions(-) create mode 100644 Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBina= ries/LinuxKernel.inf create mode 100644 Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBina= ries/initrd.cpio.xz create mode 100644 Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBina= ries/linux.efi create mode 100644 Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoot= .c create mode 100644 Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoot= .h create mode 100644 Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoot= .inf create mode 100644 Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoot= Null.c create mode 100644 Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoot= Null.inf diff --git a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreDxeInclude= .dsc b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreDxeInclude.dsc index b0660d72dd..a17015704b 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreDxeInclude.dsc +++ b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreDxeInclude.dsc @@ -83,6 +83,7 @@ $(PLATFORM_BOARD_PACKAGE)/Override/MdeModulePkg/Bus/Pci/PciBusDxe/PciBusD= xe.inf #TiogaPass Override END +!if gPlatformTokenSpaceGuid.PcdLinuxBootEnable =3D=3D FALSE MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf @@ -97,10 +98,11 @@ MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf FatPkg/EnhancedFatDxe/Fat.inf - +!endif #MdeModulePkg/Universal/Console/GraphicsOutputDxe/GraphicsOutputDxe.inf MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf +!if gPlatformTokenSpaceGuid.PcdLinuxBootEnable =3D=3D FALSE MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf @@ -124,6 +126,7 @@ PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf } +!endif !if gMinPlatformPkgTokenSpaceGuid.PcdBootToShellOnly =3D=3D FALSE MdeModulePkg/Core/PiSmmCore/PiSmmIpl.inf diff --git a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreUefiBootIn= clude.fdf b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreUefiBootInc= lude.fdf index 141ce5dda3..6cd8ba6626 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreUefiBootInclude.f= df +++ b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreUefiBootInclude.f= df @@ -47,6 +47,7 @@ INF PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf INF $(PLATFORM_BOARD_PACKAGE)/Override/MdeModulePkg/Bus/Pci/PciBusDxe/Pci= BusDxe.inf #TiogaPass Override END +!if gPlatformTokenSpaceGuid.PcdLinuxBootEnable =3D=3D FALSE INF MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf INF MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf INF MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf @@ -62,10 +63,12 @@ INF MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf INF MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf INF MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf INF FatPkg/EnhancedFatDxe/Fat.inf +!endif #INF MdeModulePkg/Universal/Console/GraphicsOutputDxe/GraphicsOutputDxe.in= f INF MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.i= nf +!if gPlatformTokenSpaceGuid.PcdLinuxBootEnable =3D=3D FALSE INF MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf INF MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf @@ -79,4 +82,4 @@ INF MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngine= Dxe.inf INF MdeModulePkg/Application/UiApp/UiApp.inf INF MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenuApp.inf - +!endif diff --git a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/OpenBoardPkg.d= sc b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/OpenBoardPkg.dsc index e4c8e7fbf1..06ed3f610e 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/OpenBoardPkg.dsc +++ b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/OpenBoardPkg.dsc @@ -104,6 +104,13 @@ ###########################################################################= ##### [LibraryClasses.common] +!if gPlatformTokenSpaceGuid.PcdLinuxBootEnable =3D=3D TRUE + LinuxBootLib|$(PLATFORM_BOARD_PACKAGE)/LinuxBootPkg/LinuxBoot.inf + LoadLinuxLib|OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.inf +!else + LinuxBootLib|$(PLATFORM_BOARD_PACKAGE)/LinuxBootPkg/LinuxBootNull.inf +!endif + !if gPlatformTokenSpaceGuid.PcdFastBoot =3D=3D FALSE PlatformBootManagerLib|$(PLATFORM_PACKAGE)/Bds/Library/DxePlatformBootMan= agerLib/DxePlatformBootManagerLib.inf !else diff --git a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/OpenBoardPkg.f= df b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/OpenBoardPkg.fdf index 43cd8d94e1..adbf28a936 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/OpenBoardPkg.fdf +++ b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/OpenBoardPkg.fdf @@ -19,6 +19,38 @@ # Also all values will have a PCD assigned so that they can be used i= n the system, and # the FlashMap edit tool can be used to change the values here, witho= ut effecting the code. # This requires all code to only use the PCD tokens to recover the va= lues. +!if gPlatformTokenSpaceGuid.PcdLinuxBootEnable =3D=3D TRUE + +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvAdvancedOffset =3D 0x0= 0000000 # Flash addr (0xFF840000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvAdvancedSize =3D 0x0= 0300000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvSecurityOffset =3D 0x0= 0300000 # Flash addr (0xFF8A0000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvSecuritySize =3D 0x0= 0100000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvOsBootOffset =3D 0x0= 0400000 # Flash addr (0xFF910000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvOsBootSize =3D 0x0= 0100000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvFspUOffset =3D 0x0= 0500000 # Flash addr (0xFFE00000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvFspUSize =3D 0x0= 0100000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvUefiBootOffset =3D 0x0= 0600000 # Flash addr (0xFF9A0000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvUefiBootSize =3D 0x0= 0600000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashNvStorageVariableOffset =3D 0x0= 0C00000 # Flash addr (0xFF800000) +SET gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize =3D 0x0= 007C000 # + +!else + +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvAdvancedOffset =3D 0x0= 0000000 # Flash addr (0xFF840000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvAdvancedSize =3D 0x0= 0500000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvSecurityOffset =3D 0x0= 0500000 # Flash addr (0xFF8A0000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvSecuritySize =3D 0x0= 0100000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvOsBootOffset =3D 0x0= 0600000 # Flash addr (0xFF910000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvOsBootSize =3D 0x0= 0100000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvFspUOffset =3D 0x0= 0700000 # Flash addr (0xFFE00000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvFspUSize =3D 0x0= 0200000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvUefiBootOffset =3D 0x0= 0900000 # Flash addr (0xFF9A0000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvUefiBootSize =3D 0x0= 0300000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashNvStorageVariableOffset =3D 0x0= 0C00000 # Flash addr (0xFF800000) +SET gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize =3D 0x0= 007C000 # + +!endif + [FD.Platform] BaseAddress =3D 0xFF000000 | gEfiPchTokenSpaceGuid.PcdFlashAreaBaseAd= dress @@ -27,27 +59,27 @@ ErasePolarity =3D 1 BlockSize =3D 0x10000 NumBlocks =3D 0x100 -0x00000000|0x00500000 +gMinPlatformPkgTokenSpaceGuid.PcdFlashFvAdvancedOffset|gMinPlatformPkgToken= SpaceGuid.PcdFlashFvAdvancedSize gMinPlatformPkgTokenSpaceGuid.PcdFlashFvAdvancedBase|gMinPlatformPkgTokenSp= aceGuid.PcdFlashFvAdvancedSize FV =3D FvAdvanced -0x00500000|0x00100000 +gMinPlatformPkgTokenSpaceGuid.PcdFlashFvSecurityOffset|gMinPlatformPkgToken= SpaceGuid.PcdFlashFvSecuritySize gMinPlatformPkgTokenSpaceGuid.PcdFlashFvSecurityBase|gMinPlatformPkgTokenSp= aceGuid.PcdFlashFvSecuritySize FV =3D FvSecurity -0x00600000|0x00100000 +gMinPlatformPkgTokenSpaceGuid.PcdFlashFvOsBootOffset|gMinPlatformPkgTokenSp= aceGuid.PcdFlashFvOsBootSize gMinPlatformPkgTokenSpaceGuid.PcdFlashFvOsBootBase|gMinPlatformPkgTokenSpac= eGuid.PcdFlashFvOsBootSize FV =3D FvOsBoot -0x00700000|0x00200000 +gMinPlatformPkgTokenSpaceGuid.PcdFlashFvFspUOffset|gMinPlatformPkgTokenSpac= eGuid.PcdFlashFvFspUSize gMinPlatformPkgTokenSpaceGuid.PcdFlashFvFspUBase|gMinPlatformPkgTokenSpaceG= uid.PcdFlashFvFspUSize FV =3D FvLateSiliconCompressed -0x00900000|0x00300000 +gMinPlatformPkgTokenSpaceGuid.PcdFlashFvUefiBootOffset|gMinPlatformPkgToken= SpaceGuid.PcdFlashFvUefiBootSize gMinPlatformPkgTokenSpaceGuid.PcdFlashFvUefiBootBase|gMinPlatformPkgTokenSp= aceGuid.PcdFlashFvUefiBootSize FV =3D FvUefiBoot -0x00C00000|0x0007C000 +gMinPlatformPkgTokenSpaceGuid.PcdFlashNvStorageVariableOffset|gEfiMdeModule= PkgTokenSpaceGuid.PcdFlashNvStorageVariableSize gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase|gEfiMdeModuleP= kgTokenSpaceGuid.PcdFlashNvStorageVariableSize #NV_VARIABLE_STORE DATA =3D { @@ -303,6 +335,19 @@ FILE DRIVER =3D db90bb7e-e4ba-4f07-96d6-b7076713bd2c { INF MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf +!if gPlatformTokenSpaceGuid.PcdLinuxBootEnable =3D=3D TRUE + +FILE DRIVER =3D 81339b04-fa8c-4be0-9ca7-916fc5319eb5 { + SECTION DXE_DEPEX_EXP =3D {FALSE} + SECTION PE32 =3D $(PLATFORM_BOARD_PACKAGE)/LinuxBootPkg/LinuxBinaries/l= inux.efi +} + +FILE FREEFORM =3D 16b60e5d-f1c5-42f0-9b34-08C81C430473 { + SECTION RAW =3D $(PLATFORM_BOARD_PACKAGE)/LinuxBootPkg/LinuxBinaries/init= rd.cpio.xz +} + +!endif + [FV.FvUefiBoot] FvAlignment =3D 16 diff --git a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/PlatformPkgCon= fig.dsc b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/PlatformPkgConfig= .dsc index 36a29c8d68..ff27252233 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/PlatformPkgConfig.dsc +++ b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/PlatformPkgConfig.dsc @@ -51,7 +51,14 @@ gMinPlatformPkgTokenSpaceGuid.PcdPerformanceEnable|TRUE + gPlatformTokenSpaceGuid.PcdLinuxBootEnable|FALSE + +!if gPlatformTokenSpaceGuid.PcdLinuxBootEnable =3D=3D TRUE + gPlatformTokenSpaceGuid.PcdFastBoot|TRUE +!else gPlatformTokenSpaceGuid.PcdFastBoot|FALSE +!endif + !if gPlatformTokenSpaceGuid.PcdFastBoot =3D=3D TRUE gIpmiFeaturePkgTokenSpaceGuid.PcdIpmiFeatureEnable|FALSE gPlatformTokenSpaceGuid.PcdUpdateConsoleInBds|FALSE diff --git a/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBinaries/Li= nuxKernel.inf b/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBinaries= /LinuxKernel.inf new file mode 100644 index 0000000000..a249027d22 --- /dev/null +++ b/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBinaries/LinuxKern= el.inf @@ -0,0 +1,9 @@ +[Defines] + INF_VERSION =3D 1.27 + BASE_NAME =3D LinuxKernel + FILE_GUID =3D 81339b04-fa8c-4be0-9ca7-916fc5319eb5 + MODULE_TYPE =3D UEFI_DRIVER + VERSION_STRING =3D 1.0 + +[Binaries.common.AARCH64] + PE32|linux.efi|* diff --git a/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBinaries/in= itrd.cpio.xz b/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBinaries/= initrd.cpio.xz new file mode 100644 index 0000000000000000000000000000000000000000..01d633b27e8ea9b17084fc911d0c= 8cc43a4170a9 GIT binary patch literal 16 KcmZQzKm`B*5C8!H literal 0 HcmV?d00001 diff --git a/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBinaries/li= nux.efi b/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBinaries/linux= .efi new file mode 100644 index 0000000000000000000000000000000000000000..01d633b27e8ea9b17084fc911d0c= 8cc43a4170a9 GIT binary patch literal 16 KcmZQzKm`B*5C8!H literal 0 HcmV?d00001 diff --git a/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoot.c b/Pl= atform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoot.c new file mode 100644 index 0000000000..eec05824d6 --- /dev/null +++ b/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoot.c @@ -0,0 +1,422 @@ +/** @file + +Copyright (c) 2021, American Megatrends International LLC. All rights reser= ved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +/** + * + * This library will load the Linux kernel and initrd from the BIOS and la= unch it. + * + */ + +//-------------------------------------------------------------------------= -- + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "LinuxBoot.h" + +//16b60e5d-f1c5-42f0-9b34-08C81C430473 +#define LINUX_BOOT_INITRD_GUID \ + { \ + 0x16b60e5d, 0xf1c5, 0x42f0, {0x9b, 0x34, 0x08, 0xc8, 0x1c, 0x43, 0x04,= 0x73} \ + } + +#define LINUX_BOOT_KERNEL_GUID \ + { \ + 0x81339b04, 0xfa8c, 0x4be0, {0x9c, 0xa7, 0x91, 0x6f, 0xc5, 0x31, 0x9e,= 0xb5} \ + } + + +EFI_STATUS +EFIAPI +LoadLinuxCheckKernelSetup ( + IN VOID *KernelSetup, + IN UINTN KernelSetupSize + ); + +VOID* +EFIAPI +LoadLinuxAllocateKernelSetupPages ( + IN UINTN Pages + ); + +EFI_STATUS +EFIAPI +LoadLinuxInitializeKernelSetup ( + IN VOID *KernelSetup + ); + +VOID* +EFIAPI +LoadLinuxAllocateKernelPages ( + IN VOID *KernelSetup, + IN UINTN Pages + ); + +EFI_STATUS +EFIAPI +LoadLinuxSetCommandLine ( + IN OUT VOID *KernelSetup, + IN CHAR8 *CommandLine + ); + +EFI_STATUS +EFIAPI +LoadLinux ( + IN VOID *Kernel, + IN OUT VOID *KernelSetup + ); + +VOID* +EFIAPI +LoadLinuxAllocateInitrdPages ( + IN VOID *KernelSetup, + IN UINTN Pages + ); + +EFI_GUID gLinuxBootInitrdFileGuid =3D LINUX_BOOT_INITRD_GUID; + +EFI_GUID gLinuxBootKernelFileGuid =3D LINUX_BOOT_KERNEL_GUID; + +//-------------------------------------------------------------------------= -- + +/** + Dump some hexadecimal data to the screen. + + @note Function taken from ShellPkg/Library/UefiShellCommandLib/UefiShellC= ommandLib.c in EDKII + + @param[in] Indent How many spaces to indent the output. + @param[in] Offset The offset of the printing. + @param[in] DataSize The size in bytes of UserData. + @param[in] UserData The data to print out. +**/ +static +VOID +DumpHex ( + IN UINTN Indent, + IN UINTN Offset, + IN UINTN DataSize, + IN VOID *UserData + ) +{ + UINT8 *Data; + CHAR8 Val[50]; + CHAR8 Str[20]; + UINT8 TempByte; + UINTN Size; + UINTN Index; + CHAR8 Hex[] =3D { + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' + }; + + DEBUG((DEBUG_INFO, "%*a 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0= D 0E 0F\n", Indent, "")); + DEBUG((DEBUG_INFO, "%*a ----------------------------------------= --------\n", Indent, "")); + + Data =3D UserData; + while (DataSize !=3D 0) { + Size =3D 16; + if (Size > DataSize) { + Size =3D DataSize; + } + + for (Index =3D 0; Index < Size; Index +=3D 1) { + TempByte =3D Data[Index]; + Val[Index * 3 + 0] =3D Hex[TempByte >> 4]; + Val[Index * 3 + 1] =3D Hex[TempByte & 0xF]; + Val[Index * 3 + 2] =3D (CHAR8) ((Index =3D=3D 7) ? '-' : ' '); + Str[Index] =3D (CHAR8) ((TempByte < ' ' || TempByte > 'z') ?= '.' : TempByte); + } + + Val[Index * 3] =3D 0; + Str[Index] =3D 0; + DEBUG((DEBUG_INFO, "%*a%08X: %-48a %a\n", Indent, "", Offset, Val, Str= )); + + Data +=3D Size; + Offset +=3D Size; + DataSize -=3D Size; + } +} + + +/** + * This function completes a minimal amount of the necessary BDS functions= to prepare + * for booting the kernel. + * + * @param None + * + * @retval EFI_SUCCESS Successfully completed remaining tasks + * @return EFI_ERROR Could not complete BDS tasks + */ +EFI_STATUS +CompleteBdsTasks ( + VOID +) +{ + + return EFI_SUCCESS; +} + +/** + * This function will load and launch the Linux kernel from a BIOS FV. + * + * @note This function is not intended to return. Any exiting from this= function indicates + * a problem loading or launching the kernel. + * + * @param None + * + * @return EFI_ERROR Any error code + */ +EFI_STATUS +LoadAndLaunchKernel ( + VOID +) +{ + EFI_LOADED_IMAGE_PROTOCOL *LoadedImage =3D NULL; + EFI_STATUS Status; + EFI_HANDLE KernelHandle =3D NULL; + VOID *KernelBuffer =3D NULL; + VOID *KernelFfsBuffer =3D NULL; + UINTN KernelFfsSize =3D 0; + VOID *InitrdData =3D NULL; + VOID *InitrdBuffer =3D NULL; + UINTN InitrdSize =3D 0; + struct boot_params *BootParams =3D NULL; + struct boot_params *HandoverParams =3D NULL; + UINT32 StartOffset =3D 0; + UINT32 KernelLength =3D 0; + UINT8 *Temp; + UINT8 CmdLine[] =3D " "; + + DEBUG((DEBUG_INFO, "LoadAndLaunchKernel Entry\n")); + + /// + /// Kernel load and preparation + /// + DEBUG((DEBUG_INFO, "Preparing the kernel...\n")); + + // Retrieve the kernel from the firmware volume + Status =3D GetSectionFromAnyFv( + &gLinuxBootKernelFileGuid, + EFI_SECTION_PE32, + 0, + &KernelFfsBuffer, + &KernelFfsSize + ); + + DEBUG((DEBUG_INFO, "Status %r\n",Status)); + DEBUG((DEBUG_INFO, "KernelFfsBuffer %x\n",KernelFfsBuffer)); + DEBUG((DEBUG_INFO, "KernelFfsSize %x\n",KernelFfsSize)); + + if (EFI_ERROR(Status)) { + DEBUG((DEBUG_ERROR, "Could not retrieve kernel; %r.\n", Status)); + goto FatalError; + } + + DEBUG((DEBUG_INFO, "Loaded kernel to buffer at 0x%p with size 0x%X.\n",= KernelFfsBuffer, KernelFfsSize)); + DEBUG((DEBUG_INFO, "Printing first 0x%X bytes:\n", MIN(KernelFfsSize, 0= x100))); + + DumpHex(2, 0, MIN(0x100, KernelFfsSize), KernelFfsBuffer); + + // Create a LoadImage protocol for the kernel + Status =3D gBS->LoadImage(TRUE, gImageHandle, NULL, KernelFfsBuffer, Ke= rnelFfsSize, &KernelHandle); + if (EFI_ERROR(Status)) { + DEBUG((DEBUG_ERROR, "Could not create LoadImage for kernel %r\n", S= tatus)); + goto FatalError; + } + + // Get the new LoadedImage protocol to retrieve information about the k= ernel + Status =3D gBS->HandleProtocol(KernelHandle, &gEfiLoadedImageProtocolGu= id, (VOID **) &LoadedImage); + if (EFI_ERROR(Status)) { + DEBUG((DEBUG_ERROR, "Could not get kernel LoadedImage protocol; %r\= n", Status)); + goto FatalError; + } + + DEBUG((DEBUG_INFO, "Kernel LoadedImage information:\n")); + DEBUG((DEBUG_INFO, " ImageBase =3D 0x%p\n", LoadedImage->ImageBase)); + DEBUG((DEBUG_INFO, " ImageSize =3D 0x%p\n", LoadedImage->ImageSize)); + + // Verify the kernel boot parameters from the LoadedImage and allocate= an initalization buffer once verified + BootParams =3D (struct boot_params*) LoadedImage->ImageBase; + + Status =3D LoadLinuxCheckKernelSetup((VOID *) BootParams, sizeof(struct= boot_params)); + if (EFI_ERROR (Status)) { + DEBUG((DEBUG_ERROR, "LoadLinuxCheckKernelSetup failed; %r.\n", Stat= us)); + goto FatalError; + } + + HandoverParams =3D LoadLinuxAllocateKernelSetupPages(EFI_SIZE_TO_PAGES(= KERNEL_SETUP_SIZE)); + if (HandoverParams =3D=3D NULL) { + DEBUG((DEBUG_ERROR, "Could not allocate memory for kernel handover= parameters.\n")); + goto FatalError; + } + DEBUG((DEBUG_INFO, "Handover parameters allocated at 0x%p\n", HandoverP= arams)); + + gBS->CopyMem(&HandoverParams->hdr, &BootParams->hdr, sizeof(struct setu= p_header)); + + Status =3D LoadLinuxInitializeKernelSetup(HandoverParams); + if (EFI_ERROR (Status)) { + DEBUG((DEBUG_ERROR, "Unable to initialize the handover parameters;= %r.\n", Status)); + goto FatalError; + } + + // Allocate space for the kernel and copy it into the new buffer + KernelBuffer =3D LoadLinuxAllocateKernelPages(HandoverParams, EFI_SIZE_= TO_PAGES(HandoverParams->hdr.init_size)); + if (KernelBuffer =3D=3D NULL) { + DEBUG((DEBUG_ERROR, "Unable to allocate memory for kernel.\n")); + goto FatalError; + } + + StartOffset =3D (HandoverParams->hdr.setup_secs + 1) * 512; + KernelLength =3D (UINT32) (KernelFfsSize - StartOffset); + Temp =3D (UINT8 *) LoadedImage->ImageBase; + + DEBUG((DEBUG_INFO, "Kernel starts at offset 0x%X with length 0x%X\n", S= tartOffset, KernelLength)); + + gBS->CopyMem(KernelBuffer, (Temp + StartOffset), KernelLength); + DEBUG((DEBUG_INFO, "First 0x%X bytes of new kernel buffer contents:\n",= MIN(0x100, KernelLength))); + + DumpHex(2, 0, MIN(0x100, KernelLength), KernelBuffer); + + // Prepare the command line + Status =3D LoadLinuxSetCommandLine(HandoverParams, (UINT8 *) &CmdLine); + if (EFI_ERROR (Status)) { + DEBUG((EFI_D_INFO, "Unable to set linux command line; %r.\n", Statu= s)); + goto FatalError; + } + + HandoverParams->hdr.code32_start =3D (UINT32)(UINTN) KernelBuffer; + HandoverParams->hdr.loader_id =3D 0x21; + + DEBUG((DEBUG_INFO, "Kernel loaded.\n")); + +#if 1 +//#if defined(INTEGRATED_INITRAM_FS) && (INTEGRATED_INITRAM_FS =3D=3D0) + /// + /// Initrd load and preparation + /// + DEBUG((DEBUG_INFO, "Preparing the initrd...\n")); + + // Retrieve the initrd from the firmware volume + Status =3D GetSectionFromAnyFv( + &gLinuxBootInitrdFileGuid, + EFI_SECTION_RAW, + 0, + &InitrdBuffer, + &InitrdSize + ); + + if (EFI_ERROR(Status)) { + DEBUG((DEBUG_ERROR, "Could not retrieve initrd; %r.\n", Status)); + goto FatalError; + } + + DEBUG((DEBUG_INFO, "Loaded initrd to buffer at 0x%p with size 0x%X.\n",= InitrdBuffer, InitrdSize)); + DEBUG((DEBUG_INFO, "Printing first 0x%X bytes:\n", MIN(0x100, InitrdSiz= e))); + DumpHex(2, 0, MIN(0x100, InitrdSize), InitrdBuffer); + + // Allocate the initrd for the kernel and copy it in + InitrdData =3D LoadLinuxAllocateInitrdPages(HandoverParams, EFI_SIZE_TO= _PAGES(InitrdSize)); + if (InitrdData =3D=3D NULL) { + DEBUG((DEBUG_ERROR, "Unable to allocate memory for initrd.\n")); + goto FatalError; + } + + gBS->CopyMem(InitrdData, InitrdBuffer, InitrdSize); + + HandoverParams->hdr.ramdisk_start =3D (UINT32)(UINTN) InitrdData; + HandoverParams->hdr.ramdisk_len =3D (UINT32) InitrdSize; + + DEBUG((DEBUG_INFO, "Initrd loaded.\n")); + DEBUG((DEBUG_INFO, "Printing first 0x%X bytes of initrd buffer:\n", MIN= (0x100, InitrdSize))); + DumpHex(2, 0, MIN(0x100, InitrdSize), InitrdData); + + // General cleanup before launching the kernel + gBS->FreePool(InitrdBuffer); + InitrdBuffer =3D NULL; +#endif + + gBS->UnloadImage(KernelHandle); + gBS->FreePool(KernelFfsBuffer); + KernelFfsBuffer =3D NULL; + + DEBUG((DEBUG_ERROR, "Launching the kernel\n")); + + + // + // Signal the EFI_EVENT_GROUP_READY_TO_BOOT event. + // + EfiSignalEventReadyToBoot(); + + + // Launch the kernel + Status =3D LoadLinux(KernelBuffer, HandoverParams); + + /// + /// LoadLinux should never return if the kernel boots. Anything past he= re is an error scenario + /// + DEBUG((DEBUG_ERROR, "ERROR: LoadLinux has returned with status; %r.\n",= Status)); + +FatalError: + // Free everything + if (InitrdData !=3D NULL) gBS->FreePages((EFI_PHYSICAL_ADDRESS) InitrdD= ata, EFI_SIZE_TO_PAGES(InitrdSize)); + if (KernelBuffer !=3D NULL) gBS->FreePages((EFI_PHYSICAL_ADDRESS) Kerne= lBuffer, EFI_SIZE_TO_PAGES(HandoverParams->hdr.init_size)); + if (HandoverParams !=3D NULL) gBS->FreePages((EFI_PHYSICAL_ADDRESS) Han= doverParams, EFI_SIZE_TO_PAGES(KERNEL_SETUP_SIZE)); + if (InitrdBuffer !=3D NULL) gBS->FreePool(InitrdBuffer); + if (KernelHandle !=3D NULL) gBS->UnloadImage(KernelHandle); + if (KernelFfsBuffer !=3D NULL) gBS->FreePool(KernelFfsBuffer); + + return EFI_NOT_FOUND; +} + +/** + * This is the main function for this feature. This will handle finding an= d launching + * the Linux kernel. + * + * @note In general, this function will never return to BDS. The LINUXBO= OT_ALLOW_RETURN_TO_BDS + * token will allow you to return to BDS if the kernel fails to la= unch for some reason. + * + * @param None + * + * @retval None + */ + +EFI_STATUS +LinuxBootStart ( + VOID + ) +{ + EFI_STATUS Status =3D EFI_SUCCESS; + + // Finish BDS and then try to launch the kernel + //Status =3D CompleteBdsTasks(); + + if (!EFI_ERROR(Status)) { + LoadAndLaunchKernel(); + } + + DEBUG((DEBUG_ERROR, "-----------------------------------\n")); + DEBUG((DEBUG_ERROR, " ERROR: Kernel failed to launch.\n")); + DEBUG((DEBUG_ERROR, "-----------------------------------\n")); + return Status; +} + +//-------------------------------------------------------------------------= -- diff --git a/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoot.h b/Pl= atform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoot.h new file mode 100644 index 0000000000..479fb8cbfd --- /dev/null +++ b/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoot.h @@ -0,0 +1,193 @@ +/** @file + +Copyright (c) 2021, American Megatrends International LLC. All rights reser= ved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +/** + * + * Header for library definitions and prototypes. + * + */ + +#ifndef __LINUX_BOOT_PRIVATE__H__ +#define __LINUX_BOOT_PRIVATE__H__ +#ifdef __cplusplus +extern "C" { +#endif // #ifdef __cplusplus + +//-------------------------------------------------------------------------= -- + +//#include + +#define BOOTSIG 0x1FE +#define SETUP_HDR 0x53726448 /* 0x53726448 =3D=3D "HdrS" */ + +#define E820_RAM 1 +#define E820_RESERVED 2 +#define E820_ACPI 3 +#define E820_NVS 4 +#define E820_UNUSABLE 5 + +#pragma pack(1) + +struct setup_header { + UINT8 setup_secs; /* Sectors for setup code */ + UINT16 root_flags; + UINT32 sys_size; + UINT16 ram_size; + UINT16 video_mode; + UINT16 root_dev; + UINT16 signature; /* Boot signature */ + UINT16 jump; + UINT32 header; + UINT16 version; + UINT16 su_switch; + UINT16 setup_seg; + UINT16 start_sys; + UINT16 kernel_ver; + UINT8 loader_id; + UINT8 load_flags; + UINT16 movesize; + UINT32 code32_start; /* Start of code loaded high */ + UINT32 ramdisk_start; /* Start of initial ramdisk */ + UINT32 ramdisk_len; /* Length of initial ramdisk */ + UINT32 bootsect_kludge; + UINT16 heap_end; + UINT8 ext_loader_ver; /* Extended boot loader version */ + UINT8 ext_loader_type; /* Extended boot loader ID */ + UINT32 cmd_line_ptr; /* 32-bit pointer to the kernel command line */ + UINT32 ramdisk_max; /* Highest legal initrd address */ + UINT32 kernel_alignment; /* Physical addr alignment required for kernel */ + UINT8 relocatable_kernel; /* Whether kernel is relocatable or not */ + UINT8 min_alignment; + UINT16 xloadflags; + UINT32 cmdline_size; + UINT32 hardware_subarch; + UINT64 hardware_subarch_data; + UINT32 payload_offset; + UINT32 payload_length; + UINT64 setup_data; + UINT64 pref_address; + UINT32 init_size; + UINT32 handover_offset; +}; + +struct efi_info { + UINT32 efi_loader_signature; + UINT32 efi_systab; + UINT32 efi_memdesc_size; + UINT32 efi_memdesc_version; + UINT32 efi_memmap; + UINT32 efi_memmap_size; + UINT32 efi_systab_hi; + UINT32 efi_memmap_hi; +}; + +struct e820_entry { + UINT64 addr; /* start of memory segment */ + UINT64 size; /* size of memory segment */ + UINT32 type; /* type of memory segment */ +}; + +struct screen_info { + UINT8 orig_x; /* 0x00 */ + UINT8 orig_y; /* 0x01 */ + UINT16 ext_mem_k; /* 0x02 */ + UINT16 orig_video_page; /* 0x04 */ + UINT8 orig_video_mode; /* 0x06 */ + UINT8 orig_video_cols; /* 0x07 */ + UINT8 flags; /* 0x08 */ + UINT8 unused2; /* 0x09 */ + UINT16 orig_video_ega_bx;/* 0x0a */ + UINT16 unused3; /* 0x0c */ + UINT8 orig_video_lines; /* 0x0e */ + UINT8 orig_video_isVGA; /* 0x0f */ + UINT16 orig_video_points;/* 0x10 */ + + /* VESA graphic mode -- linear frame buffer */ + UINT16 lfb_width; /* 0x12 */ + UINT16 lfb_height; /* 0x14 */ + UINT16 lfb_depth; /* 0x16 */ + UINT32 lfb_base; /* 0x18 */ + UINT32 lfb_size; /* 0x1c */ + UINT16 cl_magic, cl_offset; /* 0x20 */ + UINT16 lfb_linelength; /* 0x24 */ + UINT8 red_size; /* 0x26 */ + UINT8 red_pos; /* 0x27 */ + UINT8 green_size; /* 0x28 */ + UINT8 green_pos; /* 0x29 */ + UINT8 blue_size; /* 0x2a */ + UINT8 blue_pos; /* 0x2b */ + UINT8 rsvd_size; /* 0x2c */ + UINT8 rsvd_pos; /* 0x2d */ + UINT16 vesapm_seg; /* 0x2e */ + UINT16 vesapm_off; /* 0x30 */ + UINT16 pages; /* 0x32 */ + UINT16 vesa_attributes; /* 0x34 */ + UINT32 capabilities; /* 0x36 */ + UINT8 _reserved[6]; /* 0x3a */ +}; + +struct boot_params { + struct screen_info screen_info; + UINT8 apm_bios_info[0x14]; + UINT8 _pad2[4]; + UINT64 tboot_addr; + UINT8 ist_info[0x10]; + UINT8 _pad3[16]; + UINT8 hd0_info[16]; + UINT8 hd1_info[16]; + UINT8 sys_desc_table[0x10]; + UINT8 olpc_ofw_header[0x10]; + UINT8 _pad4[128]; + UINT8 edid_info[0x80]; + struct efi_info efi_info; + UINT32 alt_mem_k; + UINT32 scratch; + UINT8 e820_entries; + UINT8 eddbuf_entries; + UINT8 edd_mbr_sig_buf_entries; + UINT8 _pad6[6]; + struct setup_header hdr; + UINT8 _pad7[0x290-0x1f1-sizeof(struct setup_header)]; + UINT32 edd_mbr_sig_buffer[16]; + struct e820_entry e820_map[128]; + UINT8 _pad8[48]; + UINT8 eddbuf[0x1ec]; + UINT8 _pad9[276]; +}; +#pragma pack () + +//-------------------------------------------------------------------------= -- + +#ifndef MIN +#define MIN(x,y) ((x) < (y) ? (x) : (y)) +#endif // #ifndef MIN + +#define KERNEL_SETUP_SIZE 16384 + +//-------------------------------------------------------------------------= -- + +/// +/// Function prototypes from Bds module +/// +VOID ConnectEverything(); +VOID RecoverTheMemoryAbove4Gb(); +VOID SignalAllDriversConnectedEvent(); +VOID SignalProtocolEvent(IN EFI_GUID *ProtocolGuid); + +#if LINUXBOOT_SIGNAL_EXITPMAUTH =3D=3D 1 +VOID SignalExitPmAuthProtocolEvent(VOID); +#endif // #if LINUXBOOT_SIGNAL_EXITPMAUTH =3D=3D 1 + +typedef VOID (BDS_CONTROL_FLOW_FUNCTION)(); + +//-------------------------------------------------------------------------= -- + +/****** DO NOT WRITE BELOW THIS LINE *******/ +#ifdef __cplusplus +} +#endif // #ifdef __cplusplus +#endif // #ifndef __LINUX_BOOT_PRIVATE__H__ diff --git a/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoot.inf b/= Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoot.inf new file mode 100644 index 0000000000..62e09a75c8 --- /dev/null +++ b/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoot.inf @@ -0,0 +1,46 @@ +## @file +# +# Copyright (c) 2021, American Megatrends International LLC. All rights res= erved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +## +# +# This library links with the Bds module to launch the Linux kernel. +# +## + +[Defines] + INF_VERSION =3D 0x00010005 + VERSION_STRING =3D 1.0 + BASE_NAME =3D LinuxBoot + FILE_GUID =3D 74a41ddc-fac5-4787-afad-d81ee30a8b63= # {0x74a41ddc, 0xfac5, 0x4787, {0xaf, 0xad, 0xd8, 0x1e, 0xe3, 0x0a, 0x= 8b, 0x63}} + MODULE_TYPE =3D DXE_DRIVER + LIBRARY_CLASS =3D LinuxBootLib|DXE_DRIVER +[Sources] + LinuxBoot.c + LinuxBoot.h + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + MinPlatformPkg/MinPlatformPkg.dec + +[LibraryClasses] + UefiDriverEntryPoint + DxeServicesLib + BaseMemoryLib + DebugLib + UefiRuntimeServicesTableLib + UefiBootServicesTableLib + UefiLib + LoadLinuxLib + +[Guids] + +[Protocols] + gEfiLoadedImageProtocolGuid + +[Pcd] diff --git a/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBootNull.c= b/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBootNull.c new file mode 100644 index 0000000000..fa6ea117f4 --- /dev/null +++ b/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBootNull.c @@ -0,0 +1,43 @@ +/** @file + +Copyright (c) 2021, American Megatrends International LLC. All rights reser= ved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +/** + * + * This library will load the Linux kernel and initrd from the BIOS and la= unch it. + * + */ + +//-------------------------------------------------------------------------= -- + +#include +#include +#include +#include + + +/** + * This is the main function for this feature. This will handle finding an= d launching + * the Linux kernel. + * + * @note In general, this function will never return to BDS. The LINUXBO= OT_ALLOW_RETURN_TO_BDS + * token will allow you to return to BDS if the kernel fails to la= unch for some reason. + * + * @param None + * + * @retval None + */ + +EFI_STATUS +LinuxBootStart ( + VOID + ) +{ + + return EFI_SUCCESS; +} + +//-------------------------------------------------------------------------= -- diff --git a/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBootNull.in= f b/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBootNull.inf new file mode 100644 index 0000000000..3ed53c6ba0 --- /dev/null +++ b/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBootNull.inf @@ -0,0 +1,31 @@ +## @file +# +# Copyright (c) 2021, American Megatrends International LLC. All rights res= erved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +## +# +# This library links with the Bds module to launch the Linux kernel. +# +## + +[Defines] + INF_VERSION =3D 0x00010005 + VERSION_STRING =3D 1.0 + BASE_NAME =3D LinuxBoot + FILE_GUID =3D 0551B6D3-0594-4B02-AF42-5A9C7515CEC8 + MODULE_TYPE =3D DXE_DRIVER + LIBRARY_CLASS =3D LinuxBootLib|DXE_DRIVER +[Sources] + LinuxBootNull.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + +[LibraryClasses] + UefiDriverEntryPoint + DxeServicesLib \ No newline at end of file diff --git a/Platform/Intel/PurleyOpenBoardPkg/OpenBoardPkg.dec b/Platform/I= ntel/PurleyOpenBoardPkg/OpenBoardPkg.dec index 4dcec5430b..0c1ab318b8 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/OpenBoardPkg.dec +++ b/Platform/Intel/PurleyOpenBoardPkg/OpenBoardPkg.dec @@ -49,6 +49,8 @@ =0D= gPlatformTokenSpaceGuid.PcdUpdateConsoleInBds|TRUE|BOOLEAN|0x30000035=0D= =0D= + gPlatformTokenSpaceGuid.PcdLinuxBootEnable|FALSE|BOOLEAN|0x30000036=0D= + =0D= [PcdsDynamicEx]=0D= gPlatformTokenSpaceGuid.PcdDfxAdvDebugJumper|FALSE|BOOLEAN|0x6000001D=0D= =0D= diff --git a/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPl= atformPkg/Bds/Library/DxePlatformBootManagerLib/BdsPlatform.c b/Platform/Int= el/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatformPkg/Bds/Library/Dxe= PlatformBootManagerLib/BdsPlatform.c index b3b8ceba6f..bd0509ab10 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatformP= kg/Bds/Library/DxePlatformBootManagerLib/BdsPlatform.c +++ b/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatformP= kg/Bds/Library/DxePlatformBootManagerLib/BdsPlatform.c @@ -2,6 +2,7 @@ This file include all platform action which can be customized by IBV/OEM.= =0D= =0D= Copyright (c) 2017, Intel Corporation. All rights reserved.
=0D= +Copyright (c) 2021, American Megatrends International LLC.
=0D= SPDX-License-Identifier: BSD-2-Clause-Patent=0D= =0D= **/=0D= @@ -31,6 +32,12 @@ BOOLEAN gPPRequireUIConfirm; =0D= extern UINTN mBootMenuOptionNumber;= =0D= =0D= +EFI_STATUS=0D= +LinuxBootStart (=0D= + VOID=0D= + );=0D= +=0D= +=0D= GLOBAL_REMOVE_IF_UNREFERENCED USB_CLASS_FORMAT_DEVICE_PATH gUsbClassKeyboar= dDevicePath =3D {=0D= {=0D= {=0D= @@ -1268,6 +1275,8 @@ PlatformBootManagerAfterConsole ( LocalBootMode =3D gBootMode;=0D= DEBUG ((DEBUG_INFO, "Current local bootmode - %x\n", LocalBootMode));=0D= =0D= + LinuxBootStart();=0D= + =0D= //=0D= // Go the different platform policy with different boot mode=0D= // Notes: this part code can be change with the table policy=0D= diff --git a/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPl= atformPkg/Bds/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.in= f b/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatformPkg= /Bds/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf index 5790743565..21ac65257c 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatformP= kg/Bds/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf +++ b/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatformP= kg/Bds/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf @@ -2,6 +2,7 @@ # Component name for module DxePlatformBootManagerLib=0D= #=0D= # Copyright (c) 2017 - 2021, Intel Corporation. All rights reserved.
= =0D= +# Copyright (c) 2021, American Megatrends International LLC.
=0D= #=0D= # SPDX-License-Identifier: BSD-2-Clause-Patent=0D= #=0D= @@ -40,6 +41,7 @@ PerformanceLib=0D= TimerLib=0D= Tcg2PhysicalPresenceLib=0D= + LinuxBootLib=0D= =0D= [Packages]=0D= MdePkg/MdePkg.dec=0D= diff --git a/Platform/Intel/Readme.md b/Platform/Intel/Readme.md index 06c5f32b1e..a34784ccb8 100644 --- a/Platform/Intel/Readme.md +++ b/Platform/Intel/Readme.md @@ -87,6 +87,11 @@ A UEFI firmware implementation using MinPlatformPkg is co= nstructed using the fol ----------------------------------------|----------------------------------= ----------|------------------------------|--------------------|=0D= | Mt. Olympus | Purley = | PurleyOpenBoardPkg | BoardMtOlympus |=0D= =0D= +| Machine Name | Supported Chipsets = | BoardPkg | Board Name |=0D= +----------------------------------------|----------------------------------= ----------|------------------------------|--------------------|=0D= +| TiogaPass | Purley = | PurleyOpenBoardPkg | BoardTiogaPass |=0D= +=0D= +=0D= #### Simics=0D= =0D= | Machine Name | Supported Chipsets = | BoardPkg | Board Name |=0D= @@ -250,6 +255,12 @@ return back to the minimum platform caller. | | | | build sett= ings, environment variables.=0D= | | | |---build_board.py: Optional boa= rd-specific pre-build,=0D= | | | build, post-= build and clean functions.=0D= + | | |------PurleyOpenBoardPkg=0D= + | | | |------BoardTiogaPass=0D= + | | | |---build_config.cfg: BoardTioga= Pass specific=0D= + | | | | build sett= ings, environment variables.=0D= + | | | |---build_board.py: Optional boa= rd-specific pre-build,=0D= + | | | build, post-= build and clean functions. =0D= | | |=0D= | | |------SimicsOpenBoardPkg=0D= | | | |------BoardX58Ich10=0D= @@ -292,6 +303,18 @@ For PurleyOpenBoardPkg "bld cache-consume" Consume a cache of binary files from the specified d= irectory, BINARY_CACHE_PATH is empty,=0D= used "BinCache" as default path.=0D= =0D= +For PurleyOpenBoardPkg (TiogaPass)=0D= +1. Open command window, go to the workspace directory, e.g. c:\Edk2Workspac= e.=0D= +2. Type "cd edk2-platforms\Platform\Intel\PurleyOpenBoardPkg\BoardTiogaPass= ".=0D= +3. Type "GitEdk2MinBoardTiogaPass.bat" to setup GIT environment.=0D= +4. Type "bld" to build Purley BoardTiogaPass board UEFI firmware image, "bl= d release" for release build, "bld clean" to=0D= + remove intermediate files."bld cache-produce" Generate a cache of binary= files in the specified directory,=0D= + "bld cache-consume" Consume a cache of binary files from the specified d= irectory, BINARY_CACHE_PATH is empty,=0D= + used "BinCache" as default path. =0D= +5. Final BIOS image will be Build\PurleyOpenBoardPkg\BoardTiagoPass\DEBUG_V= S2015x86\FV\PLATFORM.fd or =0D= + Build\PurleyOpenBoardPkg\BoardTiagoPass\RELEASE_VS2015x86\FV\PLATFORM.fd= , depending on bld batch script input.=0D= +6. This BIOS image needs to be merged with SPS FW =0D= +=0D= ### **Known limitations**=0D= =0D= **KabylakeOpenBoardPkg**=0D= @@ -307,6 +330,25 @@ For PurleyOpenBoardPkg 2. This firmware project does not build with the GCC compiler.=0D= 3. The validated version of iASL compiler that can build MinPurley is 20180= 629. Older versions may generate ACPI build errors.=0D= =0D= +**PurleyOpenBoardPkg Tioga Pass **=0D= +1. This firmware project has only been tested on the Tioga Pass hardware.= =0D= +2. This firmware project build has only been tested using the Microsoft Vis= ual Studio 2015 build tools.=0D= +3. This firmware project does not build with the GCC compiler.=0D= +4. The validated version of iASL compiler that can build MinPurley is 20180= 629. Older versions may generate ACPI build errors.=0D= +5. Installed and booted to UEFI Windows 2016 on M.2 NVME slot=0D= +6. Installed and booted to UEFI Windows 2019 on M.2 NVME slot and with SATA= HDD.=0D= +7. Installed and booted to UEFI RHEL 7.3 on SATA HDD=0D= +8. Installed and booted to Ubuntu 18.04 on M.2 NVME slot.=0D= +9. Verified Mellanox card detection during POST and OS=0D= +10. LINUX Boot Support (PcdLinuxBootEnable needs to be enabled)=0D= +=0D= +1. Follow directions on http://osresearch.net/Building/ to compile the head= s kernel and initrd for qemu-system_x86_64 =0D= +2. Copy the following built files =0D= +(1) initrd.cpio.xz to LinuxBootPkg/LinuxBinaries/initrd.cpio.xz =0D= +(2) bzimage to LinuxBootPkg/LinuxBinaries/linux.efi=0D= +=0D= +=0D= +=0D= **SimicsOpenBoardPkg**=0D= 1. This firmware project has only been tested booting to Microsoft Windows= 10 x64 and Ubuntu 17.10 with AHCI mode.=0D= =0D= -- 2.25.0.windows.1 Please consider the environment before printing this email. The information contained in this message may be confidential and proprietar= y to American Megatrends (AMI). This communication is intended to be read o= nly by the individual or entity to whom it is addressed or by their designee= . If the reader of this message is not the intended recipient, you are on no= tice that any distribution of this message, in any form, is strictly prohibi= ted. Please promptly notify the sender by reply e-mail or by telephone at 7= 70-246-8600, and then delete or destroy all copies of the transmission.