lkml.org 
[lkml]   [2017]   [Dec]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 33/67] dma-direct: reject too small dma masks
    Date
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    ---
    include/linux/dma-direct.h | 1 +
    lib/dma-direct.c | 19 +++++++++++++++++++
    2 files changed, 20 insertions(+)

    diff --git a/include/linux/dma-direct.h b/include/linux/dma-direct.h
    index 4788bf0bf683..bcdb1a3e4b1f 100644
    --- a/include/linux/dma-direct.h
    +++ b/include/linux/dma-direct.h
    @@ -42,5 +42,6 @@ void *dma_direct_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle,
    gfp_t gfp, unsigned long attrs);
    void dma_direct_free(struct device *dev, size_t size, void *cpu_addr,
    dma_addr_t dma_addr, unsigned long attrs);
    +int dma_direct_supported(struct device *dev, u64 mask);

    #endif /* _LINUX_DMA_DIRECT_H */
    diff --git a/lib/dma-direct.c b/lib/dma-direct.c
    index 2e9b9494610c..5bb289483efc 100644
    --- a/lib/dma-direct.c
    +++ b/lib/dma-direct.c
    @@ -123,6 +123,24 @@ static int dma_direct_map_sg(struct device *dev, struct scatterlist *sgl,
    return nents;
    }

    +int dma_direct_supported(struct device *dev, u64 mask)
    +{
    +#ifdef CONFIG_ZONE_DMA
    + if (mask < DMA_BIT_MASK(ARCH_ZONE_DMA_BITS))
    + return 0;
    +#else
    + /*
    + * Because 32-bit DMA masks are so common we expect every architecture
    + * to be able to satisfy them - either by not supporting more physical
    + * memory, or by providing a ZONE_DMA32. If neither is the case, the
    + * architecture needs to use an IOMMU instead of the direct mapping.
    + */
    + if (mask < DMA_BIT_MASK(32))
    + return 0;
    +#endif
    + return 1;
    +}
    +
    static int dma_direct_mapping_error(struct device *dev, dma_addr_t dma_addr)
    {
    return dma_addr == DIRECT_MAPPING_ERROR;
    @@ -133,6 +151,7 @@ const struct dma_map_ops dma_direct_ops = {
    .free = dma_direct_free,
    .map_page = dma_direct_map_page,
    .map_sg = dma_direct_map_sg,
    + .dma_supported = dma_direct_supported,
    .mapping_error = dma_direct_mapping_error,
    .is_phys = true,
    };
    --
    2.14.2
    \
     
     \ /
      Last update: 2017-12-29 09:24    [W:4.244 / U:0.044 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site