forked from Minki/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>
This commit is contained in:
parent
5c2d5ce2ab
commit
2bea36fd1a
@ -48,9 +48,7 @@ int pci_mmap_resource_range(struct pci_dev *pdev, int bar,
|
||||
enum pci_mmap_state mmap_state, int write_combine)
|
||||
{
|
||||
unsigned long size;
|
||||
|
||||
if (mmap_state == pci_mmap_io)
|
||||
return -EINVAL;
|
||||
int ret;
|
||||
|
||||
size = ((pci_resource_len(pdev, bar) - 1) >> PAGE_SHIFT) + 1;
|
||||
if (vma->vm_pgoff + vma_pages(vma) > size)
|
||||
@ -61,7 +59,13 @@ int pci_mmap_resource_range(struct pci_dev *pdev, int bar,
|
||||
else
|
||||
vma->vm_page_prot = pgprot_device(vma->vm_page_prot);
|
||||
|
||||
vma->vm_pgoff += (pci_resource_start(pdev, bar) >> PAGE_SHIFT);
|
||||
if (mmap_state == pci_mmap_io) {
|
||||
ret = pci_iobar_pfn(pdev, bar, vma);
|
||||
if (ret)
|
||||
return ret;
|
||||
} else
|
||||
vma->vm_pgoff += (pci_resource_start(pdev, bar) >> PAGE_SHIFT);
|
||||
|
||||
vma->vm_ops = &pci_phys_vm_ops;
|
||||
|
||||
return io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
|
||||
|
@ -1648,8 +1648,12 @@ int pci_mmap_page_range(struct pci_dev *pdev, int bar,
|
||||
#ifndef arch_can_pci_mmap_wc
|
||||
#define arch_can_pci_mmap_wc() 0
|
||||
#endif
|
||||
|
||||
#ifndef arch_can_pci_mmap_io
|
||||
#define arch_can_pci_mmap_io() 0
|
||||
#define pci_iobar_pfn(pdev, bar, vma) (-EINVAL)
|
||||
#else
|
||||
int pci_iobar_pfn(struct pci_dev *pdev, int bar, struct vm_area_struct *vma);
|
||||
#endif
|
||||
|
||||
#ifndef pci_root_bus_fwnode
|
||||
|
Loading…
Reference in New Issue
Block a user