Laszlo, Does [0|3|0] contain option rom? (video controller?) If it contains option rom, PciBusDxe driver has a logic to convert the PMem64 to PMem32. PMem32 is converted to Mem32 because COMBINE_MEM_PMEM is set.
The detailed logic is in PciResourceSupport.c: DegradeResource(). Regards, Ray From: Laszlo Ersek [mailto:ler...@redhat.com] Sent: Saturday, March 5, 2016 5:41 AM To: Ni, Ruiyu <ruiyu...@intel.com> Cc: edk2-devel-ml01 <edk2-de...@ml01.01.org> Subject: allocation of PMem64 BARs Hi Ray, on top of my pending series [edk2] [PATCH 0/5] OvmfPkg: enable PCIe on Q35 http://thread.gmane.org/gmane.comp.bios.edk2.devel/8707 I also have some patches (not posted yet) that enable 64-bit MMIO. I tested it and it seems to work, but something is strange to me. Namely, there is enough room in the non-prefetchable 64-bit aperture for allocating some PMem64 BARs (and EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM is passed to the driver), but the driver decides to allocate those from the (also non-prefetchable) 32-bit aperture instead. It doesn't seem invalid, of course, but I thought that the driver would conserve the 32-bit aperture, and allocate everything possible from the 64-bit aperture. I also have a Mem64 BAR, and that gets allocated high just fine. Here's the initial output from the host bridge driver: > RootBridge: PciRoot(0x0) > Support/Attr: 70069 / 70069 > DmaAbove4G: No > NoExtConfSpace: No > AllocAttr: 3 (CombineMemPMem Mem64Decode) > Bus: 0 - FF > Io: C000 - FFFF > Mem: C0000000 - FBFFFFFF > MemAbove4G: 180000000 - 97FFFFFFF > PMem: 0 - 0 > PMemAbove4G: 0 - 0 > PciHostBridgeDxe: IntersectMemoryDescriptor: add [180000000, 980000000): > Success Then the output from the PCI bus driver, interspersed with messages from the host bridge driver: > PCI Bus First Scanning > PciBus: Discovered PCI @ [00|00|00] > > PciBus: Discovered PCI @ [00|01|00] > BAR[0]: Type = Mem32; Alignment = 0x3FFFFFF; Length = 0x4000000; Offset > = 0x10 > BAR[1]: Type = Mem32; Alignment = 0x3FFFFFF; Length = 0x4000000; Offset > = 0x14 > BAR[2]: Type = Mem32; Alignment = 0x1FFF; Length = 0x2000; Offset = 0x18 > BAR[3]: Type = Io32; Alignment = 0x1F; Length = 0x20; Offset = 0x1C > > PciBus: Discovered PCI @ [00|02|00] > BAR[0]: Type = Mem64; Alignment = 0x3FFF; Length = 0x4000; Offset = 0x10 > > PciBus: Discovered PCI @ [00|03|00] > BAR[0]: Type = Mem32; Alignment = 0xFFFFFF; Length = 0x1000000; Offset > = 0x10 > BAR[1]: Type = PMem64; Alignment = 0xFFFFFFF; Length = 0x10000000; > Offset = 0x14 > BAR[2]: Type = PMem64; Alignment = 0x1FFFFFF; Length = 0x2000000; Offset > = 0x1C > BAR[3]: Type = Io32; Alignment = 0x7F; Length = 0x80; Offset = 0x24 > > PciBus: Discovered PCI @ [00|04|00] > BAR[0]: Type = Mem32; Alignment = 0x3FFF; Length = 0x4000; Offset = 0x10 > > PciBus: Discovered PPB @ [00|1E|00] > > PciBus: Discovered PPB @ [01|01|00] > BAR[0]: Type = Mem64; Alignment = 0xFFF; Length = 0x100; Offset = 0x10 > > PciBus: Discovered PCI @ [02|01|00] > BAR[0]: Type = Io32; Alignment = 0x1F; Length = 0x20; Offset = 0x10 > BAR[1]: Type = Mem32; Alignment = 0xFFF; Length = 0x1000; Offset = 0x14 > > PciBus: Discovered PCI @ [02|02|00] > BAR[4]: Type = Io32; Alignment = 0x1F; Length = 0x20; Offset = 0x20 > > PciBus: Discovered PCI @ [02|02|01] > BAR[4]: Type = Io32; Alignment = 0x1F; Length = 0x20; Offset = 0x20 > > PciBus: Discovered PCI @ [02|02|02] > BAR[4]: Type = Io32; Alignment = 0x1F; Length = 0x20; Offset = 0x20 > > PciBus: Discovered PCI @ [02|02|07] > BAR[0]: Type = Mem32; Alignment = 0xFFF; Length = 0x1000; Offset = 0x10 > > PciBus: Discovered PCI @ [02|03|00] > BAR[0]: Type = Io32; Alignment = 0x3F; Length = 0x40; Offset = 0x10 > BAR[1]: Type = Mem32; Alignment = 0xFFF; Length = 0x1000; Offset = 0x14 > > PciBus: Discovered PCI @ [02|04|00] > BAR[0]: Type = Io32; Alignment = 0x1F; Length = 0x20; Offset = 0x10 > > PciBus: Discovered PCI @ [02|05|00] > BAR[0]: Type = Io32; Alignment = 0x3F; Length = 0x40; Offset = 0x10 > BAR[1]: Type = Mem32; Alignment = 0xFFF; Length = 0x1000; Offset = 0x14 > > PciBus: Discovered PCI @ [02|06|00] > BAR[0]: Type = Io32; Alignment = 0x1F; Length = 0x20; Offset = 0x10 > BAR[1]: Type = Mem32; Alignment = 0xFFF; Length = 0x1000; Offset = 0x14 > > PciBus: Discovered PCI @ [00|1F|00] > > PciBus: Discovered PCI @ [00|1F|02] > BAR[4]: Type = Io32; Alignment = 0x1F; Length = 0x20; Offset = 0x20 > BAR[5]: Type = Mem32; Alignment = 0xFFF; Length = 0x1000; Offset = 0x24 > > PciBus: Discovered PCI @ [00|1F|03] > BAR[4]: Type = Io32; Alignment = 0x3F; Length = 0x40; Offset = 0x20 > > PciBus: Discovered PCI @ [00|00|00] > > PciBus: Discovered PCI @ [00|01|00] > BAR[0]: Type = Mem32; Alignment = 0x3FFFFFF; Length = 0x4000000; Offset > = 0x10 > BAR[1]: Type = Mem32; Alignment = 0x3FFFFFF; Length = 0x4000000; Offset > = 0x14 > BAR[2]: Type = Mem32; Alignment = 0x1FFF; Length = 0x2000; Offset = 0x18 > BAR[3]: Type = Io32; Alignment = 0x1F; Length = 0x20; Offset = 0x1C > > PciBus: Discovered PCI @ [00|02|00] > BAR[0]: Type = Mem64; Alignment = 0x3FFF; Length = 0x4000; Offset = 0x10 > > PciBus: Discovered PCI @ [00|03|00] > BAR[0]: Type = Mem32; Alignment = 0xFFFFFF; Length = 0x1000000; Offset > = 0x10 > BAR[1]: Type = PMem64; Alignment = 0xFFFFFFF; Length = 0x10000000; > Offset = 0x14 > BAR[2]: Type = PMem64; Alignment = 0x1FFFFFF; Length = 0x2000000; Offset > = 0x1C > BAR[3]: Type = Io32; Alignment = 0x7F; Length = 0x80; Offset = 0x24 > > PciBus: Discovered PCI @ [00|04|00] > BAR[0]: Type = Mem32; Alignment = 0x3FFF; Length = 0x4000; Offset = 0x10 > > PciBus: Discovered PPB @ [00|1E|00] > > PciBus: Discovered PPB @ [01|01|00] > BAR[0]: Type = Mem64; Alignment = 0xFFF; Length = 0x100; Offset = 0x10 > > PciBus: Discovered PCI @ [02|01|00] > BAR[0]: Type = Io32; Alignment = 0x1F; Length = 0x20; Offset = 0x10 > BAR[1]: Type = Mem32; Alignment = 0xFFF; Length = 0x1000; Offset = 0x14 > > PciBus: Discovered PCI @ [02|02|00] > BAR[4]: Type = Io32; Alignment = 0x1F; Length = 0x20; Offset = 0x20 > > PciBus: Discovered PCI @ [02|02|01] > BAR[4]: Type = Io32; Alignment = 0x1F; Length = 0x20; Offset = 0x20 > > PciBus: Discovered PCI @ [02|02|02] > BAR[4]: Type = Io32; Alignment = 0x1F; Length = 0x20; Offset = 0x20 > > PciBus: Discovered PCI @ [02|02|07] > BAR[0]: Type = Mem32; Alignment = 0xFFF; Length = 0x1000; Offset = 0x10 > > PciBus: Discovered PCI @ [02|03|00] > BAR[0]: Type = Io32; Alignment = 0x3F; Length = 0x40; Offset = 0x10 > BAR[1]: Type = Mem32; Alignment = 0xFFF; Length = 0x1000; Offset = 0x14 > > PciBus: Discovered PCI @ [02|04|00] > BAR[0]: Type = Io32; Alignment = 0x1F; Length = 0x20; Offset = 0x10 > > PciBus: Discovered PCI @ [02|05|00] > BAR[0]: Type = Io32; Alignment = 0x3F; Length = 0x40; Offset = 0x10 > BAR[1]: Type = Mem32; Alignment = 0xFFF; Length = 0x1000; Offset = 0x14 > > PciBus: Discovered PCI @ [02|06|00] > BAR[0]: Type = Io32; Alignment = 0x1F; Length = 0x20; Offset = 0x10 > BAR[1]: Type = Mem32; Alignment = 0xFFF; Length = 0x1000; Offset = 0x14 > > PciBus: Discovered PCI @ [00|1F|00] > > PciBus: Discovered PCI @ [00|1F|02] > BAR[4]: Type = Io32; Alignment = 0x1F; Length = 0x20; Offset = 0x20 > BAR[5]: Type = Mem32; Alignment = 0xFFF; Length = 0x1000; Offset = 0x24 > > PciBus: Discovered PCI @ [00|1F|03] > BAR[4]: Type = Io32; Alignment = 0x3F; Length = 0x40; Offset = 0x20 > > PciHostBridge: SubmitResources for PciRoot(0x0) > I/O: Granularity/SpecificFlag = 0 / 01 > Length/Alignment = 0x2000 / 0xFFF > Mem: Granularity/SpecificFlag = 32 / 00 > Length/Alignment = 0x1B300000 / 0xFFFFFFF > Mem: Granularity/SpecificFlag = 64 / 00 > Length/Alignment = 0x100000 / 0xFFFFF > PciBus: HostBridge->SubmitResources() - Success > PciHostBridge: NotifyPhase (AllocateResources) > RootBridge: PciRoot(0x0) > Mem: Base/Length/Alignment = C0000000/1B300000/FFFFFFF - Success > Mem64: Base/Length/Alignment = 180000000/100000/FFFFF - Success > I/O: Base/Length/Alignment = C000/2000/FFF - Success > PciBus: HostBridge->NotifyPhase(AllocateResources) - Success > PciBus: Resource Map for Root Bridge PciRoot(0x0) > Type = Io16; Base = 0xC000; Length = 0x2000; Alignment = 0xFFF > Base = 0xC000; Length = 0x1000; Alignment = 0xFFF; Owner = PPB > [00|1E|00:**] > Base = 0xD000; Length = 0x80; Alignment = 0x7F; Owner = PCI > [00|03|00:24] > Base = 0xD080; Length = 0x40; Alignment = 0x3F; Owner = PCI > [00|1F|03:20] > Base = 0xD0C0; Length = 0x20; Alignment = 0x1F; Owner = PCI > [00|1F|02:20] > Base = 0xD0E0; Length = 0x20; Alignment = 0x1F; Owner = PCI > [00|01|00:1C] > Type = Mem32; Base = 0xC0000000; Length = 0x1B300000; Alignment = 0xFFFFFFF > Base = 0xC0000000; Length = 0x10000000; Alignment = 0xFFFFFFF; Owner = > PCI [00|03|00:14]; Type = PMem64 > Base = 0xD0000000; Length = 0x4000000; Alignment = 0x3FFFFFF; Owner = > PCI [00|01|00:14] > Base = 0xD4000000; Length = 0x4000000; Alignment = 0x3FFFFFF; Owner = > PCI [00|01|00:10] > Base = 0xD8000000; Length = 0x2000000; Alignment = 0x1FFFFFF; Owner = > PCI [00|03|00:1C]; Type = PMem64 > Base = 0xDA000000; Length = 0x1000000; Alignment = 0xFFFFFF; Owner = > PCI [00|03|00:10] > Base = 0xDB000000; Length = 0x200000; Alignment = 0xFFFFF; Owner = PPB > [00|1E|00:**] > Base = 0xDB200000; Length = 0x4000; Alignment = 0x3FFF; Owner = PCI > [00|04|00:10] > Base = 0xDB204000; Length = 0x2000; Alignment = 0x1FFF; Owner = PCI > [00|01|00:18] > Base = 0xDB206000; Length = 0x1000; Alignment = 0xFFF; Owner = PCI > [00|1F|02:24] > Type = Mem64; Base = 0x180000000; Length = 0x100000; Alignment = 0xFFFFF > Base = 0x180000000; Length = 0x4000; Alignment = 0x3FFF; Owner = PCI > [00|02|00:10] > > PciBus: Resource Map for Bridge [00|1E|00] > Type = Io16; Base = 0xC000; Length = 0x1000; Alignment = 0xFFF > Base = 0xC000; Length = 0x1000; Alignment = 0xFFF; Owner = PPB > [01|01|00:**] > Type = Mem32; Base = 0xDB000000; Length = 0x200000; Alignment = 0xFFFFF > Base = 0xDB000000; Length = 0x100000; Alignment = 0xFFFFF; Owner = PPB > [01|01|00:**] > Base = 0xDB100000; Length = 0x100; Alignment = 0xFFF; Owner = PPB > [01|01|00:10] > > PciBus: Resource Map for Bridge [01|01|00] > Type = Io16; Base = 0xC000; Length = 0x1000; Alignment = 0xFFF > Base = 0xC000; Length = 0x40; Alignment = 0x3F; Owner = PCI > [02|05|00:10] > Base = 0xC040; Length = 0x40; Alignment = 0x3F; Owner = PCI > [02|03|00:10] > Base = 0xC080; Length = 0x20; Alignment = 0x1F; Owner = PCI > [02|06|00:10] > Base = 0xC0A0; Length = 0x20; Alignment = 0x1F; Owner = PCI > [02|04|00:10] > Base = 0xC0C0; Length = 0x20; Alignment = 0x1F; Owner = PCI > [02|02|02:20] > Base = 0xC0E0; Length = 0x20; Alignment = 0x1F; Owner = PCI > [02|02|01:20] > Base = 0xC100; Length = 0x20; Alignment = 0x1F; Owner = PCI > [02|02|00:20] > Base = 0xC120; Length = 0x20; Alignment = 0x1F; Owner = PCI > [02|01|00:10] > Type = Mem32; Base = 0xDB000000; Length = 0x100000; Alignment = 0xFFFFF > Base = 0xDB000000; Length = 0x1000; Alignment = 0xFFF; Owner = PCI > [02|06|00:14] > Base = 0xDB001000; Length = 0x1000; Alignment = 0xFFF; Owner = PCI > [02|05|00:14] > Base = 0xDB002000; Length = 0x1000; Alignment = 0xFFF; Owner = PCI > [02|03|00:14] > Base = 0xDB003000; Length = 0x1000; Alignment = 0xFFF; Owner = PCI > [02|02|07:10] > Base = 0xDB004000; Length = 0x1000; Alignment = 0xFFF; Owner = PCI > [02|01|00:14] > Type = Mem32; Base = 0xDB100000; Length = 0x100; Alignment = 0xFFF As you can see, the [00|03|00] device has two PMem64 BARs (256MB and 32MB in size, respectively), but ultimately they are allocated from the Mem32 aperture. Why is that? Whereas device [00|02|00] has a Mem64 BAR (only 16KB in size), which is allocated from the Mem64 aperture. Thanks Laszlo _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel