]> Git Repo - linux.git/commitdiff
Merge branch 'pci/nikhil-big-bar-fixes' into next
authorBjorn Helgaas <[email protected]>
Wed, 18 Jul 2012 20:06:20 +0000 (14:06 -0600)
committerBjorn Helgaas <[email protected]>
Wed, 18 Jul 2012 20:06:20 +0000 (14:06 -0600)
* pci/nikhil-big-bar-fixes:
  PCI: reorder __pci_assign_resource() (no change)
  PCI: fix truncation of resource size to 32 bits

1  2 
drivers/pci/setup-res.c

diff --combined drivers/pci/setup-res.c
index 1a0e60e265ea8bdd12ecbbe3b95153304cb2533c,3ce9fa317d1d9a192099f05ca6df4feba8732b20..81b88bda79307b9003f37d5eb36699342f75383d
@@@ -30,8 -30,6 +30,8 @@@
  void pci_update_resource(struct pci_dev *dev, int resno)
  {
        struct pci_bus_region region;
 +      bool disable;
 +      u16 cmd;
        u32 new, check, mask;
        int reg;
        enum pci_bar_type type;
                new |= PCI_ROM_ADDRESS_ENABLE;
        }
  
 +      /*
 +       * We can't update a 64-bit BAR atomically, so when possible,
 +       * disable decoding so that a half-updated BAR won't conflict
 +       * with another device.
 +       */
 +      disable = (res->flags & IORESOURCE_MEM_64) && !dev->mmio_always_on;
 +      if (disable) {
 +              pci_read_config_word(dev, PCI_COMMAND, &cmd);
 +              pci_write_config_word(dev, PCI_COMMAND,
 +                                    cmd & ~PCI_COMMAND_MEMORY);
 +      }
 +
        pci_write_config_dword(dev, reg, new);
        pci_read_config_dword(dev, reg, &check);
  
                               "(high %#08x != %#08x)\n", resno, new, check);
                }
        }
 +
 +      if (disable)
 +              pci_write_config_word(dev, PCI_COMMAND, cmd);
 +
        res->flags &= ~IORESOURCE_UNSET;
        dev_dbg(&dev->dev, "BAR %d: set to %pR (PCI address [%#llx-%#llx])\n",
                resno, res, (unsigned long long)region.start,
@@@ -145,33 -127,6 +145,6 @@@ void pci_disable_bridge_window(struct p
        pci_write_config_dword(dev, PCI_PREF_BASE_UPPER32, 0xffffffff);
  }
  
- static int __pci_assign_resource(struct pci_bus *bus, struct pci_dev *dev,
-               int resno, resource_size_t size, resource_size_t align)
- {
-       struct resource *res = dev->resource + resno;
-       resource_size_t min;
-       int ret;
-       min = (res->flags & IORESOURCE_IO) ? PCIBIOS_MIN_IO : PCIBIOS_MIN_MEM;
-       /* First, try exact prefetching match.. */
-       ret = pci_bus_alloc_resource(bus, res, size, align, min,
-                                    IORESOURCE_PREFETCH,
-                                    pcibios_align_resource, dev);
-       if (ret < 0 && (res->flags & IORESOURCE_PREFETCH)) {
-               /*
-                * That failed.
-                *
-                * But a prefetching area can handle a non-prefetching
-                * window (it will just not perform as well).
-                */
-               ret = pci_bus_alloc_resource(bus, res, size, align, min, 0,
-                                            pcibios_align_resource, dev);
-       }
-       return ret;
- }
  /*
   * Generic function that returns a value indicating that the device's
   * original BIOS BAR address was not saved and so is not available for
@@@ -224,7 -179,35 +197,35 @@@ static int pci_revert_fw_address(struc
        return ret;
  }
  
- static int _pci_assign_resource(struct pci_dev *dev, int resno, int size, resource_size_t min_align)
+ static int __pci_assign_resource(struct pci_bus *bus, struct pci_dev *dev,
+               int resno, resource_size_t size, resource_size_t align)
+ {
+       struct resource *res = dev->resource + resno;
+       resource_size_t min;
+       int ret;
+       min = (res->flags & IORESOURCE_IO) ? PCIBIOS_MIN_IO : PCIBIOS_MIN_MEM;
+       /* First, try exact prefetching match.. */
+       ret = pci_bus_alloc_resource(bus, res, size, align, min,
+                                    IORESOURCE_PREFETCH,
+                                    pcibios_align_resource, dev);
+       if (ret < 0 && (res->flags & IORESOURCE_PREFETCH)) {
+               /*
+                * That failed.
+                *
+                * But a prefetching area can handle a non-prefetching
+                * window (it will just not perform as well).
+                */
+               ret = pci_bus_alloc_resource(bus, res, size, align, min, 0,
+                                            pcibios_align_resource, dev);
+       }
+       return ret;
+ }
+ static int _pci_assign_resource(struct pci_dev *dev, int resno,
+                               resource_size_t size, resource_size_t min_align)
  {
        struct resource *res = dev->resource + resno;
        struct pci_bus *bus;
        return ret;
  }
  
- int pci_reassign_resource(struct pci_dev *dev, int resno, resource_size_t addsize,
-                       resource_size_t min_align)
- {
-       struct resource *res = dev->resource + resno;
-       resource_size_t new_size;
-       int ret;
-       if (!res->parent) {
-               dev_info(&dev->dev, "BAR %d: can't reassign an unassigned resource %pR "
-                        "\n", resno, res);
-               return -EINVAL;
-       }
-       /* already aligned with min_align */
-       new_size = resource_size(res) + addsize;
-       ret = _pci_assign_resource(dev, resno, new_size, min_align);
-       if (!ret) {
-               res->flags &= ~IORESOURCE_STARTALIGN;
-               dev_info(&dev->dev, "BAR %d: reassigned %pR\n", resno, res);
-               if (resno < PCI_BRIDGE_RESOURCES)
-                       pci_update_resource(dev, resno);
-       }
-       return ret;
- }
  int pci_assign_resource(struct pci_dev *dev, int resno)
  {
        struct resource *res = dev->resource + resno;
        return ret;
  }
  
+ int pci_reassign_resource(struct pci_dev *dev, int resno, resource_size_t addsize,
+                       resource_size_t min_align)
+ {
+       struct resource *res = dev->resource + resno;
+       resource_size_t new_size;
+       int ret;
+       if (!res->parent) {
+               dev_info(&dev->dev, "BAR %d: can't reassign an unassigned resource %pR "
+                        "\n", resno, res);
+               return -EINVAL;
+       }
+       /* already aligned with min_align */
+       new_size = resource_size(res) + addsize;
+       ret = _pci_assign_resource(dev, resno, new_size, min_align);
+       if (!ret) {
+               res->flags &= ~IORESOURCE_STARTALIGN;
+               dev_info(&dev->dev, "BAR %d: reassigned %pR\n", resno, res);
+               if (resno < PCI_BRIDGE_RESOURCES)
+                       pci_update_resource(dev, resno);
+       }
+       return ret;
+ }
  int pci_enable_resources(struct pci_dev *dev, int mask)
  {
        u16 cmd, old_cmd;
This page took 0.066526 seconds and 4 git commands to generate.