lkml.org 
[lkml]   [2015]   [Jan]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v3 09/16] pci: add pci_iomap_range
    Virtio drivers should map the part of the BAR they need, not necessarily
    all of it.

    Cc: Bjorn Helgaas <bhelgaas@google.com>
    Cc: linux-pci@vger.kernel.org
    Acked-by: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
    Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
    ---

    Bjorn, can you please ack this for merging through the virtio tree?

    include/asm-generic/pci_iomap.h | 10 ++++++++++
    lib/pci_iomap.c | 35 ++++++++++++++++++++++++++++++-----
    2 files changed, 40 insertions(+), 5 deletions(-)

    diff --git a/include/asm-generic/pci_iomap.h b/include/asm-generic/pci_iomap.h
    index ce37349..7389c87 100644
    --- a/include/asm-generic/pci_iomap.h
    +++ b/include/asm-generic/pci_iomap.h
    @@ -15,6 +15,9 @@ struct pci_dev;
    #ifdef CONFIG_PCI
    /* Create a virtual mapping cookie for a PCI BAR (memory or IO) */
    extern void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max);
    +extern void __iomem *pci_iomap_range(struct pci_dev *dev, int bar,
    + unsigned long offset,
    + unsigned long maxlen);
    /* Create a virtual mapping cookie for a port on a given PCI device.
    * Do not call this directly, it exists to make it easier for architectures
    * to override */
    @@ -30,6 +33,13 @@ static inline void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned lon
    {
    return NULL;
    }
    +
    +static inline void __iomem *pci_iomap_range(struct pci_dev *dev, int bar,
    + unsigned long offset,
    + unsigned long maxlen)
    +{
    + return NULL;
    +}
    #endif

    #endif /* __ASM_GENERIC_IO_H */
    diff --git a/lib/pci_iomap.c b/lib/pci_iomap.c
    index 0d83ea8..bcce5f1 100644
    --- a/lib/pci_iomap.c
    +++ b/lib/pci_iomap.c
    @@ -10,10 +10,11 @@

    #ifdef CONFIG_PCI
    /**
    - * pci_iomap - create a virtual mapping cookie for a PCI BAR
    + * pci_iomap_range - create a virtual mapping cookie for a PCI BAR
    * @dev: PCI device that owns the BAR
    * @bar: BAR number
    - * @maxlen: length of the memory to map
    + * @offset: map memory at the given offset in BAR
    + * @maxlen: max length of the memory to map
    *
    * Using this function you will get a __iomem address to your device BAR.
    * You can access it using ioread*() and iowrite*(). These functions hide
    @@ -21,16 +22,21 @@
    * you expect from them in the correct way.
    *
    * @maxlen specifies the maximum length to map. If you want to get access to
    - * the complete BAR without checking for its length first, pass %0 here.
    + * the complete BAR from offset to the end, pass %0 here.
    * */
    -void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen)
    +void __iomem *pci_iomap_range(struct pci_dev *dev,
    + int bar,
    + unsigned long offset,
    + unsigned long maxlen)
    {
    resource_size_t start = pci_resource_start(dev, bar);
    resource_size_t len = pci_resource_len(dev, bar);
    unsigned long flags = pci_resource_flags(dev, bar);

    - if (!len || !start)
    + if (len <= offset || !start)
    return NULL;
    + len -= offset;
    + start += offset;
    if (maxlen && len > maxlen)
    len = maxlen;
    if (flags & IORESOURCE_IO)
    @@ -43,6 +49,25 @@ void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen)
    /* What? */
    return NULL;
    }
    +EXPORT_SYMBOL(pci_iomap_range);

    +/**
    + * pci_iomap - create a virtual mapping cookie for a PCI BAR
    + * @dev: PCI device that owns the BAR
    + * @bar: BAR number
    + * @maxlen: length of the memory to map
    + *
    + * Using this function you will get a __iomem address to your device BAR.
    + * You can access it using ioread*() and iowrite*(). These functions hide
    + * the details if this is a MMIO or PIO address space and will just do what
    + * you expect from them in the correct way.
    + *
    + * @maxlen specifies the maximum length to map. If you want to get access to
    + * the complete BAR without checking for its length first, pass %0 here.
    + * */
    +void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen)
    +{
    + return pci_iomap_range(dev, bar, 0, maxlen);
    +}
    EXPORT_SYMBOL(pci_iomap);
    #endif /* CONFIG_PCI */
    --
    MST


    \
     
     \ /
      Last update: 2015-01-14 19:01    [W:4.196 / U:0.060 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site