lkml.org 
[lkml]   [2016]   [Nov]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[mm PATCH v3 11/23] arch/mips: Add option to skip DMA sync as a part of map and unmap
    From
    Date
    This change allows us to pass DMA_ATTR_SKIP_CPU_SYNC which allows us to
    avoid invoking cache line invalidation if the driver will just handle it
    via a sync_for_cpu or sync_for_device call.

    Cc: Ralf Baechle <ralf@linux-mips.org>
    Cc: Keguang Zhang <keguang.zhang@gmail.com>
    Cc: linux-mips@linux-mips.org
    Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
    ---
    arch/mips/loongson64/common/dma-swiotlb.c | 2 +-
    arch/mips/mm/dma-default.c | 8 +++++---
    2 files changed, 6 insertions(+), 4 deletions(-)

    diff --git a/arch/mips/loongson64/common/dma-swiotlb.c b/arch/mips/loongson64/common/dma-swiotlb.c
    index 1a80b6f..aab4fd6 100644
    --- a/arch/mips/loongson64/common/dma-swiotlb.c
    +++ b/arch/mips/loongson64/common/dma-swiotlb.c
    @@ -61,7 +61,7 @@ static int loongson_dma_map_sg(struct device *dev, struct scatterlist *sg,
    int nents, enum dma_data_direction dir,
    unsigned long attrs)
    {
    - int r = swiotlb_map_sg_attrs(dev, sg, nents, dir, 0);
    + int r = swiotlb_map_sg_attrs(dev, sg, nents, dir, attrs);
    mb();

    return r;
    diff --git a/arch/mips/mm/dma-default.c b/arch/mips/mm/dma-default.c
    index b2eadd6..dd998d7 100644
    --- a/arch/mips/mm/dma-default.c
    +++ b/arch/mips/mm/dma-default.c
    @@ -293,7 +293,7 @@ static inline void __dma_sync(struct page *page,
    static void mips_dma_unmap_page(struct device *dev, dma_addr_t dma_addr,
    size_t size, enum dma_data_direction direction, unsigned long attrs)
    {
    - if (cpu_needs_post_dma_flush(dev))
    + if (cpu_needs_post_dma_flush(dev) && !(attrs & DMA_ATTR_SKIP_CPU_SYNC))
    __dma_sync(dma_addr_to_page(dev, dma_addr),
    dma_addr & ~PAGE_MASK, size, direction);
    plat_post_dma_flush(dev);
    @@ -307,7 +307,8 @@ static int mips_dma_map_sg(struct device *dev, struct scatterlist *sglist,
    struct scatterlist *sg;

    for_each_sg(sglist, sg, nents, i) {
    - if (!plat_device_is_coherent(dev))
    + if (!plat_device_is_coherent(dev) &&
    + !(attrs & DMA_ATTR_SKIP_CPU_SYNC))
    __dma_sync(sg_page(sg), sg->offset, sg->length,
    direction);
    #ifdef CONFIG_NEED_SG_DMA_LENGTH
    @@ -324,7 +325,7 @@ static dma_addr_t mips_dma_map_page(struct device *dev, struct page *page,
    unsigned long offset, size_t size, enum dma_data_direction direction,
    unsigned long attrs)
    {
    - if (!plat_device_is_coherent(dev))
    + if (!plat_device_is_coherent(dev) && !(attrs & DMA_ATTR_SKIP_CPU_SYNC))
    __dma_sync(page, offset, size, direction);

    return plat_map_dma_mem_page(dev, page) + offset;
    @@ -339,6 +340,7 @@ static void mips_dma_unmap_sg(struct device *dev, struct scatterlist *sglist,

    for_each_sg(sglist, sg, nhwentries, i) {
    if (!plat_device_is_coherent(dev) &&
    + !(attrs & DMA_ATTR_SKIP_CPU_SYNC) &&
    direction != DMA_TO_DEVICE)
    __dma_sync(sg_page(sg), sg->offset, sg->length,
    direction);
    \
     
     \ /
      Last update: 2016-11-10 18:42    [W:3.677 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site