lkml.org 
[lkml]   [2020]   [Nov]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[RFC PATCH 03/15] PCI/P2PDMA: Introduce pci_p2pdma_should_map_bus() and pci_p2pdma_bus_offset()
    Introduce pci_p2pdma_should_map_bus() which is meant to be called by
    dma map functions to determine how to map a given p2pdma page.

    pci_p2pdma_bus_offset() is also added to allow callers to get the bus
    offset if they need to map the bus address.

    Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
    ---
    drivers/pci/p2pdma.c | 46 ++++++++++++++++++++++++++++++++++++++
    include/linux/pci-p2pdma.h | 11 +++++++++
    2 files changed, 57 insertions(+)

    diff --git a/drivers/pci/p2pdma.c b/drivers/pci/p2pdma.c
    index ea8472278b11..9961e779f430 100644
    --- a/drivers/pci/p2pdma.c
    +++ b/drivers/pci/p2pdma.c
    @@ -930,6 +930,52 @@ void pci_p2pdma_unmap_sg_attrs(struct device *dev, struct scatterlist *sg,
    }
    EXPORT_SYMBOL_GPL(pci_p2pdma_unmap_sg_attrs);

    +/**
    + * pci_p2pdma_bus_offset - returns the bus offset for a given page
    + * @page: page to get the offset for
    + *
    + * Must be passed a pci p2pdma page.
    + */
    +u64 pci_p2pdma_bus_offset(struct page *page)
    +{
    + struct pci_p2pdma_pagemap *p2p_pgmap = to_p2p_pgmap(page->pgmap);
    +
    + WARN_ON(!is_pci_p2pdma_page(page));
    +
    + return p2p_pgmap->bus_offset;
    +}
    +EXPORT_SYMBOL_GPL(pci_p2pdma_bus_offset);
    +
    +/**
    + * pci_p2pdma_should_map_bus - determine if a dma mapping should use the
    + * bus address
    + * @dev: device doing the DMA request
    + * @pgmap: dev_pagemap structure for the mapping
    + *
    + * Returns 1 if the page should be mapped with a bus address, 0 otherwise
    + * and -1 the device should not be mapping P2PDMA pages.
    + */
    +int pci_p2pdma_should_map_bus(struct device *dev, struct dev_pagemap *pgmap)
    +{
    + struct pci_p2pdma_pagemap *p2p_pgmap = to_p2p_pgmap(pgmap);
    + struct pci_dev *client;
    +
    + if (!dev_is_pci(dev))
    + return -1;
    +
    + client = to_pci_dev(dev);
    +
    + switch (pci_p2pdma_map_type(p2p_pgmap->provider, client)) {
    + case PCI_P2PDMA_MAP_THRU_HOST_BRIDGE:
    + return 0;
    + case PCI_P2PDMA_MAP_BUS_ADDR:
    + return 1;
    + default:
    + return -1;
    + }
    +}
    +EXPORT_SYMBOL_GPL(pci_p2pdma_should_map_bus);
    +
    /**
    * pci_p2pdma_enable_store - parse a configfs/sysfs attribute store
    * to enable p2pdma
    diff --git a/include/linux/pci-p2pdma.h b/include/linux/pci-p2pdma.h
    index 8318a97c9c61..fc5de47eeac4 100644
    --- a/include/linux/pci-p2pdma.h
    +++ b/include/linux/pci-p2pdma.h
    @@ -34,6 +34,8 @@ int pci_p2pdma_map_sg_attrs(struct device *dev, struct scatterlist *sg,
    int nents, enum dma_data_direction dir, unsigned long attrs);
    void pci_p2pdma_unmap_sg_attrs(struct device *dev, struct scatterlist *sg,
    int nents, enum dma_data_direction dir, unsigned long attrs);
    +u64 pci_p2pdma_bus_offset(struct page *page);
    +int pci_p2pdma_should_map_bus(struct device *dev, struct dev_pagemap *pgmap);
    int pci_p2pdma_enable_store(const char *page, struct pci_dev **p2p_dev,
    bool *use_p2pdma);
    ssize_t pci_p2pdma_enable_show(char *page, struct pci_dev *p2p_dev,
    @@ -83,6 +85,15 @@ static inline void pci_p2pmem_free_sgl(struct pci_dev *pdev,
    static inline void pci_p2pmem_publish(struct pci_dev *pdev, bool publish)
    {
    }
    +static inline u64 pci_p2pdma_bus_offset(struct page *page)
    +{
    + return -1;
    +}
    +static inline int pci_p2pdma_should_map_bus(struct device *dev,
    + struct dev_pagemap *pgmap)
    +{
    + return -1;
    +}
    static inline int pci_p2pdma_map_sg_attrs(struct device *dev,
    struct scatterlist *sg, int nents, enum dma_data_direction dir,
    unsigned long attrs)
    --
    2.20.1
    \
     
     \ /
      Last update: 2020-11-06 18:02    [W:4.305 / U:0.120 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site