Ben,
Can I check in this patch firstly without your real platform testing? Since you 
might not
be able to test it very soon. And when later there is a bug, I can provide 
additional patch
to fix it.

Regards,
Ray


>-----Original Message-----
>From: Laszlo Ersek [mailto:[email protected]]
>Sent: Thursday, February 25, 2016 5:22 PM
>To: Ni, Ruiyu <[email protected]>; [email protected]
>Cc: Benjamin Herrenschmidt <[email protected]>; Andrew Fish <[email protected]>; 
>Fan, Jeff <[email protected]>
>Subject: Re: [edk2] [Patch V4 3/3] MdeModuelPkg/PciBus: Return 
>AddrTranslationOffset in GetBarAttributes
>
>On 02/25/16 01:56, Ruiyu Ni wrote:
>> Some platform doesn't use CPU(HOST)/Device 1:1 mapping for PCI Bus.
>> But PCI IO doesn't have interface to tell caller (device driver)
>> whether the address returned by GetBarAttributes() is HOST address
>> or device address.
>> UEFI Spec 2.6 addresses this issue by clarifying the address returned
>> is HOST address and caller can use AddrTranslationOffset to calculate
>> the device address.
>>
>> Contributed-under: TianoCore Contribution Agreement 1.0
>> Signed-off-by: Ruiyu Ni <[email protected]>
>> Cc: Benjamin Herrenschmidt <[email protected]>
>> Cc: Andrew Fish <[email protected]>
>> Cc: Jeff Fan <[email protected]>
>> ---
>>  MdeModulePkg/Bus/Pci/PciBusDxe/PciIo.c | 62 
>> ++++++++++++++++++++++++++++++++++
>>  1 file changed, 62 insertions(+)
>
>Reviewed-by: Laszlo Ersek <[email protected]>
>
>Thanks!
>
>> diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciIo.c 
>> b/MdeModulePkg/Bus/Pci/PciBusDxe/PciIo.c
>> index 334a6ac..f72598d 100644
>> --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciIo.c
>> +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciIo.c
>> @@ -1744,6 +1744,53 @@ PciIoAttributes (
>>  }
>>
>>  /**
>> +  Retrieve the AddrTranslationOffset from RootBridgeIo for the
>> +  specified range.
>> +
>> +  @param RootBridgeIo    Root Bridge IO instance.
>> +  @param AddrRangeMin    The base address of the MMIO.
>> +  @param AddrLen         The length of the MMIO.
>> +
>> +  @retval The AddrTranslationOffset from RootBridgeIo for the
>> +          specified range, or (UINT64) -1 if the range is not
>> +          found in RootBridgeIo.
>> +**/
>> +UINT64
>> +GetMmioAddressTranslationOffset (
>> +  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL   *RootBridgeIo,
>> +  UINT64                            AddrRangeMin,
>> +  UINT64                            AddrLen
>> +  )
>> +{
>> +  EFI_STATUS                        Status;
>> +  EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Configuration;
>> +
>> +  Status = RootBridgeIo->Configuration (
>> +                           RootBridgeIo,
>> +                           (VOID **) &Configuration
>> +                           );
>> +  if (EFI_ERROR (Status)) {
>> +    return (UINT64) -1;
>> +  }
>> +
>> +  while (Configuration->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR) {
>> +    if ((Configuration->ResType == ACPI_ADDRESS_SPACE_TYPE_MEM) &&
>> +        (Configuration->AddrRangeMin <= AddrRangeMin) &&
>> +        (Configuration->AddrRangeMin + Configuration->AddrLen >= 
>> AddrRangeMin + AddrLen)
>> +        ) {
>> +      return Configuration->AddrTranslationOffset;
>> +    }
>> +    Configuration++;
>> +  }
>> +
>> +  //
>> +  // The resource occupied by BAR should be in the range reported by 
>> RootBridge.
>> +  //
>> +  ASSERT (FALSE);
>> +  return (UINT64) -1;
>> +}
>> +
>> +/**
>>    Gets the attributes that this PCI controller supports setting on a BAR 
>> using
>>    SetBarAttributes(), and retrieves the list of resource descriptors for a 
>> BAR.
>>
>> @@ -1867,6 +1914,21 @@ PciIoGetBarAttributes (
>>      End           = (EFI_ACPI_END_TAG_DESCRIPTOR *) (Descriptor + 1);
>>      End->Desc     = ACPI_END_TAG_DESCRIPTOR;
>>      End->Checksum = 0;
>> +
>> +    //
>> +    // Get the Address Translation Offset
>> +    //
>> +    if (Descriptor->ResType == ACPI_ADDRESS_SPACE_TYPE_MEM) {
>> +      Descriptor->AddrTranslationOffset = GetMmioAddressTranslationOffset (
>> +                                            PciIoDevice->PciRootBridgeIo,
>> +                                            Descriptor->AddrRangeMin,
>> +                                            Descriptor->AddrLen
>> +                                            );
>> +      if (Descriptor->AddrTranslationOffset == (UINT64) -1) {
>> +        FreePool (Descriptor);
>> +        return EFI_UNSUPPORTED;
>> +      }
>> +    }
>>    }
>>
>>    return EFI_SUCCESS;
>>
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to