devres: implement pcim_iomap_regions_request_all()
Some drivers need to reserve all PCI BARs to prevent other drivers misusing unoccupied BARs. pcim_iomap_regions_request_all() requests all BARs and iomap specified BARs. Signed-off-by: Tejun Heo <htejun@gmail.com> Cc: Greg Kroah-Hartman <gregkh@suse.de> Cc: Alan Cox <alan@lxorguk.ukuu.org.uk> Cc: Jeff Garzik <jeff@garzik.org> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
Родитель
233f112042
Коммит
916fbfb7ae
|
@ -1045,6 +1045,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 pcim_iounmap(struct pci_dev *pdev, void __iomem *addr);
|
||||||
void __iomem * const *pcim_iomap_table(struct pci_dev *pdev);
|
void __iomem * const *pcim_iomap_table(struct pci_dev *pdev);
|
||||||
int pcim_iomap_regions(struct pci_dev *pdev, u16 mask, const char *name);
|
int pcim_iomap_regions(struct pci_dev *pdev, u16 mask, const char *name);
|
||||||
|
int pcim_iomap_regions_request_all(struct pci_dev *pdev, u16 mask,
|
||||||
|
const char *name);
|
||||||
void pcim_iounmap_regions(struct pci_dev *pdev, u16 mask);
|
void pcim_iounmap_regions(struct pci_dev *pdev, u16 mask);
|
||||||
|
|
||||||
extern int pci_pci_problems;
|
extern int pci_pci_problems;
|
||||||
|
|
25
lib/devres.c
25
lib/devres.c
|
@ -297,6 +297,31 @@ int pcim_iomap_regions(struct pci_dev *pdev, u16 mask, const char *name)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(pcim_iomap_regions);
|
EXPORT_SYMBOL(pcim_iomap_regions);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* pcim_iomap_regions_request_all - Request all BARs and iomap specified ones
|
||||||
|
* @pdev: PCI device to map IO resources for
|
||||||
|
* @mask: Mask of BARs to iomap
|
||||||
|
* @name: Name used when requesting regions
|
||||||
|
*
|
||||||
|
* Request all PCI BARs and iomap regions specified by @mask.
|
||||||
|
*/
|
||||||
|
int pcim_iomap_regions_request_all(struct pci_dev *pdev, u16 mask,
|
||||||
|
const char *name)
|
||||||
|
{
|
||||||
|
int request_mask = ((1 << 6) - 1) & ~mask;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = pci_request_selected_regions(pdev, request_mask, name);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
rc = pcim_iomap_regions(pdev, mask, name);
|
||||||
|
if (rc)
|
||||||
|
pci_release_selected_regions(pdev, request_mask);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(pcim_iomap_regions_request_all);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* pcim_iounmap_regions - Unmap and release PCI BARs
|
* pcim_iounmap_regions - Unmap and release PCI BARs
|
||||||
* @pdev: PCI device to map IO resources for
|
* @pdev: PCI device to map IO resources for
|
||||||
|
|
Загрузка…
Ссылка в новой задаче