Thanks,
Ray

> 在 2016年3月6日,下午8:30,Laszlo Ersek <ler...@redhat.com> 写道:
> 
>> On 03/05/16 10:54, Ni, Ruiyu wrote:
>> 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().
> 
> Right; I had found that function before I sent my email, but it looked
> quite complex; so I thought I would ask my question without cluttering
> the email with doubts about that function.
> 
> You are correct: the device is a physical GTX750 GPU assigned to the
> guest, and it does have an option ROM.
> 
> I saw the comment in the source:
> 
>  //
>  // If any child device has both option ROM and 64-bit BAR, degrade its
>  // PMEM64/MEM64 requests in case that if a legacy option ROM image can
>  // not access 64-bit resources.
>  //
> 
> but I thought that this degradation would only happen if the option ROM
> in question were *for certain* a legacy option ROM *only*. In this case
> the GPU has a well-working 64-bit UEFI firmware, so I mostly ignored the
> code under the comment.
> 
> Now I'm noticing that the condition is:
> 
>    Temp = PCI_IO_DEVICE_FROM_LINK (ChildDeviceLink);
>    if (Temp->RomSize != 0) {
> 
> i.e., any kind of option ROM suffices to degrade the region.
> 
> So, my question is answered. Thank you!
You are welcome!

> Laszlo
> 
>> 
>> 
>> 
>> 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

Reply via email to