Baytrail: Change PCIe root disable algorithm

Disable Root Port0 only when there is no PCIe device
present on any root port.

BUG=None
TEST=Boot Rambi with PCIe installed/non-installed on RP0 to
confirm the RP0 is correctly enabled/disabled. However, I still
need someone to help check if RP0(no device) is still enabled
if there is device on other RPs since since I have no devices
having slots from RP1/2/3.

Change-Id: I7147569e78b2d1ecea070bc933773cdcae59f9e7
Signed-off-by: Kenji Chen <kenji.chen@intel.com>
Reviewed-on: https://chromium-review.googlesource.com/217791
Tested-by: Ted Kuo <tedkuo@ami.com.tw>
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
This commit is contained in:
Kenji Chen 2014-09-12 02:10:53 +08:00 committed by chrome-internal-fetch
commit c5cef0b7c2
2 changed files with 38 additions and 3 deletions

View file

@ -98,5 +98,5 @@
#define PHYCTL4 0x408
# define SQDIS (1 << 27)
#define PCIE_ROOT_PORT_COUNT 4
#endif /* _BAYTRAIL_PCIE_H_ */

View file

@ -155,6 +155,35 @@ static void check_port_enabled(device_t dev)
}
}
static u8 all_ports_no_dev_present(device_t dev)
{
u8 func;
u8 temp = dev->path.pci.devfn;
u8 device_not_present = 1;
u8 data;
for (func = 1; func < PCIE_ROOT_PORT_COUNT; func++) {
dev->path.pci.devfn &= ~0x7;
dev->path.pci.devfn |= func;
/* is pcie device there */
if (pci_read_config32(dev, 0) == 0xFFFFFFFF)
continue;
data = pci_read_config8(dev, XCAP + 3) | (SI >> 24);
pci_write_config8(dev, XCAP + 3, data);
/* is any device present */
if ((pci_read_config32(dev, SLCTL_SLSTS) & PDS)) {
device_not_present = 0;
break;
}
}
dev->path.pci.devfn = temp;
return device_not_present;
}
static void check_device_present(device_t dev)
{
/* Set slot implemented. */
@ -163,8 +192,14 @@ static void check_device_present(device_t dev)
/* No device present. */
if (!(pci_read_config32(dev, SLCTL_SLSTS) & PDS)) {
printk(BIOS_DEBUG, "No PCIe device present.\n");
reg_script_run_on_dev(dev, no_dev_behind_port);
dev->enabled = 0;
if (is_first_port(dev)) {
if (all_ports_no_dev_present(dev)) {
reg_script_run_on_dev(dev, no_dev_behind_port);
dev->enabled = 0;
}
} else {
dev->enabled = 0;
}
} else if(!dev->enabled) {
/* Port is disabled, but device present. Disable link. */
pci_write_config32(dev, LCTL,