Skip to content

Commit

Permalink
PCI: PCIe: Introduce commad line switch for disabling port services
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Rafael J. Wysocki authored and Jesse Barnes committed Aug 24, 2010
1 parent f1a7bfa commit 79dd918
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 0 deletions.
4 changes: 4 additions & 0 deletions Documentation/kernel-parameters.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions drivers/pci/pcie/portdrv.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 3 additions & 0 deletions drivers/pci/pcie/portdrv_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
15 changes: 15 additions & 0 deletions drivers/pci/pcie/portdrv_pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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();
Expand Down

0 comments on commit 79dd918

Please sign in to comment.