From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by mx.groups.io with SMTP id smtpd.web08.8782.1655912126367082811 for ; Wed, 22 Jun 2022 08:35:26 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=XfmDk1g2; spf=pass (domain: kernel.org, ip: 139.178.84.217, mailfrom: ardb@kernel.org) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id B5F1C6175D for ; Wed, 22 Jun 2022 15:35:25 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 90A07C341CB for ; Wed, 22 Jun 2022 15:35:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1655912124; bh=NQGMY+3P1lDWJGPXjILJXckFUp382+abthoAXcMKbqw=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=XfmDk1g2Rs0RmJnzUjQgN393Ao/Gf42oumdAyN+ypSBzpOwKa+oN2X+FgDyzkDMpI xd5j31wGoPKJgWbU6A5Tz5t7RU0JPu/7TrkN0p6lbMIRbS8TQXlJVnGSiSQpCNESN4 +u9iszGVMH1PNiGCcRFGOM/VYqzTAW28OV6Yw16F2GW0oPsWujTb03IDEmY9cfBkBz JcmPBWdeZy/rs3WbTjVVw5y/f5LPE+tdln9OLP4D/KCELGSehW6DFiksqdp/9g/GDn Xc7hU3CsZh8HxkpHRcIV/Ih6mqpt78xplJrK5Ppxkgf32htMBYDiiIHe2vA3veHnX5 +LcJIKdmGNjtw== Received: by mail-oi1-f172.google.com with SMTP id u189so1471594oib.4 for ; Wed, 22 Jun 2022 08:35:24 -0700 (PDT) X-Gm-Message-State: AJIora9DVtJ3rIMy+xpc5aN5nWBbRrvaUEzChwA0AWQsF55IWLh9084s gUU9n3LnP5XjAdujVmoWSYuRDawJdevOZNKq3dU= X-Google-Smtp-Source: AGRyM1towqKSZfvt4uP3MCAZgiCU/TNBUJe721uma36kyOVcSv7O3Dhi08QReIvv5UvktfKrP9KsWvjNpbX9lNY7Nfk= X-Received: by 2002:a05:6808:300e:b0:32c:425e:df34 with SMTP id ay14-20020a056808300e00b0032c425edf34mr2266720oib.126.1655912123694; Wed, 22 Jun 2022 08:35:23 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: "Ard Biesheuvel" Date: Wed, 22 Jun 2022 17:35:12 +0200 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH v6 0/5] Handling of multiple PCI To: Nicolas Ojeda Leon Cc: edk2-devel-groups-io , Alexander Graf , Leif Lindholm , Sami Mujawar , Brijesh Singh , Erdem Aktas , James Bottomley , Min Xu , Tom Lendacky , Rebecca Cran , Peter Grehan , Sebastien Boeuf , Anthony Perard , Julien Grall , Ard Biesheuvel , Jiewen Yao , Jordan Justen , Gerd Hoffmann Content-Type: text/plain; charset="UTF-8" On Tue, 21 Jun 2022 at 23:28, Nicolas Ojeda Leon wrote: > > Increased control is provided in Ovmf platforms to define and configure > the specifications of multiple PCI host bridges in the hypervisor. The > host propagates this information to the guest, initially through fw-cfg > interface. > > In some AWS EC2 platforms, we expose a PCI topology including several > root bridges portraying information about physical distribution that > enables the guest to optimize accesses. Current PCI driver for Ovmf > enables the explicit definition of multiple root bridges and contains > the logic to fix their resources based on platform-specific PCD > entries. However, we need a way to control, from the hypervisor, how > many and which resources each PCI root bridge can use. For this > reason, this patch series introduces a mechanism to provide PCI host > bridges information like bus number range, attributes, allocation > attributes, PIO aperture as well as 32 and 64- bit prefetchable and > non-prefetchable MMIO ranges through a fw-cfg item created by the > hypervisor and consumed by the guest firmware. In order to offer a > generic and extensible way to disclose non-discoverable hardware > information from the host to the guest, a new library called > HardwareInfoLib is created in the OvmfPkg. In essence, this library > offers the functionality to parse a generic BLOB into a list as well > as the methods to iterate over such list, including filtering options. > The library is conceived in a generic way so that further hardware > elements can also be described using it. For such purpose the length > of the BLOB is not restricted but instead regarded as a sequence of > header-info elements that allow the parsing during runtime. > Furthermore, specific functionality is provided wrapping > QemuFwCfgReadBytes to extract hardware descriptions, in the > aforementioned format, in a static way so that early in the Pei > stage the library can be used to identify address space requirements. > The core of the library offers enough flexibility to process as many > elements, even from different hardware types (heterogenous), as needed > in a single run. This library is extended for the particular use case > already exposed, PCI host bridges, and this same code offers an > example of how to tailor it for further hardware components. > > After acknowledgement from Gerd Hoffmann and fixing all warnings and > errors found by the CI pipeline (via draft pull request), here I send > a new revision of the patches for merging. > > --- > Notes: > v6: > Prepearation for upstream merge: > - No functional change at all. > - Small changes to fix all builds excercised by CI > (https://github.com/tianocore/edk2/pull/2938) > - Added libraries to furhter platforms as per dependencies requirements > - Explicit casting of some values as required by build and > verification of values when demoting values. > - Arranged added files copyright to the format required. > - Changed HOST_BRIDGE_INFO bitfield member to UINT32 to follow > EDK2 guidelines motivated on build in 32-bit windows systems. > - Added verification of Bus Number range when values provided by > host to make sure Root Bridge is initialized with valid values > > v5: > - Removed last 3 patches dealing with pre-populated resources to > encapsulate related changes in more manageable chunks and while > pre-populated changes are finalized. > - Added Acked-by to all commits > - Re-based on top of latest master and refactored changes in > MemDetect.c to adapt to recently created > PlatformInitLib/MemDetect.c > > v4: > - Minor modification to use MAX_UINT64 as global invalid base address > when reading PCI host bridge information provided by the host > (Patch 1) > - Refactor PciHostBridgeUtilityGetRootBridges into a thin wrapper that > calls 2 new function: one (BusScan) that performs the legacy bus > scan population process and a new one (HostProvided) that populates > Root Bridges with host provided values. (Patch 5) > - Move code that sets value of PcdPciPreservePopulatedMappings token > based on host-provided fw-cfg file into the function that populates > root bridges with host provided data (Patch 6) > - Restructured base address retrieval to leave PCI Resource Allocation > protocol untouched and instead augment the existing services to > enable base address retrieval before allocation. (Patch 7) > - Use new method to retrieve Root Bridge base addresses before > allocation and use that to handle pre-populated BARs (Patch 8) > > > Nicolas Ojeda Leon (5): > OvmfPkg/Library: Create base HardwareInfoLib for PCI Host Bridges > Ovmf/HardwareInfoLib: Create Pei lib to parse directly from fw-cfg > Ovmf/HardwareInfoLib: Add Dxe lib to dynamically parse heterogenous > data > Ovmf/PlatformPei: Use host-provided GPA end if available > OvmfPkg/PciHostBridgeUtilityLib: Initialize RootBridges apertures with > spec > Merged as #3000, Thanks all, > ArmVirtPkg/ArmVirtQemu.dsc | 2 + > OvmfPkg/AmdSev/AmdSevX64.dsc | 2 + > OvmfPkg/Bhyve/BhyveX64.dsc | 2 + > OvmfPkg/CloudHv/CloudHvX64.dsc | 2 + > OvmfPkg/Include/Library/HardwareInfoLib.h | 159 ++++++ > .../HardwareInfoLib/DxeHardwareInfoLib.inf | 39 ++ > .../Library/HardwareInfoLib/HardwareInfoDxe.c | 254 +++++++++ > .../HardwareInfoPciHostBridgeLib.c | 508 ++++++++++++++++++ > .../HardwareInfoPciHostBridgeLib.h | 256 +++++++++ > .../Library/HardwareInfoLib/HardwareInfoPei.c | 79 +++ > .../HardwareInfoLib/HardwareInfoTypesLib.h | 59 ++ > .../HardwareInfoLib/PeiHardwareInfoLib.inf | 39 ++ > .../QemuFwCfgHardwareInfoLib.c | 88 +++ > .../PciHostBridgeUtilityLib.c | 332 +++++++++++- > .../PciHostBridgeUtilityLib.inf | 1 + > OvmfPkg/Library/PlatformInitLib/MemDetect.c | 148 ++++- > .../PlatformInitLib/PlatformInitLib.inf | 1 + > OvmfPkg/Microvm/MicrovmX64.dsc | 2 + > OvmfPkg/OvmfPkg.dec | 4 + > OvmfPkg/OvmfPkgIa32.dsc | 2 + > OvmfPkg/OvmfPkgIa32X64.dsc | 2 + > OvmfPkg/OvmfPkgX64.dsc | 2 + > OvmfPkg/OvmfXen.dsc | 2 + > 23 files changed, 1973 insertions(+), 12 deletions(-) > create mode 100644 OvmfPkg/Include/Library/HardwareInfoLib.h > create mode 100644 OvmfPkg/Library/HardwareInfoLib/DxeHardwareInfoLib.inf > create mode 100644 OvmfPkg/Library/HardwareInfoLib/HardwareInfoDxe.c > create mode 100644 OvmfPkg/Library/HardwareInfoLib/HardwareInfoPciHostBridgeLib.c > create mode 100644 OvmfPkg/Library/HardwareInfoLib/HardwareInfoPciHostBridgeLib.h > create mode 100644 OvmfPkg/Library/HardwareInfoLib/HardwareInfoPei.c > create mode 100644 OvmfPkg/Library/HardwareInfoLib/HardwareInfoTypesLib.h > create mode 100644 OvmfPkg/Library/HardwareInfoLib/PeiHardwareInfoLib.inf > create mode 100644 OvmfPkg/Library/HardwareInfoLib/QemuFwCfgHardwareInfoLib.c > > -- > 2.17.1 > > > > > Amazon Development Center Germany GmbH > Krausenstr. 38 > 10117 Berlin > Geschaeftsfuehrung: Christian Schlaeger, Jonathan Weiss > Eingetragen am Amtsgericht Charlottenburg unter HRB 149173 B > Sitz: Berlin > Ust-ID: DE 289 237 879 > > >