PCI bus speed cmdline
PATCH 1/1 PCI bus speed cmdline
Martin (et al),
We spoke a while back about a 'pcispeed=' command line param to set the PCI busspeed values (for later querying, if needed). Attached is my patch to implement the feature we agreed upon. It is against linux-2.4.6.
Please let me know if there is any problem that would make this not suitable for general inclusion in the kernel.
Tim
Signature · 4 lines
Tim Hockin Systems Software Engineer Sun Microsystems, Cobalt Server Appliances [email protected]
drivers/pci/pci.c +65 -0
@@ -20,6 +20,7 @@#include <linux/ioport.h> #include <linux/spinlock.h> #include <linux/pm.h> +#include <linux/ctype.h> #include <linux/kmod.h> /* for hotplug_path */ #include <linux/bitops.h>
@@ -37,6 +38,8 @@LIST_HEAD (pci_root_buses);LIST_HEAD (pci_devices); +static int get_bus_speed (struct pci_bus *bus); +/** * pci_find_slot - locate PCI device from a given PCI slot * @bus: number of PCI bus on which desired PCI device resides
@@ -1047,6 +1050,7 @@ child->number = child->secondary = busnr; child->primary = parent->secondary; child->subordinate =0xff ; + child->bus_speed =get_bus_speed (child);/* Set up default resource pointers.. */ for (i =0 ; i <4 ; i++)
@@ -1358,6 +1373,7 @@list_add_tail (&b->node, &pci_root_buses); b->number = b->secondary = bus; + b->bus_speed =get_bus_speed (b); b->resource[0 ] = &ioport_resource; b->resource[1 ] = &iomem_resource;return b;
@@ -1910,7 +1926,67 @@return 1 ; } +#define MAX_OVERRIDES 256 +static int pci_speed_overrides[MAX_OVERRIDES ]__initdata ; + +static int __init get_bus_speed (struct pci_bus *bus) +{ +if (!bus) { +return -1 ; + } + +if (pci_speed_overrides[bus->number]) { +return pci_speed_overrides[bus->number]; + }else { +/* printk("PCI: assuming 33 MHz for bus %d\n", bus->number); */ +return 33 ; + } +} + +/* handle pcispeed=0:33,1:66 parameter (speed=0 means unknown) */ +static int __init pci_speed_setup (char *str) +{ +while (str) { +char *k =strchr (str,',' ); +if (k) { + *k++ ='\0' ; + } + +if (*str) { +int bus; +int speed; +char *endp; + +if (!isdigit (*str)) { +printk ("PCI: bad bus number for " +"pcispeed parameter\n" ); + str = k; +continue ; + } + bus =simple_strtoul (str, &endp,0 ); + +if (!*endp || !isdigit (*(++endp))) { +printk ("PCI: bad speed for " +"pcispeed parameter\n" ); + str = k; +continue ; + } + speed =simple_strtoul (endp,NULL ,0 ); + pci_speed_overrides[bus] = speed; +printk ("PCI: setting bus %d speed to %d MHz\n" , + bus, speed); + + str = k; + }else { +break ; + } + } +return 1 ; +} +__setup ("pci=" , pci_setup); +__setup ("pcispeed=" , pci_speed_setup); +EXPORT_SYMBOL (pci_read_config_byte);EXPORT_SYMBOL (pci_read_config_word);
include/linux/pci.h +1 -0
@@ -420,6 +420,7 @@unsigned char primary;/* number of primary bridge */ unsigned char secondary;/* number of secondary bridge */ unsigned char subordinate;/* max number of subordinate buses */ +int bus_speed;/* the speed of this PCI segment */ char name[48 ];unsigned short vendor;