lkml.org 
[lkml]   [2007]   [Jan]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH 12/13] devres: implement pcim_iomap_regions()
    Date
    From
    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>
    ---
    include/linux/io.h | 2 +
    lib/iomap.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++
    2 files changed, 55 insertions(+), 0 deletions(-)

    diff --git a/include/linux/io.h b/include/linux/io.h
    index f5edf9c..45a9c94 100644
    --- a/include/linux/io.h
    +++ b/include/linux/io.h
    @@ -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
    diff --git a/lib/iomap.c b/lib/iomap.c
    index 3214028..4990c73 100644
    --- a/lib/iomap.c
    +++ b/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);
    --
    1.4.4.3

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-01-10 07:07    [W:2.082 / U:1.816 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site