From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM12-BN8-obe.outbound.protection.outlook.com (NAM12-BN8-obe.outbound.protection.outlook.com [40.107.237.138]) by mx.groups.io with SMTP id smtpd.web08.4745.1634883594507735105 for ; Thu, 21 Oct 2021 23:19:54 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="body hash did not verify" header.i=@os.amperecomputing.com header.s=selector2 header.b=Oq3otUZA; spf=pass (domain: os.amperecomputing.com, ip: 40.107.237.138, mailfrom: nhi@os.amperecomputing.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=mGY7ln3SGzzHR3xAddvoqz65yISeOq0cU0N1rjsloMfTFETYd6803V/0mnaozhTz3+e1l1HORe2qDYpPfleWuHMpYZWZ5kdqhpD3YLBvl+lq1IFFOIoWrmqJT1s/OQ9Yy//XTjhT30WdW5xQ8fhvRJnkvqEduZQmwZ3pRO4QnUCzyQTo4/OfY/0nGLZXtRu83243dTxReUeO0bUgBSVujvcyKSlFGKzFXNObF+KP7ygxIrpj2FYGUr+gLYa7fBl5yjSQGE1r0g513ZosYIb7yxIiU29/Z4yg8SGT7tBNazMljshHpzblxm4HSz45OpsVahsyX8WNtvOccENga4uyuw== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=sr/zagk4/LvpRWPIDDWV2Ooc7I2axFDipE2z5PPcmlk=; b=liYbYMxkdDbEfkiy+qY59v2x7I838j9nq+39AaQkacXIdatWMrn4XYbxZd5THwZVxJ382ti0cTLRumI30TcRox8WqzN9IA/aHze7FeiGbnr0vqz61lSNYSyofIR82L5POceBsD+5cFf8SdJinJIkVpqisyqFmc1Q2OiEIvouQJcg4uVzrSAyCaWKHUE/appMZhOi7UU7Ckh6VJuYYudAojA0ataaW0C7nYKnDTBXCGlsSP+Qg7+n2W1/y9gPZC5dz5aBaqtFyEPfLHk2acpRsn3dFn84xHWrQWwLdK+R8XlAbVUyVnPlrah6ueeg5//AUzvJ4UTBKT0a/382yvEkpg== 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=sr/zagk4/LvpRWPIDDWV2Ooc7I2axFDipE2z5PPcmlk=; b=Oq3otUZArHOLpnneOYoYUyp3d7CsRy00HfUv9CLQffFvQ3VfQ6AAaVA8xAGyiQt5sSGBuRN0ru3Wz3PmhsxGxfOHcdTd80cr9otfwNjyxfJoi7wZZPFny8By1bOur36PDZo3JRejdXCGjy8qg6OtusUFInBOt/wsx0K1FCNk6XA= 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 PH0PR01MB7287.prod.exchangelabs.com (2603:10b6:510:10a::21) by PH0PR01MB6103.prod.exchangelabs.com (2603:10b6:510:13::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4608.16; Fri, 22 Oct 2021 06:19:48 +0000 Received: from PH0PR01MB7287.prod.exchangelabs.com ([fe80::254c:9533:7f35:aee]) by PH0PR01MB7287.prod.exchangelabs.com ([fe80::254c:9533:7f35:aee%4]) with mapi id 15.20.4628.016; Fri, 22 Oct 2021 06:19:48 +0000 From: "Nhi Pham" To: devel@edk2.groups.io CC: patches@amperecomputing.com, nhi@os.amperecomputing.com, vunguyen@os.amperecomputing.com, Quan Nguyen , Thang Nguyen , Chuong Tran , Phong Vo , Leif Lindholm , Michael D Kinney , Ard Biesheuvel , Nate DeSimone Subject: [edk2-platforms][PATCH v4 07/31] AmpereAltraPkg: Add BootProgress support Date: Fri, 22 Oct 2021 13:17:45 +0700 Message-ID: <20211022061809.31087-8-nhi@os.amperecomputing.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20211022061809.31087-1-nhi@os.amperecomputing.com> References: <20211022061809.31087-1-nhi@os.amperecomputing.com> X-ClientProxiedBy: HK2PR02CA0168.apcprd02.prod.outlook.com (2603:1096:201:1f::28) To PH0PR01MB7287.prod.exchangelabs.com (2603:10b6:510:10a::21) Return-Path: nhi@os.amperecomputing.com MIME-Version: 1.0 Received: from sw004.amperecomputing.com (118.69.219.201) by HK2PR02CA0168.apcprd02.prod.outlook.com (2603:1096:201:1f::28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4628.16 via Frontend Transport; Fri, 22 Oct 2021 06:19:45 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 46229e82-6452-4da4-fc95-08d99523f2f5 X-MS-TrafficTypeDiagnostic: PH0PR01MB6103: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:9508; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: nv5A9XySYGnuRy9KhktSCxLOC+j+ke9FJ9g1hb+n3dk6ivmVxK9Sqv+W+aldSUgokarTlvwO3fDm+MV1VDO1YWgONPKyQmoH/yZqV0IK9shjXY6N29dwOET+B8E25apTmFRt0o5KmFoobHMQxdFM+MWKEjvxD9iyBEK/Xy1CZToiYUjaSIC6wryR8iga5q+LbmcxzVM9bJm9vHY88B3qtyGS4XIsthF/6UXrfKurSU1e1b+TmLPVeijB9kly/rdGz2z6M6twhlYNxLDQRl5XUPT7ZaZ/Kj3CtDDgqSXyrva3U2tYaKzLfE8nDNJIW8NcjigAVrKZweqqAcD/lBry/S3C1AmSXLlJVxvP4uAFM6fErXk52zaqjZO3F7jWQxb+Ga/rE8L7HU8v372u7n7hrGvaBS8JEg/4wP54Tb546yiV6gpjAen3RFtrEwEXZq8Ptig3rko9/uHkiArSjhEH8L7ZAvqwiP0j9t8GZhVKnRAIvxN+nqgvzWq/hBjRlzQK7NyYtZMszREjpETSl/0EeOvMOvxvgL1JLNgqacSxFDZkLLuQP557UPSrQxMvHppGAsWcDcMNCnHwLrMWkeYdacup4i7TDBBSOYOQEzmwmXd9NPPXXh76j76klGscUZF7KJvm676R4mS3+3GEs27B2qH1SH3mnnH7HBTPDMNr393UJjDaSRPCr76Yfn023zc920+ZBUD9SOcPnaSHIRGFyw== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH0PR01MB7287.prod.exchangelabs.com;PTR:;CAT:NONE;SFS:(4636009)(366004)(5660300002)(2906002)(86362001)(38100700002)(508600001)(66946007)(6916009)(316002)(186003)(66476007)(4326008)(1076003)(8936002)(956004)(2616005)(8676002)(83380400001)(6512007)(6486002)(26005)(52116002)(66556008)(30864003)(38350700002)(54906003)(6506007);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?dMJFthzvwjse4VsdHu1r7GAEsE/tLLsfRfaHAYbQzu9huQEBLAnHGSxkplwH?= =?us-ascii?Q?VTlQZLphGmtEPzBTISj7wOkqwFaUkd9bvwc1ztPKfTWM8DI2OvMmuFwlsrau?= =?us-ascii?Q?0v7/cBlaNdKM62DEqHQnmIxTTQFhG3vZaoXQTuD8B+3Y9dPrp5I42rz6gH1R?= =?us-ascii?Q?tqEpt0/SMOlKMKDQyHDCFaiKoyUffeINjRQ4lTOfk2CJo3UQj28H1arxVpNm?= =?us-ascii?Q?idubNSF/TLAYUboTH80p/GAwP9EPk2Hk4vUmm0yx3rXLcxDl8ZgApoeD4mGL?= =?us-ascii?Q?9gKS4aSvwg7WM4Y6/qBN8ZUSi4yqOQOBuahOJxNVfGI7/UnzuSomDWMGZhj/?= =?us-ascii?Q?+kOpPN9JoDegCOU9Di3mlxecdhwupR7woUkO6UrR6IqIQ80MPvfFUSlIrnVE?= =?us-ascii?Q?DJKq5kILPbFb6/HqRUFI8zrsse1YkVvzog/JSoZDR5xwxO5mM5xqqsD1R406?= =?us-ascii?Q?egzw2YoU2CLdqc4fUIXCXvdvovx5LwBZMQqxCarGfldDvBRTo2HgH5tjcqkL?= =?us-ascii?Q?xYNl8KVNlDTyi2RWI/x3mNL/5SBS27uQjBRbezS9nv1UtEmAsGNuRpS2k8+v?= =?us-ascii?Q?pWOuBEM0Wls69oyAvQ82xvu2zRZmO9MRa9fU+Q8a0WVVrkKCr0sANTSbfPIy?= =?us-ascii?Q?Mm7ijGfaSbwtkATbwTh3Jpb4Zk0H2VdzUoIHDO1J0/eJnJLwA9q1phfTaMX5?= =?us-ascii?Q?bF0gAQyr7aIR21fLTkp43ED/vjUInTepGPvvhtK2LpUHVpRVKkMLbUyUisZu?= =?us-ascii?Q?J7nQWm0LYf9+SN7qrOuw1pdltsdchSh8bY6lfQY/IoLb9YwtoxYT8IxfGwAI?= =?us-ascii?Q?4KkdW1Ke7j+2d6SBqDvnmH1RoPvOqY2MbGunZhH0mWx5maHIZGEyXx1mEggs?= =?us-ascii?Q?DRvtJo4WSd0nv62IbC7NBo/DCAvNj970SdJynN9FKtxWypIygYqIdVHZgRYv?= =?us-ascii?Q?XMZuwJf8IHO88jAl+S8SnXYquUCXnJFBiD71KBDeLBRk7cBcBe7naPH27VZK?= =?us-ascii?Q?C42qptxXL1M++g2IAixL/lrk+Eq64B0+2LPGb/SqvVwcq8TWukD0Lv1irvwL?= =?us-ascii?Q?zeJ2Zf/dVCBfV91I8475daDieoDId7Y1AKP/BritPR0PaZi4b8cKekFWG+F8?= =?us-ascii?Q?CMeKgtRO9ewN/f+oXGo7oITr8Kv1QBIK/7DdN6eHM7VnCi/PYJv3uGradVCf?= =?us-ascii?Q?HTdTHEWS0nx+ANrw1mDvWxV2PoW0NjeJK6KYPzI/E4zDPF/4MWPPfJ3eMYSL?= =?us-ascii?Q?iO/+C9kW+29JvPwqt51pRtaPkLB2TbXRgQOvynMeD9xZL7FSFi6+HP1GMkgi?= =?us-ascii?Q?zEWQzQPkmGw+NVJZUkAIhn93?= X-OriginatorOrg: os.amperecomputing.com X-MS-Exchange-CrossTenant-Network-Message-Id: 46229e82-6452-4da4-fc95-08d99523f2f5 X-MS-Exchange-CrossTenant-AuthSource: PH0PR01MB7287.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Oct 2021 06:19:48.5542 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3bc2b170-fd94-476d-b0ce-4229bdc904a7 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: nhi@amperemail.onmicrosoft.com X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR01MB6103 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. Cc: Thang Nguyen Cc: Chuong Tran Cc: Phong Vo Cc: Leif Lindholm Cc: Michael D Kinney Cc: Ard Biesheuvel Cc: Nate DeSimone Signed-off-by: Nhi Pham Reviewed-by: Leif Lindholm --- Silicon/Ampere/AmpereAltraPkg/AmpereAltraPkg.dsc.inc = | 2 + Platform/Ampere/JadePkg/Jade.fdf = | 2 + Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgressDxe/BootPro= gressDxe.inf | 51 +++++ Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgressPeim/BootPr= ogressPeim.inf | 49 +++++ Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgressDxe/BootPro= gressDxe.c | 212 ++++++++++++++++++++ Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgressPeim/BootPr= ogressPeim.c | 211 +++++++++++++++++++ Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgressDxe/BootPro= gressDxe.uni | 16 ++ Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgressPeim/BootPr= ogressPeim.uni | 18 ++ 8 files changed, 561 insertions(+) diff --git a/Silicon/Ampere/AmpereAltraPkg/AmpereAltraPkg.dsc.inc b/Silicon= /Ampere/AmpereAltraPkg/AmpereAltraPkg.dsc.inc index f679b818a205..cd982e987745 100644 --- a/Silicon/Ampere/AmpereAltraPkg/AmpereAltraPkg.dsc.inc +++ b/Silicon/Ampere/AmpereAltraPkg/AmpereAltraPkg.dsc.inc @@ -532,6 +532,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 @@ -542,6 +543,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 49e38db1bce4..bbee31c3fc99 100644 --- a/Platform/Ampere/JadePkg/Jade.fdf +++ b/Platform/Ampere/JadePkg/Jade.fdf @@ -101,6 +101,7 @@ [FV.FVMAIN_COMPACT] INF ArmPlatformPkg/PlatformPei/PlatformPeim.inf INF Silicon/Ampere/AmpereAltraPkg/Drivers/ATFHobPei/ATFHobPeim.inf INF ArmPlatformPkg/MemoryInitPei/MemoryInitPeim.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 @@ -149,6 +150,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..2211a213a6df --- /dev/null +++ b/Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgressDxe/Bo= otProgressDxe.inf @@ -0,0 +1,51 @@ +## @file +# This module installs Boot Progress Dxe. +# +# This module registers report status code listener to report boot progre= ss +# to SMpro. +# +# Copyright (c) 2020 - 2021, 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] + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + Silicon/Ampere/AmpereAltraPkg/AmpereAltraPkg.dec + +[LibraryClasses] + AmpereCpuLib + BaseLib + DebugLib + DxeServicesLib + SystemFirmwareInterfaceLib + UefiBootServicesTableLib + UefiDriverEntryPoint + UefiLib + UefiRuntimeServicesTableLib + +[Protocols] + gEfiRscHandlerProtocolGuid ## CONSUMES + +[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..1dd0ec31ac37 --- /dev/null +++ b/Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgressPeim/B= ootProgressPeim.inf @@ -0,0 +1,49 @@ +## @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 - 2021, 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] + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + Silicon/Ampere/AmpereAltraPkg/AmpereAltraPkg.dec + +[LibraryClasses] + BaseLib + DebugLib + PeiServicesLib + PeimEntryPoint + SystemFirmwareInterfaceLib + +[Ppis] + gEfiPeiRscHandlerPpiGuid ## CONSUMES + +[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..307efc4529e6 --- /dev/null +++ b/Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgressDxe/Bo= otProgressDxe.c @@ -0,0 +1,212 @@ +/** @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 - 2021, Ampere Computing LLC. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + +#include +#include +#include +#include +#include +#include +#include + +typedef struct { + UINT8 Byte; + EFI_STATUS_CODE_VALUE Value; +} STATUS_CODE_TO_CHECKPOINT; + +typedef enum { + BootNotStart =3D 0, + BootStart, + BootComplete, + BootFailed, + BootProgressStateMax +} BOOT_PROGRESS_STATE; + +UINT32 DxeProgressCode[] =3D { + (EFI_SOFTWARE_DXE_CORE | EFI_SW_DXE_CORE_PC_ENTRY_POINT), = // DXE Core is started + (EFI_COMPUTING_UNIT_CHIPSET | EFI_CHIPSET_PC_DXE_HB_INIT), = // PCI host bridge initialization + (EFI_SOFTWARE_DXE_CORE | EFI_SW_DXE_CORE_PC_HANDOFF_TO_NEXT), = // Boot Device 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 Controller 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 Resources + (EFI_IO_BUS_PCI | EFI_IOB_PC_ENABLE), = // PCI Bus Assign Resources + (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 Initialization + (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 Architectural Protocols are not available + (EFI_IO_BUS_PCI | EFI_IOB_EC_RESOURCE_CONFLICT), = // PCI resource allocation error. Out of Resources + (EFI_PERIPHERAL_LOCAL_CONSOLE | EFI_P_EC_NOT_DETECTED), = // No Console Output Devices are found + (EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_NOT_DETECTED), = // No Console Input 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 BootStart; + +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; +} + +/** + 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 BootFailed; + } else if (Value =3D=3D (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_PC_R= EADY_TO_BOOT_EVENT)) { + /* Set boot complete when reach to ReadyToBoot event */ + mBootstate =3D BootComplete; + } + + MailboxMsgSetBootProgress (0, mBootstate, Value); + + 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; +} + + +/** + 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..9b166ed1efbf --- /dev/null +++ b/Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgressPeim/B= ootProgressPeim.c @@ -0,0 +1,211 @@ +/** @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 - 2021, Ampere Computing LLC. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + +#include +#include +#include +#include +#include +#include + +typedef enum { + BootNotStart =3D 0, + BootStart, + BootComplete, + BootFailed, + BootProgressStateMax +} BOOT_PROGRESS_STATE; + +UINT32 PeiProgressStatusCode[] =3D { + // Regular boot + (EFI_SOFTWARE_PEI_CORE | EFI_SW_PEI_CORE_PC_ENTRY_POINT), // PEI= Core 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), // Mem= ory Installed + (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_PC_INIT_BEGIN), // CPU= post-memory initialization is started + (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_PC_CACHE_INIT), // CPU= post-memory initialization. Cache initialization + (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_PC_AP_INIT), // CPU= post-memory initialization. Application Processor(s) (AP) initialization + (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_PC_BSP_SELECT), // CPU= post-memory initialization. Boot Strap Processor (BSP) selection + (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_PC_SMM_INIT), // CPU= post-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 co= ndition triggered by firmware (Auto recovery) + (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_PC_RECOVERY_USER), // Recovery co= ndition triggered by user (Forced recovery) + (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_PC_RECOVERY_BEGIN), // Recovery pr= ocess started + (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_PC_CAPSULE_LOAD), // Recovery fi= rmware image is found + (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_PC_CAPSULE_START), // Recovery fi= rmware image is loaded + // S3 + (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_PC_S3_BOOT_SCRIPT), // S3 Boot Scr= ipt execution + (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_PC_OS_WAKE), // OS S3 wake = vector call + 0 // Must end wi= th 0 +}; + +UINT32 PeiErrorStatusCode[] =3D { + // Regular boot + (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_INVALID_TYPE), // Me= mory initialization error. Invalid memory type + (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_INVALID_SPEED), // Me= mory initialization error. Incompatible memory speed + (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_SPD_FAIL), // Me= mory initialization error. SPD reading has failed + (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_INVALID_SIZE), // Me= mory initialization error. Invalid memory size + (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_MISMATCH), // Me= mory initialization error. Memory modules do not match + (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_NONE_DETECTED), // Me= mory initialization error. No usable memory detected + (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_NONE_USEFUL), // Me= mory initialization error. No usable memory detected + (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_EC_NON_SPECIFIC), // Un= specified memory initialization error. + (EFI_SOFTWARE_PEI_CORE | EFI_SW_PEI_CORE_EC_MEMORY_NOT_INSTALLED), // Me= mory not installed + (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_INVALID_TYPE), // In= valid CPU type + (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_INVALID_SPEED), // In= valid CPU Speed + (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_MISMATCH), // CP= U mismatch + (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_SELF_TEST), // CP= U self test failed + (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_CACHE), // po= ssible CPU cache error + (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_INTERNAL), // In= ternal CPU error + (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_EC_NON_SPECIFIC), // In= ternal CPU error + (EFI_SOFTWARE_PEI_SERVICE | EFI_SW_PS_EC_RESET_NOT_AVAILABLE), // re= set PPI is not available + // Recovery + (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_EC_RECOVERY_PPI_NOT_FOUND), //= Recovery PPI is not available + (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_EC_NO_RECOVERY_CAPSULE), //= Recovery capsule is not found + (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_EC_INVALID_CAPSULE_DESCRIPTOR), //= Invalid 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 BootStart when start +STATIC UINT8 mBootstate =3D BootStart; + +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; +} + +/** + 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 BootFailed; + } + + MailboxMsgSetBootProgress (0, mBootstate, Value); + + 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..492e85404631 --- /dev/null +++ b/Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgressDxe/Bo= otProgressDxe.uni @@ -0,0 +1,16 @@ +// +// 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 - 2021, 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..0371fc4f9a80 --- /dev/null +++ b/Silicon/Ampere/AmpereAltraPkg/Drivers/BootProgress/BootProgressPeim/B= ootProgressPeim.uni @@ -0,0 +1,18 @@ +// +// 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 - 2021, 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