struct pci_dev *pdev = to_pci_dev(kobj_to_dev(kobj));
int bar = (unsigned long)attr->private;
enum pci_mmap_state mmap_type;
- struct resource *res = pci_resource_n(pdev, bar);
int ret;
ret = security_locked_down(LOCKDOWN_PCI_ACCESS);
if (ret)
return ret;
- if (res->flags & IORESOURCE_MEM && iomem_is_exclusive(res->start))
+ if (!pci_resource_is_mem(pdev, bar) &&
+ !(pci_resource_is_io(pdev, bar) && arch_can_pci_mmap_io()))
+ return -EIO;
+
+ if (pci_resource_is_mem(pdev, bar) &&
+ iomem_is_exclusive(pci_resource_start(pdev, bar)))
return -EINVAL;
if (!pci_mmap_fits(pdev, bar, vma, PCI_MMAP_SYSFS))
return -EINVAL;
- mmap_type = res->flags & IORESOURCE_MEM ? pci_mmap_mem : pci_mmap_io;
+ mmap_type = pci_resource_is_mem(pdev, bar) ? pci_mmap_mem : pci_mmap_io;
return pci_mmap_resource_range(pdev, bar, vma, mmap_type, write_combine);
}
int bar = (unsigned long)attr->private;
unsigned long port = off;
+ if (!pci_resource_is_io(pdev, bar))
+ return -EIO;
+
port += pci_resource_start(pdev, bar);
if (port > pci_resource_end(pdev, bar))