2005-11-17 01:06:39

by Rajesh Shah

[permalink] [raw]
Subject: PCI: remove bogus resource collision error

When attempting to hotadd a PCI card with a bridge on it, I saw
the kernel reporting resource collision errors even when there were
really no collisions. The problem is that the code doesn't skip
over "invalid" resources with their resource type flag not set.
Others have reported similar problems at boot time and for
non-bridge PCI card hotplug too, where the code flags a
resource collision for disabled ROMs. This patch fixes both
problems. Please consider applying.

Signed-off-by: Rajesh Shah <[email protected]>

arch/i386/pci/i386.c | 8 ++++++--
1 files changed, 6 insertions(+), 2 deletions(-)

Index: linux-2.6.15-rc1/arch/i386/pci/i386.c
===================================================================
--- linux-2.6.15-rc1.orig/arch/i386/pci/i386.c
+++ linux-2.6.15-rc1/arch/i386/pci/i386.c
@@ -212,6 +212,7 @@ int pcibios_enable_resources(struct pci_
u16 cmd, old_cmd;
int idx;
struct resource *r;
+ unsigned long type_mask = IORESOURCE_IO | IORESOURCE_MEM;

pci_read_config_word(dev, PCI_COMMAND, &cmd);
old_cmd = cmd;
@@ -221,6 +222,11 @@ int pcibios_enable_resources(struct pci_
continue;

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) {
printk(KERN_ERR "PCI: Device %s not available because of resource collisions\n", pci_name(dev));
return -EINVAL;
@@ -230,8 +236,6 @@ int pcibios_enable_resources(struct pci_
if (r->flags & IORESOURCE_MEM)
cmd |= PCI_COMMAND_MEMORY;
}
- if (dev->resource[PCI_ROM_RESOURCE].start)
- cmd |= PCI_COMMAND_MEMORY;
if (cmd != old_cmd) {
printk("PCI: Enabling device %s (%04x -> %04x)\n", pci_name(dev), old_cmd, cmd);
pci_write_config_word(dev, PCI_COMMAND, cmd);


2005-11-17 01:21:00

by Greg KH

[permalink] [raw]
Subject: Re: PCI: remove bogus resource collision error

On Wed, Nov 16, 2005 at 05:06:22PM -0800, Rajesh Shah wrote:
> When attempting to hotadd a PCI card with a bridge on it, I saw
> the kernel reporting resource collision errors even when there were
> really no collisions. The problem is that the code doesn't skip
> over "invalid" resources with their resource type flag not set.
> Others have reported similar problems at boot time and for
> non-bridge PCI card hotplug too, where the code flags a
> resource collision for disabled ROMs. This patch fixes both
> problems. Please consider applying.
>
> Signed-off-by: Rajesh Shah <[email protected]>
>
> arch/i386/pci/i386.c | 8 ++++++--
> 1 files changed, 6 insertions(+), 2 deletions(-)
>
> Index: linux-2.6.15-rc1/arch/i386/pci/i386.c
> ===================================================================
> --- linux-2.6.15-rc1.orig/arch/i386/pci/i386.c
> +++ linux-2.6.15-rc1/arch/i386/pci/i386.c
> @@ -212,6 +212,7 @@ int pcibios_enable_resources(struct pci_
> u16 cmd, old_cmd;
> int idx;
> struct resource *r;
> + unsigned long type_mask = IORESOURCE_IO | IORESOURCE_MEM;
>
> pci_read_config_word(dev, PCI_COMMAND, &cmd);
> old_cmd = cmd;
> @@ -221,6 +222,11 @@ int pcibios_enable_resources(struct pci_
> continue;
>
> r = &dev->resource[idx];
> + if (!(r->flags & type_mask))
> + continue;

Is the type_mask variable really needed here? Can't we just test:
if (!(r->flags & (IORESOURCE_IO | IORESOURCE_MEM)))
instead?

Other than that, looks good, thanks.

greg k-h

2005-11-17 17:51:52

by Rajesh Shah

[permalink] [raw]
Subject: Re: PCI: remove bogus resource collision error

On Wed, Nov 16, 2005 at 05:05:35PM -0800, Greg KH wrote:
>
> Is the type_mask variable really needed here? Can't we just test:
> if (!(r->flags & (IORESOURCE_IO | IORESOURCE_MEM)))
> instead?
>
That'll work too. Here's the updated patch.

When attempting to hotadd a PCI card with a bridge on it, I saw
the kernel reporting resource collision errors even when there were
really no collisions. The problem is that the code doesn't skip
over "invalid" resources with their resource type flag not set.
Others have reported similar problems at boot time and for
non-bridge PCI card hotplug too, where the code flags a
resource collision for disabled ROMs. This patch fixes both
problems.

Signed-off-by: Rajesh Shah <[email protected]>


arch/i386/pci/i386.c | 7 +++++--
1 files changed, 5 insertions(+), 2 deletions(-)

Index: linux-2.6.15-rc1/arch/i386/pci/i386.c
===================================================================
--- linux-2.6.15-rc1.orig/arch/i386/pci/i386.c
+++ linux-2.6.15-rc1/arch/i386/pci/i386.c
@@ -221,6 +221,11 @@ int pcibios_enable_resources(struct pci_
continue;

r = &dev->resource[idx];
+ if (!(r->flags & (IORESOURCE_IO | IORESOURCE_MEM)))
+ continue;
+ if ((idx == PCI_ROM_RESOURCE) &&
+ (!(r->flags & IORESOURCE_ROM_ENABLE)))
+ continue;
if (!r->start && r->end) {
printk(KERN_ERR "PCI: Device %s not available because of resource collisions\n", pci_name(dev));
return -EINVAL;
@@ -230,8 +235,6 @@ int pcibios_enable_resources(struct pci_
if (r->flags & IORESOURCE_MEM)
cmd |= PCI_COMMAND_MEMORY;
}
- if (dev->resource[PCI_ROM_RESOURCE].start)
- cmd |= PCI_COMMAND_MEMORY;
if (cmd != old_cmd) {
printk("PCI: Enabling device %s (%04x -> %04x)\n", pci_name(dev), old_cmd, cmd);
pci_write_config_word(dev, PCI_COMMAND, cmd);