mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
[PATCH] acpi bridge hotadd: Fix pci_enable_device() for p2p bridges
When checking if a PCI to PCI bridge should be enabled to decode memory and/or IO resources, we need to look at all device resources not just the first 6. This is needed to allow PCI bridges to pass down memory and IO accesses to child devices even when the bridge itself does not consume resources in its PCI BARs. Signed-off-by: Rajesh Shah <rajesh.shah@intel.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
c431ada45d
commit
fab3fb0ac8
1 changed files with 7 additions and 3 deletions
|
@ -418,18 +418,24 @@ pcibios_enable_resources (struct pci_dev *dev, int mask)
|
||||||
u16 cmd, old_cmd;
|
u16 cmd, old_cmd;
|
||||||
int idx;
|
int idx;
|
||||||
struct resource *r;
|
struct resource *r;
|
||||||
|
unsigned long type_mask = IORESOURCE_IO | IORESOURCE_MEM;
|
||||||
|
|
||||||
if (!dev)
|
if (!dev)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
pci_read_config_word(dev, PCI_COMMAND, &cmd);
|
pci_read_config_word(dev, PCI_COMMAND, &cmd);
|
||||||
old_cmd = cmd;
|
old_cmd = cmd;
|
||||||
for (idx=0; idx<6; idx++) {
|
for (idx=0; idx<PCI_NUM_RESOURCES; idx++) {
|
||||||
/* Only set up the desired resources. */
|
/* Only set up the desired resources. */
|
||||||
if (!(mask & (1 << idx)))
|
if (!(mask & (1 << idx)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
r = &dev->resource[idx];
|
r = &dev->resource[idx];
|
||||||
|
if (!(r->flags & type_mask))
|
||||||
|
continue;
|
||||||
|
if ((idx == PCI_ROM_RESOURCE) &&
|
||||||
|
(!(r->flags & IORESOURCE_ROM_ENABLE)))
|
||||||
|
continue;
|
||||||
if (!r->start && r->end) {
|
if (!r->start && r->end) {
|
||||||
printk(KERN_ERR
|
printk(KERN_ERR
|
||||||
"PCI: Device %s not available because of resource collisions\n",
|
"PCI: Device %s not available because of resource collisions\n",
|
||||||
|
@ -441,8 +447,6 @@ pcibios_enable_resources (struct pci_dev *dev, int mask)
|
||||||
if (r->flags & IORESOURCE_MEM)
|
if (r->flags & IORESOURCE_MEM)
|
||||||
cmd |= PCI_COMMAND_MEMORY;
|
cmd |= PCI_COMMAND_MEMORY;
|
||||||
}
|
}
|
||||||
if (dev->resource[PCI_ROM_RESOURCE].start)
|
|
||||||
cmd |= PCI_COMMAND_MEMORY;
|
|
||||||
if (cmd != old_cmd) {
|
if (cmd != old_cmd) {
|
||||||
printk("PCI: Enabling device %s (%04x -> %04x)\n", pci_name(dev), old_cmd, cmd);
|
printk("PCI: Enabling device %s (%04x -> %04x)\n", pci_name(dev), old_cmd, cmd);
|
||||||
pci_write_config_word(dev, PCI_COMMAND, cmd);
|
pci_write_config_word(dev, PCI_COMMAND, cmd);
|
||||||
|
|
Loading…
Reference in a new issue