From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by spool.mail.gandi.net (Postfix) with ESMTPS id 31E627803CC for ; Thu, 18 Jan 2024 03:54:32 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=R81Ml5fSfAfE0vImdw2rr0MzkV6M+Y7ICvCvV0tlk8U=; c=relaxed/simple; d=groups.io; h=ARC-Seal:ARC-Message-Signature:ARC-Authentication-Results:Received-SPF:From:To:CC:Subject:Date:Message-ID:In-Reply-To:References:MIME-Version:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Transfer-Encoding:Content-Type; s=20140610; t=1705550071; v=1; b=sOvPsKXElqSa2lrbKfX+3vesBb9JpGt2fO2wwp/0KRcPvSqUgz/aSJJcqnb+cCBaTPl8ugU9 IRgFvoeXJlYSQv+kVRUDfUAk/gJQDcIDU6/3IC+n0BmNj65vOPs1+LjZT9c5ajdxGXCqbv2dsOm XUEzQqeHNlRjGOc1Bjjhse9g= X-Received: by 127.0.0.2 with SMTP id Tk6HYY7687511xufpe4udKLm; Wed, 17 Jan 2024 19:54:31 -0800 X-Received: from NAM10-DM6-obe.outbound.protection.outlook.com (NAM10-DM6-obe.outbound.protection.outlook.com [40.107.93.63]) by mx.groups.io with SMTP id smtpd.web11.3922.1705550070977886169 for ; Wed, 17 Jan 2024 19:54:31 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=SO1ew5DjycUrKVrcrUo0p3MIFrnnPcY1dGmE0Y0JS3aLdugtjCAy08GC737gQB7jJgSAIUL1heFrpgVX2gIzQ9VP3ToZOhRC4kZehZVAsJFvNn0z13ojxNmWtsU6bRrKCR95f7WkDCPJFnZK0opFCq/BXfCFHM4dTR7QhpT1Y5L62Ii2w/WXH8rtIL3AIy7N5b9IJHKFlxecHLHnnMX94WqGyLVt5jsWB+ga6KHFw8rYF9b1WtTIWCeCd2RwGGNTb6sgGO6nell9Kp5Tnv22si0nVa8B6jKwUHBhqT9EHAz3IbAWUMccAb+wevBg9oPWxeVvobfmBUnzekJcuoLxfg== 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=Uuq1dIb5D7Fg3xTZElMZpDwMgMclgoAMRafzqt3myDo=; b=m3a4k/OgyTOnSwDj3awSVsp8JbCGNztOXUhnNIodMw5AiV/oYjOO4XS3DK3l9vpouv9faUo4KuYUZH9v9yWiS4f7oHIZ1T3twqdsiWagFUbMiNXvKiVLZKj15bjJYnQpjUp6UqNFb1iE3drHUQNh8HkExzXMfUiYCPcWL9VDkKXMO3gO9H3mDZ8bRAu7DRqJSRFrXyKOtdFRsazAMV9CnqC/SIucQo28gQHguRFCpKL9d+HBG2cDoC5hIqH+n7re1QPMpLqT17iZHdH/U1HSs4VdCdn8rIZ/mWLi19RVywot/DMWycvk6mESHBIfOYsuenX6hZSgLccrSk0W07CdwA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=edk2.groups.io smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) X-Received: from PH8PR07CA0005.namprd07.prod.outlook.com (2603:10b6:510:2cd::29) by DM4PR12MB6376.namprd12.prod.outlook.com (2603:10b6:8:a0::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7181.26; Thu, 18 Jan 2024 03:54:27 +0000 X-Received: from SN1PEPF0002BA52.namprd03.prod.outlook.com (2603:10b6:510:2cd:cafe::3a) by PH8PR07CA0005.outlook.office365.com (2603:10b6:510:2cd::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7202.24 via Frontend Transport; Thu, 18 Jan 2024 03:54:27 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB03.amd.com; pr=C X-Received: from SATLEXMB03.amd.com (165.204.84.17) by SN1PEPF0002BA52.mail.protection.outlook.com (10.167.242.75) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.7202.16 via Frontend Transport; Thu, 18 Jan 2024 03:54:27 +0000 X-Received: from SATLEXMB08.amd.com (10.181.40.132) by SATLEXMB03.amd.com (10.181.40.144) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.34; Wed, 17 Jan 2024 21:54:27 -0600 X-Received: from SATLEXMB04.amd.com (10.181.40.145) by SATLEXMB08.amd.com (10.181.40.132) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Wed, 17 Jan 2024 19:54:26 -0800 X-Received: from BLR-LAB-SFW01.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server id 15.1.2507.34 via Frontend Transport; Wed, 17 Jan 2024 21:54:24 -0600 From: "Abdul Lateef Attar via groups.io" To: CC: Abdul Lateef Attar , Michael D Kinney , Liming Gao , Zhiguang Liu , Ray Ni , "Rahul Kumar" , Gerd Hoffmann Subject: [edk2-devel] [PATCH RESEND v2 2/2] UefiCpuPkg/BaseXApic[X2]ApicLib: Implements AMD extended cpu topology Date: Thu, 18 Jan 2024 09:24:09 +0530 Message-ID: In-Reply-To: References: MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN1PEPF0002BA52:EE_|DM4PR12MB6376:EE_ X-MS-Office365-Filtering-Correlation-Id: 8d5f4d3f-c15c-4ecc-4f58-08dc17d92aef X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Message-Info: HTSAO5TBTmx8VoFrFMvDLz2Kzt3Hf4jU/EAy9eHb8fNWNDXKn7tJ4AsODNcasRb/399xxZI5VUSurzVEKf1syehX6rylR0+aIfZ/LRkOKu/oBT3p7P7jWOSbwcIOUKflwblBllJilER00291zv6b6ftezIRDxz9IS7lPSiiywvF4HVgTxxohwwnI9pZ+NUl5sPkiYsdUtrNJfqtUQ/QxxeGV5MyVtp1bIkq3HKF1LlpdbaXX0JTxf4yMVoOM5yoi+j0kciMlzKlpJfSDVRyESu6imt37Ik+6QjhUTO+fjQo8XSh86YO5XQ7IZh1nl6+PqPSj3ivBP05eJnAD+MtUQs68VavATV9kJniO7oS5KL4fCLyn7wwG4YD8ybO/0GISWAORFz9SZjwRM6YGzPDDfg9q4qQlTALykkKyXrbpXtDyt0qDt/B++A5tCU5vKgJIjTGSlr6VvHyS9ioVG5VmQ6Utug4FHN0eW+hxJ2GU160bHvXBVoO0P1i7j/hyuaZIYpukioBE2n3YI32vKnXHSOn0KsihJ5bR16n+A1aV5g8KjHr/cA++rHjG11y45Frs7wLz+s3sHBp22kMsENjWo/c7LLjaBsR6dO6+tgDv3sTH1uhgA2Fo9I+kFl8BzLsid5HUCXutt3EvWjGfBTz8lXiWjqp4Awy49IbY8rCyD7qMPhQ+SAQjyRZtICWAxLg7G+60VYL3y/FO0dv8HQOe+sJfXzfTYQZlWpQlVmlGLfccvPSCeJRaWPV9q77k049iqKBwVY2qObzEQvtRMUrGKQ== X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2024 03:54:27.4811 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 8d5f4d3f-c15c-4ecc-4f58-08dc17d92aef X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[SATLEXMB03.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SN1PEPF0002BA52.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM4PR12MB6376 Precedence: Bulk 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,AbdulLateef.Attar@amd.com List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: X-Gm-Message-State: mcwihuNFWajSNT5cMn9AhAVgx7686176AA= Content-Transfer-Encoding: quoted-printable Content-Type: text/plain X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20140610 header.b=sOvPsKXE; arc=reject ("signature check failed: fail, {[1] = sig:microsoft.com:reject}"); dmarc=none; spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce@groups.io From: Abdul Lateef Attar This patch adds support for AMD's new extended topology. If processor supports CPUID 80000026 leaf then obtain the topology information using new method. Algorithm: if CPUID is AMD: then check for AMD's extended cpu tology leaf. if yes then extract cpu tology based on AMD programmer manual's instruction. else then fallback to existing topology function. endif endif Cc: Michael D Kinney Cc: Liming Gao Cc: Zhiguang Liu Cc: Ray Ni Cc: Rahul Kumar Cc: Gerd Hoffmann Signed-off-by: Abdul Lateef Attar --- .../Library/BaseXApicLib/BaseXApicLib.c | 126 +++++++++++++++++- .../BaseXApicX2ApicLib/BaseXApicX2ApicLib.c | 126 +++++++++++++++++- 2 files changed, 250 insertions(+), 2 deletions(-) diff --git a/UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.c b/UefiCpuPkg/Li= brary/BaseXApicLib/BaseXApicLib.c index efb9d71ca1..c4457d98b3 100644 --- a/UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.c +++ b/UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.c @@ -4,7 +4,7 @@ This local APIC library instance supports xAPIC mode only. =20 Copyright (c) 2010 - 2023, Intel Corporation. All rights reserved.
- Copyright (c) 2017 - 2020, AMD Inc. All rights reserved.
+ Copyright (c) 2017 - 2024, AMD Inc. All rights reserved.
=20 SPDX-License-Identifier: BSD-2-Clause-Patent =20 @@ -1157,6 +1157,125 @@ GetProcessorLocationByApicId ( } } =20 +/** + Get Package ID/Die ID/Module ID/Core ID/Thread ID of a AMD processor fam= ily. + + The algorithm assumes the target system has symmetry across physical + package boundaries with respect to the number of threads per core, numbe= r of + cores per module, number of modules per die, number + of dies per package. + + @param[in] InitialApicId Initial APIC ID of the target logical process= or. + @param[out] Package Returns the processor package ID. + @param[out] Die Returns the processor die ID. + @param[out] Tile Returns zero. + @param[out] Module Returns the processor module ID. + @param[out] Core Returns the processor core ID. + @param[out] Thread Returns the processor thread ID. +**/ +VOID +AmdGetProcessorLocation2ByApicId ( + IN UINT32 InitialApicId, + OUT UINT32 *Package OPTIONAL, + OUT UINT32 *Die OPTIONAL, + OUT UINT32 *Tile OPTIONAL, + OUT UINT32 *Module OPTIONAL, + OUT UINT32 *Core OPTIONAL, + OUT UINT32 *Thread OPTIONAL + ) +{ + CPUID_EXTENDED_TOPOLOGY_EAX ExtendedTopologyEax; + CPUID_EXTENDED_TOPOLOGY_EBX ExtendedTopologyEbx; + CPUID_EXTENDED_TOPOLOGY_ECX ExtendedTopologyEcx; + UINT32 MaxExtendedCpuIdIndex; + UINT32 TopologyLevel; + UINT32 PreviousLevel; + UINT32 Data; + + if (Die !=3D NULL) { + *Die =3D 0; + } + + if (Tile !=3D NULL) { + *Tile =3D 0; + } + + if (Module !=3D NULL) { + *Module =3D 0; + } + + PreviousLevel =3D 0; + TopologyLevel =3D 0; + + /// Check if extended toplogy supported + AsmCpuid (CPUID_EXTENDED_FUNCTION, &MaxExtendedCpuIdIndex, NULL, NULL, N= ULL); + if (MaxExtendedCpuIdIndex >=3D AMD_CPUID_EXTENDED_TOPOLOGY) { + do { + AsmCpuidEx ( + AMD_CPUID_EXTENDED_TOPOLOGY, + TopologyLevel, + &ExtendedTopologyEax.Uint32, + &ExtendedTopologyEbx.Uint32, + &ExtendedTopologyEcx.Uint32, + NULL + ); + + if (ExtendedTopologyEbx.Bits.LogicalProcessors =3D=3D CPUID_EXTENDED= _TOPOLOGY_LEVEL_TYPE_INVALID) { + /// if this fails at first level + /// then will fall back to non-extended topology + break; + } + + Data =3D InitialApicId >> PreviousLevel; + Data &=3D (1 << (ExtendedTopologyEax.Bits.ApicIdShift - PreviousLeve= l)) - 1; + + switch (ExtendedTopologyEcx.Bits.LevelType) { + case CPUID_EXTENDED_TOPOLOGY_LEVEL_TYPE_SMT: + if (Thread !=3D NULL) { + *Thread =3D Data; + } + + break; + case CPUID_EXTENDED_TOPOLOGY_LEVEL_TYPE_CORE: + if (Core !=3D NULL) { + *Core =3D Data; + } + + break; + case CPUID_V2_EXTENDED_TOPOLOGY_LEVEL_TYPE_MODULE: + if (Module !=3D NULL) { + *Module =3D Data; + } + + break; + case CPUID_V2_EXTENDED_TOPOLOGY_LEVEL_TYPE_TILE: + if (Die !=3D NULL) { + *Die =3D Data; + } + + break; + default: + break; + } + + TopologyLevel++; + PreviousLevel =3D ExtendedTopologyEax.Bits.ApicIdShift; + } while (ExtendedTopologyEbx.Bits.LogicalProcessors !=3D CPUID_EXTENDE= D_TOPOLOGY_LEVEL_TYPE_INVALID); + + if (Package !=3D NULL) { + *Package =3D InitialApicId >> PreviousLevel; + } + } + + /// If extended topology CPUID is not supported + /// OR, execution of AMD_CPUID_EXTENDED_TOPOLOGY at level 0 fails(return= 0). + if (TopologyLevel =3D=3D 0) { + GetProcessorLocationByApicId (InitialApicId, Package, Core, Thread); + } + + return; +} + /** Get Package ID/Die ID/Tile ID/Module ID/Core ID/Thread ID of a processor= . =20 @@ -1194,6 +1313,11 @@ GetProcessorLocation2ByApicId ( UINT32 Bits[CPUID_V2_EXTENDED_TOPOLOGY_LEVEL_TYPE_= DIE + 2]; UINT32 *Location[CPUID_V2_EXTENDED_TOPOLOGY_LEVEL_= TYPE_DIE + 2]; =20 + if (StandardSignatureIsAuthenticAMD ()) { + AmdGetProcessorLocation2ByApicId (InitialApicId, Package, Die, Tile, M= odule, Core, Thread); + return; + } + for (LevelType =3D 0; LevelType < ARRAY_SIZE (Bits); LevelType++) { Bits[LevelType] =3D 0; } diff --git a/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c b/U= efiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c index c0a8475833..0560d38ce5 100644 --- a/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c +++ b/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c @@ -5,7 +5,7 @@ which have xAPIC and x2APIC modes. =20 Copyright (c) 2010 - 2023, Intel Corporation. All rights reserved.
- Copyright (c) 2017 - 2020, AMD Inc. All rights reserved.
+ Copyright (c) 2017 - 2024, AMD Inc. All rights reserved.
=20 SPDX-License-Identifier: BSD-2-Clause-Patent =20 @@ -1396,6 +1396,125 @@ GetProcessorLocationByApicId ( } } =20 +/** + Get Package ID/Die ID/Module ID/Core ID/Thread ID of a AMD processor fam= ily. + + The algorithm assumes the target system has symmetry across physical + package boundaries with respect to the number of threads per core, numbe= r of + cores per module, number of modules per die, number + of dies per package. + + @param[in] InitialApicId Initial APIC ID of the target logical process= or. + @param[out] Package Returns the processor package ID. + @param[out] Die Returns the processor die ID. + @param[out] Tile Returns zero. + @param[out] Module Returns the processor module ID. + @param[out] Core Returns the processor core ID. + @param[out] Thread Returns the processor thread ID. +**/ +VOID +AmdGetProcessorLocation2ByApicId ( + IN UINT32 InitialApicId, + OUT UINT32 *Package OPTIONAL, + OUT UINT32 *Die OPTIONAL, + OUT UINT32 *Tile OPTIONAL, + OUT UINT32 *Module OPTIONAL, + OUT UINT32 *Core OPTIONAL, + OUT UINT32 *Thread OPTIONAL + ) +{ + CPUID_EXTENDED_TOPOLOGY_EAX ExtendedTopologyEax; + CPUID_EXTENDED_TOPOLOGY_EBX ExtendedTopologyEbx; + CPUID_EXTENDED_TOPOLOGY_ECX ExtendedTopologyEcx; + UINT32 MaxExtendedCpuIdIndex; + UINT32 TopologyLevel; + UINT32 PreviousLevel; + UINT32 Data; + + if (Die !=3D NULL) { + *Die =3D 0; + } + + if (Tile !=3D NULL) { + *Tile =3D 0; + } + + if (Module !=3D NULL) { + *Module =3D 0; + } + + PreviousLevel =3D 0; + TopologyLevel =3D 0; + + /// Check if extended toplogy supported + AsmCpuid (CPUID_EXTENDED_FUNCTION, &MaxExtendedCpuIdIndex, NULL, NULL, N= ULL); + if (MaxExtendedCpuIdIndex >=3D AMD_CPUID_EXTENDED_TOPOLOGY) { + do { + AsmCpuidEx ( + AMD_CPUID_EXTENDED_TOPOLOGY, + TopologyLevel, + &ExtendedTopologyEax.Uint32, + &ExtendedTopologyEbx.Uint32, + &ExtendedTopologyEcx.Uint32, + NULL + ); + + if (ExtendedTopologyEbx.Bits.LogicalProcessors =3D=3D CPUID_EXTENDED= _TOPOLOGY_LEVEL_TYPE_INVALID) { + /// if this fails at first level + /// then will fall back to non-extended topology + break; + } + + Data =3D InitialApicId >> PreviousLevel; + Data &=3D (1 << (ExtendedTopologyEax.Bits.ApicIdShift - PreviousLeve= l)) - 1; + + switch (ExtendedTopologyEcx.Bits.LevelType) { + case CPUID_EXTENDED_TOPOLOGY_LEVEL_TYPE_SMT: + if (Thread !=3D NULL) { + *Thread =3D Data; + } + + break; + case CPUID_EXTENDED_TOPOLOGY_LEVEL_TYPE_CORE: + if (Core !=3D NULL) { + *Core =3D Data; + } + + break; + case CPUID_V2_EXTENDED_TOPOLOGY_LEVEL_TYPE_MODULE: + if (Module !=3D NULL) { + *Module =3D Data; + } + + break; + case CPUID_V2_EXTENDED_TOPOLOGY_LEVEL_TYPE_TILE: + if (Die !=3D NULL) { + *Die =3D Data; + } + + break; + default: + break; + } + + TopologyLevel++; + PreviousLevel =3D ExtendedTopologyEax.Bits.ApicIdShift; + } while (ExtendedTopologyEbx.Bits.LogicalProcessors !=3D CPUID_EXTENDE= D_TOPOLOGY_LEVEL_TYPE_INVALID); + + if (Package !=3D NULL) { + *Package =3D InitialApicId >> PreviousLevel; + } + } + + /// If extended topology CPUID is not supported + /// OR, execution of AMD_CPUID_EXTENDED_TOPOLOGY at level 0 fails(return= 0). + if (TopologyLevel =3D=3D 0) { + GetProcessorLocationByApicId (InitialApicId, Package, Core, Thread); + } + + return; +} + /** Get Package ID/Die ID/Tile ID/Module ID/Core ID/Thread ID of a processor= . =20 @@ -1433,6 +1552,11 @@ GetProcessorLocation2ByApicId ( UINT32 Bits[CPUID_V2_EXTENDED_TOPOLOGY_LEVEL_TYPE_= DIE + 2]; UINT32 *Location[CPUID_V2_EXTENDED_TOPOLOGY_LEVEL_= TYPE_DIE + 2]; =20 + if (StandardSignatureIsAuthenticAMD ()) { + AmdGetProcessorLocation2ByApicId (InitialApicId, Package, Die, Tile, M= odule, Core, Thread); + return; + } + for (LevelType =3D 0; LevelType < ARRAY_SIZE (Bits); LevelType++) { Bits[LevelType] =3D 0; } --=20 2.34.1 -=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 (#113983): https://edk2.groups.io/g/devel/message/113983 Mute This Topic: https://groups.io/mt/103802342/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-