From nobody Sun Apr 28 22:02:24 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+77379+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+77379+1787277+3901457@groups.io ARC-Seal: i=1; a=rsa-sha256; t=1625090257; cv=none; d=zohomail.com; s=zohoarc; b=EjB/JZ76QG2pz2utvdSugaCavFb1K8dVR0XkArSh3WwapQgmswiGKcIjDEJ0ov3gr6Sr2o+tFjGafcJFDnAcJv7sNmJUtHKNTYi5M+RvVgjWThawZ3tn5h8s5viVjsMEiwJtJo1Ow9CqGX394ILPjaEkuPNsGSCAZ62RxcmjCHI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1625090257; 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=w/CZZl4WpssS52CCG/3dzHNNqsHuLLWnl1l7xgtFvwM=; b=jrPv6qmFIMBVlt7rSrlzxbw28F2sc8y7KIM8iTBoC+Fy0FWJGKe9/qmaf+zSECxJt9rwEmVSeRe31/R8ArB5pCW0auAZAQoJA6RohKt7eW5DLFGngjy+kcVEBVqwRcky33ScqXyeIgppD8soiK8LH4+8rZth1vjWVwv3Q+gfa+U= 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+77379+1787277+3901457@groups.io Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1625090257774831.2688229660602; Wed, 30 Jun 2021 14:57:37 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id 9uKXYY1788612x6eZLvBLSXi; Wed, 30 Jun 2021 14:57:37 -0700 X-Received: from atlmailgw1.ami.com (atlmailgw1.ami.com [63.147.10.40]) by mx.groups.io with SMTP id smtpd.web11.3630.1625090251387262700 for ; Wed, 30 Jun 2021 14:57:31 -0700 X-AuditID: ac1060b2-3edff70000000c56-3f-60dce8c93eae 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 atlmailgw1.ami.com (Symantec Messaging Gateway) with SMTP id 95.66.03158.AC8ECD06; Wed, 30 Jun 2021 17:57:30 -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, 30 Jun 2021 17:57:29 -0400 From: "manickavasakam karpagavinayagam" To: CC: , , , , , , Subject: [edk2-devel] [edk2-platforms][PATCH V2] PurleyOpenBoardPkg : Support for LINUX Boot Date: Wed, 30 Jun 2021 17:57:28 -0400 Message-ID: <20210630215728.13625-1-manickavasakamk@ami.com> MIME-Version: 1.0 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrIIsWRmVeSWpSXmKPExsWyRiBhgu6pF3cSDG6dF7JonzCbzaJ/xTFW i+O/PjA7MHts/36B0WPxnpdMAUxRDYw2iXl5+SWJJakKKanFybZKAUWZZYnJlUoKmSm2SoZK CgU5icmpual5JbZKiQUFqXkpSnZcChjABqgsM08hNS85PyUzL91WyTPYX9fCwtRS11DJLiQj VSEzLy2/KDexJDM/TyE5P68EqDo1BSiqkNDNmdF7czZjwYlXTBWz1rayNjB+WMDUxcjJISFg IrGj8QZzFyMXh5DALiaJG5NvsUA42xgl1s78xAZSxSZgL7F96mx2EFtEQEpiyoGZTCBFzALr GCV2Ns4AGyUs4C9x7c83oCIODhYBVYmJNy1BwrwCNhKL9l5kgdimKXF15jU2iLigxMmZT8Di zALaEssWvmaGsCUkDr54wQwyRkhAReLJMYcJjHyzkHTMQtIxC0nHAkbmVYxCiSU5uYmZOenl hnqJuZl6yfm5mxgh8bVpB2PLRfNDjEwcjIcYJTiYlUR4o3beThDiTUmsrEotyo8vKs1JLT7E 6AR0/kRmKW5QEALjJN7YwEBKFMYxNDEzMTcyN7Q0MTc2VhLnXeV+NF5IIB0Yt9mpqQWpRTBD mDg4pRoYXdcadl5TODfzTIa3QHuQ4jqH3uCdPbtUo/2spJOjzqssYVYyztDK+jHbY+ps4a7d erf5nvSseRxaulRraukRkQ18B8qq2M/GP4vuv8J877qeJZe4TP6aQ116f+8/uxWsz3nJTDOo e8X5U+lzrDwtN2fYX+24OqO7cQIf4+ElDWuueSx3WuKjxFKckWioxVxUnAgAC6dJssQCAAA= 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: LFmXdn7dc0EfFTSUEGfxghAXx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1625090257; bh=BXWkjX85m6SIJmVQ35nfsyXsW9OaZOzAPCbcJ6mrwlg=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=lqFha+lapewmgeZ62U0jmKaANgrPpyChEK3e+n649Up5eo4xlFoVyeGaM8k77DpTtuI rodrh/7jJrMQL5Bby+O9DsiUlRDCmRUmLARyKy9Rs0p/CedwpeC0+3MO5oD/gxRpB1eNv X5Vp42hYN5hH+QNof2DuNKlQMOIdPVe7e+k= 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 PurleyOpenBoardPkg/Features/LinuxBoot/LinuxBinaries/= initrd.cpio.xz (2) bzimage to PurleyOpenBoardPkg/Features/LinuxBoot/LinuxBinaries/linux.efi Notes: V2 : - Rename LinuxBootPkg to LinuxBoot - Move LinuxBootPkg to PurleyOpenBoardPkg/Features/LinuxBoot - Follow Coding Standard in LinuxBoot.C and LinuxBoot.h Signed-off-by: manickavasakam karpagavinayagam Reviewed-by: Nate DeSimone Reviewed-by: isaac.w.oram@intel.com=20 --- .../BoardTiogaPass/CoreDxeInclude.dsc | 5 +- .../BoardTiogaPass/CoreUefiBootInclude.fdf | 5 +- .../BoardTiogaPass/OpenBoardPkg.dsc | 7 + .../BoardTiogaPass/OpenBoardPkg.fdf | 57 ++- .../BoardTiogaPass/PlatformPkgConfig.dsc | 7 + .../LinuxBoot/LinuxBinaries/LinuxKernel.inf | 17 + .../LinuxBoot/LinuxBinaries/initrd.cpio.xz | Bin 0 -> 16 bytes .../LinuxBoot/LinuxBinaries/linux.efi | Bin 0 -> 16 bytes .../Features/LinuxBoot/LinuxBoot.c | 412 ++++++++++++++++++ .../Features/LinuxBoot/LinuxBoot.h | 185 ++++++++ .../Features/LinuxBoot/LinuxBoot.inf | 40 ++ .../Features/LinuxBoot/LinuxBootNull.c | 36 ++ .../Features/LinuxBoot/LinuxBootNull.inf | 25 ++ .../Intel/PurleyOpenBoardPkg/OpenBoardPkg.dec | 2 + .../DxePlatformBootManagerLib/BdsPlatform.c | 9 + .../DxePlatformBootManagerLib.inf | 2 + Platform/Intel/Readme.md | 42 ++ 17 files changed, 843 insertions(+), 8 deletions(-) create mode 100644 Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/Li= nuxBinaries/LinuxKernel.inf create mode 100644 Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/Li= nuxBinaries/initrd.cpio.xz create mode 100644 Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/Li= nuxBinaries/linux.efi create mode 100644 Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/Li= nuxBoot.c create mode 100644 Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/Li= nuxBoot.h create mode 100644 Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/Li= nuxBoot.inf create mode 100644 Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/Li= nuxBootNull.c create mode 100644 Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/Li= nuxBootNull.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..67472a1182 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)/Features/LinuxBoot/LinuxBoot.inf + LoadLinuxLib|OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.inf +!else + LinuxBootLib|$(PLATFORM_BOARD_PACKAGE)/Features/LinuxBoot/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..1623c44cd8 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)/Features/LinuxBoot/LinuxBin= aries/linux.efi +} + +FILE FREEFORM =3D 16b60e5d-f1c5-42f0-9b34-08C81C430473 { + SECTION RAW =3D $(PLATFORM_BOARD_PACKAGE)/Features/LinuxBoot/LinuxBinari= es/initrd.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/Features/LinuxBoot/LinuxBina= ries/LinuxKernel.inf b/Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot= /LinuxBinaries/LinuxKernel.inf new file mode 100644 index 0000000000..0e197ecb68 --- /dev/null +++ b/Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/LinuxBinaries/Li= nuxKernel.inf @@ -0,0 +1,17 @@ +## @file +# +# Copyright (c) 2021, American Megatrends International LLC.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[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/Features/LinuxBoot/LinuxBina= ries/initrd.cpio.xz b/Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/= LinuxBinaries/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/Features/LinuxBoot/LinuxBina= ries/linux.efi b/Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/Linux= Binaries/linux.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/Features/LinuxBoot/LinuxBoot= .c b/Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/LinuxBoot.c new file mode 100644 index 0000000000..682047cef0 --- /dev/null +++ b/Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/LinuxBoot.c @@ -0,0 +1,412 @@ +/** @file + +Copyright (c) 2021, American Megatrends International LLC. All rights rese= rved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + + +#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 BootParams *BootParams =3D NULL; + struct BootParams *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 BootParams*) LoadedImage->ImageBase; + + Status =3D LoadLinuxCheckKernelSetup((VOID *) BootParams, sizeof(struc= t BootParams)); + 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= upHeader)); + + 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.InitSize)); + if (KernelBuffer =3D=3D NULL) { + DEBUG((DEBUG_ERROR, "Unable to allocate memory for kernel.\n")); + goto FatalError; + } + + StartOffset =3D (HandoverParams->Hdr.SetupSecs + 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.Code32Start =3D (UINT32)(UINTN) KernelBuffer; + HandoverParams->Hdr.LoaderId =3D 0x21; + + DEBUG((DEBUG_INFO, "Kernel loaded.\n")); + + // + // 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.RamDiskStart =3D (UINT32)(UINTN) InitrdData; + HandoverParams->Hdr.RamDiskLen =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; + + 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.InitSize)); + 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/Features/LinuxBoot/LinuxBoot= .h b/Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/LinuxBoot.h new file mode 100644 index 0000000000..ebbcd6bfd8 --- /dev/null +++ b/Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/LinuxBoot.h @@ -0,0 +1,185 @@ +/** @file +Copyright (c) 2021, American Megatrends International LLC. All rights rese= rved.
+SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#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 SetupHeader { + UINT8 SetupSecs; // Sectors for setup code + UINT16 Rootflags; + UINT32 SysSize; + UINT16 RamSize; + UINT16 VideoMode; + UINT16 RootDev; + UINT16 Signature; // Boot signature + UINT16 Jump; + UINT32 Header; + UINT16 Version; + UINT16 SuSwitch; + UINT16 SetupSeg; + UINT16 StartSys; + UINT16 KernelVer; + UINT8 LoaderId; + UINT8 LoadFlags; + UINT16 MoveSize; + UINT32 Code32Start; // Start of code loaded high + UINT32 RamDiskStart; // Start of initial ramdisk + UINT32 RamDiskLen; // Length of initial ramdisk + UINT32 BootSectkludge; + UINT16 HeapEnd; + UINT8 ExtLoaderVer; // Extended boot loader version + UINT8 ExtLoaderType; // Extended boot loader ID + UINT32 CmdLinePtr; // 32-bit pointer to the kernel command line + UINT32 RamDiskMax; // Highest legal initrd address + UINT32 KernelAlignment; // Physical addr alignment required for kernel + UINT8 RelocatableKernel; // Whether kernel is relocatable or not + UINT8 MinAlignment; + UINT16 XloadFlags; + UINT32 CmdlineSize; + UINT32 HardwareSubarch; + UINT64 HardwareSubarchData; + UINT32 PayloadOffset; + UINT32 PayloadLength; + UINT64 SetupData; + UINT64 PrefAddress; + UINT32 InitSize; + UINT32 HandoverOffset; +}; + +struct EfiInfo { + UINT32 EfiLoaderSignature; + UINT32 EfiSystab; + UINT32 EfiMemdescSize; + UINT32 EfiMemdescVersion; + UINT32 EfiMemMap; + UINT32 EfiMemMapSize; + UINT32 EfiSystabHi; + UINT32 EfiMemMapHi; +}; + +struct E820Entry { + UINT64 Addr; // start of memory segment + UINT64 Size; // size of memory segment + UINT32 Type; // type of memory segment +}; + +struct ScreenInfo { + UINT8 OrigX; // 0x00 + UINT8 OrigY; // 0x01 + UINT16 ExtMemK; // 0x02 + UINT16 OrigVideoPage; // 0x04 + UINT8 OrigVideoMode; // 0x06 + UINT8 OrigVideoCols; // 0x07 + UINT8 Flags; // 0x08 + UINT8 Unused2; // 0x09 + UINT16 OrigVideoEgaBx;// 0x0a + UINT16 Unused3; // 0x0c + UINT8 OrigVideoLines; // 0x0e + UINT8 OrigVideoIsVGA; // 0x0f + UINT16 OrigVideoPoints;// 0x10 + + // VESA graphic mode -- linear frame buffer + UINT16 LfbWidth; // 0x12 + UINT16 LfbHeight; // 0x14 + UINT16 LfbDepth; // 0x16 + UINT32 LfbBase; // 0x18 + UINT32 LfbSize; // 0x1c + UINT16 ClMagic, ClOffset; // 0x20 + UINT16 LfbLineLength; // 0x24 + UINT8 RedSize; // 0x26 + UINT8 RedPos; // 0x27 + UINT8 GreenSize; // 0x28 + UINT8 GreenPos; // 0x29 + UINT8 BlueSize; // 0x2a + UINT8 BluePos; // 0x2b + UINT8 RsvdSize; // 0x2c + UINT8 RsvdPos; // 0x2d + UINT16 VesaPmSeg; // 0x2e + UINT16 VesaPmOff; // 0x30 + UINT16 Pages; // 0x32 + UINT16 VesaAttributes; // 0x34 + UINT32 Capabilities; // 0x36 + UINT8 Reserved[6]; // 0x3a +}; + +struct BootParams { + struct ScreenInfo ScreenInfo; + UINT8 ApmBiosInfo[0x14]; + UINT8 Pad2[4]; + UINT64 TbootAddr; + UINT8 IstInfo[0x10]; + UINT8 Pad3[16]; + UINT8 Hd0Info[16]; + UINT8 Hd1Info[16]; + UINT8 SysDescTable[0x10]; + UINT8 OlpcOfwHeader[0x10]; + UINT8 Pad4[128]; + UINT8 EdidInfo[0x80]; + struct EfiInfo EfiInfo; + UINT32 AltMemK; + UINT32 Scratch; + UINT8 E820Entries; + UINT8 EddBufEntries; + UINT8 EddMbrSigBufEntries; + UINT8 Pad6[6]; + struct SetupHeader Hdr; + UINT8 Pad7[0x290-0x1f1-sizeof(struct SetupHeader)]; + UINT32 EddMbrSigBuffer[16]; + struct E820Entry E820Map[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/Features/LinuxBoot/LinuxBoot= .inf b/Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/LinuxBoot.inf new file mode 100644 index 0000000000..5c09e5d317 --- /dev/null +++ b/Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/LinuxBoot.inf @@ -0,0 +1,40 @@ +## @file +# +# Copyright (c) 2021, American Megatrends International LLC.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[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/Features/LinuxBoot/LinuxBoot= Null.c b/Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/LinuxBootNull= .c new file mode 100644 index 0000000000..2e5e44db6c --- /dev/null +++ b/Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/LinuxBootNull.c @@ -0,0 +1,36 @@ +/** @file + +Copyright (c) 2021, American Megatrends International LLC. All rights rese= rved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + + +#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/Features/LinuxBoot/LinuxBoot= Null.inf b/Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/LinuxBootNu= ll.inf new file mode 100644 index 0000000000..e292be9671 --- /dev/null +++ b/Platform/Intel/PurleyOpenBoardPkg/Features/LinuxBoot/LinuxBootNull.inf @@ -0,0 +1,25 @@ +## @file +# +# Copyright (c) 2021, American Megatrends International LLC.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[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 (#77379): https://edk2.groups.io/g/devel/message/77379 Mute This Topic: https://groups.io/mt/83903610/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-