ArmVirtualizationPkg/PciHostBridgeDxe: skip 0 AddrLen in SubmitResources()

According to Volume 5 of the PI spec, 10.8.2 PCI Host Bridge Resource
Allocation Protocol, SubmitResources(),

  It is considered an error if no resource requests are submitted for a
  PCI root bridge. If a PCI root bridge does not require any resources, a
  zero-length resource request must explicitly be submitted.

Under MdeModulePkg/Bus/Pci/PciBusDxe/, we have:

  PciHostBridgeResourceAllocator()                   [PciLib.c]
    ConstructAcpiResourceRequestor(..., &AcpiConfig) [PciEnumerator.c]
    PciResAlloc->SubmitResources(..., &AcpiConfig)
    ASSERT_EFI_ERROR ()

If ConstructAcpiResourceRequestor() finds no resources to request (for
example because no PCI devices are on the root bridge), it places a
zero-length EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR followed by an
EFI_ACPI_END_TAG_DESCRIPTOR in "AcpiConfig"; satisfying the PI spec.

However, PciHostBridgeDxe's SubmitResources() function does not expect
such input; the following part of the code rejects it:

        switch (Ptr->ResType) {

        case 0:

          //
          // Check invalid Address Sapce Granularity
          //
          if (Ptr->AddrSpaceGranularity != 32) {
            return EFI_INVALID_PARAMETER;
          }

Skip EFI_ACPI_ADDRESS_SPACE_DESCRIPTORs with zero AddrLen early. Also,
allow PciHostBridgeResourceAllocator() to proceed to the AllocateResources
phase by setting "ResourceSubmited" to TRUE.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Olivier Martin <Olivier.martin@arm.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16907 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Laszlo Ersek 2015-02-23 16:03:56 +00:00 committed by lersek
parent b9a44dcae3
commit 1a1d637695
1 changed files with 8 additions and 3 deletions

View File

@ -929,12 +929,19 @@ SubmitResources(
while (List != &HostBridgeInstance->Head) { while (List != &HostBridgeInstance->Head) {
RootBridgeInstance = DRIVER_INSTANCE_FROM_LIST_ENTRY (List); RootBridgeInstance = DRIVER_INSTANCE_FROM_LIST_ENTRY (List);
if (RootBridgeHandle == RootBridgeInstance->Handle) { if (RootBridgeHandle == RootBridgeInstance->Handle) {
while ( *Temp == 0x8A) { for (;
*Temp == 0x8A;
Temp += sizeof (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR)
) {
Ptr = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *) Temp ; Ptr = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *) Temp ;
// //
// Check Address Length // Check Address Length
// //
if (Ptr->AddrLen == 0) {
HostBridgeInstance->ResourceSubmited = TRUE;
continue;
}
if (Ptr->AddrLen > 0xffffffff) { if (Ptr->AddrLen > 0xffffffff) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -1002,8 +1009,6 @@ SubmitResources(
default: default:
break; break;
}; };
Temp += sizeof (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR) ;
} }
return EFI_SUCCESS; return EFI_SUCCESS;