diff options
-rw-r--r-- | drivers/pci/pci.c | 31 | ||||
-rw-r--r-- | include/asm-generic/pgtable.h | 4 | ||||
-rw-r--r-- | include/linux/pci.h | 3 |
3 files changed, 38 insertions, 0 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index d36f35ff6c5d..6e994fc077f4 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -2704,6 +2704,37 @@ int pci_request_regions_exclusive(struct pci_dev *pdev, const char *res_name) | |||
2704 | } | 2704 | } |
2705 | EXPORT_SYMBOL(pci_request_regions_exclusive); | 2705 | EXPORT_SYMBOL(pci_request_regions_exclusive); |
2706 | 2706 | ||
2707 | /** | ||
2708 | * pci_remap_iospace - Remap the memory mapped I/O space | ||
2709 | * @res: Resource describing the I/O space | ||
2710 | * @phys_addr: physical address of range to be mapped | ||
2711 | * | ||
2712 | * Remap the memory mapped I/O space described by the @res | ||
2713 | * and the CPU physical address @phys_addr into virtual address space. | ||
2714 | * Only architectures that have memory mapped IO functions defined | ||
2715 | * (and the PCI_IOBASE value defined) should call this function. | ||
2716 | */ | ||
2717 | int __weak pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr) | ||
2718 | { | ||
2719 | #if defined(PCI_IOBASE) && defined(CONFIG_MMU) | ||
2720 | unsigned long vaddr = (unsigned long)PCI_IOBASE + res->start; | ||
2721 | |||
2722 | if (!(res->flags & IORESOURCE_IO)) | ||
2723 | return -EINVAL; | ||
2724 | |||
2725 | if (res->end > IO_SPACE_LIMIT) | ||
2726 | return -EINVAL; | ||
2727 | |||
2728 | return ioremap_page_range(vaddr, vaddr + resource_size(res), phys_addr, | ||
2729 | pgprot_device(PAGE_KERNEL)); | ||
2730 | #else | ||
2731 | /* this architecture does not have memory mapped I/O space, | ||
2732 | so this function should never be called */ | ||
2733 | WARN_ONCE(1, "This architecture does not support memory mapped I/O\n"); | ||
2734 | return -ENODEV; | ||
2735 | #endif | ||
2736 | } | ||
2737 | |||
2707 | static void __pci_set_master(struct pci_dev *dev, bool enable) | 2738 | static void __pci_set_master(struct pci_dev *dev, bool enable) |
2708 | { | 2739 | { |
2709 | u16 old_cmd, cmd; | 2740 | u16 old_cmd, cmd; |
diff --git a/include/asm-generic/pgtable.h b/include/asm-generic/pgtable.h index 53b2acc38213..977e545a64c3 100644 --- a/include/asm-generic/pgtable.h +++ b/include/asm-generic/pgtable.h | |||
@@ -249,6 +249,10 @@ static inline int pmd_same(pmd_t pmd_a, pmd_t pmd_b) | |||
249 | #define pgprot_writecombine pgprot_noncached | 249 | #define pgprot_writecombine pgprot_noncached |
250 | #endif | 250 | #endif |
251 | 251 | ||
252 | #ifndef pgprot_device | ||
253 | #define pgprot_device pgprot_noncached | ||
254 | #endif | ||
255 | |||
252 | /* | 256 | /* |
253 | * When walking page tables, get the address of the next boundary, | 257 | * When walking page tables, get the address of the next boundary, |
254 | * or the end address of the range if that comes earlier. Although no | 258 | * or the end address of the range if that comes earlier. Although no |
diff --git a/include/linux/pci.h b/include/linux/pci.h index 150da2d644e7..b4995fdfffb1 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
@@ -1100,6 +1100,9 @@ int __must_check pci_bus_alloc_resource(struct pci_bus *bus, | |||
1100 | resource_size_t), | 1100 | resource_size_t), |
1101 | void *alignf_data); | 1101 | void *alignf_data); |
1102 | 1102 | ||
1103 | |||
1104 | int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr); | ||
1105 | |||
1103 | static inline dma_addr_t pci_bus_address(struct pci_dev *pdev, int bar) | 1106 | static inline dma_addr_t pci_bus_address(struct pci_dev *pdev, int bar) |
1104 | { | 1107 | { |
1105 | struct pci_bus_region region; | 1108 | struct pci_bus_region region; |