PCI: Make pci_size() return real BAR size
authorDu Changbin <changbin.du@gmail.com>
Sat, 13 Oct 2018 00:49:19 +0000 (08:49 +0800)
committerBjorn Helgaas <bhelgaas@google.com>
Wed, 30 Jan 2019 16:44:18 +0000 (10:44 -0600)
Currently, the pci_size() function actually returns 'size-1'.  Make it
return real size to avoid confusion.

Signed-off-by: Du Changbin <changbin.du@gmail.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/probe.c

index 2ef8b95..8e2e415 100644 (file)
@@ -121,13 +121,13 @@ static u64 pci_size(u64 base, u64 maxbase, u64 mask)
         * Get the lowest of them to find the decode size, and from that
         * the extent.
         */
-       size = (size & ~(size-1)) - 1;
+       size = size & ~(size-1);
 
        /*
         * base == maxbase can be valid only if the BAR has already been
         * programmed with all 1s.
         */
-       if (base == maxbase && ((base | size) & mask) != mask)
+       if (base == maxbase && ((base | (size - 1)) & mask) != mask)
                return 0;
 
        return size;
@@ -278,7 +278,7 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
                        /* Above 32-bit boundary; try to reallocate */
                        res->flags |= IORESOURCE_UNSET;
                        res->start = 0;
-                       res->end = sz64;
+                       res->end = sz64 - 1;
                        pci_info(dev, "reg 0x%x: can't handle BAR above 4GB (bus address %#010llx)\n",
                                 pos, (unsigned long long)l64);
                        goto out;
@@ -286,7 +286,7 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
        }
 
        region.start = l64;
-       region.end = l64 + sz64;
+       region.end = l64 + sz64 - 1;
 
        pcibios_bus_to_resource(dev->bus, res, &region);
        pcibios_resource_to_bus(dev->bus, &inverted_region, res);