]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
PCI: Move "pci reassigndev resource alignment" out of quirks.c
authorYinghai Lu <yinghai@kernel.org>
Thu, 16 Feb 2012 05:40:31 +0000 (21:40 -0800)
committerJesse Barnes <jbarnes@virtuousgeek.org>
Fri, 24 Feb 2012 22:37:26 +0000 (14:37 -0800)
This isn't really a quirk; calling it directly from pci_add_device makes
more sense.

Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
drivers/pci/pci.c
drivers/pci/pci.h
drivers/pci/probe.c
drivers/pci/quirks.c
drivers/pci/setup-res.c

index e9f9dc183cfcac82f45fb3feb8bb273a472f955f..b832f0fece97f8ca8d2a831c9414ccb41b6e16a1 100644 (file)
@@ -3694,6 +3694,68 @@ int pci_is_reassigndev(struct pci_dev *dev)
        return (pci_specified_resource_alignment(dev) != 0);
 }
 
+/*
+ * This function disables memory decoding and releases memory resources
+ * of the device specified by kernel's boot parameter 'pci=resource_alignment='.
+ * It also rounds up size to specified alignment.
+ * Later on, the kernel will assign page-aligned memory resource back
+ * to the device.
+ */
+void pci_reassigndev_resource_alignment(struct pci_dev *dev)
+{
+       int i;
+       struct resource *r;
+       resource_size_t align, size;
+       u16 command;
+
+       if (!pci_is_reassigndev(dev))
+               return;
+
+       if (dev->hdr_type == PCI_HEADER_TYPE_NORMAL &&
+           (dev->class >> 8) == PCI_CLASS_BRIDGE_HOST) {
+               dev_warn(&dev->dev,
+                       "Can't reassign resources to host bridge.\n");
+               return;
+       }
+
+       dev_info(&dev->dev,
+               "Disabling memory decoding and releasing memory resources.\n");
+       pci_read_config_word(dev, PCI_COMMAND, &command);
+       command &= ~PCI_COMMAND_MEMORY;
+       pci_write_config_word(dev, PCI_COMMAND, command);
+
+       align = pci_specified_resource_alignment(dev);
+       for (i = 0; i < PCI_BRIDGE_RESOURCES; i++) {
+               r = &dev->resource[i];
+               if (!(r->flags & IORESOURCE_MEM))
+                       continue;
+               size = resource_size(r);
+               if (size < align) {
+                       size = align;
+                       dev_info(&dev->dev,
+                               "Rounding up size of resource #%d to %#llx.\n",
+                               i, (unsigned long long)size);
+               }
+               r->end = size - 1;
+               r->start = 0;
+       }
+       /* Need to disable bridge's resource window,
+        * to enable the kernel to reassign new resource
+        * window later on.
+        */
+       if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE &&
+           (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) {
+               for (i = PCI_BRIDGE_RESOURCES; i < PCI_NUM_RESOURCES; i++) {
+                       r = &dev->resource[i];
+                       if (!(r->flags & IORESOURCE_MEM))
+                               continue;
+                       r->end = resource_size(r) - 1;
+                       r->start = 0;
+               }
+               pci_disable_bridge_window(dev);
+       }
+}
+
 ssize_t pci_set_resource_alignment_param(const char *buf, size_t count)
 {
        if (count > RESOURCE_ALIGNMENT_PARAM_SIZE - 1)
index 1fc63b39f83fc115884aa6ff78b5034b85c14b45..e4943479b234d1f4ff6fc5121a28dbb322fa2ba6 100644 (file)
@@ -228,11 +228,8 @@ static inline int pci_ari_enabled(struct pci_bus *bus)
        return bus->self && bus->self->ari_enabled;
 }
 
-#ifdef CONFIG_PCI_QUIRKS
-extern int pci_is_reassigndev(struct pci_dev *dev);
-resource_size_t pci_specified_resource_alignment(struct pci_dev *dev);
+void pci_reassigndev_resource_alignment(struct pci_dev *dev);
 extern void pci_disable_bridge_window(struct pci_dev *dev);
-#endif
 
 /* Single Root I/O Virtualization */
 struct pci_sriov {
index 36c22032ea14a25955c0b2a9c43a2a5f121278b6..944e05a66b979fd22614e7ab1ca2c98199b05d49 100644 (file)
@@ -1325,6 +1325,9 @@ void pci_device_add(struct pci_dev *dev, struct pci_bus *bus)
        /* Fix up broken headers */
        pci_fixup_device(pci_fixup_header, dev);
 
+       /* moved out from quirk header fixup code */
+       pci_reassigndev_resource_alignment(dev);
+
        /* Clear the state_saved flag. */
        dev->state_saved = false;
 
index e198589d099049f0a3c8f781739081a0d3a97728..f8f81d4f29ff038cdcb0aba5805c5b82321ccf9b 100644 (file)
 #include <asm/dma.h>   /* isa_dma_bridge_buggy */
 #include "pci.h"
 
-/*
- * This quirk function disables memory decoding and releases memory resources
- * of the device specified by kernel's boot parameter 'pci=resource_alignment='.
- * It also rounds up size to specified alignment.
- * Later on, the kernel will assign page-aligned memory resource back
- * to the device.
- */
-static void __devinit quirk_resource_alignment(struct pci_dev *dev)
-{
-       int i;
-       struct resource *r;
-       resource_size_t align, size;
-       u16 command;
-
-       if (!pci_is_reassigndev(dev))
-               return;
-
-       if (dev->hdr_type == PCI_HEADER_TYPE_NORMAL &&
-           (dev->class >> 8) == PCI_CLASS_BRIDGE_HOST) {
-               dev_warn(&dev->dev,
-                       "Can't reassign resources to host bridge.\n");
-               return;
-       }
-
-       dev_info(&dev->dev,
-               "Disabling memory decoding and releasing memory resources.\n");
-       pci_read_config_word(dev, PCI_COMMAND, &command);
-       command &= ~PCI_COMMAND_MEMORY;
-       pci_write_config_word(dev, PCI_COMMAND, command);
-
-       align = pci_specified_resource_alignment(dev);
-       for (i=0; i < PCI_BRIDGE_RESOURCES; i++) {
-               r = &dev->resource[i];
-               if (!(r->flags & IORESOURCE_MEM))
-                       continue;
-               size = resource_size(r);
-               if (size < align) {
-                       size = align;
-                       dev_info(&dev->dev,
-                               "Rounding up size of resource #%d to %#llx.\n",
-                               i, (unsigned long long)size);
-               }
-               r->end = size - 1;
-               r->start = 0;
-       }
-       /* Need to disable bridge's resource window,
-        * to enable the kernel to reassign new resource
-        * window later on.
-        */
-       if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE &&
-           (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) {
-               for (i = PCI_BRIDGE_RESOURCES; i < PCI_NUM_RESOURCES; i++) {
-                       r = &dev->resource[i];
-                       if (!(r->flags & IORESOURCE_MEM))
-                               continue;
-                       r->end = resource_size(r) - 1;
-                       r->start = 0;
-               }
-               pci_disable_bridge_window(dev);
-       }
-}
-DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, quirk_resource_alignment);
-
 /*
  * Decoding should be disabled for a PCI device during BAR sizing to avoid
  * conflict. But doing so may cause problems on host bridge and perhaps other
index f968185aa192fe0343ee98bfb879f45d8e7f859d..eea85dafc7632ce149d432355301ed3157eee195 100644 (file)
@@ -114,7 +114,6 @@ int pci_claim_resource(struct pci_dev *dev, int resource)
 }
 EXPORT_SYMBOL(pci_claim_resource);
 
-#ifdef CONFIG_PCI_QUIRKS
 void pci_disable_bridge_window(struct pci_dev *dev)
 {
        dev_info(&dev->dev, "disabling bridge mem windows\n");
@@ -127,9 +126,6 @@ void pci_disable_bridge_window(struct pci_dev *dev)
        pci_write_config_dword(dev, PCI_PREF_MEMORY_BASE, 0x0000fff0);
        pci_write_config_dword(dev, PCI_PREF_BASE_UPPER32, 0xffffffff);
 }
-#endif /* CONFIG_PCI_QUIRKS */
-
-
 
 static int __pci_assign_resource(struct pci_bus *bus, struct pci_dev *dev,
                int resno, resource_size_t size, resource_size_t align)