|
@@ -108,3 +108,56 @@ static void fixup_winbond_82c105(struct pci_dev* dev)
|
|
|
}
|
|
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_WINBOND, PCI_DEVICE_ID_WINBOND_82C105,
|
|
|
fixup_winbond_82c105);
|
|
|
+
|
|
|
+int pseries_root_bridge_prepare(struct pci_host_bridge *bridge)
|
|
|
+{
|
|
|
+ struct device_node *dn, *pdn;
|
|
|
+ struct pci_bus *bus;
|
|
|
+ const uint32_t *pcie_link_speed_stats;
|
|
|
+
|
|
|
+ bus = bridge->bus;
|
|
|
+
|
|
|
+ dn = pcibios_get_phb_of_node(bus);
|
|
|
+ if (!dn)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ for (pdn = dn; pdn != NULL; pdn = of_get_next_parent(pdn)) {
|
|
|
+ pcie_link_speed_stats = (const uint32_t *) of_get_property(pdn,
|
|
|
+ "ibm,pcie-link-speed-stats", NULL);
|
|
|
+ if (pcie_link_speed_stats)
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ of_node_put(pdn);
|
|
|
+
|
|
|
+ if (!pcie_link_speed_stats) {
|
|
|
+ pr_err("no ibm,pcie-link-speed-stats property\n");
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (pcie_link_speed_stats[0]) {
|
|
|
+ case 0x01:
|
|
|
+ bus->max_bus_speed = PCIE_SPEED_2_5GT;
|
|
|
+ break;
|
|
|
+ case 0x02:
|
|
|
+ bus->max_bus_speed = PCIE_SPEED_5_0GT;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ bus->max_bus_speed = PCI_SPEED_UNKNOWN;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (pcie_link_speed_stats[1]) {
|
|
|
+ case 0x01:
|
|
|
+ bus->cur_bus_speed = PCIE_SPEED_2_5GT;
|
|
|
+ break;
|
|
|
+ case 0x02:
|
|
|
+ bus->cur_bus_speed = PCIE_SPEED_5_0GT;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ bus->cur_bus_speed = PCI_SPEED_UNKNOWN;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|