]> bbs.cooldavid.org Git - net-next-2.6.git/commitdiff
PCI: PCIe: Introduce commad line switch for disabling port services
authorRafael J. Wysocki <rjw@sisk.pl>
Fri, 20 Aug 2010 23:51:44 +0000 (01:51 +0200)
committerJesse Barnes <jbarnes@virtuousgeek.org>
Tue, 24 Aug 2010 20:43:15 +0000 (13:43 -0700)
Introduce kernel command line switch pcie_ports= allowing one to
disable all of the native PCIe port services, so that PCIe ports
are treated like PCI-to-PCI bridges.

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Documentation/kernel-parameters.txt
drivers/pci/pcie/portdrv.h
drivers/pci/pcie/portdrv_core.c
drivers/pci/pcie/portdrv_pci.c

index 873b68090098459a3fd0983793c9005d59727f77..b9008fc3a53d977f33556843c4f2efe6487f88ff 100644 (file)
@@ -2042,6 +2042,10 @@ and is between 256 and 4096 characters. It is defined in the file
                force   Enable ASPM even on devices that claim not to support it.
                        WARNING: Forcing ASPM on may cause system lockups.
 
+       pcie_ports=     [PCIE] PCIe ports handling:
+               compat  Treat PCIe ports as PCI-to-PCI bridges, disable the PCIe
+                       ports driver.
+
        pcie_pme=       [PCIE,PM] Native PCIe PME signaling options:
                        Format: {auto|force}[,nomsi]
                auto    Use native PCIe PME signaling if the BIOS allows the
index 813a5c3427b69261d0d54d5c531ffc9f9973ce64..966f6e9761c887c95837a4c89fb4dc8521e62e9c 100644 (file)
@@ -20,6 +20,8 @@
 
 #define get_descriptor_id(type, service) (((type - 4) << 4) | service)
 
+extern bool pcie_ports_disabled;
+
 extern struct bus_type pcie_port_bus_type;
 extern int pcie_port_device_register(struct pci_dev *dev);
 #ifdef CONFIG_PM
index e73effbe402c55e82be4d8a821b3d39e64f96bac..2bf2fe510e15fd0890322bd07cd2ba44ac6ff3c8 100644 (file)
@@ -494,6 +494,9 @@ static void pcie_port_shutdown_service(struct device *dev) {}
  */
 int pcie_port_service_register(struct pcie_port_service_driver *new)
 {
+       if (pcie_ports_disabled)
+               return -ENODEV;
+
        new->driver.name = (char *)new->name;
        new->driver.bus = &pcie_port_bus_type;
        new->driver.probe = pcie_port_probe_service;
index 3debed25e46bb63f4e70e4a58b0d9abff3fd33be..a04392da6ce170bcf4a8d1443715c2319c8c9783 100644 (file)
@@ -29,6 +29,18 @@ MODULE_AUTHOR(DRIVER_AUTHOR);
 MODULE_DESCRIPTION(DRIVER_DESC);
 MODULE_LICENSE("GPL");
 
+/* If this switch is set, PCIe port native services should not be enabled. */
+bool pcie_ports_disabled;
+
+static int __init pcie_port_setup(char *str)
+{
+       if (!strncmp(str, "compat", 6))
+               pcie_ports_disabled = true;
+
+       return 1;
+}
+__setup("pcie_ports=", pcie_port_setup);
+
 /* global data */
 
 static int pcie_portdrv_restore_config(struct pci_dev *dev)
@@ -301,6 +313,9 @@ static int __init pcie_portdrv_init(void)
 {
        int retval;
 
+       if (pcie_ports_disabled)
+               return -EACCES;
+
        dmi_check_system(pcie_portdrv_dmi_table);
 
        retval = pcie_port_bus_register();