|
@@ -2704,6 +2704,37 @@ int pci_request_regions_exclusive(struct pci_dev *pdev, const char *res_name)
|
|
|
}
|
|
|
EXPORT_SYMBOL(pci_request_regions_exclusive);
|
|
|
|
|
|
+/**
|
|
|
+ * pci_remap_iospace - Remap the memory mapped I/O space
|
|
|
+ * @res: Resource describing the I/O space
|
|
|
+ * @phys_addr: physical address of range to be mapped
|
|
|
+ *
|
|
|
+ * Remap the memory mapped I/O space described by the @res
|
|
|
+ * and the CPU physical address @phys_addr into virtual address space.
|
|
|
+ * Only architectures that have memory mapped IO functions defined
|
|
|
+ * (and the PCI_IOBASE value defined) should call this function.
|
|
|
+ */
|
|
|
+int __weak pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr)
|
|
|
+{
|
|
|
+#if defined(PCI_IOBASE) && defined(CONFIG_MMU)
|
|
|
+ unsigned long vaddr = (unsigned long)PCI_IOBASE + res->start;
|
|
|
+
|
|
|
+ if (!(res->flags & IORESOURCE_IO))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ if (res->end > IO_SPACE_LIMIT)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ return ioremap_page_range(vaddr, vaddr + resource_size(res), phys_addr,
|
|
|
+ pgprot_device(PAGE_KERNEL));
|
|
|
+#else
|
|
|
+ /* this architecture does not have memory mapped I/O space,
|
|
|
+ so this function should never be called */
|
|
|
+ WARN_ONCE(1, "This architecture does not support memory mapped I/O\n");
|
|
|
+ return -ENODEV;
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
static void __pci_set_master(struct pci_dev *dev, bool enable)
|
|
|
{
|
|
|
u16 old_cmd, cmd;
|