arm: ioremap: Implement standard PCI function pci_remap_iospace()
authorPali Rohár <pali@kernel.org>
Wed, 24 Nov 2021 15:41:12 +0000 (16:41 +0100)
committerLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Tue, 30 Nov 2021 11:10:11 +0000 (11:10 +0000)
pci_remap_iospace() is standard PCI core function. Architecture code can
reimplement default core implementation if needs custom arch specific
functionality.

ARM needs custom implementation due to pci_ioremap_set_mem_type() hook
which allows ARM platforms to change mem type for iospace.

Implement this pci_remap_iospace() function for ARM architecture to
correctly handle pci_ioremap_set_mem_type() hook, which allows usage of
this standard PCI core function also for platforms which needs different
mem type (e.g. Marvell Armada 375, 38x and 39x).

Link: https://lore.kernel.org/r/20211124154116.916-2-pali@kernel.org
Signed-off-by: Pali Rohár <pali@kernel.org>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
arch/arm/include/asm/io.h
arch/arm/mm/ioremap.c

index c576fa7..12eca75 100644 (file)
@@ -182,6 +182,11 @@ static inline void pci_ioremap_set_mem_type(int mem_type) {}
 
 extern int pci_ioremap_io(unsigned int offset, phys_addr_t phys_addr);
 
+struct resource;
+
+#define pci_remap_iospace pci_remap_iospace
+int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr);
+
 /*
  * PCI configuration space mapping function.
  *
index 6e830b9..fa3bde4 100644 (file)
@@ -459,6 +459,21 @@ void pci_ioremap_set_mem_type(int mem_type)
        pci_ioremap_mem_type = mem_type;
 }
 
+int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr)
+{
+       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(get_mem_type(pci_ioremap_mem_type)->prot_pte));
+}
+EXPORT_SYMBOL(pci_remap_iospace);
+
 int pci_ioremap_io(unsigned int offset, phys_addr_t phys_addr)
 {
        BUG_ON(offset + SZ_64K - 1 > IO_SPACE_LIMIT);