Hi Ray,

On Tue, Nov 03, 2015 at 02:27:29PM +0000, Ni, Ruiyu wrote:
> Leif,
> I saw your feedbacks as your opinion if you create patches. I don't
> think your opinion is the *only* right solution.

Oh, certainly. I was only expecting some sort of response before the
patches were committed again.

> I can also split 3/4 in your patch serials to two patches: one is to
> just change DumpBridgeResource(), the other is for the remaining
> changes.
> So I think my splitting way is good enough.

And I will always argue for splitting more :)

> OK I will give response to your questions firstly.

Thanks.

Regards,

Leif
 
> Regards,
> Ray
> 
> -----Original Message-----
> From: Leif Lindholm [mailto:leif.lindh...@linaro.org] 
> Sent: Tuesday, November 3, 2015 6:45 PM
> To: Ni, Ruiyu <ruiyu...@intel.com>
> Cc: Tian, Feng <feng.t...@intel.com>; Kinney, Michael D 
> <michael.d.kin...@intel.com>; edk2-devel@lists.01.org; Fan, Jeff 
> <jeff....@intel.com>
> Subject: Re: [edk2] [Patch] MdeModulePkg: Fix a PciBusDxe hot plug bug
> 
> Hi guys,
> 
> I never saw a response to this feedback I sent on the revised patch
> set, but I see it has now been committed.
> Could you let me know why my feedback was ignored?
> 
> Regards,
> 
> Leif
> 
> On 30 October 2015 at 18:02, Leif Lindholm <leif.lindh...@linaro.org> wrote:
> > Hi Ray,
> >
> > Many thanks for this.
> >
> > On Fri, Oct 30, 2015 at 04:53:54AM +0000, Ni, Ruiyu wrote:
> >> Ok I will revert the two patches I committed (big patch + small
> >> patch). But I want to clarify one thing that not every big patch can
> >> be easily understood by just splitting to small patches.
> >
> > Certainly, but it is always helpful to split as much as is possible.
> > The shorter a patch is to review, the more likely reviewers are to
> > spot mistakes - especially when reviewing code they are not already
> > very familiar with.
> >
> > As an example, I have split your set up a little bit further by
> > breaking 2/3 into two separate patches.
> > https://git.linaro.org/people/leif.lindholm/edk2.git/shortlog/refs/heads/ray-pci
> >
> > I have also tried to remove modifications completely unrelated to this
> > fix - resulting in a difference between the tree with your current
> > patch set and my variant as included below. The changes in your set
> > are all valid changes, but they are not related to the fix.
> >
> > The method behind all of this madness is to make the output of "git
> > blame" as relevant as possible, as well as making automated "git
> > bisect" sessions for tracking down which specific change caused an
> > issue more useful.
> >
> > Best Regards,
> >
> > Leif
> >
> >
> > Diff between Ray's v2 and my version of it:
> >
> > diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c 
> > b/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c
> > index 12647be..523c698 100644
> > --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c
> > +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c
> > @@ -281,13 +281,13 @@ DumpResourceMap (
> >    IN UINTN             ResourceCount
> >    )
> >  {
> > -  EFI_STATUS           Status;
> > -  LIST_ENTRY           *Link;
> > -  PCI_IO_DEVICE        *Device;
> > -  UINTN                Index;
> > -  CHAR16               *Str;
> > -  PCI_RESOURCE_NODE    **ChildResources;
> > -  UINTN                ChildResourceCount;
> > +  EFI_STATUS                       Status;^M
> > +  LIST_ENTRY                       *Link;^M
> > +  PCI_IO_DEVICE                    *Device;^M
> > +  UINTN                            Index;^M
> > +  CHAR16                           *Str;^M
> > +  PCI_RESOURCE_NODE                **ChildResources;^M
> > +  UINTN                            ChildResourceCount;^M
> >
> >    DEBUG ((EFI_D_INFO, "PciBus: Resource Map for "));
> >
> > @@ -976,7 +976,7 @@ PciScanBus (
> >    UINT8                             Device;
> >    UINT8                             Func;
> >    UINT64                            Address;
> > -  UINT8                             SecondBus;
> > +  UINTN                             SecondBus;^M
> >    UINT8                             PaddedSubBus;
> >    UINT16                            Register;
> >    UINTN                             HpIndex;
> > @@ -1211,7 +1211,7 @@ PciScanBus (
> >
> >            Status = PciScanBus (
> >                      PciDevice,
> > -                    SecondBus,
> > +                    (UINT8) (SecondBus),^M
> >                      SubBusNumber,
> >                      PaddedBusRange
> >                      );
> > @@ -1227,7 +1227,7 @@ PciScanBus (
> >            if ((Attributes == EfiPaddingPciRootBridge) &&
> >                (State & EFI_HPC_STATE_ENABLED) != 0    &&
> >                (State & EFI_HPC_STATE_INITIALIZED) != 0) {
> > -            *PaddedBusRange = (UINT8) ((UINT8) (BusRange) + 
> > *PaddedBusRange);
> > +            *PaddedBusRange = (UINT8) ((UINT8) (BusRange) 
> > +*PaddedBusRange);^M
> >            } else {
> >              //
> >              // Reserve the larger one between the actual occupied bus
> >              // number and padded bus number
> > diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.c
> > b/MdeModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.c
> > index e12d59f..fb6270b 100644
> > --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.c
> > +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.c
> > @@ -245,6 +245,7 @@ CalculateApertureIo16 (
> >        ) {
> >
> >      Node = RESOURCE_NODE_FROM_LINK (CurrentLink);
> > +^M
> >      if (Node->ResourceUsage == PciResUsagePadding) {
> >        ASSERT (PaddingAperture == 0);
> >        PaddingAperture = Node->Length;
> > @@ -303,7 +304,8 @@ CalculateApertureIo16 (
> >    }
> >
> >    //
> > -  // Adjust the aperture with the bridge's alignment
> > +  // At last, adjust the aperture with the bridge's^M
> > +  // alignment^M
> >    //
> >    Offset = Aperture & (Bridge->Alignment);
> >
> > @@ -346,6 +348,7 @@ CalculateResourceAperture (
> >    UINT64            Aperture;
> >    LIST_ENTRY        *CurrentLink;
> >    PCI_RESOURCE_NODE *Node;
> > +^M
> >    UINT64            PaddingAperture;
> >    UINT64            Offset;
> >
> > @@ -419,7 +422,7 @@ CalculateResourceAperture (
> >    }
> >
> >    //
> > -  // Adjust the bridge's alignment to the first child's alignment
> > +  // At last, adjust the bridge's alignment to the first child's
> >    // alignment^M
> >    // if the bridge has at least one child
> >    //
> >    CurrentLink = Bridge->ChildList.ForwardLink;
> >
> >
> >>
> >> Thanks,
> >> Ray
> >>
> >> -----Original Message-----
> >> From: Tian, Feng
> >> Sent: Friday, October 30, 2015 9:57 AM
> >> To: Leif Lindholm <leif.lindh...@linaro.org>
> >> Cc: Ni, Ruiyu <ruiyu...@intel.com>; Kinney, Michael D 
> >> <michael.d.kin...@intel.com>; edk2-devel@lists.01.org; Fan, Jeff 
> >> <jeff....@intel.com>; Tian, Feng <feng.t...@intel.com>
> >> Subject: RE: [edk2] [Patch] MdeModulePkg: Fix a PciBusDxe hot plug bug
> >>
> >> Leif,
> >>
> >> Thanks for raising this issue.
> >>
> >> I agree with you that the patch should be split to small ones and make it 
> >> more readable. I also agree we should give community more time to review 
> >> those big patch before getting committed in.
> >>
> >> Ray, who is the module owner, will follow up your suggestions.
> >>
> >> Thanks
> >> Feng
> >>
> >> -----Original Message-----
> >> From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of 
> >> Leif Lindholm
> >> Sent: Thursday, October 29, 2015 19:55
> >> To: Tian, Feng
> >> Cc: Ni, Ruiyu; Kinney, Michael D; edk2-devel@lists.01.org; Fan, Jeff
> >> Subject: Re: [edk2] [Patch] MdeModulePkg: Fix a PciBusDxe hot plug bug
> >>
> >> Hi Feng,
> >>
> >> On Thu, Oct 29, 2015 at 12:23:04AM +0000, Tian, Feng wrote:
> >> > Ray has sent the patch for review, you may ignore it.
> >> > (http://article.gmane.org/gmane.comp.bios.edk2.devel/3484)
> >>
> >> Yes, I see it has now been committed - which solves the known bug.
> >>
> >> But this still leaves us with a clearly not sufficiently reviewed/tested 
> >> invasive patch in core PCI code, and a jumbled commit history.
> >>
> >> Since I have not received any response when asking previously, I will ask 
> >> again: Can we please revert SVN r18658 and introduce this changeset in a 
> >> more reviewable form, with proper review/testing?
> >>
> >> Regards,
> >>
> >> Leif
> >>
> >> > -----Original Message-----
> >> > From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of
> >> > Leif Lindholm
> >> > Sent: Wednesday, October 28, 2015 22:51
> >> > To: Tian, Feng
> >> > Cc: Ni, Ruiyu; edk2-devel@lists.01.org; Fan, Jeff
> >> > Subject: Re: [edk2] [Patch] MdeModulePkg: Fix a PciBusDxe hot plug bug
> >> >
> >> > Feng,
> >> >
> >> > Any update on the below?
> >> > The hard crash bug is still in SVN r18690.
> >> >
> >> > Regards,
> >> >
> >> > Leif
> >> >
> >> > On Mon, Oct 26, 2015 at 03:35:15PM +0000, Leif Lindholm wrote:
> >> > > Hi Ray,
> >> > >
> >> > > On Mon, Oct 26, 2015 at 03:17:22PM +0000, Ni, Ruiyu wrote:
> >> > > > Can you add a null pointer check to
> >> > > > PciIoDevice->ResourcePaddingDescriptors before calling
> >> > > > DumpPpbPaddingResource? Does it help?
> >> > >
> >> > > It removes the delay and the crash - thanks!
> >> > >
> >> > > But it does nothing for the commit history ;)
> >> > >
> >> > > Regards,
> >> > >
> >> > > Leif
> >> > >
> >> > > > > 在 2015年10月26日,21:13,Leif Lindholm <leif.lindh...@linaro.org> 写道:
> >> > > > >
> >> > > > > Hi Ruiyu, Feng,
> >> > > > >
> >> > > > > I am currently tracking down an issue on (at least) one of my
> >> > > > > platforms - that happens with this (now committed) patch, but
> >> > > > > not without it.
> >> > > > >
> >> > > > > Symptoms are a _long_ delay, followed by an unaligned access in
> >> > > > > (I
> >> > > > > think) DumpPpbPaddingResource.
> >> > > > >
> >> > > > > Anyway, there could be other things playing in here - I'm
> >> > > > > testing a new card in a platform I haven't previously tested cards.
> >> > > > >
> >> > > > > But this is one large patch, which could have been split up into
> >> > > > > multiple ones to make the introduced changes more reviewable:
> >> > > > > - There are both functional changes and whitespace fixups.
> >> > > > > - There are (text-only) changes to existing messages.
> >> > > > > - There is refactoring of internal APIs.
> >> > > > >
> >> > > > > It is certainly too invasive a change to be committed ~32
> >> > > > > minutes after having first been posted to the list.
> >> > > > >
> >> > > > > Any chance we can revert this one and introduce it in smaller
> >> > > > > portions, making the individual change sets more reviewable?
> >> > > > >
> >> > > > > Regards,
> >> > > > >
> >> > > > > Leif
> >> > > > >
> >> > > > >> On Fri, Oct 23, 2015 at 03:57:40PM +0800, Ruiyu Ni wrote:
> >> > > > >> For a hot plug bridge with device attached, PciBusDxe driver
> >> > > > >> reserves the resources which equal to the total amount of
> >> > > > >> padding resource returned from HotPlug->GetResourcePadding()
> >> > > > >> and the actual occupied resource by the attached device. The 
> >> > > > >> behavior is incorrect.
> >> > > > >> Correct behavior is to reserve the bigger one between the
> >> > > > >> padding resource and the actual occupied resource.
> >> > > > >>
> >> > > > >> Contributed-under: TianoCore Contribution Agreement 1.0
> >> > > > >> Signed-off-by: Ruiyu Ni <ruiyu...@intel.com>
> >> > > > >> Cc: Jeff Fan <jeff....@intel.com>
> >> > > > >> Cc: Feng Tian <feng.t...@intel.com>
> >> > > > >> ---
> >> > > > >> .../Bus/Pci/PciBusDxe/PciEnumeratorSupport.c       |  76 
> >> > > > >> +++++++++-
> >> > > > >> .../Bus/Pci/PciBusDxe/PciEnumeratorSupport.h       |  13 ++
> >> > > > >> MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c            | 159 
> >> > > > >> ++++++++++-----------
> >> > > > >> .../Bus/Pci/PciBusDxe/PciResourceSupport.c         |  58 +++++---
> >> > > > >> 4 files changed, 204 insertions(+), 102 deletions(-)
> >> > > > >>
> >> > > > >> diff --git
> >> > > > >> a/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c
> >> > > > >> b/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c
> >> > > > >> index f7aea4f..030ef42 100644
> >> > > > >> --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c
> >> > > > >> +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c
> >> > > > >> @@ -325,6 +325,77 @@ PciSearchDevice ( }
> >> > > > >>
> >> > > > >> /**
> >> > > > >> +  Dump the PPB padding resource information.
> >> > > > >> +
> >> > > > >> +  @param PciIoDevice     PCI IO instance.
> >> > > > >> +  @param ResourceType    The desired resource type to dump.
> >> > > > >> +                         PciBarTypeUnknown means to dump all 
> >> > > > >> types of resources.
> >> > > > >> +**/
> >> > > > >> +VOID
> >> > > > >> +DumpPpbPaddingResource (
> >> > > > >> +  IN PCI_IO_DEVICE                    *PciIoDevice,
> >> > > > >> +  IN PCI_BAR_TYPE                     ResourceType
> >> > > > >> +  )
> >> > > > >> +{
> >> > > > >> +  EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Descriptor;
> >> > > > >> +  PCI_BAR_TYPE                      Type;
> >> > > > >> +
> >> > > > >> +  if (ResourceType == PciBarTypeIo16 || ResourceType == 
> >> > > > >> PciBarTypeIo32) {
> >> > > > >> +    ResourceType = PciBarTypeIo;  }
> >> > > > >> +
> >> > > > >> +  for (Descriptor = PciIoDevice->ResourcePaddingDescriptors;
> >> > > > >> + Descriptor->Desc != ACPI_END_TAG_DESCRIPTOR; Descriptor++) {
> >> > > > >> +
> >> > > > >> +    Type = PciBarTypeUnknown;
> >> > > > >> +    if (Descriptor->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR && 
> >> > > > >> Descriptor->ResType == ACPI_ADDRESS_SPACE_TYPE_IO) {
> >> > > > >> +      Type = PciBarTypeIo;
> >> > > > >> +    } else if (Descriptor->Desc ==
> >> > > > >> + ACPI_ADDRESS_SPACE_DESCRIPTOR && Descriptor->ResType ==
> >> > > > >> + ACPI_ADDRESS_SPACE_TYPE_MEM) {
> >> > > > >> +
> >> > > > >> +      if (Descriptor->AddrSpaceGranularity == 32) {
> >> > > > >> +        //
> >> > > > >> +        // prefechable
> >> > > > >> +        //
> >> > > > >> +        if (Descriptor->SpecificFlag == 
> >> > > > >> EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE_PREFETCHABLE) {
> >> > > > >> +          Type = PciBarTypePMem32;
> >> > > > >> +        }
> >> > > > >> +
> >> > > > >> +        //
> >> > > > >> +        // Non-prefechable
> >> > > > >> +        //
> >> > > > >> +        if (Descriptor->SpecificFlag == 0) {
> >> > > > >> +          Type = PciBarTypeMem32;
> >> > > > >> +        }
> >> > > > >> +      }
> >> > > > >> +
> >> > > > >> +      if (Descriptor->AddrSpaceGranularity == 64) {
> >> > > > >> +        //
> >> > > > >> +        // prefechable
> >> > > > >> +        //
> >> > > > >> +        if (Descriptor->SpecificFlag == 
> >> > > > >> EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE_PREFETCHABLE) {
> >> > > > >> +          Type = PciBarTypePMem64;
> >> > > > >> +        }
> >> > > > >> +
> >> > > > >> +        //
> >> > > > >> +        // Non-prefechable
> >> > > > >> +        //
> >> > > > >> +        if (Descriptor->SpecificFlag == 0) {
> >> > > > >> +          Type = PciBarTypeMem64;
> >> > > > >> +        }
> >> > > > >> +      }
> >> > > > >> +    }
> >> > > > >> +
> >> > > > >> +    if ((Type != PciBarTypeUnknown) && ((ResourceType == 
> >> > > > >> PciBarTypeUnknown) || (ResourceType == Type))) {
> >> > > > >> +      DEBUG ((
> >> > > > >> +        EFI_D_INFO,
> >> > > > >> +        "   Padding: Type = %s; Alignment = 0x%lx;\tLength = 
> >> > > > >> 0x%lx\n",
> >> > > > >> +        mBarTypeStr[Type], Descriptor->AddrRangeMax, 
> >> > > > >> Descriptor->AddrLen
> >> > > > >> +        ));
> >> > > > >> +    }
> >> > > > >> +  }
> >> > > > >> +
> >> > > > >> +}
> >> > > > >> +
> >> > > > >> +/**
> >> > > > >>   Dump the PCI BAR information.
> >> > > > >>
> >> > > > >>   @param PciIoDevice     PCI IO instance.
> >> > > > >> @@ -586,7 +657,10 @@ GatherPpbInfo (
> >> > > > >>
> >> > > > >>   GetResourcePaddingPpb (PciIoDevice);
> >> > > > >>
> >> > > > >> -  DEBUG_CODE (DumpPciBars (PciIoDevice););
> >> > > > >> +  DEBUG_CODE (
> >> > > > >> +    DumpPpbPaddingResource (PciIoDevice, PciBarTypeUnknown);
> >> > > > >> +    DumpPciBars (PciIoDevice);  );
> >> > > > >>
> >> > > > >>   return PciIoDevice;
> >> > > > >> }
> >> > > > >> diff --git
> >> > > > >> a/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.h
> >> > > > >> b/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.h
> >> > > > >> index a4489b8..4d7b3b7 100644
> >> > > > >> --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.h
> >> > > > >> +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.h
> >> > > > >> @@ -460,4 +460,17 @@ ResetAllPpbBusNumber (
> >> > > > >>   IN UINT8                              StartBusNumber
> >> > > > >>   );
> >> > > > >>
> >> > > > >> +/**
> >> > > > >> +  Dump the PPB padding resource information.
> >> > > > >> +
> >> > > > >> +  @param PciIoDevice     PCI IO instance.
> >> > > > >> +  @param ResourceType    The desired resource type to dump.
> >> > > > >> +                         PciBarTypeUnknown means to dump all 
> >> > > > >> types of resources.
> >> > > > >> +**/
> >> > > > >> +VOID
> >> > > > >> +DumpPpbPaddingResource (
> >> > > > >> +  IN PCI_IO_DEVICE                    *PciIoDevice,
> >> > > > >> +  IN PCI_BAR_TYPE                     ResourceType
> >> > > > >> +  );
> >> > > > >> +
> >> > > > >> #endif
> >> > > > >> diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c
> >> > > > >> b/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c
> >> > > > >> index 3e275e3..f4b6ebf 100644
> >> > > > >> --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c
> >> > > > >> +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c
> >> > > > >> @@ -188,19 +188,21 @@ DumpBridgeResource (
> >> > > > >>       
> >> > > > >> BridgeResource->PciDev->PciBar[BridgeResource->Bar].BaseAddress,
> >> > > > >>       BridgeResource->Length, BridgeResource->Alignment
> >> > > > >>       ));
> >> > > > >> -    for ( Link = BridgeResource->ChildList.ForwardLink
> >> > > > >> -        ; Link != &BridgeResource->ChildList
> >> > > > >> -        ; Link = Link->ForwardLink
> >> > > > >> +    for ( Link = GetFirstNode (&BridgeResource->ChildList)
> >> > > > >> +        ; !IsNull (&BridgeResource->ChildList, Link)
> >> > > > >> +        ; Link = GetNextNode (&BridgeResource->ChildList,
> >> > > > >> + Link)
> >> > > > >>         ) {
> >> > > > >>       Resource = RESOURCE_NODE_FROM_LINK (Link);
> >> > > > >>       if (Resource->ResourceUsage == PciResUsageTypical) {
> >> > > > >>         Bar = Resource->Virtual ? Resource->PciDev->VfPciBar : 
> >> > > > >> Resource->PciDev->PciBar;
> >> > > > >>         DEBUG ((
> >> > > > >> -          EFI_D_INFO, " Base = 0x%lx;\tLength = 
> >> > > > >> 0x%lx;\tAlignment = 0x%lx;\tOwner = %s ",
> >> > > > >> +          EFI_D_INFO, "   Base = 0x%lx;\tLength = 
> >> > > > >> 0x%lx;\tAlignment = 0x%lx;\tOwner = %s [%02x|%02x|%02x:",
> >> > > > >>           Bar[Resource->Bar].BaseAddress, Resource->Length, 
> >> > > > >> Resource->Alignment,
> >> > > > >>           IS_PCI_BRIDGE (&Resource->PciDev->Pci)     ? L"PPB" :
> >> > > > >>           IS_CARDBUS_BRIDGE (&Resource->PciDev->Pci) ? L"P2C" :
> >> > > > >> -                                                       L"PCI"
> >> > > > >> +                                                       L"PCI",
> >> > > > >> +          Resource->PciDev->BusNumber, 
> >> > > > >> Resource->PciDev->DeviceNumber,
> >> > > > >> +          Resource->PciDev->FunctionNumber
> >> > > > >>           ));
> >> > > > >>
> >> > > > >>         if ((!IS_PCI_BRIDGE (&Resource->PciDev->Pci) &&
> >> > > > >> !IS_CARDBUS_BRIDGE (&Resource->PciDev->Pci)) || @@ -210,24 
> >> > > > >> +212,20 @@ DumpBridgeResource (
> >> > > > >>           //
> >> > > > >>           // The resource requirement comes from the device 
> >> > > > >> itself.
> >> > > > >>           //
> >> > > > >> -          DEBUG ((
> >> > > > >> -            EFI_D_INFO, " [%02x|%02x|%02x:%02x]\n",
> >> > > > >> -            Resource->PciDev->BusNumber, 
> >> > > > >> Resource->PciDev->DeviceNumber,
> >> > > > >> -            Resource->PciDev->FunctionNumber, 
> >> > > > >> Bar[Resource->Bar].Offset
> >> > > > >> -            ));
> >> > > > >> +          DEBUG ((EFI_D_INFO, "%02x]",
> >> > > > >> + Bar[Resource->Bar].Offset));
> >> > > > >>         } else {
> >> > > > >>           //
> >> > > > >>           // The resource requirement comes from the subordinate 
> >> > > > >> devices.
> >> > > > >>           //
> >> > > > >> -          DEBUG ((
> >> > > > >> -            EFI_D_INFO, " [%02x|%02x|%02x:**]\n",
> >> > > > >> -            Resource->PciDev->BusNumber, 
> >> > > > >> Resource->PciDev->DeviceNumber,
> >> > > > >> -            Resource->PciDev->FunctionNumber
> >> > > > >> -            ));
> >> > > > >> +          DEBUG ((EFI_D_INFO, "**]"));
> >> > > > >>         }
> >> > > > >>       } else {
> >> > > > >> -        DEBUG ((EFI_D_INFO, " Padding:Length = 0x%lx;\tAlignment 
> >> > > > >> = 0x%lx\n", Resource->Length, Resource->Alignment));
> >> > > > >> +        DEBUG ((EFI_D_INFO, "   Base = Padding;\tLength = 
> >> > > > >> 0x%lx;\tAlignment = 0x%lx", Resource->Length, 
> >> > > > >> Resource->Alignment));
> >> > > > >>       }
> >> > > > >> +      if (BridgeResource->ResType != Resource->ResType) {
> >> > > > >> +        DEBUG ((EFI_D_INFO, "; Type = %s", mBarTypeStr[MIN 
> >> > > > >> (Resource->ResType, PciBarTypeMaxType)]));
> >> > > > >> +      }
> >> > > > >> +      DEBUG ((EFI_D_INFO, "\n"));
> >> > > > >>     }
> >> > > > >>   }
> >> > > > >> }
> >> > > > >> @@ -235,63 +233,61 @@ DumpBridgeResource (
> >> > > > >> /**
> >> > > > >>   Find the corresponding resource node for the Device in child 
> >> > > > >> list of BridgeResource.
> >> > > > >>
> >> > > > >> -  @param[in] Device         Pointer to PCI_IO_DEVICE.
> >> > > > >> -  @param[in] BridgeResource Pointer to PCI_RESOURCE_NODE.
> >> > > > >> +  @param[in]  Device          Pointer to PCI_IO_DEVICE.
> >> > > > >> +  @param[in]  BridgeResource  Pointer to PCI_RESOURCE_NODE.
> >> > > > >> +  @param[out] DeviceResources Pointer to a buffer to receive 
> >> > > > >> resources for the Device.
> >> > > > >>
> >> > > > >> -  @return !NULL  The corresponding resource node for the Device.
> >> > > > >> -  @return NULL   No corresponding resource node for the Device.
> >> > > > >> +  @return Count of the resource descriptors returned.
> >> > > > >> **/
> >> > > > >> -PCI_RESOURCE_NODE *
> >> > > > >> +UINTN
> >> > > > >> FindResourceNode (
> >> > > > >> -  IN PCI_IO_DEVICE     *Device,
> >> > > > >> -  IN PCI_RESOURCE_NODE *BridgeResource
> >> > > > >> +  IN  PCI_IO_DEVICE     *Device,
> >> > > > >> +  IN  PCI_RESOURCE_NODE *BridgeResource,  OUT
> >> > > > >> + PCI_RESOURCE_NODE **DeviceResources OPTIONAL
> >> > > > >>   )
> >> > > > >> {
> >> > > > >>   LIST_ENTRY               *Link;
> >> > > > >>   PCI_RESOURCE_NODE        *Resource;
> >> > > > >> +  UINTN                    Count;
> >> > > > >>
> >> > > > >> +  Count = 0;
> >> > > > >>   for ( Link = BridgeResource->ChildList.ForwardLink
> >> > > > >>       ; Link != &BridgeResource->ChildList
> >> > > > >>       ; Link = Link->ForwardLink
> >> > > > >>       ) {
> >> > > > >>     Resource = RESOURCE_NODE_FROM_LINK (Link);
> >> > > > >>     if (Resource->PciDev == Device) {
> >> > > > >> -      return Resource;
> >> > > > >> +      if (DeviceResources != NULL) {
> >> > > > >> +        DeviceResources[Count] = Resource;
> >> > > > >> +      }
> >> > > > >> +      Count++;
> >> > > > >>     }
> >> > > > >>   }
> >> > > > >>
> >> > > > >> -  return NULL;
> >> > > > >> +  return Count;
> >> > > > >> }
> >> > > > >>
> >> > > > >> /**
> >> > > > >>   Dump the resource map of all the devices under Bridge.
> >> > > > >>
> >> > > > >> -  @param[in] Bridge     Bridge device instance.
> >> > > > >> -  @param[in] IoNode     IO resource descriptor for the bridge 
> >> > > > >> device.
> >> > > > >> -  @param[in] Mem32Node  Mem32 resource descriptor for the bridge 
> >> > > > >> device.
> >> > > > >> -  @param[in] PMem32Node PMem32 resource descriptor for the 
> >> > > > >> bridge device.
> >> > > > >> -  @param[in] Mem64Node  Mem64 resource descriptor for the bridge 
> >> > > > >> device.
> >> > > > >> -  @param[in] PMem64Node PMem64 resource descriptor for the 
> >> > > > >> bridge device.
> >> > > > >> +  @param[in] Bridge        Bridge device instance.
> >> > > > >> +  @param[in] Resources     Resource descriptors for the bridge 
> >> > > > >> device.
> >> > > > >> +  @param[in] ResourceCount Count of resource descriptors.
> >> > > > >> **/
> >> > > > >> VOID
> >> > > > >> DumpResourceMap (
> >> > > > >>   IN PCI_IO_DEVICE     *Bridge,
> >> > > > >> -  IN PCI_RESOURCE_NODE *IoNode,
> >> > > > >> -  IN PCI_RESOURCE_NODE *Mem32Node,
> >> > > > >> -  IN PCI_RESOURCE_NODE *PMem32Node,
> >> > > > >> -  IN PCI_RESOURCE_NODE *Mem64Node,
> >> > > > >> -  IN PCI_RESOURCE_NODE *PMem64Node
> >> > > > >> +  IN PCI_RESOURCE_NODE **Resources,
> >> > > > >> +  IN UINTN             ResourceCount
> >> > > > >>   )
> >> > > > >> {
> >> > > > >> -  EFI_STATUS                       Status;
> >> > > > >> -  LIST_ENTRY                       *Link;
> >> > > > >> -  PCI_IO_DEVICE                    *Device;
> >> > > > >> -  PCI_RESOURCE_NODE                *ChildIoNode;
> >> > > > >> -  PCI_RESOURCE_NODE                *ChildMem32Node;
> >> > > > >> -  PCI_RESOURCE_NODE                *ChildPMem32Node;
> >> > > > >> -  PCI_RESOURCE_NODE                *ChildMem64Node;
> >> > > > >> -  PCI_RESOURCE_NODE                *ChildPMem64Node;
> >> > > > >> -  CHAR16                           *Str;
> >> > > > >> +  EFI_STATUS           Status;
> >> > > > >> +  LIST_ENTRY           *Link;
> >> > > > >> +  PCI_IO_DEVICE        *Device;
> >> > > > >> +  UINTN                Index;
> >> > > > >> +  CHAR16               *Str;
> >> > > > >> +  PCI_RESOURCE_NODE    **ChildResources;
> >> > > > >> +  UINTN                ChildResourceCount;
> >> > > > >>
> >> > > > >>   DEBUG ((EFI_D_INFO, "PciBus: Resource Map for "));
> >> > > > >>
> >> > > > >> @@ -320,11 +316,9 @@ DumpResourceMap (
> >> > > > >>     }
> >> > > > >>   }
> >> > > > >>
> >> > > > >> -  DumpBridgeResource (IoNode);
> >> > > > >> -  DumpBridgeResource (Mem32Node);
> >> > > > >> -  DumpBridgeResource (PMem32Node);
> >> > > > >> -  DumpBridgeResource (Mem64Node);
> >> > > > >> -  DumpBridgeResource (PMem64Node);
> >> > > > >> +  for (Index = 0; Index < ResourceCount; Index++) {
> >> > > > >> +    DumpBridgeResource (Resources[Index]);  }
> >> > > > >>   DEBUG ((EFI_D_INFO, "\n"));
> >> > > > >>
> >> > > > >>   for ( Link = Bridge->ChildList.ForwardLink @@ -334,20 +328,19
> >> > > > >> @@ DumpResourceMap (
> >> > > > >>     Device = PCI_IO_DEVICE_FROM_LINK (Link);
> >> > > > >>     if (IS_PCI_BRIDGE (&Device->Pci)) {
> >> > > > >>
> >> > > > >> -      ChildIoNode     = (IoNode     == NULL ? NULL : 
> >> > > > >> FindResourceNode (Device, IoNode));
> >> > > > >> -      ChildMem32Node  = (Mem32Node  == NULL ? NULL : 
> >> > > > >> FindResourceNode (Device, Mem32Node));
> >> > > > >> -      ChildPMem32Node = (PMem32Node == NULL ? NULL : 
> >> > > > >> FindResourceNode (Device, PMem32Node));
> >> > > > >> -      ChildMem64Node  = (Mem64Node  == NULL ? NULL : 
> >> > > > >> FindResourceNode (Device, Mem64Node));
> >> > > > >> -      ChildPMem64Node = (PMem64Node == NULL ? NULL : 
> >> > > > >> FindResourceNode (Device, PMem64Node));
> >> > > > >> -
> >> > > > >> -      DumpResourceMap (
> >> > > > >> -        Device,
> >> > > > >> -        ChildIoNode,
> >> > > > >> -        ChildMem32Node,
> >> > > > >> -        ChildPMem32Node,
> >> > > > >> -        ChildMem64Node,
> >> > > > >> -        ChildPMem64Node
> >> > > > >> -        );
> >> > > > >> +      ChildResourceCount = 0;
> >> > > > >> +      for (Index = 0; Index < ResourceCount; Index++) {
> >> > > > >> +        ChildResourceCount += FindResourceNode (Device, 
> >> > > > >> Resources[Index], NULL);
> >> > > > >> +      }
> >> > > > >> +      ChildResources = AllocatePool (sizeof (PCI_RESOURCE_NODE 
> >> > > > >> *) * ChildResourceCount);
> >> > > > >> +      ASSERT (ChildResources != NULL);
> >> > > > >> +      ChildResourceCount = 0;
> >> > > > >> +      for (Index = 0; Index < ResourceCount; Index++) {
> >> > > > >> +        ChildResourceCount += FindResourceNode (Device, 
> >> > > > >> Resources[Index], &ChildResources[ChildResourceCount]);
> >> > > > >> +      }
> >> > > > >> +
> >> > > > >> +      DumpResourceMap (Device, ChildResources, 
> >> > > > >> ChildResourceCount);
> >> > > > >> +      FreePool (ChildResources);
> >> > > > >>     }
> >> > > > >>   }
> >> > > > >> }
> >> > > > >> @@ -807,11 +800,11 @@ PciHostBridgeResourceAllocator (
> >> > > > >>     // Create the entire system resource map from the information 
> >> > > > >> collected by
> >> > > > >>     // enumerator. Several resource tree was created
> >> > > > >>     //
> >> > > > >> -    IoBridge     = FindResourceNode (RootBridgeDev, &IoPool);
> >> > > > >> -    Mem32Bridge  = FindResourceNode (RootBridgeDev, &Mem32Pool);
> >> > > > >> -    PMem32Bridge = FindResourceNode (RootBridgeDev, &PMem32Pool);
> >> > > > >> -    Mem64Bridge  = FindResourceNode (RootBridgeDev, &Mem64Pool);
> >> > > > >> -    PMem64Bridge = FindResourceNode (RootBridgeDev, &PMem64Pool);
> >> > > > >> +    FindResourceNode (RootBridgeDev, &IoPool, &IoBridge);
> >> > > > >> +    FindResourceNode (RootBridgeDev, &Mem32Pool, &Mem32Bridge);
> >> > > > >> +    FindResourceNode (RootBridgeDev, &PMem32Pool, &PMem32Bridge);
> >> > > > >> +    FindResourceNode (RootBridgeDev, &Mem64Pool, &Mem64Bridge);
> >> > > > >> +    FindResourceNode (RootBridgeDev, &PMem64Pool,
> >> > > > >> + &PMem64Bridge);
> >> > > > >>
> >> > > > >>     ASSERT (IoBridge     != NULL);
> >> > > > >>     ASSERT (Mem32Bridge  != NULL); @@ -869,14 +862,13 @@
> >> > > > >> PciHostBridgeResourceAllocator (
> >> > > > >>     // Dump the resource map for current root bridge
> >> > > > >>     //
> >> > > > >>     DEBUG_CODE (
> >> > > > >> -      DumpResourceMap (
> >> > > > >> -        RootBridgeDev,
> >> > > > >> -        IoBridge,
> >> > > > >> -        Mem32Bridge,
> >> > > > >> -        PMem32Bridge,
> >> > > > >> -        Mem64Bridge,
> >> > > > >> -        PMem64Bridge
> >> > > > >> -        );
> >> > > > >> +      PCI_RESOURCE_NODE *Resources[5];
> >> > > > >> +      Resources[0] = IoBridge;
> >> > > > >> +      Resources[1] = Mem32Bridge;
> >> > > > >> +      Resources[2] = PMem32Bridge;
> >> > > > >> +      Resources[3] = Mem64Bridge;
> >> > > > >> +      Resources[4] = PMem64Bridge;
> >> > > > >> +      DumpResourceMap (RootBridgeDev, Resources, sizeof
> >> > > > >> + (Resources) / sizeof (Resources[0]));
> >> > > > >>     );
> >> > > > >>
> >> > > > >>     FreePool (AcpiConfig);
> >> > > > >> @@ -984,7 +976,8 @@ PciScanBus (
> >> > > > >>   UINT8                             Device;
> >> > > > >>   UINT8                             Func;
> >> > > > >>   UINT64                            Address;
> >> > > > >> -  UINTN                             SecondBus;
> >> > > > >> +  UINT8                             SecondBus;
> >> > > > >> +  UINT8                             PaddedSubBus;
> >> > > > >>   UINT16                            Register;
> >> > > > >>   UINTN                             HpIndex;
> >> > > > >>   PCI_IO_DEVICE                     *PciDevice;
> >> > > > >> @@ -1218,7 +1211,7 @@ PciScanBus (
> >> > > > >>
> >> > > > >>           Status = PciScanBus (
> >> > > > >>                     PciDevice,
> >> > > > >> -                    (UINT8) (SecondBus),
> >> > > > >> +                    SecondBus,
> >> > > > >>                     SubBusNumber,
> >> > > > >>                     PaddedBusRange
> >> > > > >>                     );
> >> > > > >> @@ -1234,12 +1227,16 @@ PciScanBus (
> >> > > > >>           if ((Attributes == EfiPaddingPciRootBridge) &&
> >> > > > >>               (State & EFI_HPC_STATE_ENABLED) != 0    &&
> >> > > > >>               (State & EFI_HPC_STATE_INITIALIZED) != 0) {
> >> > > > >> -            *PaddedBusRange = (UINT8) ((UINT8) (BusRange) 
> >> > > > >> +*PaddedBusRange);
> >> > > > >> +            *PaddedBusRange = (UINT8) ((UINT8) (BusRange) +
> >> > > > >> + *PaddedBusRange);
> >> > > > >>           } else {
> >> > > > >> -            Status = PciAllocateBusNumber (PciDevice, 
> >> > > > >> *SubBusNumber, (UINT8) (BusRange), SubBusNumber);
> >> > > > >> +            //
> >> > > > >> +            // Reserve the larger one between the actual 
> >> > > > >> occupied bus number and padded bus number
> >> > > > >> +            //
> >> > > > >> +            Status = PciAllocateBusNumber (PciDevice,
> >> > > > >> + StartBusNumber, (UINT8) (BusRange), &PaddedSubBus);
> >> > > > >>             if (EFI_ERROR (Status)) {
> >> > > > >>               return Status;
> >> > > > >>             }
> >> > > > >> +            *SubBusNumber = MAX (PaddedSubBus, *SubBusNumber);
> >> > > > >>           }
> >> > > > >>         }
> >> > > > >>
> >> > > > >> diff --git
> >> > > > >> a/MdeModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.c
> >> > > > >> b/MdeModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.c
> >> > > > >> index d8d988c..b106abe 100644
> >> > > > >> --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.c
> >> > > > >> +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.c
> >> > > > >> @@ -196,6 +196,7 @@ CalculateApertureIo16 (
> >> > > > >>   PCI_RESOURCE_NODE       *Node;
> >> > > > >>   UINT64                  Offset;
> >> > > > >>   EFI_PCI_PLATFORM_POLICY PciPolicy;
> >> > > > >> +  UINT64                  PaddingAperture;
> >> > > > >>
> >> > > > >>   if (!mPolicyDetermined) {
> >> > > > >>     //
> >> > > > >> @@ -228,21 +229,27 @@ CalculateApertureIo16 (
> >> > > > >>     mPolicyDetermined = TRUE;
> >> > > > >>   }
> >> > > > >>
> >> > > > >> -  Aperture = 0;
> >> > > > >> +  Aperture        = 0;
> >> > > > >> +  PaddingAperture = 0;
> >> > > > >>
> >> > > > >>   if (Bridge == NULL) {
> >> > > > >>     return ;
> >> > > > >>   }
> >> > > > >>
> >> > > > >> -  CurrentLink = Bridge->ChildList.ForwardLink;
> >> > > > >> -
> >> > > > >>   //
> >> > > > >>   // Assume the bridge is aligned
> >> > > > >>   //
> >> > > > >> -  while (CurrentLink != &Bridge->ChildList) {
> >> > > > >> +  for ( CurrentLink = GetFirstNode (&Bridge->ChildList)
> >> > > > >> +      ; !IsNull (&Bridge->ChildList, CurrentLink)
> >> > > > >> +      ; CurrentLink = GetNextNode (&Bridge->ChildList, 
> >> > > > >> CurrentLink)
> >> > > > >> +      ) {
> >> > > > >>
> >> > > > >>     Node = RESOURCE_NODE_FROM_LINK (CurrentLink);
> >> > > > >> -
> >> > > > >> +    if (Node->ResourceUsage == PciResUsagePadding) {
> >> > > > >> +      ASSERT (PaddingAperture == 0);
> >> > > > >> +      PaddingAperture = Node->Length;
> >> > > > >> +      continue;
> >> > > > >> +    }
> >> > > > >>     //
> >> > > > >>     // Consider the aperture alignment
> >> > > > >>     //
> >> > > > >> @@ -293,13 +300,10 @@ CalculateApertureIo16 (
> >> > > > >>     // Increment aperture by the length of node
> >> > > > >>     //
> >> > > > >>     Aperture += Node->Length;
> >> > > > >> -
> >> > > > >> -    CurrentLink = CurrentLink->ForwardLink;
> >> > > > >>   }
> >> > > > >>
> >> > > > >>   //
> >> > > > >> -  // At last, adjust the aperture with the bridge's
> >> > > > >> -  // alignment
> >> > > > >> +  // Adjust the aperture with the bridge's alignment
> >> > > > >>   //
> >> > > > >>   Offset = Aperture & (Bridge->Alignment);
> >> > > > >>
> >> > > > >> @@ -319,6 +323,12 @@ CalculateApertureIo16 (
> >> > > > >>       Bridge->Alignment = Node->Alignment;
> >> > > > >>     }
> >> > > > >>   }
> >> > > > >> +
> >> > > > >> +  //
> >> > > > >> +  // Hotplug controller needs padding resources.
> >> > > > >> +  // Use the larger one between the padding resource and actual 
> >> > > > >> occupied resource.
> >> > > > >> +  //
> >> > > > >> +  Bridge->Length = MAX (Bridge->Length, PaddingAperture);
> >> > > > >> }
> >> > > > >>
> >> > > > >> /**
> >> > > > >> @@ -336,10 +346,11 @@ CalculateResourceAperture (
> >> > > > >>   UINT64            Aperture;
> >> > > > >>   LIST_ENTRY        *CurrentLink;
> >> > > > >>   PCI_RESOURCE_NODE *Node;
> >> > > > >> -
> >> > > > >> +  UINT64            PaddingAperture;
> >> > > > >>   UINT64            Offset;
> >> > > > >>
> >> > > > >> -  Aperture = 0;
> >> > > > >> +  Aperture        = 0;
> >> > > > >> +  PaddingAperture = 0;
> >> > > > >>
> >> > > > >>   if (Bridge == NULL) {
> >> > > > >>     return ;
> >> > > > >> @@ -351,14 +362,20 @@ CalculateResourceAperture (
> >> > > > >>     return ;
> >> > > > >>   }
> >> > > > >>
> >> > > > >> -  CurrentLink = Bridge->ChildList.ForwardLink;
> >> > > > >> -
> >> > > > >>   //
> >> > > > >>   // Assume the bridge is aligned
> >> > > > >>   //
> >> > > > >> -  while (CurrentLink != &Bridge->ChildList) {
> >> > > > >> +  for ( CurrentLink = GetFirstNode (&Bridge->ChildList)
> >> > > > >> +      ; !IsNull (&Bridge->ChildList, CurrentLink)
> >> > > > >> +      ; CurrentLink = GetNextNode (&Bridge->ChildList, 
> >> > > > >> CurrentLink)
> >> > > > >> +      ) {
> >> > > > >>
> >> > > > >>     Node = RESOURCE_NODE_FROM_LINK (CurrentLink);
> >> > > > >> +    if (Node->ResourceUsage == PciResUsagePadding) {
> >> > > > >> +      ASSERT (PaddingAperture == 0);
> >> > > > >> +      PaddingAperture = Node->Length;
> >> > > > >> +      continue;
> >> > > > >> +    }
> >> > > > >>
> >> > > > >>     //
> >> > > > >>     // Apply padding resource if available @@ -381,11 +398,6 @@
> >> > > > >> CalculateResourceAperture (
> >> > > > >>     // Increment aperture by the length of node
> >> > > > >>     //
> >> > > > >>     Aperture += Node->Length;
> >> > > > >> -
> >> > > > >> -    //
> >> > > > >> -    // Consider the aperture alignment
> >> > > > >> -    //
> >> > > > >> -    CurrentLink = CurrentLink->ForwardLink;
> >> > > > >>   }
> >> > > > >>
> >> > > > >>   //
> >> > > > >> @@ -407,7 +419,7 @@ CalculateResourceAperture (
> >> > > > >>   }
> >> > > > >>
> >> > > > >>   //
> >> > > > >> -  // At last, adjust the bridge's alignment to the first
> >> > > > >> child's alignment
> >> > > > >> +  // Adjust the bridge's alignment to the first child's
> >> > > > >> + alignment
> >> > > > >>   // if the bridge has at least one child
> >> > > > >>   //
> >> > > > >>   CurrentLink = Bridge->ChildList.ForwardLink; @@ -417,6
> >> > > > >> +429,12 @@ CalculateResourceAperture (
> >> > > > >>       Bridge->Alignment = Node->Alignment;
> >> > > > >>     }
> >> > > > >>   }
> >> > > > >> +
> >> > > > >> +  //
> >> > > > >> +  // Hotplug controller needs padding resources.
> >> > > > >> +  // Use the larger one between the padding resource and actual 
> >> > > > >> occupied resource.
> >> > > > >> +  //
> >> > > > >> +  Bridge->Length = MAX (Bridge->Length, PaddingAperture);
> >> > > > >> }
> >> > > > >>
> >> > > > >> /**
> >> > > > >> --
> >> > > > >> 1.9.5.msysgit.1
> >> > > > >>
> >> > > > >> _______________________________________________
> >> > > > >> edk2-devel mailing list
> >> > > > >> edk2-devel@lists.01.org
> >> > > > >> https://lists.01.org/mailman/listinfo/edk2-devel
> >> > _______________________________________________
> >> > edk2-devel mailing list
> >> > edk2-devel@lists.01.org
> >> > https://lists.01.org/mailman/listinfo/edk2-devel
> >> _______________________________________________
> >> edk2-devel mailing list
> >> edk2-devel@lists.01.org
> >> https://lists.01.org/mailman/listinfo/edk2-devel
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to