From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM11-CO1-obe.outbound.protection.outlook.com (NAM11-CO1-obe.outbound.protection.outlook.com []) by mx.groups.io with SMTP id smtpd.web12.4056.1607505900404124467 for ; Wed, 09 Dec 2020 01:25:01 -0800 Authentication-Results: mx.groups.io; dkim=fail reason="body hash did not verify" header.i=@os.amperecomputing.com header.s=selector2 header.b=LyzFig0y; spf=fail (domain: os.amperecomputing.com, ip: , mailfrom: nhi@os.amperecomputing.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=lG4taqhg03HPHFMBLh7sKZFjHtfWHIfKjqAcDXdn4QcXL4st10FRP/7olz0tBvk/67cKSXRhwobevhrkgsNePzMoO0pwf4Q0WeU1v+o0VI06RsR/xfhTSBnS3GgHqPEmAuX/gX5VuD7VfXB38MqJjZyoB4U8CnPha84UlQQYUqdj/kzbHbvSBGPdzysI4eLzIlEnBjvRo55pbiXAzG4AQX/Vrj8baXXq5EpO2Or+QQcrhjtH+gfEeTF/sEFH4JZ6Rk5/j5eoWMbuERH1YPwrF4/m/neurY2wi71ZC4fk8f9c6dFLvs1YLC8BeeLkcNq9GqO+xfAAcfjqiYkVddQpmg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=cKZG05Q1x/D4CFx5LzG1imigQDGQB6swDCbMPlEBM0U=; b=F48a7LJVmgzPcBdjnbIEqGuorVeAhw0GSntcS7qSxFmlq48RDrDiomjSBNBlJjFa94mVns5tAnLl1BNwZNp2uGtT5Q329x8V/xkEAKe7QUqx6bmW+FvC6+6I+cZWm0kBQ0aKbLlAf9LyXbC9B5EBfx1bi7Tdjt9k/ihwaK7xRXQ88rGDBJqwLGEBLkqrvZwobILHfP1zQZ/FDHPafSW3HX6ET5cDPE44xCBMXw5P0X2O+AU/kb6fQlOzkaYdqjXPyz2OmbOnQZfLO1LZ0KGGGFHCR2Q5rMWrVSeMIxa2nEuf+/ANKKo6RG6e+uHZjE368AKAnzNqbiuijjPz8KZMiA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=os.amperecomputing.com; dmarc=pass action=none header.from=os.amperecomputing.com; dkim=pass header.d=os.amperecomputing.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=os.amperecomputing.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=cKZG05Q1x/D4CFx5LzG1imigQDGQB6swDCbMPlEBM0U=; b=LyzFig0ygHXCKXazkp3BMrO00yVvPEspzFbaDhtxjnPMLILGAjEKYqyk2kk6aR/nHKmte1Nn32Mbp/AxRTD9a+DzUbG7m4jbdSbufOYYZFscqIwNPpXuNB+iH0Ro1uDp1KvqKKtup5RetEndO4L8LFk3T3QFD1iIbAnNtUmmt2k= Authentication-Results: edk2.groups.io; dkim=none (message not signed) header.d=none;edk2.groups.io; dmarc=none action=none header.from=os.amperecomputing.com; Received: from DM6PR01MB5849.prod.exchangelabs.com (2603:10b6:5:205::20) by DM6PR01MB5932.prod.exchangelabs.com (2603:10b6:5:14e::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3654.12; Wed, 9 Dec 2020 09:24:58 +0000 Received: from DM6PR01MB5849.prod.exchangelabs.com ([fe80::c814:9a08:5c2e:4076]) by DM6PR01MB5849.prod.exchangelabs.com ([fe80::c814:9a08:5c2e:4076%5]) with mapi id 15.20.3632.023; Wed, 9 Dec 2020 09:24:57 +0000 From: "Nhi Pham" To: devel@edk2.groups.io CC: Quan Nguyen Subject: [edk2-platforms][PATCH 31/34] AmpereAltraPkg: Add BootProgress support Date: Wed, 9 Dec 2020 16:25:28 +0700 Message-ID: <20201209092531.30867-32-nhi@os.amperecomputing.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201209092531.30867-1-nhi@os.amperecomputing.com> References: <20201209092531.30867-1-nhi@os.amperecomputing.com> X-Originating-IP: [118.69.219.201] X-ClientProxiedBy: HK0PR01CA0054.apcprd01.prod.exchangelabs.com (2603:1096:203:a6::18) To DM6PR01MB5849.prod.exchangelabs.com (2603:10b6:5:205::20) Return-Path: nhi@os.amperecomputing.com MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from sw004.amperecomputing.com (118.69.219.201) by HK0PR01CA0054.apcprd01.prod.exchangelabs.com (2603:1096:203:a6::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3654.12 via Frontend Transport; Wed, 9 Dec 2020 09:24:56 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 17edd4e8-a465-4a7e-9a6d-08d89c244bf3 X-MS-TrafficTypeDiagnostic: DM6PR01MB5932: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:9508; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 97ikotvlwGRqv4a+yK1Xjh6pUrXMoAFqqcVNnJuKKVSNFBEFZKE18a0AIQ1gQ9nC1Tsp0/yb6zY88hKkyZC/ZUzHnjkbUUE4BFUJT6xoZy4uF+vDpYpS+s6z2e+u6eFMgCPMBW9d0wgE2F/UiVU1iwsxKLkInUE0HCyxwYLhXariUW3RMXDiGZRCxegOoj0Lj9pA5KoWG2+4jhtx3FGO8Bhs4jwwK4x5+ADxeru00AF40bzxflN8j4exLh4ujVdEgKNXqBibWF5cmICrWXvbKp2jHSJVwPTZCzB9Eic1gjXruOjiVJS/IRG7rXih9qno64ikLuLi0zGvRG5Oen9wMHB8BEnCP7Be2LCSO8br4eciCJTYrKKnbccZaTghouqf X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM6PR01MB5849.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(4636009)(366004)(346002)(376002)(136003)(186003)(26005)(8936002)(107886003)(16526019)(6666004)(2906002)(86362001)(508600001)(4326008)(30864003)(66556008)(66476007)(66946007)(5660300002)(6506007)(8676002)(34490700003)(1076003)(19627235002)(2616005)(52116002)(6512007)(956004)(6486002)(6916009)(83380400001);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData: =?us-ascii?Q?OgWsJLYV/3uvPDhLg4MD5BNVsUiLV7Pp7myB34zoAbbpWz/tdXigTBg8BT7p?= =?us-ascii?Q?76VFowRiQ1tA77Tk6tnclEBP0R4msJxAOVSgzcdmH0lLjG9jOgZouyHvjk7v?= =?us-ascii?Q?XQXLvghAUYsbMPqBapzR+Ha+PenaDSuwizNkiFUaj6nCh/pM36z1jUgDC2Dr?= =?us-ascii?Q?86FPspvKR4kR3w3x4orMbBwcxGnlhettmsaxEUn0PKF3VJedgxC9zdROvc1V?= =?us-ascii?Q?6oXWfeUc6gyd2tV6GcaTrn+j9MCZ1GCiwymQzp+5OjjWxBg3xCCjb/rft/Iz?= =?us-ascii?Q?fkLBFHo7RO8ILb4Z1rC1B9qU7nHCYSRO1Ww7j/K2KfPClhr00dGk2Tg0EseG?= =?us-ascii?Q?EHH0DvZZbY6UAm6b7yKNeW2FLqzXGfsMQyx/vy1t/fRmf/oEHAPkfAyhkDM9?= =?us-ascii?Q?7ocnOwtiR6z7gOzhCFaCovRuDMjIjuUSO583yYs+wAEGIN7G7pJlh03VYe0K?= =?us-ascii?Q?SgWniPYCJe9Ygu1WfuCGoVv2Dmg+u6miwitK2ZQW8TMo4qXDlih5G/IxDSlp?= =?us-ascii?Q?h1w8YEFL00+naQJgAW1ZnEPSNQNSdom5OnC8v29jr+1D+CQ1kzuzaNgtqWLz?= =?us-ascii?Q?xjK/cgAL6G1DJFOJ6FPgDObfDIB5Ymt2AEfGiyuSO8CQQ23NvY7AMvTnCuLJ?= =?us-ascii?Q?bthrzwftnNQ9tV72PXAAaS5if5UGgny8Ncksg2O9oT/W1Im76jOFyPaSlha4?= =?us-ascii?Q?htnuQnZR4aA6FfEWJH+kJ6s7DrAD4Fd4bPM3SBInyFnMnzVXIiLRPX5wnNv9?= =?us-ascii?Q?loOsMD5BsaE02DxBsfMqrNsWnpiDT0PqstCjcoxvxwA7Z0xTkp7MYhHrLGdN?= =?us-ascii?Q?Md0HVcxG4t2EA+PjE2GOwuGfBNZrZU3TtwvMyEh9xZxBwJrRcN5VFANcUCib?= =?us-ascii?Q?NX2UUxQKLWiNLufVHzEzwRTL0v63niIHTeI8vHoWDv2sBhHIKtBKZcAI3kX2?= =?us-ascii?Q?DV2A+AKRTrcJjY7iaUU9/wZqLj2y/8nfjTB/T5uhIGcHETH21DTPAUBQ/4y9?= =?us-ascii?Q?UOG1?= X-OriginatorOrg: os.amperecomputing.com X-MS-Exchange-CrossTenant-AuthSource: DM6PR01MB5849.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Dec 2020 09:24:57.9247 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3bc2b170-fd94-476d-b0ce-4229bdc904a7 X-MS-Exchange-CrossTenant-Network-Message-Id: 17edd4e8-a465-4a7e-9a6d-08d89c244bf3 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: VXZieYi5a334dJHQRgr9QB0kYXg/bnYn/MEOOYuT0qdsfOOSd+rfekp/Q4oaGAmJl+3f19L/hU6AnW+eWCMHQ9CjMO+ksRi1CCgKN4wZOkM= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR01MB5932 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable From: Quan Nguyen BootProgress will send 32-bit UEFI Status Code via doorbell to report its progress status. Currently support reporting Progress Status Code and Error Status Code only. Other types of Status Code are ignored. Signed-off-by: Quan Nguyen --- Silicon/Ampere/AmpereAltraPkg/Ac01Pkg.dsc.inc = | 2 + Platform/Ampere/JadePkg/Jade.fdf = | 2 + Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgressDxe/BootPro= gressDxe.inf | 57 +++++ Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgressPeim/BootPr= ogressPeim.inf | 55 +++++ Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgressDxe/BootPro= gressDxe.c | 258 ++++++++++++++++++++ Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgressPeim/BootPr= ogressPeim.c | 255 +++++++++++++++++++ Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgressDxe/BootPro= gressDxe.uni | 17 ++ Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgressPeim/BootPr= ogressPeim.uni | 19 ++ 8 files changed, 665 insertions(+) diff --git a/Silicon/Ampere/AmpereAltraPkg/Ac01Pkg.dsc.inc b/Silicon/Ampere= /AmpereAltraPkg/Ac01Pkg.dsc.inc index 708b4bea003b..b62f20c4947e 100755 --- a/Silicon/Ampere/AmpereAltraPkg/Ac01Pkg.dsc.inc +++ b/Silicon/Ampere/AmpereAltraPkg/Ac01Pkg.dsc.inc @@ -535,6 +535,7 @@ [Components.common] } MdeModulePkg/Universal/ReportStatusCodeRouter/Pei/ReportStatusCodeRouter= Pei.inf MdeModulePkg/Universal/StatusCodeHandler/Pei/StatusCodeHandlerPei.inf + Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgressPeim/Boot= ProgressPeim.inf =20 # # DXE Phase modules @@ -545,6 +546,7 @@ [Components.common] } MdeModulePkg/Universal/ReportStatusCodeRouter/RuntimeDxe/ReportStatusCod= eRouterRuntimeDxe.inf MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCodeHandlerRun= timeDxe.inf + Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgressDxe/BootP= rogressDxe.inf =20 # # PCD diff --git a/Platform/Ampere/JadePkg/Jade.fdf b/Platform/Ampere/JadePkg/Jad= e.fdf index 636376ac9cb1..422ce35449b5 100755 --- a/Platform/Ampere/JadePkg/Jade.fdf +++ b/Platform/Ampere/JadePkg/Jade.fdf @@ -175,6 +175,7 @@ [FV.FV_PEI] INF Silicon/Ampere/AmpereAltraPkg/Drivers/MemoryInitPeim/MemoryInitPeim.= inf INF Silicon/Ampere/AmpereAltraPkg/Drivers/MmCommunicationPei/MmCommunica= tionPei.inf INF Silicon/Ampere/AmpereAltraPkg/Drivers/FlashPei/FlashPei.inf + INF Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgressPeim/= BootProgressPeim.inf INF ArmPkg/Drivers/CpuPei/CpuPei.inf INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf INF MdeModulePkg/Universal/Variable/Pei/VariablePei.inf @@ -223,6 +224,7 @@ [FV.FvMain] INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf INF MdeModulePkg/Universal/ReportStatusCodeRouter/RuntimeDxe/ReportStatu= sCodeRouterRuntimeDxe.inf INF MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCodeHandle= rRuntimeDxe.inf + INF Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgressDxe/B= ootProgressDxe.inf =20 # # PI DXE Drivers producing Architectural Protocols (EFI Services) diff --git a/Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgres= sDxe/BootProgressDxe.inf b/Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgre= ss/BootProgressDxe/BootProgressDxe.inf new file mode 100644 index 000000000000..ff9be3d4ceb8 --- /dev/null +++ b/Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgressDxe/Bo= otProgressDxe.inf @@ -0,0 +1,57 @@ +## @file +# This module installs Boot Progress Dxe. +# +# This module registers report status code listener to report boot progre= ss +# to SMPro. +# +# Copyright (c) 2020, Ampere Computing LLC. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION =3D 0x0001001B + BASE_NAME =3D BootProgressDxe + MODULE_UNI_FILE =3D BootProgressDxe.uni + FILE_GUID =3D 6E12F248-F0C1-11EA-B37C-9798918A2163 + MODULE_TYPE =3D DXE_DRIVER + VERSION_STRING =3D 1.0 + ENTRY_POINT =3D BootProgressDxeEntryPoint + +# +# The following information is for reference only and not required by the = build tools. +# +# VALID_ARCHITECTURES =3D AARCH64 +# + +[Sources] + BootProgressDxe.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + Silicon/Ampere/AmperePkg.dec + Silicon/Ampere/AmpereAltraPkg/Ac01Pkg.dec + +[LibraryClasses] + UefiDriverEntryPoint + UefiBootServicesTableLib + UefiRuntimeServicesTableLib + BaseLib + DebugLib + DxeServicesLib + UefiLib + SMProLib + AmpereCpuLib + +[Protocols] + gEfiRscHandlerProtocolGuid ## CONSUMES + +[FixedPcd] + gAmpereTokenSpaceGuid.PcdSmproDbBaseReg + gAmpereTokenSpaceGuid.PcdSmproNsMailboxIndex + +[Depex] + gEfiRscHandlerProtocolGuid + diff --git a/Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgres= sPeim/BootProgressPeim.inf b/Silicon/Ampere/AmpereAltraPkg/Drivers/BootProg= ress/BootProgressPeim/BootProgressPeim.inf new file mode 100644 index 000000000000..95e5f28f9b8a --- /dev/null +++ b/Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgressPeim/B= ootProgressPeim.inf @@ -0,0 +1,55 @@ +## @file +# Boot Progress Pei Module. +# +# Updates to SCP with Boot Progress information during boot. +# +# This module register report status code listener to collect boot progre= ss +# information and keep SCP posted. +# +# Copyright (c) 2020, Ampere Computing LLC. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION =3D 0x0001001B + BASE_NAME =3D BootProgressPeim + MODULE_UNI_FILE =3D BootProgressPeim.uni + FILE_GUID =3D 2E8A3B3E-F26C-11EA-BDE5-6726AD8F88BD + MODULE_TYPE =3D PEIM + VERSION_STRING =3D 1.0 + ENTRY_POINT =3D BootProgressPeiEntryPoint + +# +# The following information is for reference only and not required by the = build tools. +# +# VALID_ARCHITECTURES =3D AARCH64 +# + +[Sources] + BootProgressPeim.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + Silicon/Ampere/AmperePkg.dec + Silicon/Ampere/AmpereAltraPkg/Ac01Pkg.dec + +[LibraryClasses] + PeimEntryPoint + PeiServicesLib + BaseLib + DebugLib + SMProLib + +[Ppis] + gEfiPeiRscHandlerPpiGuid ## CONSUMES + +[FixedPcd] + gAmpereTokenSpaceGuid.PcdSmproDbBaseReg + gAmpereTokenSpaceGuid.PcdSmproNsMailboxIndex + +[Depex] + gEfiPeiRscHandlerPpiGuid + diff --git a/Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgres= sDxe/BootProgressDxe.c b/Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress= /BootProgressDxe/BootProgressDxe.c new file mode 100644 index 000000000000..cbad49417d69 --- /dev/null +++ b/Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgressDxe/Bo= otProgressDxe.c @@ -0,0 +1,258 @@ +/** @file + + This module installs Boot Progress Dxe that report boot progress to SMPr= o. + + This module registers report status code listener to report boot progres= s + to SMPro. + + Copyright (c) 2020, Ampere Computing LLC. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define BIOS_BOOT_PROG_SET 1 +#define BIOS_BOOT_STAGE 8 + +#define BOOT_STATE_MASK 0x0000FFFF +#define BOOT_STATE_SHIFT 0 +#define STATUS_MASK 0xFFFF0000 +#define STATUS_SHIFT 16 + +#define SOCKET_BASE_OFFSET 0x400000000000 + +#define BASE_REG (FixedPcdGet64 (PcdSmproDbBaseReg)) +#define MAILBOX (FixedPcdGet32 (PcdSmproNsMailboxIndex)) + +typedef struct { + UINT8 Byte; + EFI_STATUS_CODE_VALUE Value; +} STATUS_CODE_TO_CHECKPOINT; + +enum BOOT_PROGRESS_STATE { + BOOT_NOTSTART =3D 0, + BOOT_START =3D 1, + BOOT_COMPLETE =3D 2, + BOOT_FAILED =3D 3, +}; + +UINT32 DxeProgressCode[] =3D { + (EFI_SOFTWARE_DXE_CORE | EFI_SW_DXE_CORE_PC_ENTRY_POINT), // DXE Cor= e is started + (EFI_COMPUTING_UNIT_CHIPSET | EFI_CHIPSET_PC_DXE_HB_INIT), // PCI hos= t bridge initialization + (EFI_SOFTWARE_DXE_CORE | EFI_SW_DXE_CORE_PC_HANDOFF_TO_NEXT), // Boot De= vice Selection (BDS) phase is started=C2=A0 + (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_PC_BEGIN_CONNECTING_DRIVERS)= , // Driver connecting is started + (EFI_IO_BUS_PCI | EFI_IOB_PC_INIT), // PCI Bus initialization= is started + (EFI_IO_BUS_PCI | EFI_IOB_PCI_HPC_INIT), // PCI Bus Hot Plug Contr= oller Initialization + (EFI_IO_BUS_PCI | EFI_IOB_PCI_BUS_ENUM), // PCI Bus Enumeration + (EFI_IO_BUS_PCI | EFI_IOB_PCI_RES_ALLOC), // PCI Bus Request Resour= ces + (EFI_IO_BUS_PCI | EFI_IOB_PC_ENABLE), // PCI Bus Assign Resourc= es + (EFI_PERIPHERAL_LOCAL_CONSOLE | EFI_P_PC_INIT),// Console Output devices= connect + (EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_INIT), // Console input devices = connect + (EFI_IO_BUS_LPC | EFI_IOB_PC_INIT), // Super IO Initializatio= n + (EFI_IO_BUS_USB | EFI_IOB_PC_INIT), // USB initialization is = started + (EFI_IO_BUS_USB | EFI_IOB_PC_RESET), // USB Reset + (EFI_IO_BUS_USB | EFI_IOB_PC_DETECT), // USB Detect + (EFI_IO_BUS_USB | EFI_IOB_PC_ENABLE), // USB Enable + (EFI_IO_BUS_SCSI | EFI_IOB_PC_INIT), // SCSI initialization is= started + (EFI_IO_BUS_SCSI | EFI_IOB_PC_RESET), // SCSI Reset + (EFI_IO_BUS_SCSI | EFI_IOB_PC_DETECT), // SCSI Detect + (EFI_IO_BUS_SCSI | EFI_IOB_PC_ENABLE), // SCSI Enable + (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_PC_VERIFYING_PASSWORD), = // Setup Verifying Password + (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_PC_USER_SETUP), = // Start of Setup + (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_PC_INPUT_WAIT), = // Setup Input Wait + (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_PC_READY_TO_BOOT_EVENT), = // Ready To Boot event + (EFI_SOFTWARE_EFI_BOOT_SERVICE | EFI_SW_BS_PC_EXIT_BOOT_SERVICES), = // Exit Boot Services event + (EFI_SOFTWARE_EFI_RUNTIME_SERVICE | EFI_SW_RS_PC_SET_VIRTUAL_ADDRESS_MAP= ), // Runtime Set Virtual Address MAP Begin + (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_PC_VIRTUAL_ADDRESS_CHANGE_EV= ENT),// Runtime Set Virtual Address MAP End + (EFI_SOFTWARE_EFI_RUNTIME_SERVICE | EFI_SW_RS_PC_RESET_SYSTEM), = // System Reset + (EFI_IO_BUS_USB | EFI_IOB_PC_HOTPLUG), // USB hot plug + (EFI_IO_BUS_PCI | EFI_IOB_PC_HOTPLUG), // PCI bus hot plug + 0 // Must ended by 0 +}; + +UINT32 DxeErrorCode[] =3D { + (EFI_SOFTWARE_DXE_CORE | EFI_SW_DXE_CORE_EC_NO_ARCH), // Some of the Ar= chitectural Protocols are not available + (EFI_IO_BUS_PCI | EFI_IOB_EC_RESOURCE_CONFLICT), // PCI resource a= llocation error. Out of Resources + (EFI_PERIPHERAL_LOCAL_CONSOLE | EFI_P_EC_NOT_DETECTED),// No Console Out= put Devices are found + (EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_NOT_DETECTED), // No Console Inp= ut Devices are found + (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_EC_INVALID_PASSWORD), /= / Invalid password + (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_EC_BOOT_OPTION_LOAD_ERROR),/= / Error loading Boot Option (LoadImage returned error) + (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_EC_BOOT_OPTION_FAILED), /= / Boot Option is failed (StartImage returned error) + (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_UPDATE_FAIL), /= / Flash update is failed + (EFI_SOFTWARE_EFI_RUNTIME_SERVICE | EFI_SW_PS_EC_RESET_NOT_AVAILABLE), /= / Reset protocol is not available + 0 // Must end by 0 +}; + +EFI_RSC_HANDLER_PROTOCOL *mRscHandlerProtocol =3D NULL; + +STATIC UINT8 mBootstate =3D BOOT_START; + +STATIC +BOOLEAN +StatusCodeFilter ( + UINT32 *Map, + EFI_STATUS_CODE_VALUE Value + ) +{ + UINTN Index =3D 0; + + while (Map[Index] !=3D 0) { + if (Map[Index] =3D=3D Value) { + return TRUE; + } + Index++; + } + return FALSE; +} + +/** + * Send boot progress data to SMPro. + * + * @param Data to send to SMPro. + * @return + * EFI_DEVICE_ERROR: Error while sending to SMPro. + * EFI_SUCCESS + * + **/ +STATIC +EFI_STATUS +BootProgressSendSMpro ( + IN UINT32 Data1, + IN UINT32 Data2 + ) +{ + UINT32 NumSockets; + UINT32 Msg; + EFI_STATUS Status; + UINT32 Index; + + Msg =3D SMPRO_BOOT_PROCESS_ENCODE_MSG (BIOS_BOOT_PROG_SET, BIOS_BOOT_STA= GE); + + NumSockets =3D GetNumberActiveSockets (); + for (Index =3D 0; Index < NumSockets; Index++) { + Status =3D SMProDBWr (MAILBOX, Msg, Data1, Data2, BASE_REG + (SOCKET_B= ASE_OFFSET * Index)); + if (EFI_ERROR (Status)) { + return EFI_DEVICE_ERROR; + } + } + + return EFI_SUCCESS; +} + +/** + Report status code listener of Boot Progress Dxe. + + @param[in] CodeType Indicates the type of status code being = reported. + @param[in] Value Describes the current status of a hardwa= re or software entity. + This included information about the clas= s and subclass that is used to + classify the entity as well as an operat= ion. + @param[in] Instance The enumeration of a hardware or softwar= e entity within + the system. Valid instance numbers start= with 1. + @param[in] CallerId This optional parameter may be used to i= dentify the caller. + This parameter allows the status code dr= iver to apply different rules to + different callers. + @param[in] Data This optional parameter may be used to p= ass additional data. + + @retval EFI_SUCCESS Status code is what we expected. + @retval EFI_UNSUPPORTED Status code not supported. + +**/ +EFI_STATUS +EFIAPI +BootProgressListenerDxe ( + IN EFI_STATUS_CODE_TYPE CodeType, + IN EFI_STATUS_CODE_VALUE Value, + IN UINT32 Instance, + IN EFI_GUID *CallerId, + IN EFI_STATUS_CODE_DATA *Data + ) +{ + BOOLEAN IsProgress =3D FALSE; + BOOLEAN IsError =3D FALSE; + + if ((CodeType & EFI_STATUS_CODE_TYPE_MASK) =3D=3D EFI_PROGRESS_CODE) { + IsProgress=3D StatusCodeFilter (DxeProgressCode, Value); + } + else if ((CodeType & EFI_STATUS_CODE_TYPE_MASK) =3D=3D EFI_ERROR_CODE) { + IsError =3D StatusCodeFilter (DxeErrorCode, Value); + } + else { + return EFI_SUCCESS; + } + + if (!IsProgress && !IsError) { + return EFI_SUCCESS; + } + + DEBUG ((DEBUG_INFO, + "BootProgressDxe: CodeType=3D0x%X Value=3D0x%X Instance=3D0x%X CallerI= dGuid=3D%g Data=3D%p\n", + CodeType, Value, Instance, CallerId, Data + )); + + if (IsError) { + mBootstate =3D BOOT_FAILED; + } + else if (Value =3D=3D (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_PC_REA= DY_TO_BOOT_EVENT)) { + /* Complete boot because of ready to boot checkpoint*/ + mBootstate =3D BOOT_COMPLETE; + } + else if (Value =3D=3D (EFI_SOFTWARE_EFI_BOOT_SERVICE | EFI_SW_BS_PC_EXIT= _BOOT_SERVICES) && + mRscHandlerProtocol !=3D NULL) { + mRscHandlerProtocol->Unregister (BootProgressListenerDxe); + return EFI_SUCCESS; + } + + BootProgressSendSMpro ( + (((UINT32) mBootstate << BOOT_STATE_SHIFT) & BOOT_STATE_MASK) | (((UIN= T32) Value << STATUS_SHIFT) & STATUS_MASK), + Value >> STATUS_SHIFT + ); + + return EFI_SUCCESS; +} + + +/** + The module Entry Point of the Firmware Performance Data Table DXE driver= . + + @param[in] ImageHandle The firmware allocated handle for the EFI ima= ge. + @param[in] SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The entry point is executed successfully. + @retval Other Some error occurs when executing this entry point= . + +**/ +EFI_STATUS +EFIAPI +BootProgressDxeEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + // + // Get Report Status Code Handler Protocol. + // + Status =3D gBS->LocateProtocol (&gEfiRscHandlerProtocolGuid, NULL, (VOID= **) &mRscHandlerProtocol); + ASSERT_EFI_ERROR (Status); + + // + // Register report status code listener for OS Loader load and start. + // + if (!EFI_ERROR (Status)) { + Status =3D mRscHandlerProtocol->Register (BootProgressListenerDxe, TPL= _HIGH_LEVEL); + } + ASSERT_EFI_ERROR (Status); + + return EFI_SUCCESS; +} diff --git a/Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgres= sPeim/BootProgressPeim.c b/Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgre= ss/BootProgressPeim/BootProgressPeim.c new file mode 100644 index 000000000000..7daf2d3e8a1c --- /dev/null +++ b/Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgressPeim/B= ootProgressPeim.c @@ -0,0 +1,255 @@ +/** @file + + This module installs Boot Progress Pei to report boot progress to SMPro. + + This module registers report status code listener to report boot progres= s + to SMPro. + + Copyright (c) 2020, Ampere Computing LLC. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define BIOS_BOOT_PROG_SET 1 +#define BIOS_BOOT_STAGE 8 + +#define BOOT_STATE_MASK 0x0000FFFF +#define BOOT_STATE_SHIFT 0 +#define STATUS_MASK 0xFFFF0000 +#define STATUS_SHIFT 16 + +#define SOCKET_BASE_OFFSET 0x400000000000 + +#define BASE_REG (FixedPcdGet64 (PcdSmproDbBaseReg)) +#define MAILBOX (FixedPcdGet32 (PcdSmproNsMailboxIndex)) + +enum BOOT_PROGRESS_STATE { + BOOT_NOTSTART =3D 0, + BOOT_START =3D 1, + BOOT_COMPLETE =3D 2, + BOOT_FAILED =3D 3, +}; + +UINT32 PeiProgressStatusCode[] =3D { + //Regular boot + (EFI_SOFTWARE_PEI_CORE | EFI_SW_PEI_CORE_PC_ENTRY_POINT), // PEI Cor= e is started + (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_PC_POWER_ON_INIT),// Pre-= memory CPU initialization is started + (EFI_SOFTWARE_PEI_SERVICE | EFI_SW_PS_PC_INSTALL_PEI_MEMORY), // Memory = Installed + (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_PC_INIT_BEGIN), // CPU pos= t-memory initialization is started + (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_PC_CACHE_INIT),// CPU pos= t-memory initialization. Cache initialization + (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_PC_AP_INIT), // CPU pos= t-memory initialization. Application Processor(s) (AP) initialization + (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_PC_BSP_SELECT),// CPU pos= t-memory initialization. Boot Strap Processor (BSP) selection + (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_PC_SMM_INIT), // CPU pos= t-memory initialization. System Management Mode (SMM) initialization + // DXE IPL is started + (EFI_SOFTWARE_PEI_CORE | EFI_SW_PEI_CORE_PC_HANDOFF_TO_NEXT), // DXE IPL= is started + // DXE Core is started + (EFI_SOFTWARE_DXE_CORE | EFI_SW_DXE_CORE_PC_ENTRY_POINT), // DXE Cor= e is started + //Recovery + (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_PC_RECOVERY_AUTO), // Recovery con= dition triggered by firmware (Auto recovery) + (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_PC_RECOVERY_USER), // Recovery con= dition triggered by user (Forced recovery) + (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_PC_RECOVERY_BEGIN),// Recovery pro= cess started + (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_PC_CAPSULE_LOAD), // Recovery fir= mware image is found + (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_PC_CAPSULE_START), // Recovery fir= mware image is loaded + //S3 + (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_PC_S3_BOOT_SCRIPT),//S3 Boot Scrip= t execution + (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_PC_OS_WAKE), //OS S3 wake ve= ctor call + 0 // Must end with 0 +}; + +UINT32 PeiErrorStatusCode[] =3D { + //Regular boot + (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_INVALID_TYPE), // Memory i= nitialization error. Invalid memory type + (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_INVALID_SPEED),// Memory i= nitialization error. Incompatible memory speed + (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_SPD_FAIL), // Memory i= nitialization error. SPD reading has failed + (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_INVALID_SIZE), // Memory i= nitialization error. Invalid memory size + (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_MISMATCH), // Memory i= nitialization error. Memory modules do not match + (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_NONE_DETECTED),// Memory i= nitialization error. No usable memory detected + (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_NONE_USEFUL), // Memory i= nitialization error. No usable memory detected + (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_EC_NON_SPECIFIC), // Unspecif= ied memory initialization error. + (EFI_SOFTWARE_PEI_CORE | EFI_SW_PEI_CORE_EC_MEMORY_NOT_INSTALLED),// Mem= ory not installed + (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_INVALID_TYPE), // Inv= alid CPU type + (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_INVALID_SPEED), // Inv= alid CPU Speed + (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_MISMATCH), // CPU= mismatch + (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_SELF_TEST), // CPU= self test failed + (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_CACHE), // pos= sible CPU cache error + (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_INTERNAL), // Int= ernal CPU error + (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_EC_NON_SPECIFIC), // Int= ernal CPU error + (EFI_SOFTWARE_PEI_SERVICE | EFI_SW_PS_EC_RESET_NOT_AVAILABLE), // res= et PPI is not available + //Recovery + (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_EC_RECOVERY_PPI_NOT_FOUND), // Rec= overy PPI is not available + (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_EC_NO_RECOVERY_CAPSULE), // Rec= overy capsule is not found + (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_EC_INVALID_CAPSULE_DESCRIPTOR),//I= nvalid recovery capsule + //S3 Resume + (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_S3_RESUME_FAIL), // S3 = Resume Failed + (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_EC_S3_RESUME_PPI_NOT_FOUND),// S3 = Resume PPI not found + (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_EC_S3_BOOT_SCRIPT_ERROR), // S3 = Resume Boot Script Error + (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_EC_S3_OS_WAKE_ERROR), // S3 = OS Wake Error + 0 +}; + +// Should always be BOOT_START when start +STATIC UINT8 mBootstate =3D BOOT_START; + +STATIC +BOOLEAN +StatusCodeFilter ( + UINT32 *Map, + EFI_STATUS_CODE_VALUE Value + ) +{ + UINTN Index =3D 0; + + while (Map[Index] !=3D 0) { + if (Map[Index] =3D=3D Value) { + return TRUE; + } + Index++; + } + + return FALSE; +} + +/** + * Send boot progress data to SMPro. + * + * @param Data to send to SMPro. + * @return + * EFI_DEVICE_ERROR: Error while sending to SMPro. + * EFI_SUCCESS + * + **/ +STATIC +EFI_STATUS +BootProgressSendSMpro ( + IN UINT32 Data1, + IN UINT32 Data2 + ) +{ + UINT32 NumSockets; + UINT32 Msg; + EFI_STATUS Status; + UINT32 Index; + + Msg =3D SMPRO_BOOT_PROCESS_ENCODE_MSG (BIOS_BOOT_PROG_SET, BIOS_BOOT_STA= GE); + + NumSockets =3D GetNumberActiveSockets (); + for (Index =3D 0; Index < NumSockets; Index++) { + Status =3D SMProDBWr (MAILBOX, Msg, Data1, Data2, BASE_REG + (SOCKET_B= ASE_OFFSET * Index)); + if (EFI_ERROR (Status)) { + return EFI_DEVICE_ERROR; + } + } + + return EFI_SUCCESS; +} + +/** + Report status code listener for PEI. This is used to record the boot pro= gress info + and report it to SMPro. + + @param[in] PeiServices An indirect pointer to the EFI_PEI_SERVI= CES table published by the PEI Foundation. + @param[in] CodeType Indicates the type of status code being = reported. + @param[in] Value Describes the current status of a hardwa= re or software entity. + This included information about the clas= s and subclass that is used to + classify the entity as well as an operat= ion. + @param[in] Instance The enumeration of a hardware or softwar= e entity within + the system. Valid instance numbers start= with 1. + @param[in] CallerId This optional parameter may be used to i= dentify the caller. + This parameter allows the status code dr= iver to apply different rules to + different callers. + @param[in] Data This optional parameter may be used to p= ass additional data. + + @retval EFI_SUCCESS Status code is what we expected. + @retval EFI_UNSUPPORTED Status code not supported. + +**/ +EFI_STATUS +EFIAPI +BootProgressListenerPei ( + IN CONST EFI_PEI_SERVICES **PeiServices, + IN EFI_STATUS_CODE_TYPE CodeType, + IN EFI_STATUS_CODE_VALUE Value, + IN UINT32 Instance, + IN CONST EFI_GUID *CallerId, + IN CONST EFI_STATUS_CODE_DATA *Data + ) +{ + BOOLEAN IsProgress =3D FALSE; + BOOLEAN IsError =3D FALSE; + + if ((CodeType & EFI_STATUS_CODE_TYPE_MASK) =3D=3D EFI_PROGRESS_CODE) { + IsProgress =3D StatusCodeFilter (PeiProgressStatusCode, Value); + } else if ((CodeType & EFI_STATUS_CODE_TYPE_MASK) =3D=3D EFI_ERROR_CODE)= { + IsError =3D StatusCodeFilter (PeiErrorStatusCode, Value); + } else { + return EFI_SUCCESS; + } + + // No interested status found + if (!IsProgress && !IsError) { + return EFI_SUCCESS; + } + + DEBUG ((DEBUG_INFO, + "BootProgressPeim: CodeType=3D0x%X Value=3D0x%X Instance=3D0x%X Caller= IdGuid=3D%g Data=3D%p\n", + CodeType, Value, Instance, CallerId, Data + )); + + if (IsError) { + mBootstate =3D BOOT_FAILED; + } + + BootProgressSendSMpro ( + (((UINT32) mBootstate << BOOT_STATE_SHIFT) & BOOT_STATE_MASK) | (((UIN= T32) Value << STATUS_SHIFT) & STATUS_MASK), + Value >> STATUS_SHIFT + ); + + return EFI_SUCCESS; +} + +/** + Main entry for Boot Progress PEIM. + + This routine is to register report status code listener for Boot Progres= s PEIM. + + @param[in] FileHandle Handle of the file being invoked. + @param[in] PeiServices Pointer to PEI Services table. + + @retval EFI_SUCCESS Report status code listener is registered successful= ly. + +**/ +EFI_STATUS +EFIAPI +BootProgressPeiEntryPoint ( + IN EFI_PEI_FILE_HANDLE FileHandle, + IN CONST EFI_PEI_SERVICES **PeiServices + ) +{ + EFI_STATUS Status; + EFI_PEI_RSC_HANDLER_PPI *RscHandler; + + Status =3D PeiServicesLocatePpi ( + &gEfiPeiRscHandlerPpiGuid, + 0, + NULL, + (VOID **) &RscHandler + ); + ASSERT_EFI_ERROR (Status); + + if (!EFI_ERROR (Status)) { + Status =3D RscHandler->Register (BootProgressListenerPei); + } + ASSERT_EFI_ERROR (Status); + + return EFI_SUCCESS; +} diff --git a/Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgres= sDxe/BootProgressDxe.uni b/Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgre= ss/BootProgressDxe/BootProgressDxe.uni new file mode 100644 index 000000000000..ea6bae806b1a --- /dev/null +++ b/Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgressDxe/Bo= otProgressDxe.uni @@ -0,0 +1,17 @@ +// +// This module installs Boot Progress Dxe that report boot progress to SMP= ro. +// +// This module registers report status code listener to report boot progre= ss +// for SMPro. +// +// Copyright (c) 2020, Ampere Computing LLC. All rights reserved.
+// +// SPDX-License-Identifier: BSD-2-Clause-Patent +// +// + + +#string STR_MODULE_ABSTRACT #language en-US "Installs Boot Pro= gress Driver" + +#string STR_MODULE_DESCRIPTION #language en-US "This module regis= ters report status code listener to collect and report boot progress to SMP= ro." + diff --git a/Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgres= sPeim/BootProgressPeim.uni b/Silicon/Ampere/AmpereAltraPkg/Drivers/BootProg= ress/BootProgressPeim/BootProgressPeim.uni new file mode 100644 index 000000000000..d356b0ccbc00 --- /dev/null +++ b/Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgressPeim/B= ootProgressPeim.uni @@ -0,0 +1,19 @@ +// +// Boot Progress Pei Module. +// +// Updates to SCP with Boot Progress information during boot +// +// This module register report status code listener to collect boot progre= ss +// information and keep SCP posted. +// +// Copyright (c) 2020, Ampere Computing LLC. All rights reserved.
+// +// SPDX-License-Identifier: BSD-2-Clause-Patent +// +// + + +#string STR_MODULE_ABSTRACT #language en-US "Boot Progress Pei= Module." + +#string STR_MODULE_DESCRIPTION #language en-US "Updates SCP with = boot progress information during boot. This module register report status c= ode listener to collect boot progress information and post to SCP." + --=20 2.17.1