From nobody Sat Apr 27 11:58:30 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+76616+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+76616+1787277+3901457@groups.io ARC-Seal: i=1; a=rsa-sha256; t=1623888891; cv=none; d=zohomail.com; s=zohoarc; b=bFeuDfO5nxXx9TDnsHluLyD1cv51OEOPKcEJdyOdIYETgTayOr14XZ2D1vBUrCwZM1rDVmt2SF3MGuTPIrSJorC+FLChar2DC/Vxf97gCjnmM9iGFaQBUj7tFgBvb4gtW1FCrOBAoY4Yxh7CrsbXWCxCO7eyGydU6M7XbyvMT8w= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1623888891; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Sender:Subject:To; bh=hmDGpXKpTAeVgtHI3c7T0Pq4XpQ713I0pcS49ulFQns=; b=NXTU/vUQmLsoEe2kUBTbjA+Nh0iMep6BPorWhpDZ+drWgQokkK5lUaH40oOtKqKATawmI5eZbF+BOtFuf3C94lSI+WB33werLO90J3hZ2Xucnau0XlK5TW2r+SOsbmyZnwPYedeprPqZLMkSNZtIAuBMMAwIiGQ7BlwsyvQwxIU= 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+76616+1787277+3901457@groups.io Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1623888891554562.0570223723116; Wed, 16 Jun 2021 17:14:51 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id QXJJYY1788612xq2wA3PCnlB; Wed, 16 Jun 2021 17:14:51 -0700 X-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 X-AuditID: ac10606f-8edff70000006d35-a3-60ca71b41433 X-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) X-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-devel] [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> MIME-Version: 1.0 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== 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,manickavasakamk@ami.com X-Gm-Message-State: s09h6cuqZ8nUBLg1CMqwtki3x1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1623888891; bh=qYVfk70BOKbawDDoMqZXlmIm5nBvcwSxA48P3e84Daw=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=tEHbEO9JAM2jv4pmVRH2dteecl/2C+NtB//JSN3NL6Ys9l2qEamPENT9sFBnO7uJOZ3 w6OStTZaPYvhhd2QEbC74UFcaDcjznIvuZepbrobcOU/mbUnMasdUsfDCY12pjAH2IBN4 TSnMZJdLSBp8btYC418Ig1eoj/IkwIsKESY= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" Support for LINUX Boot To enable/disable feature, PcdLinuxBootEnable can be used 1. Follow directions on http://osresearch.net/Building/ to compile the head= s 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/LinuxBin= aries/LinuxKernel.inf create mode 100644 Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBin= aries/initrd.cpio.xz create mode 100644 Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBin= aries/linux.efi create mode 100644 Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoo= t.c create mode 100644 Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoo= t.h create mode 100644 Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoo= t.inf create mode 100644 Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoo= tNull.c create mode 100644 Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoo= tNull.inf diff --git a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreDxeInclud= e.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/PciBus= Dxe.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/CoreUefiBootI= nclude.fdf b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreUefiBootI= nclude.fdf index 141ce5dda3..6cd8ba6626 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreUefiBootInclude.= fdf +++ b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/CoreUefiBootInclude.= fdf @@ -47,6 +47,7 @@ INF PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf INF $(PLATFORM_BOARD_PACKAGE)/Override/MdeModulePkg/Bus/Pci/PciBusDxe/Pc= iBusDxe.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.i= nf INF MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.= inf +!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/DisplayEngin= eDxe.inf INF MdeModulePkg/Application/UiApp/UiApp.inf INF MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenuApp.inf - +!endif diff --git a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/OpenBoardPkg.= dsc 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/DxePlatformBootMa= nagerLib/DxePlatformBootManagerLib.inf !else diff --git a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/OpenBoardPkg.= fdf 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 = in the system, and # the FlashMap edit tool can be used to change the values here, with= out effecting the code. # This requires all code to only use the PCD tokens to recover the v= alues. +!if gPlatformTokenSpaceGuid.PcdLinuxBootEnable =3D=3D TRUE + +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvAdvancedOffset =3D 0x= 00000000 # Flash addr (0xFF840000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvAdvancedSize =3D 0x= 00300000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvSecurityOffset =3D 0x= 00300000 # Flash addr (0xFF8A0000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvSecuritySize =3D 0x= 00100000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvOsBootOffset =3D 0x= 00400000 # Flash addr (0xFF910000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvOsBootSize =3D 0x= 00100000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvFspUOffset =3D 0x= 00500000 # Flash addr (0xFFE00000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvFspUSize =3D 0x= 00100000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvUefiBootOffset =3D 0x= 00600000 # Flash addr (0xFF9A0000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvUefiBootSize =3D 0x= 00600000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashNvStorageVariableOffset =3D 0x= 00C00000 # Flash addr (0xFF800000) +SET gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize =3D 0x= 0007C000 # + +!else + +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvAdvancedOffset =3D 0x= 00000000 # Flash addr (0xFF840000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvAdvancedSize =3D 0x= 00500000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvSecurityOffset =3D 0x= 00500000 # Flash addr (0xFF8A0000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvSecuritySize =3D 0x= 00100000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvOsBootOffset =3D 0x= 00600000 # Flash addr (0xFF910000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvOsBootSize =3D 0x= 00100000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvFspUOffset =3D 0x= 00700000 # Flash addr (0xFFE00000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvFspUSize =3D 0x= 00200000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvUefiBootOffset =3D 0x= 00900000 # Flash addr (0xFF9A0000) +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashFvUefiBootSize =3D 0x= 00300000 # +SET gMinPlatformPkgTokenSpaceGuid.PcdFlashNvStorageVariableOffset =3D 0x= 00C00000 # Flash addr (0xFF800000) +SET gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize =3D 0x= 0007C000 # + +!endif + [FD.Platform] BaseAddress =3D 0xFF000000 | gEfiPchTokenSpaceGuid.PcdFlashAreaBaseA= ddress @@ -27,27 +59,27 @@ ErasePolarity =3D 1 BlockSize =3D 0x10000 NumBlocks =3D 0x100 -0x00000000|0x00500000 +gMinPlatformPkgTokenSpaceGuid.PcdFlashFvAdvancedOffset|gMinPlatformPkgToke= nSpaceGuid.PcdFlashFvAdvancedSize gMinPlatformPkgTokenSpaceGuid.PcdFlashFvAdvancedBase|gMinPlatformPkgTokenS= paceGuid.PcdFlashFvAdvancedSize FV =3D FvAdvanced -0x00500000|0x00100000 +gMinPlatformPkgTokenSpaceGuid.PcdFlashFvSecurityOffset|gMinPlatformPkgToke= nSpaceGuid.PcdFlashFvSecuritySize gMinPlatformPkgTokenSpaceGuid.PcdFlashFvSecurityBase|gMinPlatformPkgTokenS= paceGuid.PcdFlashFvSecuritySize FV =3D FvSecurity -0x00600000|0x00100000 +gMinPlatformPkgTokenSpaceGuid.PcdFlashFvOsBootOffset|gMinPlatformPkgTokenS= paceGuid.PcdFlashFvOsBootSize gMinPlatformPkgTokenSpaceGuid.PcdFlashFvOsBootBase|gMinPlatformPkgTokenSpa= ceGuid.PcdFlashFvOsBootSize FV =3D FvOsBoot -0x00700000|0x00200000 +gMinPlatformPkgTokenSpaceGuid.PcdFlashFvFspUOffset|gMinPlatformPkgTokenSpa= ceGuid.PcdFlashFvFspUSize gMinPlatformPkgTokenSpaceGuid.PcdFlashFvFspUBase|gMinPlatformPkgTokenSpace= Guid.PcdFlashFvFspUSize FV =3D FvLateSiliconCompressed -0x00900000|0x00300000 +gMinPlatformPkgTokenSpaceGuid.PcdFlashFvUefiBootOffset|gMinPlatformPkgToke= nSpaceGuid.PcdFlashFvUefiBootSize gMinPlatformPkgTokenSpaceGuid.PcdFlashFvUefiBootBase|gMinPlatformPkgTokenS= paceGuid.PcdFlashFvUefiBootSize FV =3D FvUefiBoot -0x00C00000|0x0007C000 +gMinPlatformPkgTokenSpaceGuid.PcdFlashNvStorageVariableOffset|gEfiMdeModul= ePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase|gEfiMdeModule= PkgTokenSpaceGuid.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/= linux.efi +} + +FILE FREEFORM =3D 16b60e5d-f1c5-42f0-9b34-08C81C430473 { + SECTION RAW =3D $(PLATFORM_BOARD_PACKAGE)/LinuxBootPkg/LinuxBinaries/ini= trd.cpio.xz +} + +!endif + [FV.FvUefiBoot] FvAlignment =3D 16 diff --git a/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/PlatformPkgCo= nfig.dsc b/Platform/Intel/PurleyOpenBoardPkg/BoardTiogaPass/PlatformPkgConf= ig.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/L= inuxKernel.inf b/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBinari= es/LinuxKernel.inf new file mode 100644 index 0000000000..a249027d22 --- /dev/null +++ b/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBinaries/LinuxKer= nel.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/i= nitrd.cpio.xz b/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBinarie= s/initrd.cpio.xz new file mode 100644 index 0000000000000000000000000000000000000000..01d633b27e8ea9b17084fc911d0= c8cc43a4170a9 GIT binary patch literal 16 KcmZQzKm`B*5C8!H literal 0 HcmV?d00001 diff --git a/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBinaries/l= inux.efi b/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBinaries/lin= ux.efi new file mode 100644 index 0000000000000000000000000000000000000000..01d633b27e8ea9b17084fc911d0= c8cc43a4170a9 GIT binary patch literal 16 KcmZQzKm`B*5C8!H literal 0 HcmV?d00001 diff --git a/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBoot.c b/P= latform/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 rese= rved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +/** + * + * This library will load the Linux kernel and initrd from the BIOS and l= aunch 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/UefiShell= CommandLib.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 = 0D 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, St= r)); + + Data +=3D Size; + Offset +=3D Size; + DataSize -=3D Size; + } +} + + +/** + * This function completes a minimal amount of the necessary BDS function= s 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, = 0x100))); + + DumpHex(2, 0, MIN(0x100, KernelFfsSize), KernelFfsBuffer); + + // Create a LoadImage protocol for the kernel + Status =3D gBS->LoadImage(TRUE, gImageHandle, NULL, KernelFfsBuffer, K= ernelFfsSize, &KernelHandle); + if (EFI_ERROR(Status)) { + DEBUG((DEBUG_ERROR, "Could not create LoadImage for kernel %r\n", = Status)); + goto FatalError; + } + + // Get the new LoadedImage protocol to retrieve information about the = kernel + Status =3D gBS->HandleProtocol(KernelHandle, &gEfiLoadedImageProtocolG= uid, (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(struc= t boot_params)); + if (EFI_ERROR (Status)) { + DEBUG((DEBUG_ERROR, "LoadLinuxCheckKernelSetup failed; %r.\n", Sta= tus)); + 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", Handover= Params)); + + gBS->CopyMem(&HandoverParams->hdr, &BootParams->hdr, sizeof(struct set= up_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", = StartOffset, 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", Stat= us)); + 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, InitrdSi= ze))); + DumpHex(2, 0, MIN(0x100, InitrdSize), InitrdBuffer); + + // Allocate the initrd for the kernel and copy it in + InitrdData =3D LoadLinuxAllocateInitrdPages(HandoverParams, EFI_SIZE_T= O_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", MI= N(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 h= ere 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) Initrd= Data, EFI_SIZE_TO_PAGES(InitrdSize)); + if (KernelBuffer !=3D NULL) gBS->FreePages((EFI_PHYSICAL_ADDRESS) Kern= elBuffer, EFI_SIZE_TO_PAGES(HandoverParams->hdr.init_size)); + if (HandoverParams !=3D NULL) gBS->FreePages((EFI_PHYSICAL_ADDRESS) Ha= ndoverParams, 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 a= nd launching + * the Linux kernel. + * + * @note In general, this function will never return to BDS. The LINUXB= OOT_ALLOW_RETURN_TO_BDS + * token will allow you to return to BDS if the kernel fails to l= aunch 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/P= latform/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 rese= rved.
+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 re= served.
+# +# 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, 0= x8b, 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 rese= rved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +/** + * + * This library will load the Linux kernel and initrd from the BIOS and l= aunch it. + * + */ + +//------------------------------------------------------------------------= --- + +#include +#include +#include +#include + + +/** + * This is the main function for this feature. This will handle finding a= nd launching + * the Linux kernel. + * + * @note In general, this function will never return to BDS. The LINUXB= OOT_ALLOW_RETURN_TO_BDS + * token will allow you to return to BDS if the kernel fails to l= aunch for some reason. + * + * @param None + * + * @retval None + */ + +EFI_STATUS +LinuxBootStart ( + VOID + ) +{ + + return EFI_SUCCESS; +} + +//------------------------------------------------------------------------= --- diff --git a/Platform/Intel/PurleyOpenBoardPkg/LinuxBootPkg/LinuxBootNull.i= nf 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 re= served.
+# +# 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/= Intel/PurleyOpenBoardPkg/OpenBoardPkg.dec index 4dcec5430b..0c1ab318b8 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/OpenBoardPkg.dec +++ b/Platform/Intel/PurleyOpenBoardPkg/OpenBoardPkg.dec @@ -49,6 +49,8 @@ =20 gPlatformTokenSpaceGuid.PcdUpdateConsoleInBds|TRUE|BOOLEAN|0x30000035 =20 + gPlatformTokenSpaceGuid.PcdLinuxBootEnable|FALSE|BOOLEAN|0x30000036 + =20 [PcdsDynamicEx] gPlatformTokenSpaceGuid.PcdDfxAdvDebugJumper|FALSE|BOOLEAN|0x6000001D =20 diff --git a/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinP= latformPkg/Bds/Library/DxePlatformBootManagerLib/BdsPlatform.c b/Platform/I= ntel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatformPkg/Bds/Library/= DxePlatformBootManagerLib/BdsPlatform.c index b3b8ceba6f..bd0509ab10 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatform= Pkg/Bds/Library/DxePlatformBootManagerLib/BdsPlatform.c +++ b/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatform= Pkg/Bds/Library/DxePlatformBootManagerLib/BdsPlatform.c @@ -2,6 +2,7 @@ This file include all platform action which can be customized by IBV/OEM. =20 Copyright (c) 2017, Intel Corporation. All rights reserved.
+Copyright (c) 2021, American Megatrends International LLC.
SPDX-License-Identifier: BSD-2-Clause-Patent =20 **/ @@ -31,6 +32,12 @@ BOOLEAN gPPRequireUIConfirm; =20 extern UINTN mBootMenuOptionNumber; =20 +EFI_STATUS +LinuxBootStart ( + VOID + ); + + GLOBAL_REMOVE_IF_UNREFERENCED USB_CLASS_FORMAT_DEVICE_PATH gUsbClassKeyboa= rdDevicePath =3D { { { @@ -1268,6 +1275,8 @@ PlatformBootManagerAfterConsole ( LocalBootMode =3D gBootMode; DEBUG ((DEBUG_INFO, "Current local bootmode - %x\n", LocalBootMode)); =20 + LinuxBootStart(); + =20 // // Go the different platform policy with different boot mode // Notes: this part code can be change with the table policy diff --git a/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinP= latformPkg/Bds/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.= inf b/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatform= Pkg/Bds/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf index 5790743565..21ac65257c 100644 --- a/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatform= Pkg/Bds/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf +++ b/Platform/Intel/PurleyOpenBoardPkg/Override/Platform/Intel/MinPlatform= Pkg/Bds/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf @@ -2,6 +2,7 @@ # Component name for module DxePlatformBootManagerLib # # Copyright (c) 2017 - 2021, Intel Corporation. All rights reserved.
+# Copyright (c) 2021, American Megatrends International LLC.
# # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -40,6 +41,7 @@ PerformanceLib TimerLib Tcg2PhysicalPresenceLib + LinuxBootLib =20 [Packages] MdePkg/MdePkg.dec 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 c= onstructed using the fol ----------------------------------------|---------------------------------= -----------|------------------------------|--------------------| | Mt. Olympus | Purley = | PurleyOpenBoardPkg | BoardMtOlympus | =20 +| Machine Name | Supported Chipsets = | BoardPkg | Board Name | +----------------------------------------|---------------------------------= -----------|------------------------------|--------------------| +| TiogaPass | Purley = | PurleyOpenBoardPkg | BoardTiogaPass | + + #### Simics =20 | Machine Name | Supported Chipsets = | BoardPkg | Board Name | @@ -250,6 +255,12 @@ return back to the minimum platform caller. | | | | build set= tings, environment variables. | | | |---build_board.py: Optional bo= ard-specific pre-build, | | | build, post= -build and clean functions. + | | |------PurleyOpenBoardPkg + | | | |------BoardTiogaPass + | | | |---build_config.cfg: BoardTiog= aPass specific + | | | | build set= tings, environment variables. + | | | |---build_board.py: Optional bo= ard-specific pre-build, + | | | build, post= -build and clean functions. =20 | | | | | |------SimicsOpenBoardPkg | | | |------BoardX58Ich10 @@ -292,6 +303,18 @@ For PurleyOpenBoardPkg "bld cache-consume" Consume a cache of binary files from the specified = directory, BINARY_CACHE_PATH is empty, used "BinCache" as default path. =20 +For PurleyOpenBoardPkg (TiogaPass) +1. Open command window, go to the workspace directory, e.g. c:\Edk2Workspa= ce. +2. Type "cd edk2-platforms\Platform\Intel\PurleyOpenBoardPkg\BoardTiogaPas= s". +3. Type "GitEdk2MinBoardTiogaPass.bat" to setup GIT environment. +4. Type "bld" to build Purley BoardTiogaPass board UEFI firmware image, "b= ld release" for release build, "bld clean" to + remove intermediate files."bld cache-produce" Generate a cache of binar= y files in the specified directory, + "bld cache-consume" Consume a cache of binary files from the specified = directory, BINARY_CACHE_PATH is empty, + used "BinCache" as default path. =20 +5. Final BIOS image will be Build\PurleyOpenBoardPkg\BoardTiagoPass\DEBUG_= VS2015x86\FV\PLATFORM.fd or =20 + Build\PurleyOpenBoardPkg\BoardTiagoPass\RELEASE_VS2015x86\FV\PLATFORM.f= d, depending on bld batch script input. +6. This BIOS image needs to be merged with SPS FW =20 + ### **Known limitations** =20 **KabylakeOpenBoardPkg** @@ -307,6 +330,25 @@ For PurleyOpenBoardPkg 2. This firmware project does not build with the GCC compiler. 3. The validated version of iASL compiler that can build MinPurley is 2018= 0629. Older versions may generate ACPI build errors. =20 +**PurleyOpenBoardPkg Tioga Pass ** +1. This firmware project has only been tested on the Tioga Pass hardware. +2. This firmware project build has only been tested using the Microsoft Vi= sual Studio 2015 build tools. +3. This firmware project does not build with the GCC compiler. +4. The validated version of iASL compiler that can build MinPurley is 2018= 0629. Older versions may generate ACPI build errors. +5. Installed and booted to UEFI Windows 2016 on M.2 NVME slot +6. Installed and booted to UEFI Windows 2019 on M.2 NVME slot and with SAT= A HDD. +7. Installed and booted to UEFI RHEL 7.3 on SATA HDD +8. Installed and booted to Ubuntu 18.04 on M.2 NVME slot. +9. Verified Mellanox card detection during POST and OS +10. LINUX Boot Support (PcdLinuxBootEnable needs to be enabled) + +1. Follow directions on http://osresearch.net/Building/ to compile the hea= ds kernel and initrd for qemu-system_x86_64=20 +2. Copy the following built files=20 +(1) initrd.cpio.xz to LinuxBootPkg/LinuxBinaries/initrd.cpio.xz=20 +(2) bzimage to LinuxBootPkg/LinuxBinaries/linux.efi + + + **SimicsOpenBoardPkg** 1. This firmware project has only been tested booting to Microsoft Windows= 10 x64 and Ubuntu 17.10 with AHCI mode. =20 -- 2.25.0.windows.1 Please consider the environment before printing this email. The information contained in this message may be confidential and proprieta= ry to American Megatrends (AMI). This communication is intended to be read= only by the individual or entity to whom it is addressed or by their desig= nee. If the reader of this message is not the intended recipient, you are o= n notice that any distribution of this message, in any form, is strictly pr= ohibited. Please promptly notify the sender by reply e-mail or by telephon= e at 770-246-8600, and then delete or destroy all copies of the transmissio= n. -=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 (#76616): https://edk2.groups.io/g/devel/message/76616 Mute This Topic: https://groups.io/mt/83594336/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-