Host bridge hotplug:
- Untangle _PRT from struct pci_bus (Bjorn Helgaas)
- Request _OSC control before scanning root bus (Taku Izumi)
- Assign resources when adding host bridge (Yinghai Lu)
- Remove root bus when removing host bridge (Yinghai Lu)
- Remove _PRT during hot remove (Yinghai Lu)
SRIOV
- Add sysfs knobs to control numVFs (Don Dutile)
Power management
- Notify devices when power resource turned on (Huang Ying)
Bug fixes
- Work around broken _SEG on HP xw9300 (Bjorn Helgaas)
- Keep runtime PM enabled for unbound PCI devices (Huang Ying)
- Fix Optimus dual-GPU runtime D3 suspend issue (Dave Airlie)
- Fix xen frontend shutdown issue (David Vrabel)
- Work around PLX PCI 9050 BAR alignment erratum (Ian Abbott)
Miscellaneous
- Add GPL license for drivers/pci/ioapic (Andrew Cooks)
- Add standard PCI-X, PCIe ASPM register #defines (Bjorn Helgaas)
- NumaChip remote PCI support (Daniel Blueman)
- Fix PCIe Link Capabilities Supported Link Speed definition (Jingoo Han)
- Convert dev_printk() to dev_info(), etc (Joe Perches)
- Add support for non PCI BAR ROM data (Matthew Garrett)
- Add x86 support for host bridge translation offset (Mike Yoknis)
- Report success only when every driver supports AER (Vijay Pandarathil)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
iQIcBAABAgAGBQJQyKwSAAoJEPGMOI97Hn6zScgQAJZK2VDfCv74mKrgSDNokIzH
5nVDrc9AHKJm7CUODs6keJK5d4TD/za3Zao68zrYHsJJKes2ni2Z3W34HP2RXKK2
eOmePXOHYPPZMlimP9r9cVxNu1ZJCyp/yWSBcsPF4zUgWhBWLRaSj85I049gQ0sz
+05nZYfLjVd3HNiaXsG4CQyMrNF46XEsLhF9vs+Nr2GHPwrpzhfScgYv63oDS86C
3ICKsjmiRUZcNelxIFYmyxa5u89QdW5XHjzc9eHGQuus24Vxw+TZzsdfc17sUJEE
HTyXY+RjDpOVhdtwwUjrCEOiyZYvy3g9+3sKxoxgt/76ghdUaR7fxITwB97qVMFD
T0ESlKjSV/Qv5QYdyy5uP4zwNs/PXCWXkTg/L1m71F30BxKWDa7tgiA6uK7Z7fl5
1aokKBdk3mtJJJIDJG1YkxPXx/JItTGCNYrx7CcFj49rSjrUWLQdmrYahersRIsB
3wiD2xTi9e4dXeP/+VGzGOWB/sHk+73jvrvZe/REa1FCnMINDz4+9V9WaGROMqyq
MQ8kX0KfYcNVNxy1GOXjU5wLpMN/t/QbvI7gwzRP1DAUCJPoOgFy7AjvSTVG3zuy
8CtdOFttVkUn5dqsbQR0gVbyQVTS3PGSKz5XC/s8kVDWhja0xZTBYwrskM/4zdSD
Xf48OyYV5EjpC3FYUSiU
=OE3Q
-----END PGP SIGNATURE-----
Merge tag 'for-3.8' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci
Pull PCI update from Bjorn Helgaas:
"Host bridge hotplug:
- Untangle _PRT from struct pci_bus (Bjorn Helgaas)
- Request _OSC control before scanning root bus (Taku Izumi)
- Assign resources when adding host bridge (Yinghai Lu)
- Remove root bus when removing host bridge (Yinghai Lu)
- Remove _PRT during hot remove (Yinghai Lu)
SRIOV
- Add sysfs knobs to control numVFs (Don Dutile)
Power management
- Notify devices when power resource turned on (Huang Ying)
Bug fixes
- Work around broken _SEG on HP xw9300 (Bjorn Helgaas)
- Keep runtime PM enabled for unbound PCI devices (Huang Ying)
- Fix Optimus dual-GPU runtime D3 suspend issue (Dave Airlie)
- Fix xen frontend shutdown issue (David Vrabel)
- Work around PLX PCI 9050 BAR alignment erratum (Ian Abbott)
Miscellaneous
- Add GPL license for drivers/pci/ioapic (Andrew Cooks)
- Add standard PCI-X, PCIe ASPM register #defines (Bjorn Helgaas)
- NumaChip remote PCI support (Daniel Blueman)
- Fix PCIe Link Capabilities Supported Link Speed definition (Jingoo
Han)
- Convert dev_printk() to dev_info(), etc (Joe Perches)
- Add support for non PCI BAR ROM data (Matthew Garrett)
- Add x86 support for host bridge translation offset (Mike Yoknis)
- Report success only when every driver supports AER (Vijay
Pandarathil)"
Fix up trivial conflicts.
* tag 'for-3.8' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci: (48 commits)
PCI: Use phys_addr_t for physical ROM address
x86/PCI: Add NumaChip remote PCI support
ath9k: Use standard #defines for PCIe Capability ASPM fields
iwlwifi: Use standard #defines for PCIe Capability ASPM fields
iwlwifi: collapse wrapper for pcie_capability_read_word()
iwlegacy: Use standard #defines for PCIe Capability ASPM fields
iwlegacy: collapse wrapper for pcie_capability_read_word()
cxgb3: Use standard #defines for PCIe Capability ASPM fields
PCI: Add standard PCIe Capability Link ASPM field names
PCI/portdrv: Use PCI Express Capability accessors
PCI: Use standard PCIe Capability Link register field names
x86: Use PCI setup data
PCI: Add support for non-BAR ROMs
PCI: Add pcibios_add_device
EFI: Stash ROMs if they're not in the PCI BAR
PCI: Add and use standard PCI-X Capability register names
PCI/PM: Keep runtime PM enabled for unbound PCI devices
xen-pcifront: Handle backend CLOSED without CLOSING
PCI: SRIOV control and status via sysfs (documentation)
PCI/AER: Report success only when every device has AER-aware driver
...
129 lines
2.8 KiB
C
129 lines
2.8 KiB
C
/*
|
|
* IOAPIC/IOxAPIC/IOSAPIC driver
|
|
*
|
|
* Copyright (C) 2009 Fujitsu Limited.
|
|
* (c) Copyright 2009 Hewlett-Packard Development Company, L.P.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
/*
|
|
* This driver manages PCI I/O APICs added by hotplug after boot. We try to
|
|
* claim all I/O APIC PCI devices, but those present at boot were registered
|
|
* when we parsed the ACPI MADT, so we'll fail when we try to re-register
|
|
* them.
|
|
*/
|
|
|
|
#include <linux/pci.h>
|
|
#include <linux/module.h>
|
|
#include <linux/acpi.h>
|
|
#include <linux/slab.h>
|
|
#include <acpi/acpi_bus.h>
|
|
|
|
struct ioapic {
|
|
acpi_handle handle;
|
|
u32 gsi_base;
|
|
};
|
|
|
|
static int ioapic_probe(struct pci_dev *dev, const struct pci_device_id *ent)
|
|
{
|
|
acpi_handle handle;
|
|
acpi_status status;
|
|
unsigned long long gsb;
|
|
struct ioapic *ioapic;
|
|
int ret;
|
|
char *type;
|
|
struct resource *res;
|
|
|
|
handle = DEVICE_ACPI_HANDLE(&dev->dev);
|
|
if (!handle)
|
|
return -EINVAL;
|
|
|
|
status = acpi_evaluate_integer(handle, "_GSB", NULL, &gsb);
|
|
if (ACPI_FAILURE(status))
|
|
return -EINVAL;
|
|
|
|
/*
|
|
* The previous code in acpiphp evaluated _MAT if _GSB failed, but
|
|
* ACPI spec 4.0 sec 6.2.2 requires _GSB for hot-pluggable I/O APICs.
|
|
*/
|
|
|
|
ioapic = kzalloc(sizeof(*ioapic), GFP_KERNEL);
|
|
if (!ioapic)
|
|
return -ENOMEM;
|
|
|
|
ioapic->handle = handle;
|
|
ioapic->gsi_base = (u32) gsb;
|
|
|
|
if (dev->class == PCI_CLASS_SYSTEM_PIC_IOAPIC)
|
|
type = "IOAPIC";
|
|
else
|
|
type = "IOxAPIC";
|
|
|
|
ret = pci_enable_device(dev);
|
|
if (ret < 0)
|
|
goto exit_free;
|
|
|
|
pci_set_master(dev);
|
|
|
|
if (pci_request_region(dev, 0, type))
|
|
goto exit_disable;
|
|
|
|
res = &dev->resource[0];
|
|
if (acpi_register_ioapic(ioapic->handle, res->start, ioapic->gsi_base))
|
|
goto exit_release;
|
|
|
|
pci_set_drvdata(dev, ioapic);
|
|
dev_info(&dev->dev, "%s at %pR, GSI %u\n", type, res, ioapic->gsi_base);
|
|
return 0;
|
|
|
|
exit_release:
|
|
pci_release_region(dev, 0);
|
|
exit_disable:
|
|
pci_disable_device(dev);
|
|
exit_free:
|
|
kfree(ioapic);
|
|
return -ENODEV;
|
|
}
|
|
|
|
static void ioapic_remove(struct pci_dev *dev)
|
|
{
|
|
struct ioapic *ioapic = pci_get_drvdata(dev);
|
|
|
|
acpi_unregister_ioapic(ioapic->handle, ioapic->gsi_base);
|
|
pci_release_region(dev, 0);
|
|
pci_disable_device(dev);
|
|
kfree(ioapic);
|
|
}
|
|
|
|
|
|
static DEFINE_PCI_DEVICE_TABLE(ioapic_devices) = {
|
|
{ PCI_DEVICE_CLASS(PCI_CLASS_SYSTEM_PIC_IOAPIC, ~0) },
|
|
{ PCI_DEVICE_CLASS(PCI_CLASS_SYSTEM_PIC_IOXAPIC, ~0) },
|
|
{ }
|
|
};
|
|
MODULE_DEVICE_TABLE(pci, ioapic_devices);
|
|
|
|
static struct pci_driver ioapic_driver = {
|
|
.name = "ioapic",
|
|
.id_table = ioapic_devices,
|
|
.probe = ioapic_probe,
|
|
.remove = ioapic_remove,
|
|
};
|
|
|
|
static int __init ioapic_init(void)
|
|
{
|
|
return pci_register_driver(&ioapic_driver);
|
|
}
|
|
|
|
static void __exit ioapic_exit(void)
|
|
{
|
|
pci_unregister_driver(&ioapic_driver);
|
|
}
|
|
|
|
module_init(ioapic_init);
|
|
module_exit(ioapic_exit);
|
|
|
|
MODULE_LICENSE("GPL");
|