soc/intel/common: don't infinitely recurse in busmaster_disable_on_bus()
If a bridge has the primary bus equal to the secondary bus the busmaster_disable_on_bus() will infinitely call itself. Avoid the inifinite recursion by checking current bus number against the secondary bus number. BUG=chrome-os-partner:54262 TEST=Ran on reef. Able to actually get the chipset to assert SLP_Sx signals which means no more infinite recursion. Change-Id: I52b21fbba24e6a652ea8f9f87f5f49f60109c8f2 Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: https://review.coreboot.org/15157 Reviewed-by: Furquan Shaikh <furquan@google.com> Tested-by: build bot (Jenkins)
This commit is contained in:
parent
1ee6f0bdc8
commit
065b683618
@ -104,15 +104,24 @@ static void busmaster_disable_on_bus(int bus)
|
|||||||
reg32 &= ~PCI_COMMAND_MASTER;
|
reg32 &= ~PCI_COMMAND_MASTER;
|
||||||
pci_write_config32(dev, PCI_COMMAND, reg32);
|
pci_write_config32(dev, PCI_COMMAND, reg32);
|
||||||
|
|
||||||
/* If this is a bridge, then follow it. */
|
/* If it's not a bridge, move on. */
|
||||||
hdr = pci_read_config8(dev, PCI_HEADER_TYPE);
|
hdr = pci_read_config8(dev, PCI_HEADER_TYPE);
|
||||||
hdr &= 0x7f;
|
hdr &= 0x7f;
|
||||||
if (hdr == PCI_HEADER_TYPE_BRIDGE ||
|
if (hdr != PCI_HEADER_TYPE_BRIDGE &&
|
||||||
hdr == PCI_HEADER_TYPE_CARDBUS) {
|
hdr != PCI_HEADER_TYPE_CARDBUS)
|
||||||
unsigned int buses;
|
continue;
|
||||||
buses = pci_read_config32(dev, PCI_PRIMARY_BUS);
|
|
||||||
busmaster_disable_on_bus((buses >> 8) & 0xff);
|
/*
|
||||||
}
|
* If secondary bus is equal to current bus bypass
|
||||||
|
* the bridge because it's likely unconfigured and
|
||||||
|
* would cause infinite recursion.
|
||||||
|
*/
|
||||||
|
int secbus = pci_read_config8(dev, PCI_SECONDARY_BUS);
|
||||||
|
|
||||||
|
if (secbus == bus)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
busmaster_disable_on_bus(secbus);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user