PCI: Mark resources as IORESOURCE_UNSET if we can't assign them
authorBjorn Helgaas <bhelgaas@google.com>
Wed, 26 Feb 2014 18:25:58 +0000 (11:25 -0700)
committerBjorn Helgaas <bhelgaas@google.com>
Thu, 27 Feb 2014 17:43:32 +0000 (10:43 -0700)
When assigning addresses to resources, mark them with IORESOURCE_UNSET
before we start and clear IORESOURCE_UNSET if assignment is successful.
That means that if we print the resource during assignment, we will show
the size, not a meaningless address.

Also, clear IORESOURCE_UNSET if we do assign an address, so we print the
address when it is valid.

Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/pci.c
drivers/pci/quirks.c
drivers/pci/rom.c
drivers/pci/setup-res.c

index 99293fa..dc9ce62 100644 (file)
@@ -4244,6 +4244,7 @@ void pci_reassigndev_resource_alignment(struct pci_dev *dev)
                                "Rounding up size of resource #%d to %#llx.\n",
                                i, (unsigned long long)size);
                }
+               r->flags |= IORESOURCE_UNSET;
                r->end = size - 1;
                r->start = 0;
        }
@@ -4257,6 +4258,7 @@ void pci_reassigndev_resource_alignment(struct pci_dev *dev)
                        r = &dev->resource[i];
                        if (!(r->flags & IORESOURCE_MEM))
                                continue;
+                       r->flags |= IORESOURCE_UNSET;
                        r->end = resource_size(r) - 1;
                        r->start = 0;
                }
index 5cb726c..6e596ab 100644 (file)
@@ -296,6 +296,7 @@ static void quirk_s3_64M(struct pci_dev *dev)
        struct resource *r = &dev->resource[0];
 
        if ((r->start & 0x3ffffff) || r->end != r->start + 0x3ffffff) {
+               r->flags |= IORESOURCE_UNSET;
                r->start = 0;
                r->end = 0x3ffffff;
        }
@@ -937,6 +938,8 @@ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_AMD,   PCI_DEVICE_ID_AMD_FE_GATE_700C
 static void quirk_dunord(struct pci_dev *dev)
 {
        struct resource *r = &dev->resource [1];
+
+       r->flags |= IORESOURCE_UNSET;
        r->start = 0;
        r->end = 0xffffff;
 }
@@ -1740,6 +1743,7 @@ static void quirk_tc86c001_ide(struct pci_dev *dev)
        struct resource *r = &dev->resource[0];
 
        if (r->start & 0x8) {
+               r->flags |= IORESOURCE_UNSET;
                r->start = 0;
                r->end = 0xf;
        }
@@ -1769,6 +1773,7 @@ static void quirk_plx_pci9050(struct pci_dev *dev)
                        dev_info(&dev->dev,
                                 "Re-allocating PLX PCI 9050 BAR %u to length 256 to avoid bit 7 bug\n",
                                 bar);
+                       r->flags |= IORESOURCE_UNSET;
                        r->start = 0;
                        r->end = 0xff;
                }
index 5d59572..c183945 100644 (file)
@@ -197,8 +197,10 @@ void pci_unmap_rom(struct pci_dev *pdev, void __iomem *rom)
 void pci_cleanup_rom(struct pci_dev *pdev)
 {
        struct resource *res = &pdev->resource[PCI_ROM_RESOURCE];
+
        if (res->flags & IORESOURCE_ROM_COPY) {
                kfree((void*)(unsigned long)res->start);
+               res->flags |= IORESOURCE_UNSET;
                res->flags &= ~IORESOURCE_ROM_COPY;
                res->start = 0;
                res->end = 0;
index 5c060b1..0474b02 100644 (file)
@@ -263,6 +263,7 @@ int pci_assign_resource(struct pci_dev *dev, int resno)
        resource_size_t align, size;
        int ret;
 
+       res->flags |= IORESOURCE_UNSET;
        align = pci_resource_alignment(dev, res);
        if (!align) {
                dev_info(&dev->dev, "BAR %d: can't assign %pR "
@@ -282,6 +283,7 @@ int pci_assign_resource(struct pci_dev *dev, int resno)
                ret = pci_revert_fw_address(res, dev, resno, size);
 
        if (!ret) {
+               res->flags &= ~IORESOURCE_UNSET;
                res->flags &= ~IORESOURCE_STARTALIGN;
                dev_info(&dev->dev, "BAR %d: assigned %pR\n", resno, res);
                if (resno < PCI_BRIDGE_RESOURCES)
@@ -297,6 +299,7 @@ int pci_reassign_resource(struct pci_dev *dev, int resno, resource_size_t addsiz
        resource_size_t new_size;
        int ret;
 
+       res->flags |= IORESOURCE_UNSET;
        if (!res->parent) {
                dev_info(&dev->dev, "BAR %d: can't reassign an unassigned resource %pR "
                         "\n", resno, res);
@@ -307,6 +310,7 @@ int pci_reassign_resource(struct pci_dev *dev, int resno, resource_size_t addsiz
        new_size = resource_size(res) + addsize;
        ret = _pci_assign_resource(dev, resno, new_size, min_align);
        if (!ret) {
+               res->flags &= ~IORESOURCE_UNSET;
                res->flags &= ~IORESOURCE_STARTALIGN;
                dev_info(&dev->dev, "BAR %d: reassigned %pR\n", resno, res);
                if (resno < PCI_BRIDGE_RESOURCES)