diff mbox

powerpc/pci: check the bus address instead of resource address in pcibios_fixup_resources

Message ID 1370435211-6929-1-git-send-email-haokexin@gmail.com (mailing list archive)
State Accepted, archived
Commit c5df457ffe6db7569de9fb856de490b5317c97b4
Delegated to: Benjamin Herrenschmidt
Headers show

Commit Message

Kevin Hao June 5, 2013, 12:26 p.m. UTC
If a BAR has the value of 0, we would assume that it is unset yet and
then mark the resource as unset and would reassign it later. But after
commit 6c5705fe (powerpc/PCI: get rid of device resource fixups)
the pcibios_fixup_resources is invoked after the bus address was
translated to linux resource. So the value of res->start is resource
address. And since the resource and bus address may be different, we
should translate it to the bus address before doing the check.

Signed-off-by: Kevin Hao <haokexin@gmail.com>
---
 arch/powerpc/kernel/pci-common.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Comments

David Laight June 5, 2013, 1:10 p.m. UTC | #1
> If a BAR has the value of 0, we would assume that it is unset yet and
> then mark the resource as unset and would reassign it later.

IIRC the PCI spec allows a BAR address of zero.
Certainly some sparc systems have assigned 0 to a BAR.
So assuming a BAR of 0 means it is unset may not be
true for all systems.

	David
Benjamin Herrenschmidt June 5, 2013, 10:38 p.m. UTC | #2
On Wed, 2013-06-05 at 14:10 +0100, David Laight wrote:
> > If a BAR has the value of 0, we would assume that it is unset yet and
> > then mark the resource as unset and would reassign it later.
> 
> IIRC the PCI spec allows a BAR address of zero.
> Certainly some sparc systems have assigned 0 to a BAR.
> So assuming a BAR of 0 means it is unset may not be
> true for all systems.

Yes, look at the code and the comment above :-) It tries to make a
guess... which so far has worked well for us.

Note that people assigning 0 to BARs are asking for trouble anyway.

Cheers,
Ben.
diff mbox

Patch

diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
index 7f2273c..eabeec9 100644
--- a/arch/powerpc/kernel/pci-common.c
+++ b/arch/powerpc/kernel/pci-common.c
@@ -827,6 +827,7 @@  static void pcibios_fixup_resources(struct pci_dev *dev)
 	}
 	for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
 		struct resource *res = dev->resource + i;
+		struct pci_bus_region reg;
 		if (!res->flags)
 			continue;
 
@@ -835,8 +836,9 @@  static void pcibios_fixup_resources(struct pci_dev *dev)
 		 * at 0 as unset as well, except if PCI_PROBE_ONLY is also set
 		 * since in that case, we don't want to re-assign anything
 		 */
+		pcibios_resource_to_bus(dev, &reg, res);
 		if (pci_has_flag(PCI_REASSIGN_ALL_RSRC) ||
-		    (res->start == 0 && !pci_has_flag(PCI_PROBE_ONLY))) {
+		    (reg.start == 0 && !pci_has_flag(PCI_PROBE_ONLY))) {
 			/* Only print message if not re-assigning */
 			if (!pci_has_flag(PCI_REASSIGN_ALL_RSRC))
 				pr_debug("PCI:%s Resource %d %016llx-%016llx [%x] "