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:
Aaron Durbin 2016-06-10 21:44:26 -05:00 committed by Martin Roth
parent 1ee6f0bdc8
commit 065b683618

View File

@ -104,15 +104,24 @@ static void busmaster_disable_on_bus(int bus)
reg32 &= ~PCI_COMMAND_MASTER;
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 &= 0x7f;
if (hdr == PCI_HEADER_TYPE_BRIDGE ||
hdr == PCI_HEADER_TYPE_CARDBUS) {
unsigned int buses;
buses = pci_read_config32(dev, PCI_PRIMARY_BUS);
busmaster_disable_on_bus((buses >> 8) & 0xff);
}
if (hdr != PCI_HEADER_TYPE_BRIDGE &&
hdr != PCI_HEADER_TYPE_CARDBUS)
continue;
/*
* 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);
}
}
}