UPSTREAM: PCI: Add pci_unmap_iospace() to unmap I/O resources
authorSinan Kaya <okaya@codeaurora.org>
Fri, 10 Jun 2016 19:55:11 +0000 (21:55 +0200)
committerHuang, Tao <huangtao@rock-chips.com>
Thu, 16 Mar 2017 03:25:48 +0000 (11:25 +0800)
Add pci_unmap_iospace() to undo what pci_remap_iospace() did.

This is needed to support hotplug removal of host bridges that use
pci_remap_iospace().

Change-Id: Iee5d778cb8ddfedab59c55c227a8c60825786854
[bhelgaas: changelog]
Signed-off-by: Sinan Kaya <okaya@codeaurora.org>
Signed-off-by: Tomasz Nowicki <tn@semihalf.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Acked-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
(cherry picked from 4d3f13845957a87729a324cce8509fad8826ef5)
Conflicts:
drivers/pci/pci.c

drivers/pci/pci.c
include/linux/pci.h

index e311a9bf2c90d602e3ced4725b22562c733660cf..b767915dcb4ee2549d9d76165a5dafe70f4bc428 100644 (file)
@@ -25,7 +25,7 @@
 #include <linux/device.h>
 #include <linux/pm_runtime.h>
 #include <linux/pci_hotplug.h>
 #include <linux/device.h>
 #include <linux/pm_runtime.h>
 #include <linux/pci_hotplug.h>
-#include <asm-generic/pci-bridge.h>
+#include <linux/vmalloc.h>
 #include <asm/setup.h>
 #include <linux/aer.h>
 #include "pci.h"
 #include <asm/setup.h>
 #include <linux/aer.h>
 #include "pci.h"
@@ -3057,6 +3057,23 @@ int __weak pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr)
 #endif
 }
 
 #endif
 }
 
+/**
+ *     pci_unmap_iospace - Unmap the memory mapped I/O space
+ *     @res: resource to be unmapped
+ *
+ *     Unmap the CPU virtual address @res from virtual address space.
+ *     Only architectures that have memory mapped IO functions defined
+ *     (and the PCI_IOBASE value defined) should call this function.
+ */
+void pci_unmap_iospace(struct resource *res)
+{
+#if defined(PCI_IOBASE) && defined(CONFIG_MMU)
+       unsigned long vaddr = (unsigned long)PCI_IOBASE + res->start;
+
+       unmap_kernel_range(vaddr, resource_size(res));
+#endif
+}
+
 static void __pci_set_master(struct pci_dev *dev, bool enable)
 {
        u16 old_cmd, cmd;
 static void __pci_set_master(struct pci_dev *dev, bool enable)
 {
        u16 old_cmd, cmd;
index c51d2798643c40ce4258a3892b821a8576d60f0c..f6c1d97193382a897d1981e1ecf5dd3a56fa334e 100644 (file)
@@ -1156,6 +1156,7 @@ int __must_check pci_bus_alloc_resource(struct pci_bus *bus,
 
 
 int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr);
 
 
 int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr);
+void pci_unmap_iospace(struct resource *res);
 
 static inline pci_bus_addr_t pci_bus_address(struct pci_dev *pdev, int bar)
 {
 
 static inline pci_bus_addr_t pci_bus_address(struct pci_dev *pdev, int bar)
 {