From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by mx.groups.io with SMTP id smtpd.web10.108.1624384496201876956 for ; Tue, 22 Jun 2021 10:54:56 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@intel.onmicrosoft.com header.s=selector2-intel-onmicrosoft-com header.b=fSbj6Sge; spf=pass (domain: intel.com, ip: 192.55.52.93, mailfrom: guo.dong@intel.com) IronPort-SDR: QegduNqWsHlYwEoiDtfJtT49AvMHtRXb+qPGinFZd2lwNG1TEpCG1WwFGFA6A154dl1H1YBncb +ZFx//oOqbwg== X-IronPort-AV: E=McAfee;i="6200,9189,10023"; a="204106164" X-IronPort-AV: E=Sophos;i="5.83,291,1616482800"; d="scan'208";a="204106164" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Jun 2021 10:54:55 -0700 IronPort-SDR: GVC9J8Cxi1lVFARspwnbGMQzLfBw7E8VsJtN428lDSog4XOP21q6HTIYVMSKwSzWvW0JWLwuBb U50Osp5RJshA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.83,291,1616482800"; d="scan'208";a="423404228" Received: from fmsmsx604.amr.corp.intel.com ([10.18.126.84]) by orsmga002.jf.intel.com with ESMTP; 22 Jun 2021 10:54:54 -0700 Received: from fmsmsx607.amr.corp.intel.com (10.18.126.87) by fmsmsx604.amr.corp.intel.com (10.18.126.84) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.4; Tue, 22 Jun 2021 10:54:54 -0700 Received: from fmsmsx607.amr.corp.intel.com (10.18.126.87) by fmsmsx607.amr.corp.intel.com (10.18.126.87) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.4; Tue, 22 Jun 2021 10:54:54 -0700 Received: from fmsedg602.ED.cps.intel.com (10.1.192.136) by fmsmsx607.amr.corp.intel.com (10.18.126.87) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.4 via Frontend Transport; Tue, 22 Jun 2021 10:54:54 -0700 Received: from NAM11-DM6-obe.outbound.protection.outlook.com (104.47.57.172) by edgegateway.intel.com (192.55.55.71) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2242.4; Tue, 22 Jun 2021 10:54:50 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=MvjMge91PtQcwiiSlCqY85An3+tIsBXf4EnyXp7kxd20fYhdkr3mhsSHP2jwSJMOQA2rAYtIsA40a3Wx8YS8GjTrQP8LGNQdRRS1/Y3CiWxXKSLlHlADaXsz1aokQq21x2tkjQi4BQVjM/rVJo7yeuuQF1QAgOTYP1k1+yJw9FL/aUobtXpHCln/nBXVaS3pFnp8Mu9b53VY/ebm1X4gU+TCVVPXpTOxnk4NepXgdmzyy211+tC5CQQM9PkBbOYdzOl1IhOurkZRxudYrCfhqMQlcD7xaWIcf8C42d6Z4ExHLVuM0cGGNH75ciPPX09+Y3GrkYji7/RNn6KUXRZ/9w== 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=55VhWCOxZR++ola3M9KMrAQtRsbbJszTZS2FcbBfUT0=; b=X3LS5XFwFBOQHyxUMRmtoWcP/R+o6KsOYa0pljetsN9TVIv0xZjUp6LmKe4dXtExA+vpaE4S/MSmGEP6wi7jnWAeSb8ym9CPShuN5iJjbbQjv/sTs+c/qWwR8UUeFaWvFANoohdLvgU5BRexfKDHhJWN/6KfXfa+HOq2HVQ5vNV72VhkQjuuiCqoqRP+nCxoshAPtlxtiEyPEuanCqU+mmHAFu4/mqATUISqzNS8WUKQ5aPzg/9KOl86nsKpxmXuXQMfRi9f5L+Y/BNEZuebe0+Ga8Ny/Smwn1/HIcAdJctRRjebCGL0NQ4hF2SgWO3bk80X99/+n2ze/cK3jhBG9A== 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=55VhWCOxZR++ola3M9KMrAQtRsbbJszTZS2FcbBfUT0=; b=fSbj6Sgel4UqNcNiQBUCH806b6T+mxT+h6NeYJiqB60cX7sPiZeR25UYX2v5bp8FYizq2aUKSEx1OZxsWVU138W4ZDKWNVXCkF3gULC/e8olcH3sDzjV9769jBaObCFsZRRYLzM2XHm/keDBJ/0k5xm0JzESVXxFRyDkqYUBxTA= Received: from BYAPR11MB3622.namprd11.prod.outlook.com (2603:10b6:a03:fe::30) by BYAPR11MB3254.namprd11.prod.outlook.com (2603:10b6:a03:7c::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4242.22; Tue, 22 Jun 2021 17:54:48 +0000 Received: from BYAPR11MB3622.namprd11.prod.outlook.com ([fe80::247b:262c:b8da:710b]) by BYAPR11MB3622.namprd11.prod.outlook.com ([fe80::247b:262c:b8da:710b%7]) with mapi id 15.20.4242.023; Tue, 22 Jun 2021 17:54:48 +0000 From: "Guo Dong" To: Patrick Rudolph , "devel@edk2.groups.io" CC: "Ma, Maurice" , "You, Benjamin" Subject: Re: [PATCH v3] UefiPayloadPkg/UefiPayloadEntry: Improve bootloader memrange parsing Thread-Topic: [PATCH v3] UefiPayloadPkg/UefiPayloadEntry: Improve bootloader memrange parsing Thread-Index: AQHXZnTaqXyapkhIy0uyKURlWyEDzKsgUm4A Date: Tue, 22 Jun 2021 17:54:48 +0000 Message-ID: References: <20210621080937.76468-1-patrick.rudolph@9elements.com> In-Reply-To: <20210621080937.76468-1-patrick.rudolph@9elements.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-reaction: no-action dlp-version: 11.5.1.3 authentication-results: 9elements.com; dkim=none (message not signed) header.d=none;9elements.com; dmarc=none action=none header.from=intel.com; x-originating-ip: [68.104.146.79] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 2482400c-66f8-4407-d3e2-08d935a6d403 x-ms-traffictypediagnostic: BYAPR11MB3254: 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: 3V4p/z34TUhTv6ikuWlte+9eqx0LJ/TIUn937UiodhoGg45smZEBNz5g/LSfnO509VooXMY11s/ZOfak/K67q51lcCq/mORKAbyAzrtj7tnNokzG9qOcpyNZOKKYiIoK5TDx/S7TDTSNg8CQIjW5t18JbAhVf5Xy6a/Fpxq1SWY0l87yLv5ONbBui/Tm54ttLF8HxqY0AU2tNoZLWCoah0+TV/KrQGgiOoodi58c18uIvk8xCKklBUAlF40ROCyrbesvUKjN4ivCYw4M2r//AIf9gPDbFgp+lvX84CVHUDgRPeUVhfuPt4JfyWYT7EhonlEhlpjKZo2Y3ozRH9ZeVEPZCSWOJvP4OfvAz1hnABMlUsyPPuRfoOHxom9HManI4rY9f/qO5MWdJYTXRJdmGNeGIDnRGqPB74/McLCbjuNjrZAFkd1TjTl089fwn8J4zdOpBVvoIQd032VKnoBM1b8AT5l/Z+lU8vaE35Gk7yvBcJsauMecHosZ7FLwPQjAuaAdLn7D2fdMm3lK1CyZfz2mwQnz2Sho0nrTEf5NdjsrBnaq6oKWtAj62BC6RbwvlopZZdhVUp6VadbF4JdM42TR+jghl0n0fugg+WrDDQQ= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BYAPR11MB3622.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(396003)(376002)(346002)(136003)(39860400002)(366004)(110136005)(71200400001)(52536014)(8676002)(9686003)(33656002)(86362001)(6506007)(107886003)(55016002)(54906003)(53546011)(316002)(38100700002)(186003)(76116006)(83380400001)(66946007)(26005)(4326008)(478600001)(5660300002)(8936002)(122000001)(66446008)(64756008)(66556008)(66476007)(30864003)(2906002)(7696005);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?DM3yY4C78EoFzEnWr0FRh4C6NSqCA4sHVWbUvdmWiMrqtVQiG452SGVBNBcs?= =?us-ascii?Q?7d2Cy6PAbn4NzjpMkP6C2ApmQCC/+2kREhpczDlR8ROfUhlwMoXwZpVtJBJE?= =?us-ascii?Q?l10lxOAHKvx1Es7DDNtEwTPoG21rLUumaZw8Dk1zyw5s27OvMXRowijawwnZ?= =?us-ascii?Q?xrN52pJYl7/Dhv7NDS5ZW0gRJJzm9hWjfHp7YKfVRRfSBMVHkt/VgelT+mRJ?= =?us-ascii?Q?ECsNSY06dmoULbALQuv6I2f2y/J9Humlo+t7LyA3IrEiaDCcxcqg6delihcw?= =?us-ascii?Q?vL1MkMwUCG49qE1FpGXuNiPLW2oCO3UzKsk30hTCPdvF+L98OzKwVBk3YvaH?= =?us-ascii?Q?PaZ0uK41bXiJnXvYJgOO7OtP0eFCJ7LW5KUYrstxdgWcSGfV5kLpdL51O7QQ?= =?us-ascii?Q?/nShJLhIEYxhjDs+X5Vtp8pooOBtz7Y65gFzoumyl9H2uJ9YASuGu6GlpFRV?= =?us-ascii?Q?BBm7liLzsZ9LT0KFt+YURNtde+RaEC3+eFxJmopLr/01Td6t8cCnbMr+fnwO?= =?us-ascii?Q?kOUYUfdzqFukOBsCN3A6LTC0I4ADxox+SuUGG8Ocy/IIv3bb2cS6qroFAPJv?= =?us-ascii?Q?GrEmSB542bEbiacIhoYVvaMJb7j1uFcO+vw1ej0C/vHWkD0+1xOmeXiWhy/u?= =?us-ascii?Q?6EoOw8cvlt6IrIF44CWCtGJxQabJcb7n1+927D7kOOaiE5vZpIa5pMUrDB7z?= =?us-ascii?Q?FoI4oKSnScVxlvVBXI8Q3h6DfvvoQcvjz386DHbRjYi81rqOYxUa8emJOSKT?= =?us-ascii?Q?S9pms5qYTCt6cLkzDBh+eRua7P+PtR706fehlw2u0pNGFWamLWE+4HZMW6KN?= =?us-ascii?Q?RRe3nunO/Cs9+Wh7tBeIDRt3HufDtRrJfmXateTcY52w7lAHBHXyUGTnJZBd?= =?us-ascii?Q?+ztlTJB258H3wfsfXxd2Tpu1Umd5iwIcZemovNiR1f5654BsJPaYBUxjGRQX?= =?us-ascii?Q?IyB8Lgq6uv2y8eG6zzzKmbqsU7yU+uWOG/ptDjK1MW3fBwng0XNWn3fRhMhQ?= =?us-ascii?Q?8QoZwOaIYo3aWjfLqgd8wOnhNQ2JZQ4HroE547IGpuSRCgoWhD0HxRv2VN5H?= =?us-ascii?Q?4wHfiMgw5mAVWIj0KfVbF6uCO9NXMeMiBmo3xLLIBzkVxqaNuXCQazUcqsBg?= =?us-ascii?Q?f+qnu4tkg08vNOf4MoeMJLH5Z0LbWOFO+7+xuVYMix9pfr7OnWZ8ac8C7HbT?= =?us-ascii?Q?VKYDoYfGWYPIDIEUv1R00vln+l5hPrMumHC9kmlG5wBWxjtbd9NdU2feSyLJ?= =?us-ascii?Q?DS03V2sd9OdGt/Y0SeuBPKTQpzU+j9S5jJqginNZ3ojHtvM2/tMuEG7jnvVq?= =?us-ascii?Q?OR/3+JvImxMwW1d/VsPwm58b?= MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: BYAPR11MB3622.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2482400c-66f8-4407-d3e2-08d935a6d403 X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Jun 2021 17:54:48.5950 (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: ChXN446hC769Ufwn6lndxI9DMHhX4lLjtMuw5GmqNsFNyfdgznCORNrMwScCOx7f35wG+hcgRk+hGf8jveaOxA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BYAPR11MB3254 Return-Path: guo.dong@intel.com X-OriginatorOrg: intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: Guo Dong > -----Original Message----- > From: Patrick Rudolph > Sent: Monday, June 21, 2021 1:10 AM > To: devel@edk2.groups.io > Cc: Ma, Maurice ; Dong, Guo > ; You, Benjamin > Subject: [PATCH v3] UefiPayloadPkg/UefiPayloadEntry: Improve bootloader > memrange parsing >=20 > Currently several DXE crash due to invalid memory resource settings. > The PciHostBridgeDxe which expects the MMCONF and PCI Aperature > to be EfiMemoryMappedIO, but currently those regions are (partly) > mapped as EfiReservedMemoryType. >=20 > coreboot and slimbootloader provide an e820 compatible memory map, > which doesn't work well with EDK2 as the e820 spec is missing MMIO region= s. > In e820 'reserved' could either mean "DRAM used by boot firmware" or > "MMIO > in use and not detectable by OS". >=20 > Guess Top of lower usable DRAM (TOLUD) by walking the bootloader > provided > memory ranges. Memory types of RAM, ACPI and ACPI NVS below 4 GiB are > used > to increment TOLUD and reserved memory ranges touching TOLUD at the > base > are also assumed to be reserved DRAM, which increment TOLUD. >=20 > Then mark everything reserved below TOLUD as EfiReservedMemoryType > and > everything reserved above TOLUD as EfiMemoryMappedIO. >=20 > This fixes assertions seen in PciHostBridgeDxe. >=20 > Signed-off-by: Patrick Rudolph > --- > .../UefiPayloadEntry/UefiPayloadEntry.c | 190 +++++++++++++++++- > .../UefiPayloadEntry/UefiPayloadEntry.h | 10 + > 2 files changed, 197 insertions(+), 3 deletions(-) >=20 > diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c > b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c > index 805f5448d9..04c58f776c 100644 > --- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c > +++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c > @@ -7,10 +7,159 @@ >=20 >=20 > #include "UefiPayloadEntry.h" >=20 >=20 >=20 > +STATIC UINT32 mTopOfLowerUsableDram =3D 0; >=20 > + >=20 > /** >=20 > Callback function to build resource descriptor HOB >=20 >=20 >=20 > This function build a HOB based on the memory map entry info. >=20 > + It creates only EFI_RESOURCE_MEMORY_MAPPED_IO and > EFI_RESOURCE_MEMORY_RESERVED >=20 > + resources. >=20 > + >=20 > + @param MemoryMapEntry Memory map entry info got from > bootloader. >=20 > + @param Params A pointer to ACPI_BOARD_INFO. >=20 > + >=20 > + @retval EFI_SUCCESS Successfully build a HOB. >=20 > + @retval EFI_INVALID_PARAMETER Invalid parameter provided. >=20 > +**/ >=20 > +EFI_STATUS >=20 > +MemInfoCallbackMmio ( >=20 > + IN MEMROY_MAP_ENTRY *MemoryMapEntry, >=20 > + IN VOID *Params >=20 > + ) >=20 > +{ >=20 > + EFI_PHYSICAL_ADDRESS Base; >=20 > + EFI_RESOURCE_TYPE Type; >=20 > + UINT64 Size; >=20 > + EFI_RESOURCE_ATTRIBUTE_TYPE Attribue; >=20 > + ACPI_BOARD_INFO *AcpiBoardInfo; >=20 > + >=20 > + AcpiBoardInfo =3D (ACPI_BOARD_INFO *)Params; >=20 > + if (AcpiBoardInfo =3D=3D NULL) { >=20 > + return EFI_INVALID_PARAMETER; >=20 > + } >=20 > + >=20 > + // >=20 > + // Skip types already handled in MemInfoCallback >=20 > + // >=20 > + if (MemoryMapEntry->Type =3D=3D E820_RAM || MemoryMapEntry->Type =3D= =3D > E820_ACPI) { >=20 > + return EFI_SUCCESS; >=20 > + } >=20 > + >=20 > + if (MemoryMapEntry->Base =3D=3D AcpiBoardInfo->PcieBaseAddress) { >=20 > + // >=20 > + // MMCONF is always MMIO >=20 > + // >=20 > + Type =3D EFI_RESOURCE_MEMORY_MAPPED_IO; >=20 > + } else if (MemoryMapEntry->Base < mTopOfLowerUsableDram) { >=20 > + // >=20 > + // It's in DRAM and thus must be reserved >=20 > + // >=20 > + Type =3D EFI_RESOURCE_MEMORY_RESERVED; >=20 > + } else if ((MemoryMapEntry->Base < 0x100000000ULL) && > (MemoryMapEntry->Base >=3D mTopOfLowerUsableDram)) { >=20 > + // >=20 > + // It's not in DRAM, must be MMIO >=20 > + // >=20 > + Type =3D EFI_RESOURCE_MEMORY_MAPPED_IO; >=20 > + } else { >=20 > + Type =3D EFI_RESOURCE_MEMORY_RESERVED; >=20 > + } >=20 > + >=20 > + Base =3D MemoryMapEntry->Base; >=20 > + Size =3D MemoryMapEntry->Size; >=20 > + >=20 > + Attribue =3D EFI_RESOURCE_ATTRIBUTE_PRESENT | >=20 > + EFI_RESOURCE_ATTRIBUTE_INITIALIZED | >=20 > + EFI_RESOURCE_ATTRIBUTE_TESTED | >=20 > + EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE | >=20 > + EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE | >=20 > + EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE | >=20 > + EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE; >=20 > + >=20 > + BuildResourceDescriptorHob (Type, Attribue, > (EFI_PHYSICAL_ADDRESS)Base, Size); >=20 > + DEBUG ((DEBUG_INFO , "buildhob: base =3D 0x%lx, size =3D 0x%lx, type = =3D > 0x%x\n", Base, Size, Type)); >=20 > + >=20 > + if (MemoryMapEntry->Type =3D=3D E820_UNUSABLE || >=20 > + MemoryMapEntry->Type =3D=3D E820_DISABLED) { >=20 > + BuildMemoryAllocationHob (Base, Size, EfiUnusableMemory); >=20 > + } else if (MemoryMapEntry->Type =3D=3D E820_PMEM) { >=20 > + BuildMemoryAllocationHob (Base, Size, EfiPersistentMemory); >=20 > + } >=20 > + >=20 > + return EFI_SUCCESS; >=20 > +} >=20 > + >=20 > + >=20 > +/** >=20 > + Callback function to find TOLUD (Top of Lower Usable DRAM) >=20 > + >=20 > + Estimate where TOLUD (Top of Lower Usable DRAM) resides. The exact > position >=20 > + would require platform specific code. >=20 > + >=20 > + @param MemoryMapEntry Memory map entry info got from > bootloader. >=20 > + @param Params Not used for now. >=20 > + >=20 > + @retval EFI_SUCCESS Successfully updated > mTopOfLowerUsableDram. >=20 > +**/ >=20 > +EFI_STATUS >=20 > +FindToludCallback ( >=20 > + IN MEMROY_MAP_ENTRY *MemoryMapEntry, >=20 > + IN VOID *Params >=20 > + ) >=20 > +{ >=20 > + // >=20 > + // This code assumes that the memory map on this x86 machine below > 4GiB is continous >=20 > + // until TOLUD. In addition it assumes that the bootloader provided > memory tables have >=20 > + // no "holes" and thus the first memory range not covered by e820 mark= s > the end of >=20 > + // usable DRAM. In addition it's assumed that every reserved memory > region touching >=20 > + // usable RAM is also covering DRAM, everything else that is marked > reserved thus must be >=20 > + // MMIO not detectable by bootloader/OS >=20 > + // >=20 > + >=20 > + // >=20 > + // Skip memory types not RAM or reserved >=20 > + // >=20 > + if ((MemoryMapEntry->Type =3D=3D E820_UNUSABLE) || (MemoryMapEntry- > >Type =3D=3D E820_DISABLED) || >=20 > + (MemoryMapEntry->Type =3D=3D E820_PMEM)) { >=20 > + return EFI_SUCCESS; >=20 > + } >=20 > + >=20 > + // >=20 > + // Skip resources above 4GiB >=20 > + // >=20 > + if ((MemoryMapEntry->Base + MemoryMapEntry->Size) > > 0x100000000ULL) { >=20 > + return EFI_SUCCESS; >=20 > + } >=20 > + >=20 > + if ((MemoryMapEntry->Type =3D=3D E820_RAM) || (MemoryMapEntry->Type > =3D=3D E820_ACPI) || >=20 > + (MemoryMapEntry->Type =3D=3D E820_NVS)) { >=20 > + // >=20 > + // It's usable DRAM. Update TOLUD. >=20 > + // >=20 > + if (mTopOfLowerUsableDram < (MemoryMapEntry->Base + > MemoryMapEntry->Size)) { >=20 > + mTopOfLowerUsableDram =3D (UINT32)(MemoryMapEntry->Base + > MemoryMapEntry->Size); >=20 > + } >=20 > + } else { >=20 > + // >=20 > + // It might be 'reserved DRAM' or 'MMIO'. >=20 > + // >=20 > + // If it touches usable DRAM at Base assume it's DRAM as well, >=20 > + // as it could be bootloader installed tables, TSEG, GTT, ... >=20 > + // >=20 > + if (mTopOfLowerUsableDram =3D=3D MemoryMapEntry->Base) { >=20 > + mTopOfLowerUsableDram =3D (UINT32)(MemoryMapEntry->Base + > MemoryMapEntry->Size); >=20 > + } >=20 > + } >=20 > + >=20 > + return EFI_SUCCESS; >=20 > +} >=20 > + >=20 > + >=20 > +/** >=20 > + Callback function to build resource descriptor HOB >=20 > + >=20 > + This function build a HOB based on the memory map entry info. >=20 > + Only add EFI_RESOURCE_SYSTEM_MEMORY. >=20 >=20 >=20 > @param MemoryMapEntry Memory map entry info got from > bootloader. >=20 > @param Params Not used for now. >=20 > @@ -28,7 +177,16 @@ MemInfoCallback ( > UINT64 Size; >=20 > EFI_RESOURCE_ATTRIBUTE_TYPE Attribue; >=20 >=20 >=20 > - Type =3D (MemoryMapEntry->Type =3D=3D 1) ? > EFI_RESOURCE_SYSTEM_MEMORY : EFI_RESOURCE_MEMORY_RESERVED; >=20 > + // >=20 > + // Skip everything not known to be usable DRAM. >=20 > + // It will be added later. >=20 > + // >=20 > + if ((MemoryMapEntry->Type !=3D E820_RAM) && (MemoryMapEntry- > >Type !=3D E820_ACPI) && >=20 > + (MemoryMapEntry->Type !=3D E820_NVS)) { >=20 > + return RETURN_SUCCESS; >=20 > + } >=20 > + >=20 > + Type =3D EFI_RESOURCE_SYSTEM_MEMORY; >=20 > Base =3D MemoryMapEntry->Base; >=20 > Size =3D MemoryMapEntry->Size; >=20 >=20 >=20 > @@ -40,7 +198,7 @@ MemInfoCallback ( > EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE | >=20 > EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE; >=20 >=20 >=20 > - if (Base >=3D BASE_4GB ) { >=20 > + if (Base >=3D BASE_4GB) { >=20 > // Remove tested attribute to avoid DXE core to dispatch driver to m= emory > above 4GB >=20 > Attribue &=3D ~EFI_RESOURCE_ATTRIBUTE_TESTED; >=20 > } >=20 > @@ -48,6 +206,12 @@ MemInfoCallback ( > BuildResourceDescriptorHob (Type, Attribue, > (EFI_PHYSICAL_ADDRESS)Base, Size); >=20 > DEBUG ((DEBUG_INFO , "buildhob: base =3D 0x%lx, size =3D 0x%lx, type = =3D > 0x%x\n", Base, Size, Type)); >=20 >=20 >=20 > + if (MemoryMapEntry->Type =3D=3D E820_ACPI) { >=20 > + BuildMemoryAllocationHob (Base, Size, EfiACPIReclaimMemory); >=20 > + } else if (MemoryMapEntry->Type =3D=3D E820_NVS) { >=20 > + BuildMemoryAllocationHob (Base, Size, EfiACPIMemoryNVS); >=20 > + } >=20 > + >=20 > return RETURN_SUCCESS; >=20 > } >=20 >=20 >=20 > @@ -236,8 +400,19 @@ BuildHobFromBl ( > EFI_PEI_GRAPHICS_DEVICE_INFO_HOB *NewGfxDeviceInfo; >=20 >=20 >=20 > // >=20 > - // Parse memory info and build memory HOBs >=20 > + // First find TOLUD >=20 > + // >=20 > + DEBUG ((DEBUG_INFO , "Guessing Top of Lower Usable DRAM:\n")); >=20 > + Status =3D ParseMemoryInfo (FindToludCallback, NULL); >=20 > + if (EFI_ERROR(Status)) { >=20 > + return Status; >=20 > + } >=20 > + DEBUG ((DEBUG_INFO , "Assuming TOLUD =3D 0x%x\n", > mTopOfLowerUsableDram)); >=20 > + >=20 > + // >=20 > + // Parse memory info and build memory HOBs for Usable RAM >=20 > // >=20 > + DEBUG ((DEBUG_INFO , "Building ResourceDescriptorHobs for usable > memory:\n")); >=20 > Status =3D ParseMemoryInfo (MemInfoCallback, NULL); >=20 > if (EFI_ERROR(Status)) { >=20 > return Status; >=20 > @@ -289,6 +464,15 @@ BuildHobFromBl ( > DEBUG ((DEBUG_INFO, "Create acpi board info guid hob\n")); >=20 > } >=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 > memory:\n")); >=20 > + Status =3D ParseMemoryInfo (MemInfoCallbackMmio, &AcpiBoardInfo); >=20 > + if (EFI_ERROR(Status)) { >=20 > + return Status; >=20 > + } >=20 > + >=20 > // >=20 > // Parse platform specific information. >=20 > // >=20 > diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h > b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h > index 2c84d6ed53..4fd50e47cd 100644 > --- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h > +++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h > @@ -38,6 +38,16 @@ > #define GET_OCCUPIED_SIZE(ActualSize, Alignment) \ >=20 > ((ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) & > ((Alignment) - 1))) >=20 >=20 >=20 > + >=20 > +#define E820_RAM 1 >=20 > +#define E820_RESERVED 2 >=20 > +#define E820_ACPI 3 >=20 > +#define E820_NVS 4 >=20 > +#define E820_UNUSABLE 5 >=20 > +#define E820_DISABLED 6 >=20 > +#define E820_PMEM 7 >=20 > +#define E820_UNDEFINED 8 >=20 > + >=20 > /** >=20 > Auto-generated function that calls the library constructors for all of= the > module's >=20 > dependent libraries. >=20 > -- > 2.30.2