Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

PCI: Add I/O BAR support to generic pci_mmap_resource_range()

This will need to call into an arch-provided pci_iobar_pfn() function.

Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>

authored by

David Woodhouse and committed by
Bjorn Helgaas
2bea36fd 5c2d5ce2

+12 -4
+8 -4
drivers/pci/mmap.c
··· 48 48 enum pci_mmap_state mmap_state, int write_combine) 49 49 { 50 50 unsigned long size; 51 - 52 - if (mmap_state == pci_mmap_io) 53 - return -EINVAL; 51 + int ret; 54 52 55 53 size = ((pci_resource_len(pdev, bar) - 1) >> PAGE_SHIFT) + 1; 56 54 if (vma->vm_pgoff + vma_pages(vma) > size) ··· 59 61 else 60 62 vma->vm_page_prot = pgprot_device(vma->vm_page_prot); 61 63 62 - vma->vm_pgoff += (pci_resource_start(pdev, bar) >> PAGE_SHIFT); 64 + if (mmap_state == pci_mmap_io) { 65 + ret = pci_iobar_pfn(pdev, bar, vma); 66 + if (ret) 67 + return ret; 68 + } else 69 + vma->vm_pgoff += (pci_resource_start(pdev, bar) >> PAGE_SHIFT); 70 + 63 71 vma->vm_ops = &pci_phys_vm_ops; 64 72 65 73 return io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
+4
include/linux/pci.h
··· 1648 1648 #ifndef arch_can_pci_mmap_wc 1649 1649 #define arch_can_pci_mmap_wc() 0 1650 1650 #endif 1651 + 1651 1652 #ifndef arch_can_pci_mmap_io 1652 1653 #define arch_can_pci_mmap_io() 0 1654 + #define pci_iobar_pfn(pdev, bar, vma) (-EINVAL) 1655 + #else 1656 + int pci_iobar_pfn(struct pci_dev *pdev, int bar, struct vm_area_struct *vma); 1653 1657 #endif 1654 1658 1655 1659 #ifndef pci_root_bus_fwnode