lkml.org 
[lkml]   [2017]   [Jul]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v9 25/38] swiotlb: Add warnings for use of bounce buffers with SME
    Date
    Add warnings to let the user know when bounce buffers are being used for
    DMA when SME is active. Since the bounce buffers are not in encrypted
    memory, these notifications are to allow the user to determine some
    appropriate action - if necessary. Actions can range from utilizing an
    IOMMU, replacing the device with another device that can support 64-bit
    DMA, ignoring the message if the device isn't used much, etc.

    Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
    ---
    include/linux/dma-mapping.h | 13 +++++++++++++
    lib/swiotlb.c | 3 +++
    2 files changed, 16 insertions(+)

    diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
    index 4f3eece..a156c40 100644
    --- a/include/linux/dma-mapping.h
    +++ b/include/linux/dma-mapping.h
    @@ -10,6 +10,7 @@
    #include <linux/scatterlist.h>
    #include <linux/kmemcheck.h>
    #include <linux/bug.h>
    +#include <linux/mem_encrypt.h>

    /**
    * List of possible attributes associated with a DMA mapping. The semantics
    @@ -554,6 +555,12 @@ static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
    #endif
    }

    +static inline void dma_check_mask(struct device *dev, u64 mask)
    +{
    + if (sme_active() && (mask < (((u64)sme_get_me_mask() << 1) - 1)))
    + dev_warn(dev, "SME is active, device will require DMA bounce buffers\n");
    +}
    +
    #ifndef HAVE_ARCH_DMA_SUPPORTED
    static inline int dma_supported(struct device *dev, u64 mask)
    {
    @@ -577,6 +584,9 @@ static inline int dma_set_mask(struct device *dev, u64 mask)

    if (!dev->dma_mask || !dma_supported(dev, mask))
    return -EIO;
    +
    + dma_check_mask(dev, mask);
    +
    *dev->dma_mask = mask;
    return 0;
    }
    @@ -596,6 +606,9 @@ static inline int dma_set_coherent_mask(struct device *dev, u64 mask)
    {
    if (!dma_supported(dev, mask))
    return -EIO;
    +
    + dma_check_mask(dev, mask);
    +
    dev->coherent_dma_mask = mask;
    return 0;
    }
    diff --git a/lib/swiotlb.c b/lib/swiotlb.c
    index 04ac91a..8c6c83e 100644
    --- a/lib/swiotlb.c
    +++ b/lib/swiotlb.c
    @@ -507,6 +507,9 @@ phys_addr_t swiotlb_tbl_map_single(struct device *hwdev,
    if (no_iotlb_memory)
    panic("Can not allocate SWIOTLB buffer earlier and can't now provide you with the DMA bounce buffer");

    + if (sme_active())
    + pr_warn_once("SME is active and system is using DMA bounce buffers\n");
    +
    mask = dma_get_seg_boundary(hwdev);

    tbl_dma_addr &= mask;
    \
     
     \ /
      Last update: 2017-07-07 15:43    [W:4.147 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site