|
@@ -985,15 +985,19 @@ void pci_remove_legacy_files(struct pci_bus *b)
|
|
|
int pci_mmap_fits(struct pci_dev *pdev, int resno, struct vm_area_struct *vma,
|
|
|
enum pci_mmap_api mmap_api)
|
|
|
{
|
|
|
- unsigned long nr, start, size, pci_start;
|
|
|
+ unsigned long nr, start, size;
|
|
|
+ resource_size_t pci_start = 0, pci_end;
|
|
|
|
|
|
if (pci_resource_len(pdev, resno) == 0)
|
|
|
return 0;
|
|
|
nr = vma_pages(vma);
|
|
|
start = vma->vm_pgoff;
|
|
|
size = ((pci_resource_len(pdev, resno) - 1) >> PAGE_SHIFT) + 1;
|
|
|
- pci_start = (mmap_api == PCI_MMAP_PROCFS) ?
|
|
|
- pci_resource_start(pdev, resno) >> PAGE_SHIFT : 0;
|
|
|
+ if (mmap_api == PCI_MMAP_PROCFS) {
|
|
|
+ pci_resource_to_user(pdev, resno, &pdev->resource[resno],
|
|
|
+ &pci_start, &pci_end);
|
|
|
+ pci_start >>= PAGE_SHIFT;
|
|
|
+ }
|
|
|
if (start >= pci_start && start < pci_start + size &&
|
|
|
start + nr <= pci_start + size)
|
|
|
return 1;
|