On Thu, 2016-02-18 at 06:55 +0000, Ni, Ruiyu wrote: > Ben, > I just had a look at your changes. Nice feeling that our codes are > quite similar, except yours are in a separate function. > I thought about separating it to a sub function but later didn't do > that because this sub function is only called once > and the logic after all is quite simple:)
The logic is simple yes but I dislike large functions, I find it makes the overall code flow harder to follow ;-) Just a matter of personal taste. > Can you give a rb for this patch? or you think a sub function is > better? I can make that change if you insist. I'd prefer testing before rb'ing but I won't be able to do that for a couple of weeks at least (travelling). Did you manage to find a platform to test your changes ? I'll give it a closer look tomorrow and send a rb based on pure code review. (Ping me if I forget). Cheers, Ben. > Regards, > Ray > > -----Original Message----- > From: Benjamin Herrenschmidt [mailto:[email protected]] > Sent: Thursday, February 18, 2016 11:21 AM > To: Ni, Ruiyu <[email protected]>; [email protected] > Cc: Andrew Fish <[email protected]>; Fan, Jeff <[email protected]> > Subject: Re: [Patch 2/2] MdeModuelPkg/PciBus: Return > AddrTranslationOffset in GetBarAttributes > > On Thu, 2016-02-18 at 10:33 +0800, 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. > > Hi ! > > I had implemented that a bit differently mostly for code clarity > (see below pasted from github) > > Ie, make it a sub function. Otherwise I think the principle is ok. > > Note that I haven't been able to work on my EDK2 port for a while now > due to other commitments. I will eventually get back to it and test > your patch. > > You can browse my monster-patch on github, I need to split/clean it > into a proper patch series, it also contains some updates of a couple > of drivers to actually use that offset properly > > https://github.com/ozbenh/edk2/commits/master > > + Finds the root bridge resource corresponding to the BAR whose > address > + space descritpor is passes as an argument and copy the > translation offset > + over from it into the BAR descriptor > + > + @param RootBridge A pointer to the > EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL instance. > + @param BarAddressSpace A pointer to the ACPI 2.0 resource > descriptors that describe the current > + configuration of this BAR of the > PCI controller that is to be updated. > + > + @retval EFI_SUCCESS The descriptor was successfully > updated. > + @retval EFI_UNSUPPORTED No resource in the root bridge > matches the BAR region > + @retval EFI_OUT_OF_RESOURCES There are not enough resources > available to allocate > + Resources. > + > +**/ > +STATIC > +EFI_STATUS > +PciBarUpdateTranslationOffset( > + IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *RootBridge, > + IN OUT EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *BarAddressSpace) > +{ > + EFI_STATUS Status; > + EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *RootDescriptors; > + EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Desc; > + UINT8 *Temp; > + > + Status = RootBridge->Configuration (RootBridge, (VOID **) > &RootDescriptors); > + if (EFI_ERROR (Status)) { > + return Status; > + } > + > + Temp = (UINT8 *) RootDescriptors; > + while (*Temp == ACPI_ADDRESS_SPACE_DESCRIPTOR) { > + Desc = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *) Temp; > + > + // > + // Do we have the right type of descriptor ? > + // > + if (Desc->ResType == BarAddressSpace->ResType) { > + // > + // Check if the BAR base fits > + // > + if (BarAddressSpace->AddrRangeMin >= Desc->AddrRangeMin && > + BarAddressSpace->AddrRangeMin < (Desc->AddrRangeMin + > Desc->AddrLen)) { > + // > + // Found it, update offset and return > + // > + BarAddressSpace->AddrTranslationOffset = Desc- > >AddrTranslationOffset; > + return EFI_SUCCESS; > + } > + } > + Temp += sizeof (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR); > + } > + return EFI_UNSUPPORTED; > +} > + > +/** > Gets the attributes that this PCI controller supports setting on > a BAR using > SetBarAttributes(), and retrieves the list of resource > descriptors for a BAR. > > @@ -1778,6 +1834,7 @@ PciIoGetBarAttributes ( > PCI_IO_DEVICE *PciIoDevice; > EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *AddressSpace; > EFI_ACPI_END_TAG_DESCRIPTOR *End; > + EFI_STATUS Status; > > PciIoDevice = PCI_IO_DEVICE_FROM_PCI_IO_THIS (This); > > @@ -1878,6 +1935,15 @@ PciIoGetBarAttributes ( > } > > // > + // Update the AddrTranslationOffset field > + // > + Status = PciBarUpdateTranslationOffset(PciIoDevice- > >PciRootBridgeIo, AddressSpace); > + if (EFI_ERROR (Status)) { > + FreePool(AddressSpace); > + return Status; > + } > + > + // > // put the checksum > // > End = (EFI_ACPI_END_TAG_DESCRIPTOR *) (AddressSpace + > 1); > View > > > 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 | 37 > > ++++++++++++++++++++++++++++++++++ > > 1 file changed, 37 insertions(+) > > > > diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciIo.c > > b/MdeModulePkg/Bus/Pci/PciBusDxe/PciIo.c > > index 50ed866..5cee8ca 100644 > > --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciIo.c > > +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciIo.c > > @@ -1774,8 +1774,10 @@ PciIoGetBarAttributes ( > > OUT VOID **Resources OPTIONAL > > ) > > { > > + EFI_STATUS Status; > > PCI_IO_DEVICE *PciIoDevice; > > EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Descriptor; > > + EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Configuration; > > EFI_ACPI_END_TAG_DESCRIPTOR *End; > > > > PciIoDevice = PCI_IO_DEVICE_FROM_PCI_IO_THIS (This); > > @@ -1863,6 +1865,41 @@ 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) { > > + Status = PciIoDevice->PciRootBridgeIo->Configuration ( > > + PciIoDevice- > > > PciRootBridgeIo, > > + (VOID **) > > &Configuration > > + ); > > + if (!EFI_ERROR (Status)) { > > + while (Configuration->Desc == Descriptor->Desc) { > > + if ((Configuration->ResType == Descriptor->ResType) && > > + (Configuration->AddrRangeMin <= Descriptor- > > > AddrRangeMin) && > > + (Configuration->AddrRangeMin + Configuration- > > >AddrLen > > > = Descriptor->AddrRangeMin + Descriptor->AddrLen) > > + ) { > > + Descriptor->AddrTranslationOffset = Configuration- > > > AddrTranslationOffset; > > + break; > > + } > > + Configuration++; > > + } > > + > > + // > > + // The resource occupied by BAR should be in the range > > reported by RootBridge. > > + // > > + ASSERT (Configuration->Desc == Descriptor->Desc); > > + if (Configuration->Desc != Descriptor->Desc) { > > + Status = EFI_UNSUPPORTED; > > + } > > + } > > + > > + if (EFI_ERROR (Status)) { > > + FreePool (Descriptor); > > + return Status; > > + } > > + } > > } > > > > return EFI_SUCCESS; _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

