Merge branch 'pci/misc' into next

* pci/misc:
  PCI: Enable INTx if BIOS left them disabled
  ia64/PCI: Set IORESOURCE_ROM_SHADOW only for the default VGA device
  x86/PCI: Set IORESOURCE_ROM_SHADOW only for the default VGA device
  PCI: Update outdated comment for pcibios_bus_report_status()
  PCI: Cleanup per-arch list of object files
  PCI: cpqphp: Fix hex vs decimal typo in cpqhpc_probe()
  x86/PCI: Fix function definition whitespace
  x86/PCI: Reword comments
  x86/PCI: Remove unnecessary local variable initialization
  PCI: Remove unnecessary list_empty(&pci_pme_list) check
This commit is contained in:
Bjorn Helgaas 2014-02-18 17:02:04 -07:00
commit 94a5f850ae
7 changed files with 75 additions and 74 deletions

View file

@ -19,7 +19,7 @@
static int debug_pci; static int debug_pci;
/* /*
* We can't use pci_find_device() here since we are * We can't use pci_get_device() here since we are
* called from interrupt context. * called from interrupt context.
*/ */
static void pcibios_bus_report_status(struct pci_bus *bus, u_int status_mask, int warn) static void pcibios_bus_report_status(struct pci_bus *bus, u_int status_mask, int warn)

View file

@ -5,6 +5,7 @@
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/vgaarb.h>
#include <asm/machvec.h> #include <asm/machvec.h>
@ -19,9 +20,10 @@
* IORESOURCE_ROM_SHADOW is used to associate the boot video * IORESOURCE_ROM_SHADOW is used to associate the boot video
* card with this copy. On laptops this copy has to be used since * card with this copy. On laptops this copy has to be used since
* the main ROM may be compressed or combined with another image. * the main ROM may be compressed or combined with another image.
* See pci_map_rom() for use of this flag. IORESOURCE_ROM_SHADOW * See pci_map_rom() for use of this flag. Before marking the device
* is marked here since the boot video device will be the only enabled * with IORESOURCE_ROM_SHADOW check if a vga_default_device is already set
* video device at this point. * by either arch cde or vga-arbitration, if so only apply the fixup to this
* already determined primary video card.
*/ */
static void pci_fixup_video(struct pci_dev *pdev) static void pci_fixup_video(struct pci_dev *pdev)
@ -35,9 +37,6 @@ static void pci_fixup_video(struct pci_dev *pdev)
return; return;
/* Maybe, this machine supports legacy memory map. */ /* Maybe, this machine supports legacy memory map. */
if ((pdev->class >> 8) != PCI_CLASS_DISPLAY_VGA)
return;
/* Is VGA routed to us? */ /* Is VGA routed to us? */
bus = pdev->bus; bus = pdev->bus;
while (bus) { while (bus) {
@ -60,10 +59,14 @@ static void pci_fixup_video(struct pci_dev *pdev)
} }
bus = bus->parent; bus = bus->parent;
} }
pci_read_config_word(pdev, PCI_COMMAND, &config); if (!vga_default_device() || pdev == vga_default_device()) {
if (config & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) { pci_read_config_word(pdev, PCI_COMMAND, &config);
pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW; if (config & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) {
dev_printk(KERN_DEBUG, &pdev->dev, "Boot video device\n"); pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW;
dev_printk(KERN_DEBUG, &pdev->dev, "Boot video device\n");
vga_set_default_device(pdev);
}
} }
} }
DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pci_fixup_video); DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_ANY_ID, PCI_ANY_ID,
PCI_CLASS_DISPLAY_VGA, 8, pci_fixup_video);

View file

@ -218,9 +218,8 @@ static void teardown_mcfg_map(struct pci_root_info *info)
} }
#endif #endif
static acpi_status static acpi_status resource_to_addr(struct acpi_resource *resource,
resource_to_addr(struct acpi_resource *resource, struct acpi_resource_address64 *addr)
struct acpi_resource_address64 *addr)
{ {
acpi_status status; acpi_status status;
struct acpi_resource_memory24 *memory24; struct acpi_resource_memory24 *memory24;
@ -265,8 +264,7 @@ resource_to_addr(struct acpi_resource *resource,
return AE_ERROR; return AE_ERROR;
} }
static acpi_status static acpi_status count_resource(struct acpi_resource *acpi_res, void *data)
count_resource(struct acpi_resource *acpi_res, void *data)
{ {
struct pci_root_info *info = data; struct pci_root_info *info = data;
struct acpi_resource_address64 addr; struct acpi_resource_address64 addr;
@ -278,8 +276,7 @@ count_resource(struct acpi_resource *acpi_res, void *data)
return AE_OK; return AE_OK;
} }
static acpi_status static acpi_status setup_resource(struct acpi_resource *acpi_res, void *data)
setup_resource(struct acpi_resource *acpi_res, void *data)
{ {
struct pci_root_info *info = data; struct pci_root_info *info = data;
struct resource *res; struct resource *res;
@ -435,9 +432,9 @@ static void release_pci_root_info(struct pci_host_bridge *bridge)
__release_pci_root_info(info); __release_pci_root_info(info);
} }
static void static void probe_pci_root_info(struct pci_root_info *info,
probe_pci_root_info(struct pci_root_info *info, struct acpi_device *device, struct acpi_device *device,
int busnum, int domain) int busnum, int domain)
{ {
size_t size; size_t size;
@ -473,11 +470,11 @@ probe_pci_root_info(struct pci_root_info *info, struct acpi_device *device,
struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root) struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
{ {
struct acpi_device *device = root->device; struct acpi_device *device = root->device;
struct pci_root_info *info = NULL; struct pci_root_info *info;
int domain = root->segment; int domain = root->segment;
int busnum = root->secondary.start; int busnum = root->secondary.start;
LIST_HEAD(resources); LIST_HEAD(resources);
struct pci_bus *bus = NULL; struct pci_bus *bus;
struct pci_sysdata *sd; struct pci_sysdata *sd;
int node; int node;
@ -509,15 +506,12 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
sd->domain = domain; sd->domain = domain;
sd->node = node; sd->node = node;
sd->companion = device; sd->companion = device;
/*
* Maybe the desired pci bus has been already scanned. In such case
* it is unnecessary to scan the pci bus with the given domain,busnum.
*/
bus = pci_find_bus(domain, busnum); bus = pci_find_bus(domain, busnum);
if (bus) { if (bus) {
/* /*
* If the desired bus exits, the content of bus->sysdata will * If the desired bus has been scanned already, replace
* be replaced by sd. * its bus->sysdata.
*/ */
memcpy(bus->sysdata, sd, sizeof(*sd)); memcpy(bus->sysdata, sd, sizeof(*sd));
kfree(info); kfree(info);

View file

@ -313,9 +313,10 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MCH_PC1, pcie_r
* IORESOURCE_ROM_SHADOW is used to associate the boot video * IORESOURCE_ROM_SHADOW is used to associate the boot video
* card with this copy. On laptops this copy has to be used since * card with this copy. On laptops this copy has to be used since
* the main ROM may be compressed or combined with another image. * the main ROM may be compressed or combined with another image.
* See pci_map_rom() for use of this flag. IORESOURCE_ROM_SHADOW * See pci_map_rom() for use of this flag. Before marking the device
* is marked here since the boot video device will be the only enabled * with IORESOURCE_ROM_SHADOW check if a vga_default_device is already set
* video device at this point. * by either arch cde or vga-arbitration, if so only apply the fixup to this
* already determined primary video card.
*/ */
static void pci_fixup_video(struct pci_dev *pdev) static void pci_fixup_video(struct pci_dev *pdev)
@ -346,12 +347,13 @@ static void pci_fixup_video(struct pci_dev *pdev)
} }
bus = bus->parent; bus = bus->parent;
} }
pci_read_config_word(pdev, PCI_COMMAND, &config); if (!vga_default_device() || pdev == vga_default_device()) {
if (config & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) { pci_read_config_word(pdev, PCI_COMMAND, &config);
pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW; if (config & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) {
dev_printk(KERN_DEBUG, &pdev->dev, "Boot video device\n"); pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW;
if (!vga_default_device()) dev_printk(KERN_DEBUG, &pdev->dev, "Boot video device\n");
vga_set_default_device(pdev); vga_set_default_device(pdev);
}
} }
} }
DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_ANY_ID, PCI_ANY_ID, DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_ANY_ID, PCI_ANY_ID,

View file

@ -33,21 +33,15 @@ obj-$(CONFIG_PCI_IOV) += iov.o
# #
# Some architectures use the generic PCI setup functions # Some architectures use the generic PCI setup functions
# #
obj-$(CONFIG_X86) += setup-bus.o obj-$(CONFIG_ALPHA) += setup-irq.o
obj-$(CONFIG_ALPHA) += setup-bus.o setup-irq.o obj-$(CONFIG_ARM) += setup-irq.o
obj-$(CONFIG_ARM) += setup-bus.o setup-irq.o obj-$(CONFIG_UNICORE32) += setup-irq.o
obj-$(CONFIG_UNICORE32) += setup-bus.o setup-irq.o obj-$(CONFIG_SUPERH) += setup-irq.o
obj-$(CONFIG_PARISC) += setup-bus.o obj-$(CONFIG_MIPS) += setup-irq.o
obj-$(CONFIG_SUPERH) += setup-bus.o setup-irq.o
obj-$(CONFIG_PPC) += setup-bus.o
obj-$(CONFIG_FRV) += setup-bus.o
obj-$(CONFIG_MIPS) += setup-bus.o setup-irq.o
obj-$(CONFIG_X86_VISWS) += setup-irq.o obj-$(CONFIG_X86_VISWS) += setup-irq.o
obj-$(CONFIG_MN10300) += setup-bus.o obj-$(CONFIG_TILE) += setup-irq.o
obj-$(CONFIG_MICROBLAZE) += setup-bus.o obj-$(CONFIG_SPARC_LEON) += setup-irq.o
obj-$(CONFIG_TILE) += setup-bus.o setup-irq.o obj-$(CONFIG_M68K) += setup-irq.o
obj-$(CONFIG_SPARC_LEON) += setup-bus.o setup-irq.o
obj-$(CONFIG_M68K) += setup-bus.o setup-irq.o
# #
# ACPI Related PCI FW Functions # ACPI Related PCI FW Functions

View file

@ -920,12 +920,12 @@ static int cpqhpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
bus->max_bus_speed = PCI_SPEED_100MHz_PCIX; bus->max_bus_speed = PCI_SPEED_100MHz_PCIX;
break; break;
} }
if (bus_cap & 20) { if (bus_cap & 0x20) {
dbg("bus max supports 66MHz PCI-X\n"); dbg("bus max supports 66MHz PCI-X\n");
bus->max_bus_speed = PCI_SPEED_66MHz_PCIX; bus->max_bus_speed = PCI_SPEED_66MHz_PCIX;
break; break;
} }
if (bus_cap & 10) { if (bus_cap & 0x10) {
dbg("bus max supports 66MHz PCI\n"); dbg("bus max supports 66MHz PCI\n");
bus->max_bus_speed = PCI_SPEED_66MHz; bus->max_bus_speed = PCI_SPEED_66MHz;
break; break;

View file

@ -1181,6 +1181,8 @@ EXPORT_SYMBOL_GPL(pci_load_and_free_saved_state);
static int do_pci_enable_device(struct pci_dev *dev, int bars) static int do_pci_enable_device(struct pci_dev *dev, int bars)
{ {
int err; int err;
u16 cmd;
u8 pin;
err = pci_set_power_state(dev, PCI_D0); err = pci_set_power_state(dev, PCI_D0);
if (err < 0 && err != -EIO) if (err < 0 && err != -EIO)
@ -1190,6 +1192,14 @@ static int do_pci_enable_device(struct pci_dev *dev, int bars)
return err; return err;
pci_fixup_device(pci_fixup_enable, dev); pci_fixup_device(pci_fixup_enable, dev);
pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
if (pin) {
pci_read_config_word(dev, PCI_COMMAND, &cmd);
if (cmd & PCI_COMMAND_INTX_DISABLE)
pci_write_config_word(dev, PCI_COMMAND,
cmd & ~PCI_COMMAND_INTX_DISABLE);
}
return 0; return 0;
} }
@ -1611,29 +1621,27 @@ static void pci_pme_list_scan(struct work_struct *work)
struct pci_pme_device *pme_dev, *n; struct pci_pme_device *pme_dev, *n;
mutex_lock(&pci_pme_list_mutex); mutex_lock(&pci_pme_list_mutex);
if (!list_empty(&pci_pme_list)) { list_for_each_entry_safe(pme_dev, n, &pci_pme_list, list) {
list_for_each_entry_safe(pme_dev, n, &pci_pme_list, list) { if (pme_dev->dev->pme_poll) {
if (pme_dev->dev->pme_poll) { struct pci_dev *bridge;
struct pci_dev *bridge;
bridge = pme_dev->dev->bus->self; bridge = pme_dev->dev->bus->self;
/* /*
* If bridge is in low power state, the * If bridge is in low power state, the
* configuration space of subordinate devices * configuration space of subordinate devices
* may be not accessible * may be not accessible
*/ */
if (bridge && bridge->current_state != PCI_D0) if (bridge && bridge->current_state != PCI_D0)
continue; continue;
pci_pme_wakeup(pme_dev->dev, NULL); pci_pme_wakeup(pme_dev->dev, NULL);
} else { } else {
list_del(&pme_dev->list); list_del(&pme_dev->list);
kfree(pme_dev); kfree(pme_dev);
}
} }
if (!list_empty(&pci_pme_list))
schedule_delayed_work(&pci_pme_work,
msecs_to_jiffies(PME_TIMEOUT));
} }
if (!list_empty(&pci_pme_list))
schedule_delayed_work(&pci_pme_work,
msecs_to_jiffies(PME_TIMEOUT));
mutex_unlock(&pci_pme_list_mutex); mutex_unlock(&pci_pme_list_mutex);
} }