From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by mx.groups.io with SMTP id smtpd.web09.9331.1632924842145201882 for ; Wed, 29 Sep 2021 07:14:02 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@intel.onmicrosoft.com header.s=selector2-intel-onmicrosoft-com header.b=tZgAKRnp; spf=pass (domain: intel.com, ip: 192.55.52.120, mailfrom: ray.ni@intel.com) X-IronPort-AV: E=McAfee;i="6200,9189,10122"; a="223058872" X-IronPort-AV: E=Sophos;i="5.85,332,1624345200"; d="scan'208";a="223058872" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Sep 2021 07:14:01 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.85,332,1624345200"; d="scan'208";a="708386927" Received: from orsmsx605.amr.corp.intel.com ([10.22.229.18]) by fmsmga005.fm.intel.com with ESMTP; 29 Sep 2021 07:14:01 -0700 Received: from orsmsx607.amr.corp.intel.com (10.22.229.20) by ORSMSX605.amr.corp.intel.com (10.22.229.18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.12; Wed, 29 Sep 2021 07:14:00 -0700 Received: from orsmsx610.amr.corp.intel.com (10.22.229.23) by ORSMSX607.amr.corp.intel.com (10.22.229.20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.12; Wed, 29 Sep 2021 07:14:00 -0700 Received: from ORSEDG602.ED.cps.intel.com (10.7.248.7) by orsmsx610.amr.corp.intel.com (10.22.229.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.12 via Frontend Transport; Wed, 29 Sep 2021 07:14:00 -0700 Received: from NAM11-BN8-obe.outbound.protection.outlook.com (104.47.58.175) by edgegateway.intel.com (134.134.137.103) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2242.12; Wed, 29 Sep 2021 07:13:59 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=XjSFECpjP/8XuIUhoNjqBuZWqgekiFQ/bShPkbou+kbvl7KvYeBN2Zy/mSuL1Mfc23NQFzWRz2+TcoyGWF11dQkbh2qlSi3RDfeC2SzX9LGg1KdcOjyYovm2mumJl7y9EYeCQ6nf/1is3UHTQZyS6ScYXQcOVI5RNt4aGnmRzACXE21Y8cosH6fN+R+jZxQIwO7QSh1Qu0gJO1xOevouAAL4rwVutNmQwl/F9EkuPXHJe3srEFy9JlsJB76QsHYJR0jm12Ll6a6kCMYIKbApcZS22nSu7hPAQRbQYwac/K9wqZDqjWMnkfOlum6xWVSYrQBMFJ2TFXULI6UPQ30DFw== 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; bh=CoSDpuhB3Z04ogxNZOV43FgeX/B/MVjqVE74itcGrZ8=; b=Mh9zMWtw+5BsJunmyUgbYaE2Gd824+2z/4y+4Yyk/c8HPOlMFyeabhSK1Ngvosb6WYPPx2akmEaEXULowxJp4Nn+NvSvJYgvEkmTZI5d4nU1jSRLwFlN5JKPbOK3Tmxm3VYDYOhvLJW4ZnGgwwMOflHJmiRneeJlJEAQtJE+HEb4YUiEKjk31ikPj2Ng+vKzAQHbTARvgthY8/FUeRzY/GslAX4KCIFWrKJggN4DLjcr1Yfc78J2jGFNqDk0hGL/uYLuhqlusjlC72xCWw6hATMFALR0RHB5mJxFrujmsajTjdUmeMWkLmqeeOrXHkoijvIEgdVyh6hq5xENRkJi3g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel.onmicrosoft.com; s=selector2-intel-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=CoSDpuhB3Z04ogxNZOV43FgeX/B/MVjqVE74itcGrZ8=; b=tZgAKRnpf+gjBUFSH4bsuS8xVSju+mgyCwi+7RBG+gpJNZNOeuI6BochvZSHbpp7ZzIM9ndFmMVcgMqbI6k8IZeKIyGcj+XwoxiEBPftsMf8xgk8HKSJ5OS1/M1k6aF1Dh5cHVyDUUxO66wjRRgFu7iacFYs2pKs7D6Fg9u/Cdk= Received: from CY4PR1101MB2072.namprd11.prod.outlook.com (2603:10b6:910:1d::15) by CY4PR11MB1272.namprd11.prod.outlook.com (2603:10b6:903:29::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4544.18; Wed, 29 Sep 2021 14:13:58 +0000 Received: from CY4PR1101MB2072.namprd11.prod.outlook.com ([fe80::7dc5:34b5:bbff:832f]) by CY4PR1101MB2072.namprd11.prod.outlook.com ([fe80::7dc5:34b5:bbff:832f%8]) with mapi id 15.20.4566.015; Wed, 29 Sep 2021 14:13:57 +0000 From: "Ni, Ray" To: "Dong, Guo" , "devel@edk2.groups.io" CC: "Ma, Maurice" , "You, Benjamin" Subject: Re: [`edk2-devel][PATCH V2] UefiPayloadPkg: Build a HOB from bootloader ACPI table Thread-Topic: [`edk2-devel][PATCH V2] UefiPayloadPkg: Build a HOB from bootloader ACPI table Thread-Index: AQHXtIz3tx332OibPEGG+XzSo5YQnKu7D1Dg Date: Wed, 29 Sep 2021 14:13:57 +0000 Message-ID: References: <20210928171857.1552-1-guo.dong@intel.com> In-Reply-To: <20210928171857.1552-1-guo.dong@intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: intel.com; dkim=none (message not signed) header.d=none;intel.com; dmarc=none action=none header.from=intel.com; x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: f2961b6f-9174-4c95-0fc4-08d9835360c9 x-ms-traffictypediagnostic: CY4PR11MB1272: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:4303; x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: 21rlxt0OyN+TlbRPYI5vUFmQ9C7XNQvkp0rS+t1Yfulc7jOcs4HkbTrilyU9OLuANSNk2ipqHzbXzwU47pMTQhpvxcgGVd24XnbMj8DwL+xnp1oT1WA+m7B/wGL1yu8uRahTTcJ5yfz0yzDM8j1/Hx2Fqx0S9+DJ9ga1iAxzfsNJEBOSV5eRUa0+RS6KDG+ST50zEvoEZe/Y0CobKf4qBtY8h1+sxAh7454MAF2GPXp5hgNM+nMRcTZc46QV5/hFQdUKr4bDoI682o2mfzVMHGthseYaUsU/Pa/AAtTTCYPvE87euILTyD/xcNENA0xIqApnXa2MqEud1uansMYe8Qq7zX7DrEbgSm8rjXpnvGQKD292am5ItfgXHo6DMN6DjdsYksCs1ESFqEieZmtsyK1p9YcxkvziCfXku11D0yOBh/98ZgcPKGE6dQoIFSdwc56BD10JGa8r7PQRr5s8ab8+lSZZR0CxH9rY5mS12orOywh3WKAYsk6+K2bpc6Wd27nDBv8NZRDz/1s2KfMds5bYMRis5UuruswP5eAU5XIuhuytwIyVQY0xlJ5o/uoCjJ1/99H68sINmkmi0LMlOv2Yn2LYrj70CghqyqwOFktqQ8+NOdgs0ouYi1TUELaiyJyOdlCFt51ThZ0AnavkBK0n4QD682BJdGkuJRCCatR3WFnqN/QrapdZ9b9swUz7g03Cxx7ATW1cLTpIxaHJAPsblstUPRdkNBvEuQ7qMCk= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CY4PR1101MB2072.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(4636009)(366004)(508600001)(33656002)(107886003)(186003)(122000001)(8936002)(8676002)(7696005)(83380400001)(53546011)(38100700002)(316002)(71200400001)(54906003)(6506007)(30864003)(66946007)(66476007)(64756008)(5660300002)(66556008)(86362001)(26005)(38070700005)(9686003)(2906002)(55016002)(52536014)(76116006)(110136005)(66446008)(4326008)(81973001)(579004);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?BiWGz7MzCw1XC52wmusLMyTzrO+EYRVALtbph/cxak1DRtEFIkcO6OlN2Kwg?= =?us-ascii?Q?DxvEZ5yzffgjyZkZezQ0OF/q52sOHvQViftERGa6934qzyiWyz7MsTqVQgbE?= =?us-ascii?Q?lpc+7rl+nsn67oVPncwPD6DfbX35eP4HOYVVs91TbXg0jtp3zH2/H33kTu3+?= =?us-ascii?Q?plWzpKgHGUO8obfz/hU2tBf2WmWjR2EieL7WzRc4eKGCmhnLJcHDIrUYQW8K?= =?us-ascii?Q?pnP1/rmH+TxhyVNSwN9Rj8DyYUbTlqCJ3TKEq3uGyo/d/EeF4Ls8e0Qqz3wm?= =?us-ascii?Q?YYqqzg3mSaSfHBanXLTHPtfKwLXAlymwpEojHHY3FtBbMKbhOK9dwRiAITsp?= =?us-ascii?Q?bGTm3dz9lUHRTlV1MYN9d7c4UIW83KosJGwOwFBnfbifvo0Hz5lC5Xdug4aO?= =?us-ascii?Q?J4bz1Hunw9if8aVrJ4zwwyLQlLWIWEYvm06YIRf2BfLdB6sD0pDge5VAZB5d?= =?us-ascii?Q?lox0HJjtq1DSyYy9Iq8SEjU5F7LEL8Ie5BtLSi01ahgWQmqkqBpOmNpUEayt?= =?us-ascii?Q?DJawf1ZWWzWaAkbEhwpcVt59yoP7ny8Ov3o478bdmWmUSVG8JRWTBvCSc7Iu?= =?us-ascii?Q?ApMI3R/ndknNQV/eFUvhPIdc06KMF/mKdBpx0VYVyNn0UZ3s3ON823DiCTlZ?= =?us-ascii?Q?YFQE9XMNnJBtCAw0i8mo7GTujLVN+qu7C0Ub9V4rAEQmVGw4L6W2HcI8+Ror?= =?us-ascii?Q?5e7MAgkJKDqw9XzbOwPABgYfL0agD8yZF0KbT5GOv/OxhTmCmF1CV/Hc5699?= =?us-ascii?Q?lru/ROaExbyGf/JHTC8FWJy25LCgUgSf1Zl1g05rjn7epATQFtgSAygO7nWX?= =?us-ascii?Q?T48LQVesny57ktEO1LJopnXThPqz/J4dfbY5XvoRbrG+4iyhVlOYJi8di2RM?= =?us-ascii?Q?WzQqkicSMCtSLc+F360/MUTNjJUAqs0F3IPo4Tj3Sxv78RKfZkEHUZF/8St9?= =?us-ascii?Q?+jFb+8BSBtDum88fDiWNXA3YrGYIGgvw7ux8GFzzDOz4A/kG6DXGBXh0osod?= =?us-ascii?Q?6wBe+kr7rwb3BYrcny84Wr6Op8fw5BRVPEH9fawBr/iqG0Zt79I5MXXIRYJF?= =?us-ascii?Q?h/dYoVhVqzPLJgtffeeL+eMR3DEen5w6iKgS/JOWBT2qrsMszjyGAw+oDYg0?= =?us-ascii?Q?bTOb+FRqWRT2zYXUKqeomka8KbmYSZnpS80jYQJONQvzZUyvAN2zaphUrx6L?= =?us-ascii?Q?9a+5c1ProufgbyKLIyeF6fSF0NhMGfhe66T6X3Aw9BECg5HEVxQV3c+7++Pe?= =?us-ascii?Q?RYqxdLay6UGmdiegb8cwuwuQjyKOTAXD8j4OBfKQc421AEEAYy5MasIJiPNw?= =?us-ascii?Q?/htarCWNGBIm/eAmwzdPda8/?= MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: CY4PR1101MB2072.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: f2961b6f-9174-4c95-0fc4-08d9835360c9 X-MS-Exchange-CrossTenant-originalarrivaltime: 29 Sep 2021 14:13:57.6700 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: uHr1oKc8i9xQHYtSrZRQbTI8zBoMhotKrsNggTq22EEEADRghgZXFH2yYoqYh2C9RRUH+k6zJOO3yQsondN2yQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR11MB1272 Return-Path: ray.ni@intel.com X-OriginatorOrg: intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: Ray Ni > -----Original Message----- > From: Dong, Guo > Sent: Wednesday, September 29, 2021 1:19 AM > To: devel@edk2.groups.io > Cc: Dong, Guo ; Ni, Ray ; Ma, Mauri= ce ; You, Benjamin > > Subject: [`edk2-devel][PATCH V2] UefiPayloadPkg: Build a HOB from bootloa= der ACPI table >=20 > From: Guo Dong >=20 > V2: Update BuildHobFromAcpi() to return a HOB pointer. >=20 > For universal UEFI payload, build a HOB from the ACPI table, so that > other modules could use this info from HOB at very early DXE phase. > This code are shared by universal payload and non universal payload. >=20 > Cc: Ray Ni > Cc: Maurice Ma > Cc: Benjamin You > Signed-off-by: Guo Dong > --- > UefiPayloadPkg/UefiPayloadEntry/AcpiTable.c | 202 > +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= +++++++++++++++++++++++++++++++ > +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= +++++++++++++++++++++++++ > UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c | 176 ++++----= ------------------------------------------------------------------- > -------------------------------------------------------------------------= ---------------------------- > UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h | 13 ++++++++= +++++ > UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf | 1 + > UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c | 12 ++++++++= ++++ > UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf | 2 +- > 6 files changed, 233 insertions(+), 173 deletions(-) >=20 > diff --git a/UefiPayloadPkg/UefiPayloadEntry/AcpiTable.c b/UefiPayloadPkg= /UefiPayloadEntry/AcpiTable.c > new file mode 100644 > index 0000000000..e5f2a2b124 > --- /dev/null > +++ b/UefiPayloadPkg/UefiPayloadEntry/AcpiTable.c > @@ -0,0 +1,202 @@ > +/** @file >=20 > + >=20 > + >=20 > + Copyright (c) 2021, Intel Corporation. All rights reserved.
>=20 > + >=20 > + SPDX-License-Identifier: BSD-2-Clause-Patent >=20 > + >=20 > +**/ >=20 > + >=20 > +#include "UefiPayloadEntry.h" >=20 > + >=20 > + >=20 > +/** >=20 > + Find the board related info from ACPI table >=20 > + >=20 > + @param AcpiTableBase ACPI table start address in memory >=20 > + @param AcpiBoardInfo Pointer to the acpi board info strucutr= e >=20 > + >=20 > + @retval RETURN_SUCCESS Successfully find out all the required info= rmation. >=20 > + @retval RETURN_NOT_FOUND Failed to find the required info. >=20 > + >=20 > +**/ >=20 > +RETURN_STATUS >=20 > +ParseAcpiInfo ( >=20 > + IN UINT64 AcpiTableBase, >=20 > + OUT ACPI_BOARD_INFO *AcpiBoardInfo >=20 > + ) >=20 > +{ >=20 > + EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp; >=20 > + EFI_ACPI_DESCRIPTION_HEADER *Rsdt; >=20 > + UINT32 *Entry32; >=20 > + UINTN Entry32Num; >=20 > + EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *Fadt; >=20 > + EFI_ACPI_DESCRIPTION_HEADER *Xsdt; >=20 > + UINT64 *Entry64; >=20 > + UINTN Entry64Num; >=20 > + UINTN Idx; >=20 > + UINT32 *Signature; >=20 > + EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *MmCfgH= dr; >=20 > + EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOC= ATION_STRUCTURE > *MmCfgBase; >=20 > + >=20 > + Rsdp =3D (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)(UINTN)AcpiTa= bleBase; >=20 > + DEBUG ((DEBUG_INFO, "Rsdp at 0x%p\n", Rsdp)); >=20 > + DEBUG ((DEBUG_INFO, "Rsdt at 0x%x, Xsdt at 0x%lx\n", Rsdp->RsdtAddress= , Rsdp->XsdtAddress)); >=20 > + >=20 > + // >=20 > + // Search Rsdt First >=20 > + // >=20 > + Fadt =3D NULL; >=20 > + MmCfgHdr =3D NULL; >=20 > + Rsdt =3D (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->RsdtAddress)= ; >=20 > + if (Rsdt !=3D NULL) { >=20 > + Entry32 =3D (UINT32 *)(Rsdt + 1); >=20 > + Entry32Num =3D (Rsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) = >> 2; >=20 > + for (Idx =3D 0; Idx < Entry32Num; Idx++) { >=20 > + Signature =3D (UINT32 *)(UINTN)Entry32[Idx]; >=20 > + if (*Signature =3D=3D EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SI= GNATURE) { >=20 > + Fadt =3D (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)Signature; >=20 > + DEBUG ((DEBUG_INFO, "Found Fadt in Rsdt\n")); >=20 > + } >=20 > + >=20 > + if (*Signature =3D=3D > EFI_ACPI_5_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_D= ESCRIPTION_TABLE_SIGNATURE) > { >=20 > + MmCfgHdr =3D (EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_= TABLE_HEADER *)Signature; >=20 > + DEBUG ((DEBUG_INFO, "Found MM config address in Rsdt\n")); >=20 > + } >=20 > + >=20 > + if ((Fadt !=3D NULL) && (MmCfgHdr !=3D NULL)) { >=20 > + goto Done; >=20 > + } >=20 > + } >=20 > + } >=20 > + >=20 > + // >=20 > + // Search Xsdt Second >=20 > + // >=20 > + Xsdt =3D (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->XsdtAddress)= ; >=20 > + if (Xsdt !=3D NULL) { >=20 > + Entry64 =3D (UINT64 *)(Xsdt + 1); >=20 > + Entry64Num =3D (Xsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) = >> 3; >=20 > + for (Idx =3D 0; Idx < Entry64Num; Idx++) { >=20 > + Signature =3D (UINT32 *)(UINTN)Entry64[Idx]; >=20 > + if (*Signature =3D=3D EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SI= GNATURE) { >=20 > + Fadt =3D (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)Signature; >=20 > + DEBUG ((DEBUG_INFO, "Found Fadt in Xsdt\n")); >=20 > + } >=20 > + >=20 > + if (*Signature =3D=3D > EFI_ACPI_5_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_D= ESCRIPTION_TABLE_SIGNATURE) > { >=20 > + MmCfgHdr =3D (EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_= TABLE_HEADER *)Signature; >=20 > + DEBUG ((DEBUG_INFO, "Found MM config address in Xsdt\n")); >=20 > + } >=20 > + >=20 > + if ((Fadt !=3D NULL) && (MmCfgHdr !=3D NULL)) { >=20 > + goto Done; >=20 > + } >=20 > + } >=20 > + } >=20 > + >=20 > + if (Fadt =3D=3D NULL) { >=20 > + return RETURN_NOT_FOUND; >=20 > + } >=20 > + >=20 > +Done: >=20 > + >=20 > + AcpiBoardInfo->PmCtrlRegBase =3D Fadt->Pm1aCntBlk; >=20 > + AcpiBoardInfo->PmTimerRegBase =3D Fadt->PmTmrBlk; >=20 > + AcpiBoardInfo->ResetRegAddress =3D Fadt->ResetReg.Address; >=20 > + AcpiBoardInfo->ResetValue =3D Fadt->ResetValue; >=20 > + AcpiBoardInfo->PmEvtBase =3D Fadt->Pm1aEvtBlk; >=20 > + AcpiBoardInfo->PmGpeEnBase =3D Fadt->Gpe0Blk + Fadt->Gpe0BlkLen / = 2; >=20 > + >=20 > + if (MmCfgHdr !=3D NULL) { >=20 > + MmCfgBase =3D > (EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCAT= ION_STRUCTURE *)((UINT8*) > MmCfgHdr + sizeof (*MmCfgHdr)); >=20 > + AcpiBoardInfo->PcieBaseAddress =3D MmCfgBase->BaseAddress; >=20 > + AcpiBoardInfo->PcieBaseSize =3D (MmCfgBase->EndBusNumber + 1 - MmCfg= Base->StartBusNumber) * 4096 * 32 * 8; >=20 > + } else { >=20 > + AcpiBoardInfo->PcieBaseAddress =3D 0; >=20 > + AcpiBoardInfo->PcieBaseSize =3D 0; >=20 > + } >=20 > + DEBUG ((DEBUG_INFO, "PmCtrl Reg 0x%lx\n", AcpiBoardInfo->PmCtrlRegBa= se)); >=20 > + DEBUG ((DEBUG_INFO, "PmTimer Reg 0x%lx\n", AcpiBoardInfo->PmTimerRegB= ase)); >=20 > + DEBUG ((DEBUG_INFO, "Reset Reg 0x%lx\n", AcpiBoardInfo->ResetRegAdd= ress)); >=20 > + DEBUG ((DEBUG_INFO, "Reset Value 0x%x\n", AcpiBoardInfo->ResetValue)= ); >=20 > + DEBUG ((DEBUG_INFO, "PmEvt Reg 0x%lx\n", AcpiBoardInfo->PmEvtBase))= ; >=20 > + DEBUG ((DEBUG_INFO, "PmGpeEn Reg 0x%lx\n", AcpiBoardInfo->PmGpeEnBase= )); >=20 > + DEBUG ((DEBUG_INFO, "PcieBaseAddr 0x%lx\n", AcpiBoardInfo->PcieBaseAdd= ress)); >=20 > + DEBUG ((DEBUG_INFO, "PcieBaseSize 0x%lx\n", AcpiBoardInfo->PcieBaseSiz= e)); >=20 > + >=20 > + // >=20 > + // Verify values for proper operation >=20 > + // >=20 > + ASSERT(Fadt->Pm1aCntBlk !=3D 0); >=20 > + ASSERT(Fadt->PmTmrBlk !=3D 0); >=20 > + ASSERT(Fadt->ResetReg.Address !=3D 0); >=20 > + ASSERT(Fadt->Pm1aEvtBlk !=3D 0); >=20 > + ASSERT(Fadt->Gpe0Blk !=3D 0); >=20 > + >=20 > + DEBUG_CODE_BEGIN (); >=20 > + BOOLEAN SciEnabled; >=20 > + >=20 > + // >=20 > + // Check the consistency of SCI enabling >=20 > + // >=20 > + >=20 > + // >=20 > + // Get SCI_EN value >=20 > + // >=20 > + if (Fadt->Pm1CntLen =3D=3D 4) { >=20 > + SciEnabled =3D (IoRead32 (Fadt->Pm1aCntBlk) & BIT0)? TRUE : FALSE; >=20 > + } else { >=20 > + // >=20 > + // if (Pm1CntLen =3D=3D 2), use 16 bit IO read; >=20 > + // if (Pm1CntLen !=3D 2 && Pm1CntLen !=3D 4), use 16 bit IO read a= s a fallback >=20 > + // >=20 > + SciEnabled =3D (IoRead16 (Fadt->Pm1aCntBlk) & BIT0)? TRUE : FALSE; >=20 > + } >=20 > + >=20 > + if (!(Fadt->Flags & EFI_ACPI_5_0_HW_REDUCED_ACPI) && >=20 > + (Fadt->SmiCmd =3D=3D 0) && >=20 > + !SciEnabled) { >=20 > + // >=20 > + // The ACPI enabling status is inconsistent: SCI is not enabled bu= t ACPI >=20 > + // table does not provide a means to enable it through FADT->SmiCm= d >=20 > + // >=20 > + DEBUG ((DEBUG_ERROR, "ERROR: The ACPI enabling status is inconsist= ent: SCI is not" >=20 > + " enabled but the ACPI table does not provide a means to enable = it through FADT->SmiCmd." >=20 > + " This may cause issues in OS.\n")); >=20 > + } >=20 > + DEBUG_CODE_END (); >=20 > + >=20 > + return RETURN_SUCCESS; >=20 > +} >=20 > + >=20 > + >=20 > +/** >=20 > + Build ACPI board info HOB using infomation from ACPI table >=20 > + >=20 > + @param AcpiTableBase ACPI table start address in memory >=20 > + >=20 > + @retval A pointer to ACPI board HOB ACPI_BOARD_INFO. Null if build HO= B failure. >=20 > +**/ >=20 > +ACPI_BOARD_INFO * >=20 > +BuildHobFromAcpi ( >=20 > + IN UINT64 AcpiTableBase >=20 > + ) >=20 > +{ >=20 > + EFI_STATUS Status; >=20 > + ACPI_BOARD_INFO AcpiBoardInfo; >=20 > + ACPI_BOARD_INFO *NewAcpiBoardInfo; >=20 > + >=20 > + NewAcpiBoardInfo =3D NULL; >=20 > + Status =3D ParseAcpiInfo (AcpiTableBase, &AcpiBoardInfo); >=20 > + ASSERT_EFI_ERROR (Status); >=20 > + if (!EFI_ERROR (Status)) { >=20 > + NewAcpiBoardInfo =3D BuildGuidHob (&gUefiAcpiBoardInfoGuid, sizeof (= ACPI_BOARD_INFO)); >=20 > + ASSERT (NewAcpiBoardInfo !=3D NULL); >=20 > + CopyMem (NewAcpiBoardInfo, &AcpiBoardInfo, sizeof (ACPI_BOARD_INFO))= ; >=20 > + DEBUG ((DEBUG_INFO, "Create acpi board info guid hob\n")); >=20 > + } >=20 > + return NewAcpiBoardInfo; >=20 > +} >=20 > + >=20 > + >=20 > diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c b/UefiPay= loadPkg/UefiPayloadEntry/UefiPayloadEntry.c > index ae16f25c7c..a12d9961f1 100644 > --- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c > +++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c > @@ -212,167 +212,6 @@ MemInfoCallback ( >=20 >=20 >=20 >=20 >=20 >=20 > -/** >=20 > - Find the board related info from ACPI table >=20 > - >=20 > - @param AcpiTableBase ACPI table start address in memory >=20 > - @param AcpiBoardInfo Pointer to the acpi board info strucutr= e >=20 > - >=20 > - @retval RETURN_SUCCESS Successfully find out all the required info= rmation. >=20 > - @retval RETURN_NOT_FOUND Failed to find the required info. >=20 > - >=20 > -**/ >=20 > -RETURN_STATUS >=20 > -ParseAcpiInfo ( >=20 > - IN UINT64 AcpiTableBase, >=20 > - OUT ACPI_BOARD_INFO *AcpiBoardInfo >=20 > - ) >=20 > -{ >=20 > - EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp; >=20 > - EFI_ACPI_DESCRIPTION_HEADER *Rsdt; >=20 > - UINT32 *Entry32; >=20 > - UINTN Entry32Num; >=20 > - EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *Fadt; >=20 > - EFI_ACPI_DESCRIPTION_HEADER *Xsdt; >=20 > - UINT64 *Entry64; >=20 > - UINTN Entry64Num; >=20 > - UINTN Idx; >=20 > - UINT32 *Signature; >=20 > - EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *MmCfgH= dr; >=20 > - EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOC= ATION_STRUCTURE > *MmCfgBase; >=20 > - >=20 > - Rsdp =3D (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)(UINTN)AcpiTa= bleBase; >=20 > - DEBUG ((DEBUG_INFO, "Rsdp at 0x%p\n", Rsdp)); >=20 > - DEBUG ((DEBUG_INFO, "Rsdt at 0x%x, Xsdt at 0x%lx\n", Rsdp->RsdtAddress= , Rsdp->XsdtAddress)); >=20 > - >=20 > - // >=20 > - // Search Rsdt First >=20 > - // >=20 > - Fadt =3D NULL; >=20 > - MmCfgHdr =3D NULL; >=20 > - Rsdt =3D (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->RsdtAddress)= ; >=20 > - if (Rsdt !=3D NULL) { >=20 > - Entry32 =3D (UINT32 *)(Rsdt + 1); >=20 > - Entry32Num =3D (Rsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) = >> 2; >=20 > - for (Idx =3D 0; Idx < Entry32Num; Idx++) { >=20 > - Signature =3D (UINT32 *)(UINTN)Entry32[Idx]; >=20 > - if (*Signature =3D=3D EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SI= GNATURE) { >=20 > - Fadt =3D (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)Signature; >=20 > - DEBUG ((DEBUG_INFO, "Found Fadt in Rsdt\n")); >=20 > - } >=20 > - >=20 > - if (*Signature =3D=3D > EFI_ACPI_5_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_D= ESCRIPTION_TABLE_SIGNATURE) > { >=20 > - MmCfgHdr =3D (EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_= TABLE_HEADER *)Signature; >=20 > - DEBUG ((DEBUG_INFO, "Found MM config address in Rsdt\n")); >=20 > - } >=20 > - >=20 > - if ((Fadt !=3D NULL) && (MmCfgHdr !=3D NULL)) { >=20 > - goto Done; >=20 > - } >=20 > - } >=20 > - } >=20 > - >=20 > - // >=20 > - // Search Xsdt Second >=20 > - // >=20 > - Xsdt =3D (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->XsdtAddress)= ; >=20 > - if (Xsdt !=3D NULL) { >=20 > - Entry64 =3D (UINT64 *)(Xsdt + 1); >=20 > - Entry64Num =3D (Xsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) = >> 3; >=20 > - for (Idx =3D 0; Idx < Entry64Num; Idx++) { >=20 > - Signature =3D (UINT32 *)(UINTN)Entry64[Idx]; >=20 > - if (*Signature =3D=3D EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SI= GNATURE) { >=20 > - Fadt =3D (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)Signature; >=20 > - DEBUG ((DEBUG_INFO, "Found Fadt in Xsdt\n")); >=20 > - } >=20 > - >=20 > - if (*Signature =3D=3D > EFI_ACPI_5_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_D= ESCRIPTION_TABLE_SIGNATURE) > { >=20 > - MmCfgHdr =3D (EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_= TABLE_HEADER *)Signature; >=20 > - DEBUG ((DEBUG_INFO, "Found MM config address in Xsdt\n")); >=20 > - } >=20 > - >=20 > - if ((Fadt !=3D NULL) && (MmCfgHdr !=3D NULL)) { >=20 > - goto Done; >=20 > - } >=20 > - } >=20 > - } >=20 > - >=20 > - if (Fadt =3D=3D NULL) { >=20 > - return RETURN_NOT_FOUND; >=20 > - } >=20 > - >=20 > -Done: >=20 > - >=20 > - AcpiBoardInfo->PmCtrlRegBase =3D Fadt->Pm1aCntBlk; >=20 > - AcpiBoardInfo->PmTimerRegBase =3D Fadt->PmTmrBlk; >=20 > - AcpiBoardInfo->ResetRegAddress =3D Fadt->ResetReg.Address; >=20 > - AcpiBoardInfo->ResetValue =3D Fadt->ResetValue; >=20 > - AcpiBoardInfo->PmEvtBase =3D Fadt->Pm1aEvtBlk; >=20 > - AcpiBoardInfo->PmGpeEnBase =3D Fadt->Gpe0Blk + Fadt->Gpe0BlkLen / = 2; >=20 > - >=20 > - if (MmCfgHdr !=3D NULL) { >=20 > - MmCfgBase =3D > (EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCAT= ION_STRUCTURE *)((UINT8*) > MmCfgHdr + sizeof (*MmCfgHdr)); >=20 > - AcpiBoardInfo->PcieBaseAddress =3D MmCfgBase->BaseAddress; >=20 > - AcpiBoardInfo->PcieBaseSize =3D (MmCfgBase->EndBusNumber + 1 - MmCfg= Base->StartBusNumber) * 4096 * 32 * 8; >=20 > - } else { >=20 > - AcpiBoardInfo->PcieBaseAddress =3D 0; >=20 > - AcpiBoardInfo->PcieBaseSize =3D 0; >=20 > - } >=20 > - DEBUG ((DEBUG_INFO, "PmCtrl Reg 0x%lx\n", AcpiBoardInfo->PmCtrlRegBa= se)); >=20 > - DEBUG ((DEBUG_INFO, "PmTimer Reg 0x%lx\n", AcpiBoardInfo->PmTimerRegB= ase)); >=20 > - DEBUG ((DEBUG_INFO, "Reset Reg 0x%lx\n", AcpiBoardInfo->ResetRegAdd= ress)); >=20 > - DEBUG ((DEBUG_INFO, "Reset Value 0x%x\n", AcpiBoardInfo->ResetValue)= ); >=20 > - DEBUG ((DEBUG_INFO, "PmEvt Reg 0x%lx\n", AcpiBoardInfo->PmEvtBase))= ; >=20 > - DEBUG ((DEBUG_INFO, "PmGpeEn Reg 0x%lx\n", AcpiBoardInfo->PmGpeEnBase= )); >=20 > - DEBUG ((DEBUG_INFO, "PcieBaseAddr 0x%lx\n", AcpiBoardInfo->PcieBaseAdd= ress)); >=20 > - DEBUG ((DEBUG_INFO, "PcieBaseSize 0x%lx\n", AcpiBoardInfo->PcieBaseSiz= e)); >=20 > - >=20 > - // >=20 > - // Verify values for proper operation >=20 > - // >=20 > - ASSERT(Fadt->Pm1aCntBlk !=3D 0); >=20 > - ASSERT(Fadt->PmTmrBlk !=3D 0); >=20 > - ASSERT(Fadt->ResetReg.Address !=3D 0); >=20 > - ASSERT(Fadt->Pm1aEvtBlk !=3D 0); >=20 > - ASSERT(Fadt->Gpe0Blk !=3D 0); >=20 > - >=20 > - DEBUG_CODE_BEGIN (); >=20 > - BOOLEAN SciEnabled; >=20 > - >=20 > - // >=20 > - // Check the consistency of SCI enabling >=20 > - // >=20 > - >=20 > - // >=20 > - // Get SCI_EN value >=20 > - // >=20 > - if (Fadt->Pm1CntLen =3D=3D 4) { >=20 > - SciEnabled =3D (IoRead32 (Fadt->Pm1aCntBlk) & BIT0)? TRUE : FALSE; >=20 > - } else { >=20 > - // >=20 > - // if (Pm1CntLen =3D=3D 2), use 16 bit IO read; >=20 > - // if (Pm1CntLen !=3D 2 && Pm1CntLen !=3D 4), use 16 bit IO read a= s a fallback >=20 > - // >=20 > - SciEnabled =3D (IoRead16 (Fadt->Pm1aCntBlk) & BIT0)? TRUE : FALSE; >=20 > - } >=20 > - >=20 > - if (!(Fadt->Flags & EFI_ACPI_5_0_HW_REDUCED_ACPI) && >=20 > - (Fadt->SmiCmd =3D=3D 0) && >=20 > - !SciEnabled) { >=20 > - // >=20 > - // The ACPI enabling status is inconsistent: SCI is not enabled bu= t ACPI >=20 > - // table does not provide a means to enable it through FADT->SmiCm= d >=20 > - // >=20 > - DEBUG ((DEBUG_ERROR, "ERROR: The ACPI enabling status is inconsist= ent: SCI is not" >=20 > - " enabled but the ACPI table does not provide a means to enable = it through FADT->SmiCmd." >=20 > - " This may cause issues in OS.\n")); >=20 > - } >=20 > - DEBUG_CODE_END (); >=20 > - >=20 > - return RETURN_SUCCESS; >=20 > -} >=20 > - >=20 > - >=20 > /** >=20 > It will build HOBs based on information from bootloaders. >=20 >=20 >=20 > @@ -387,8 +226,7 @@ BuildHobFromBl ( > EFI_STATUS Status; >=20 > SYSTEM_TABLE_INFO SysTableInfo; >=20 > SYSTEM_TABLE_INFO *NewSysTableInfo; >=20 > - ACPI_BOARD_INFO AcpiBoardInfo; >=20 > - ACPI_BOARD_INFO *NewAcpiBoardInfo; >=20 > + ACPI_BOARD_INFO *AcpiBoardInfo; >=20 > EFI_PEI_GRAPHICS_INFO_HOB GfxInfo; >=20 > EFI_PEI_GRAPHICS_INFO_HOB *NewGfxInfo; >=20 > EFI_PEI_GRAPHICS_DEVICE_INFO_HOB GfxDeviceInfo; >=20 > @@ -471,20 +309,14 @@ BuildHobFromBl ( > // >=20 > // Create guid hob for acpi board information >=20 > // >=20 > - Status =3D ParseAcpiInfo (SysTableInfo.AcpiTableBase, &AcpiBoardInfo); >=20 > - ASSERT_EFI_ERROR (Status); >=20 > - if (!EFI_ERROR (Status)) { >=20 > - NewAcpiBoardInfo =3D BuildGuidHob (&gUefiAcpiBoardInfoGuid, sizeof (= ACPI_BOARD_INFO)); >=20 > - ASSERT (NewAcpiBoardInfo !=3D NULL); >=20 > - CopyMem (NewAcpiBoardInfo, &AcpiBoardInfo, sizeof (ACPI_BOARD_INFO))= ; >=20 > - DEBUG ((DEBUG_INFO, "Create acpi board info guid hob\n")); >=20 > - } >=20 > + AcpiBoardInfo =3D BuildHobFromAcpi (SysTableInfo.AcpiTableBase); >=20 > + ASSERT (AcpiBoardInfo !=3D NULL); >=20 >=20 >=20 > // >=20 > // Parse memory info and build memory HOBs for reserved DRAM and MMIO >=20 > // >=20 > DEBUG ((DEBUG_INFO , "Building ResourceDescriptorHobs for reserved mem= ory:\n")); >=20 > - Status =3D ParseMemoryInfo (MemInfoCallbackMmio, &AcpiBoardInfo); >=20 > + Status =3D ParseMemoryInfo (MemInfoCallbackMmio, AcpiBoardInfo); >=20 > if (EFI_ERROR(Status)) { >=20 > return Status; >=20 > } >=20 > diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h b/UefiPay= loadPkg/UefiPayloadEntry/UefiPayloadEntry.h > index 331724c687..9922b56b39 100644 > --- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h > +++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h > @@ -204,4 +204,17 @@ FvFindFileByTypeGuid ( > IN EFI_GUID *Guid OPTIONAL, >=20 > OUT EFI_FFS_FILE_HEADER **FileHeader >=20 > ); >=20 > + >=20 > +/** >=20 > + Build ACPI board info HOB using infomation from ACPI table >=20 > + >=20 > + @param AcpiTableBase ACPI table start address in memory >=20 > + >=20 > + @retval A pointer to ACPI board HOB ACPI_BOARD_INFO. Null if build HO= B failure. >=20 > +**/ >=20 > +ACPI_BOARD_INFO * >=20 > +BuildHobFromAcpi ( >=20 > + IN UINT64 AcpiTableBase >=20 > + ); >=20 > + >=20 > #endif >=20 > diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf b/UefiP= ayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf > index 8d42925fcd..4c5170d9cc 100644 > --- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf > +++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf > @@ -25,6 +25,7 @@ > UefiPayloadEntry.c >=20 > LoadDxeCore.c >=20 > MemoryAllocation.c >=20 > + AcpiTable.c >=20 >=20 >=20 > [Sources.Ia32] >=20 > X64/VirtualMemory.h >=20 > diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c > b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c > index 03ad9c457b..7e67cf0f04 100644 > --- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c > +++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c > @@ -260,6 +260,8 @@ BuildHobs ( > UNIVERSAL_PAYLOAD_EXTRA_DATA *ExtraData; >=20 > UINT8 *GuidHob; >=20 > EFI_HOB_FIRMWARE_VOLUME *FvHob; >=20 > + UNIVERSAL_PAYLOAD_ACPI_TABLE *AcpiTable; >=20 > + ACPI_BOARD_INFO *AcpiBoardInfo; >=20 >=20 >=20 > Hob.Raw =3D (UINT8 *) BootloaderParameter; >=20 > MinimalNeededSize =3D FixedPcdGet32 (PcdSystemMemoryUefiRegionSize); >=20 > @@ -351,6 +353,16 @@ BuildHobs ( > *DxeFv =3D (EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) ExtraData->Entry[0].= Base; >=20 > ASSERT ((*DxeFv)->FvLength =3D=3D ExtraData->Entry[0].Size); >=20 >=20 >=20 > + // >=20 > + // Create guid hob for acpi board information >=20 > + // >=20 > + GuidHob =3D GetFirstGuidHob(&gUniversalPayloadAcpiTableGuid); >=20 > + if (GuidHob !=3D NULL) { >=20 > + AcpiTable =3D (UNIVERSAL_PAYLOAD_ACPI_TABLE *) GET_GUID_HOB_DATA (Gu= idHob); >=20 > + AcpiBoardInfo =3D BuildHobFromAcpi ((UINT64)AcpiTable->Rsdp); >=20 > + ASSERT (AcpiBoardInfo !=3D NULL); >=20 > + } >=20 > + >=20 > // >=20 > // Update DXE FV information to first fv hob in the hob list, which >=20 > // is the empty FvHob created before. >=20 > diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf > b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf > index 3ee449219d..e7e05b744a 100644 > --- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf > +++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf > @@ -25,6 +25,7 @@ > LoadDxeCore.c >=20 > MemoryAllocation.c >=20 > PrintHob.c >=20 > + AcpiTable.c >=20 >=20 >=20 > [Sources.Ia32] >=20 > X64/VirtualMemory.h >=20 > @@ -61,7 +62,6 @@ > gEfiGraphicsDeviceInfoHobGuid >=20 > gUefiAcpiBoardInfoGuid >=20 > gEfiSmbiosTableGuid >=20 > - gEfiAcpiTableGuid >=20 > gUefiSerialPortInfoGuid >=20 > gUniversalPayloadExtraDataGuid >=20 > gPcdDataBaseHobGuid >=20 > -- > 2.32.0.windows.2