|
@@ -437,11 +437,56 @@ void pcie_update_link_speed(struct pci_bus *bus, u16 linksta)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(pcie_update_link_speed);
|
|
|
|
|
|
+static unsigned char agp_speeds[] = {
|
|
|
+ AGP_UNKNOWN,
|
|
|
+ AGP_1X,
|
|
|
+ AGP_2X,
|
|
|
+ AGP_4X,
|
|
|
+ AGP_8X
|
|
|
+};
|
|
|
+
|
|
|
+static enum pci_bus_speed agp_speed(int agp3, int agpstat)
|
|
|
+{
|
|
|
+ int index = 0;
|
|
|
+
|
|
|
+ if (agpstat & 4)
|
|
|
+ index = 3;
|
|
|
+ else if (agpstat & 2)
|
|
|
+ index = 2;
|
|
|
+ else if (agpstat & 1)
|
|
|
+ index = 1;
|
|
|
+ else
|
|
|
+ goto out;
|
|
|
+
|
|
|
+ if (agp3) {
|
|
|
+ index += 2;
|
|
|
+ if (index == 5)
|
|
|
+ index = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ out:
|
|
|
+ return agp_speeds[index];
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
static void pci_set_bus_speed(struct pci_bus *bus)
|
|
|
{
|
|
|
struct pci_dev *bridge = bus->self;
|
|
|
int pos;
|
|
|
|
|
|
+ pos = pci_find_capability(bridge, PCI_CAP_ID_AGP);
|
|
|
+ if (!pos)
|
|
|
+ pos = pci_find_capability(bridge, PCI_CAP_ID_AGP3);
|
|
|
+ if (pos) {
|
|
|
+ u32 agpstat, agpcmd;
|
|
|
+
|
|
|
+ pci_read_config_dword(bridge, pos + PCI_AGP_STATUS, &agpstat);
|
|
|
+ bus->max_bus_speed = agp_speed(agpstat & 8, agpstat & 7);
|
|
|
+
|
|
|
+ pci_read_config_dword(bridge, pos + PCI_AGP_COMMAND, &agpcmd);
|
|
|
+ bus->cur_bus_speed = agp_speed(agpstat & 8, agpcmd & 7);
|
|
|
+ }
|
|
|
+
|
|
|
pos = pci_find_capability(bridge, PCI_CAP_ID_PCIX);
|
|
|
if (pos) {
|
|
|
u16 status;
|