mirror of https://gitee.com/openkylin/linux.git
devres: implement pcim_iomap_regions()
Implement pcim_iomap_regions(). This function takes mask of BARs to request and iomap. No BAR should have length of zero. BARs are iomapped using pcim_iomap_table(). Signed-off-by: Tejun Heo <htejun@gmail.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
parent
b878ca5d37
commit
d24bbbf251
|
@ -45,6 +45,8 @@ void __iomem * pcim_iomap(struct pci_dev *pdev, int bar, unsigned long maxlen);
|
|||
void pcim_iounmap(struct pci_dev *pdev, void __iomem *addr);
|
||||
void __iomem * const * pcim_iomap_table(struct pci_dev *pdev);
|
||||
|
||||
int pcim_iomap_regions(struct pci_dev *pdev, u16 mask, const char *name);
|
||||
|
||||
/**
|
||||
* check_signature - find BIOS signatures
|
||||
* @io_addr: mmio address to check
|
||||
|
|
53
lib/iomap.c
53
lib/iomap.c
|
@ -498,3 +498,56 @@ void pcim_iounmap(struct pci_dev *pdev, void __iomem *addr)
|
|||
WARN_ON(1);
|
||||
}
|
||||
EXPORT_SYMBOL(pcim_iounmap);
|
||||
|
||||
/**
|
||||
* pcim_iomap_regions - Request and iomap PCI BARs
|
||||
* @pdev: PCI device to map IO resources for
|
||||
* @mask: Mask of BARs to request and iomap
|
||||
* @name: Name used when requesting regions
|
||||
*
|
||||
* Request and iomap regions specified by @mask.
|
||||
*/
|
||||
int pcim_iomap_regions(struct pci_dev *pdev, u16 mask, const char *name)
|
||||
{
|
||||
void __iomem * const *iomap;
|
||||
int i, rc;
|
||||
|
||||
iomap = pcim_iomap_table(pdev);
|
||||
if (!iomap)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
|
||||
unsigned long len;
|
||||
|
||||
if (!(mask & (1 << i)))
|
||||
continue;
|
||||
|
||||
rc = -EINVAL;
|
||||
len = pci_resource_len(pdev, i);
|
||||
if (!len)
|
||||
goto err_inval;
|
||||
|
||||
rc = pci_request_region(pdev, i, name);
|
||||
if (rc)
|
||||
goto err_region;
|
||||
|
||||
rc = -ENOMEM;
|
||||
if (!pcim_iomap(pdev, i, 0))
|
||||
goto err_iomap;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_iomap:
|
||||
pcim_iounmap(pdev, iomap[i]);
|
||||
err_region:
|
||||
pci_release_region(pdev, i);
|
||||
err_inval:
|
||||
while (--i >= 0) {
|
||||
pcim_iounmap(pdev, iomap[i]);
|
||||
pci_release_region(pdev, i);
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL(pcim_iomap_regions);
|
||||
|
|
Loading…
Reference in New Issue