Laszlo,
Thanks for raising this questions.
Please see my embedded reply in below

Thanks/Ray

> -----Original Message-----
> From: edk2-devel [mailto:[email protected]] On Behalf Of
> Laszlo Ersek
> Sent: Thursday, July 27, 2017 7:23 PM
> To: Ni, Ruiyu <[email protected]>; [email protected]
> Cc: Marcel Apfelbaum <[email protected]>; Aleksandr Bezzubikov
> <[email protected]>; Zeng, Star <[email protected]>
> Subject: [edk2] bus number padding [was: MdeModulePkg/PciBus: Avoid
> hang when BUS pad resource is not in top]
> 
> Hello Ray,
> 
> please excuse me for hijacking this thread a little bit, but I'm very happy 
> that
> you happen to be looking at this exact part of the code, which is also what
> I've been discussing with Marcel and Aleksandr (CC'd) due to a different
> reason.
> 
> (The relevant sub-thread is at
> 
>   Allow RedHat PCI bridges reserve more buses than necessary during init
> 
>   http://mid.mail-archive.com/d0bd04f4-1ac4-0e3a-885f-
> [email protected]
> 
> but it's very long, so I'm not asking you to read that -- instead, please let 
> me
> ask you our question independently and in a self-contained
> form.)
> 
> In "OvmfPkg/PciHotPlugInitDxe/", we plan to return some BUS resource
> paddings, from the
> EFI_PCI_HOT_PLUG_INIT_PROTOCOL.GetResourcePadding()
> function.
> 
> QEMU has no "root" hotplug controllers, only "non-root" hotplug controllers
> (using the terminology from "12.6 PCI Hot Plug PCI Initialization Protocol" in
> the PI-1.6 spec). Therefore OVMF's
> EFI_PCI_HOT_PLUG_INIT_PROTOCOL.GetRootHpcList() returns an empty
> array.
> The BUS resource padding that we'd like to return from
> GetResourcePadding() would be for "non-root" hotplug controllers.
> 
> According to the PI spec, this is a valid thing to do:
> 
> * From "12.5 Sample Implementation for a Platform Containing PCI
>   Hot Plug* Slots":
> 
> > [...] For all the root HPCs and the nonroot HPCs, call
> > EFI_PCI_HOT_PLUG_INIT_PROTOCOL.GetResourcePadding() to obtain the
> > amount of overallocation and add that amount to the requests from the
> > physical devices. Reprogram the bus numbers by taking into account the
> > bus resource padding information. [...]
> 
> * From "12.6 PCI Hot Plug PCI Initialization Protocol,
>   EFI_PCI_HOT_PLUG_INIT_PROTOCOL.GetResourcePadding()":
> 
> > [...] This member function is called for all the root HPCs and nonroot
> > HPCs that are detected by the PCI bus enumerator. [...] The PCI bus
> > driver is responsible for adding this resource request to the resource
> > requests by the physical PCI devices. [...]
> 
> I searched PciBusDxe for GetResourcePadding() call sites, and there are
> two:
> 
> (1) In "MdeModulePkg/Bus/Pci/PciBusDxe/PciHotPlugSupport.c", function
>     GetResourcePaddingForHpb(). This call site seems to work as follows,
>     for our purposes:
> 
>     GetResourcePaddingPpb()
> [MdeModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.c]
>       GetResourcePaddingForHpb()
> [MdeModulePkg/Bus/Pci/PciBusDxe/PciHotPlugSupport.c]
>         gPciHotPlugInit->GetResourcePadding()
>         //
>         // and then save the resource descriptors, including the bus
>         // padding, in PciIoDevice->ResourcePaddingDescriptors
>         //
> 
>     ResourcePaddingPolicy()
> [MdeModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.c]
>       ApplyResourcePadding()
> [MdeModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.c]
>         //
>         // translate IO and MMIO resources from
>         // PciDev->ResourcePaddingDescriptors to internal padding
>         // representation
>         //
> 
>     This call site and processing seem to be active for "non-root"
>     hotplug controllers, but they do not consider bus numbers, only IO
>     and MMIO.
[Ray] It's in bus allocation phase. So the PciBus driver only cares about the
bus padding.
PciBus driver firstly allocates the bus resource and programs the PCI-PCI 
bridges
to set the bus numbers.
After that, PciBus allocates the IO/MMIO resources and program the BARs in
PCI devices & PCI-PCI bridges.
So it's good here.
> 
> (2) In the PciScanBus() function, file
>     "MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c", we have another
>     GetResourcePadding() call -- your present patch is updating this
>     code part.
> 
>     From the resource padding list returned by this GetResourcePadding()
>     invocation, PciBusDxe cares only about the bus numbers. I think
>     that's probably fine. However, in this location,
>     GetResourcePadding() is called *only* for "root" hotplug
>     controllers, of which QEMU has none.
> 
> The end result is that bus number paddings are not considered at all for
> "non-root" hotplug controllers:
[Ray] Bus number padding should be considered for "non-root" HPCs.
So I agree it's a bug/gap I need to fix. I noticed that already before your 
question.
And I do have a plan to fix it though the priority is not very high.

> - site (1) is active for "non-root" HPCs, but it ignores bus number
>   paddings,
> - site (2) processes bus number paddings, but it is inactive for
>   "non-root" HPCs.
> 
> This doesn't seem to match what the PI spec says. Is this behavior intentional
> in PciBusDxe? If so, what is the reason for it?
[Ray] In summary, site(1) is good. Site(2) contains a bug/gap.
Would you please submit a Bugzilla to record this issue?

But can you just return the non-root HPCs as root for a workaround?
What prevent you from reporting the HPC as non-root?
My opinion is the differences between non-root and root HPCs are:
1. Explicitly initialization is needed for root HPCs
2. Root HPCs may not be detected as hot-pluggable by PciBus using standard ways
If your platform doesn't report any root HPCs, why not just report non-root as 
root ones?

> 
> Thank you!
> Laszlo
> 
> On 07/27/17 05:05, Ruiyu Ni wrote:
> > PciScanBus() assumes the GetResourcePadding() puts BUS descriptor in
> > the very beginning, if it's not, the Descriptors will be updated to
> > point to middle of the pool buffer, which can cause
> > FreePool(Descriptors) hang in DEBUG image.
> > No functionality impact to RELEASE image.
> >
> > Contributed-under: TianoCore Contribution Agreement 1.0
> > Signed-off-by: Ruiyu Ni <[email protected]>
> > Cc: Star Zeng <[email protected]>
> > ---
> >  MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c | 6 ++++--
> >  1 file changed, 4 insertions(+), 2 deletions(-)
> >
> > diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c
> > b/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c
> > index e1d62e8c21..8b076e8791 100644
> > --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c
> > +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c
> > @@ -1,7 +1,7 @@
> >  /** @file
> >    Internal library implementation for PCI Bus module.
> >
> > -Copyright (c) 2006 - 2016, Intel Corporation. All rights
> > reserved.<BR>
> > +Copyright (c) 2006 - 2017, Intel Corporation. All rights
> > +reserved.<BR>
> >  (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>
> > This program and the accompanying materials  are licensed and made
> > available under the terms and conditions of the BSD License @@ -986,6
> > +986,7 @@ PciScanBus (
> >    UINT64                            PciAddress;
> >    EFI_HPC_PADDING_ATTRIBUTES        Attributes;
> >    EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Descriptors;
> > +  EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *NextDescriptors;
> >    UINT16                            BusRange;
> >    EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL   *PciRootBridgeIo;
> >    BOOLEAN                           BusPadding;
> > @@ -1143,8 +1144,9 @@ PciScanBus (
> >                }
> >
> >                BusRange = 0;
> > +              NextDescriptors = Descriptors;
> >                Status = PciGetBusRange (
> > -                        &Descriptors,
> > +                        &NextDescriptors,
> >                          NULL,
> >                          NULL,
> >                          &BusRange
> >
> 
> _______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to