PCI: Refactor pci_ioremap_bar() and pci_ioremap_wc_bar()
authorKrzysztof Wilczyński <kw@linux.com>
Tue, 13 Jul 2021 10:24:36 +0000 (10:24 +0000)
committerBjorn Helgaas <bhelgaas@google.com>
Fri, 16 Jul 2021 21:04:13 +0000 (16:04 -0500)
pci_ioremap_bar() and pci_ioremap_wc_bar() shared similar implementations
but differed in unimportant ways.  Align them by adding a shared helper,
__pci_ioremap_resource().

Upgrade warning message to error level, since it indicates a driver defect.
Remove WARN_ON() from WC path in favor of the error message.

[bhelgaas: commit log, use ioremap() since pci_iomap_range() doesn't add
anything]
Link: https://lore.kernel.org/r/20210713102436.304693-1-kw@linux.com
Signed-off-by: Krzysztof Wilczyński <kw@linux.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/pci.c

index aacf575..2f51907 100644 (file)
@@ -206,32 +206,36 @@ int pci_status_get_and_clear_errors(struct pci_dev *pdev)
 EXPORT_SYMBOL_GPL(pci_status_get_and_clear_errors);
 
 #ifdef CONFIG_HAS_IOMEM
-void __iomem *pci_ioremap_bar(struct pci_dev *pdev, int bar)
+static void __iomem *__pci_ioremap_resource(struct pci_dev *pdev, int bar,
+                                           bool write_combine)
 {
        struct resource *res = &pdev->resource[bar];
+       resource_size_t start = res->start;
+       resource_size_t size = resource_size(res);
 
        /*
         * Make sure the BAR is actually a memory resource, not an IO resource
         */
        if (res->flags & IORESOURCE_UNSET || !(res->flags & IORESOURCE_MEM)) {
-               pci_warn(pdev, "can't ioremap BAR %d: %pR\n", bar, res);
+               pci_err(pdev, "can't ioremap BAR %d: %pR\n", bar, res);
                return NULL;
        }
-       return ioremap(res->start, resource_size(res));
+
+       if (write_combine)
+               return ioremap_wc(start, size);
+
+       return ioremap(start, size);
+}
+
+void __iomem *pci_ioremap_bar(struct pci_dev *pdev, int bar)
+{
+       return __pci_ioremap_resource(pdev, bar, false);
 }
 EXPORT_SYMBOL_GPL(pci_ioremap_bar);
 
 void __iomem *pci_ioremap_wc_bar(struct pci_dev *pdev, int bar)
 {
-       /*
-        * Make sure the BAR is actually a memory resource, not an IO resource
-        */
-       if (!(pci_resource_flags(pdev, bar) & IORESOURCE_MEM)) {
-               WARN_ON(1);
-               return NULL;
-       }
-       return ioremap_wc(pci_resource_start(pdev, bar),
-                         pci_resource_len(pdev, bar));
+       return __pci_ioremap_resource(pdev, bar, true);
 }
 EXPORT_SYMBOL_GPL(pci_ioremap_wc_bar);
 #endif