Messages in this thread Patch in this message | | | Date | Tue, 30 Sep 2008 11:19:10 +0200 | From | Rene Herman <> | Subject | Re: [patch 2/2] PNP: don't check disabled PCI BARs for conflicts in quirk_system_pci_resources() |
| |
On 29-09-08 21:13, Linus Torvalds wrote: > > On Mon, 29 Sep 2008, Rene Herman wrote: >> I believe the possible issue is that resources that do _not_ (seem to) start >> at zero might also be disabled. > > But that is irrelevant. > > If we have registered them in the resource tree, then PnP must ignore > them. > > The fact is, this is not about being enabled or disabled. This is about > the PnP tree containing resources that we already parsed from the PCI > stuff, and once we've seen them as PCI resources, there's not really > anything valuable in the PnP information.
Well, if you say so...
Just did the attached which might match that intention. Please do not consider this a submission as I've no idea if this is sensible nor if it actually helps Frans. Just for discussion. Anything here should arrive through Bjorn.
Rene. diff --git a/drivers/pnp/quirks.c b/drivers/pnp/quirks.c index 0bdf9b8..0824eed 100644 --- a/drivers/pnp/quirks.c +++ b/drivers/pnp/quirks.c @@ -230,7 +230,8 @@ static void quirk_ad1815_mpu_resources(struct pnp_dev *dev) static void quirk_system_pci_resources(struct pnp_dev *dev) { struct pci_dev *pdev = NULL; - struct resource *res; + struct resource *pci_res; + struct resource *pnp_res; resource_size_t pnp_start, pnp_end, pci_start, pci_end; int i, j; @@ -247,20 +248,29 @@ static void quirk_system_pci_resources(struct pnp_dev *dev) for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { unsigned int type; - type = pci_resource_flags(pdev, i) & - (IORESOURCE_IO | IORESOURCE_MEM); - if (!type || pci_resource_len(pdev, i) == 0) + pci_res = &pdev->resource[i]; + + /* have we been registered already? */ + if (pci_res->parent) + continue; + + pci_start = pci_res->start; + pci_end = pci_res->end; + + if (pci_end < pci_start || !pci_end) + continue; + + type = pci_res->flags & (IORESOURCE_IO | IORESOURCE_MEM); + if (!type) continue; - pci_start = pci_resource_start(pdev, i); - pci_end = pci_resource_end(pdev, i); for (j = 0; - (res = pnp_get_resource(dev, type, j)); j++) { - if (res->start == 0 && res->end == 0) - continue; + (pnp_res = pnp_get_resource(dev, type, j)); j++) { + pnp_start = pnp_res->start; + pnp_end = pnp_res->end; - pnp_start = res->start; - pnp_end = res->end; + if (pnp_end < pnp_start || !pnp_end) + continue; /* * If the PNP region doesn't overlap the PCI @@ -288,13 +298,13 @@ static void quirk_system_pci_resources(struct pnp_dev *dev) dev_warn(&dev->dev, "%s resource " "(0x%llx-0x%llx) overlaps %s BAR %d " "(0x%llx-0x%llx), disabling\n", - pnp_resource_type_name(res), + pnp_resource_type_name(pnp_res), (unsigned long long) pnp_start, (unsigned long long) pnp_end, pci_name(pdev), i, (unsigned long long) pci_start, (unsigned long long) pci_end); - res->flags |= IORESOURCE_DISABLED; + pnp_res->flags |= IORESOURCE_DISABLED; } } } | |