Laszlo, Thank you very much for your explanation.
> -----Original Message----- > From: Laszlo Ersek [mailto:ler...@redhat.com] > Sent: Thursday, May 3, 2018 6:52 AM > To: Roman Bacik > Cc: edk2-devel@lists.01.org; Ruiyu Ni; Vladimir Olovyannikov > Subject: Re: [edk2] [PATCH v2] MdeModulePkg/Bus: Enable ascending > resource list > > On 05/02/18 20:07, Roman Bacik wrote: > > Some processors require resource list sorted in ascending order. > > > > Cc: Ruiyu Ni <ruiyu...@intel.com> > > Cc: Vladimir Olovyannikov <vladimir.olovyanni...@broadcom.com> > > Contributed-under: TianoCore Contribution Agreement 1.1 > > Signed-off-by: Roman Bacik <roman.ba...@broadcom.com> > > --- > > MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf | 1 + > > .../Bus/Pci/PciBusDxe/PciResourceSupport.c | 43 > ++++++++++++++++++---- > > MdeModulePkg/MdeModulePkg.dec | 3 ++ > > MdeModulePkg/MdeModulePkg.dsc | 1 + > > 4 files changed, 41 insertions(+), 7 deletions(-) > > I don't understand the goal of this patch. > > (Please don't take my comments as "review" or arguments against this > patch, > I'd just like to understand the issue.) > > To my understanding, InsertResourceNode() keeps PCI resources sorted in > descending *alignment* order -- because a larger power-of-two alignment is > also suitable for a smaller power-of-two alignment. > > Say, we have a bridge with two devices behind it. The first device has one > MMIO BAR of size 32MB (requiring the same 32MB natural alignment), while > the other device has one MMIO BAR, of size 4MB (requiring the same 4MB > natural alignment). > > Ordering the resources in descending *alignment* order means that we'll > 1st > allocate the 32MB BAR, at a suitably aligned address. The important thing > is > that the end of that allocation will *also* be aligned at 32MB, hence we > can > allocate, as 2nd step, the 4MB BAR right there. No gaps needed. > > If the 4MB BAR was allocated 1st (naturally aligned), then its end address > might not be naturally aligned for becoming the base address of the > remaining 32MB BAR. Thus we might have to waste some MMIO aperture to > align the large BAR correctly. > > Here's an example output from PciBusDxe running as part of OVMF: > > > PciBus: Resource Map for Root Bridge PciRoot(0x0) [...] > > Type = Mem32; Base = 0x80000000; Length = 0x8100000; > > Alignment = > 0x3FFFFFF > > Base = 0x80000000; Length = 0x4000000; Alignment = 0x3FFFFFF; > Owner = PCI [00|02|00:14] > > Base = 0x84000000; Length = 0x4000000; Alignment = 0x3FFFFFF; > Owner = PCI [00|02|00:10] > > Base = 0x88000000; Length = 0x2000; Alignment = 0x1FFF; > > Owner = > PCI [00|02|00:18] > > Base = 0x88002000; Length = 0x1000; Alignment = 0xFFF; > > Owner = > PCI [00|07|00:14] > > Base = 0x88003000; Length = 0x1000; Alignment = 0xFFF; > > Owner = > PCI [00|06|07:10] > > Base = 0x88004000; Length = 0x1000; Alignment = 0xFFF; > > Owner = > PCI [00|05|00:14] > > Base = 0x88005000; Length = 0x1000; Alignment = 0xFFF; > > Owner = > PCI [00|03|00:14] > > [...] > > The base addresses are already sorted in ascending order; what's > descending > is the alignment -- and that seems correct, because it conserves MMIO > aperture (no gaps needed). > > Can you please explain what's wrong with this approach for your platform, > and what the desired behavior is? > > Can you post a log snippet that shows a placement that's right for your > platform? We are also patching allocation order bottom up search starting at BaseAddress. This placement is desirable and working for us after applying the submitted two patches: PciBus: Resource Map for Bridge [00|00|00] Type = PMem32; Base = 0x60000000; Length = 0x100000; Alignment = 0xFFFFF Base = 0x60000000; Length = 0x20000; Alignment = 0x1FFFF; Owner = PCI [01|00|00:18]; Type = PMem64 Base = 0x60020000; Length = 0x20000; Alignment = 0x1FFFF; Owner = PCI [01|00|01:18]; Type = PMem64 Base = 0x60040000; Length = 0x20000; Alignment = 0x1FFFF; Owner = PCI [01|00|02:18]; Type = PMem64 Base = 0x60060000; Length = 0x20000; Alignment = 0x1FFFF; Owner = PCI [01|00|03:18]; Type = PMem64 Base = 0x60080000; Length = 0x10000; Alignment = 0xFFFF; Owner = PCI [01|00|00:10]; Type = PMem64 Base = 0x60090000; Length = 0x10000; Alignment = 0xFFFF; Owner = PCI [01|00|01:10]; Type = PMem64 Base = 0x600A0000; Length = 0x10000; Alignment = 0xFFFF; Owner = PCI [01|00|02:10]; Type = PMem64 Base = 0x600B0000; Length = 0x10000; Alignment = 0xFFFF; Owner = PCI [01|00|03:10]; Type = PMem64 Base = 0x600C0000; Length = 0x1000; Alignment = 0xFFF; Owner = PCI [01|00|00:20]; Type = PMem64 Base = 0x600C1000; Length = 0x1000; Alignment = 0xFFF; Owner = PCI [01|00|01:20]; Type = PMem64 Base = 0x600C2000; Length = 0x1000; Alignment = 0xFFF; Owner = PCI [01|00|02:20]; Type = PMem64 Base = 0x600C3000; Length = 0x1000; Alignment = 0xFFF; Owner = PCI [01|00|03:20]; Type = PMem64 > > Thanks, > Laszlo Thanks, Roman _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel