Skip to contentSkip to conversation

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

PATCH In review Kevin Hao 3 participants 3 messages Jun 5, 2013 PowerPC

lore
Share & tools
lore

Kevin Hao

author
#0 lore raw

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

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.

---
 arch/powerpc/kernel/pci-common.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
arch/powerpc/kernel/pci-common.c +3 -1
index 7f2273c..eabeec9 100644
@@ -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] "
Signature · 1 line
1.8.1.4
#1 lore raw
Quoted 2 lines

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

#2 lore raw
Quoted 7 lines · David Laight
Quoted 2 lines

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.