drm/vmwgfx: Fix dma API layer violation [Linux 5.1]

drm/vmwgfx: Fix dma API layer violation [Linux 5.1]

This Linux kernel change "drm/vmwgfx: Fix dma API layer violation" is included in the Linux 5.1 release. This change is authored by Thomas Hellstrom <thellstrom [at] vmware.com> on Tue Apr 23 14:02:57 2019 +0200. The commit for this change in Linux stable tree is 8110335 (patch).

drm/vmwgfx: Fix dma API layer violation

Remove the check for IOMMU presence since it was considered a
layer violation.
This means we have no reliable way to destinguish between coherent
hardware IOMMU DMA address translations and incoherent SWIOTLB DMA
address translations, which we can't handle. So always presume the
former. This means that if anybody forces SWIOTLB without also setting
the vmw_force_coherent=1 vmwgfx option, driver operation will fail,
like it will on most other graphics drivers.

Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>

There are 33 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 33 +++++----------------------------
 1 file changed, 5 insertions(+), 28 deletions(-)

diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
index 7ef5dcb..2d06638 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -546,29 +546,13 @@ static void vmw_get_initial_size(struct vmw_private *dev_priv)
 }

 /**
- * vmw_assume_iommu - Figure out whether coherent dma-remapping might be
- * taking place.
- * @dev: Pointer to the struct drm_device.
- *
- * Return: true if iommu present, false otherwise.
- */
-static bool vmw_assume_iommu(struct drm_device *dev)
-{
-   const struct dma_map_ops *ops = get_dma_ops(dev->dev);
-
-   return !dma_is_direct(ops) && ops &&
-       ops->map_page != dma_direct_map_page;
-}
-
-/**
  * vmw_dma_select_mode - Determine how DMA mappings should be set up for this
  * system.
  *
  * @dev_priv: Pointer to a struct vmw_private
  *
- * This functions tries to determine the IOMMU setup and what actions
- * need to be taken by the driver to make system pages visible to the
- * device.
+ * This functions tries to determine what actions need to be taken by the
+ * driver to make system pages visible to the device.
  * If this function decides that DMA is not possible, it returns -EINVAL.
  * The driver may then try to disable features of the device that require
  * DMA.
@@ -578,23 +562,16 @@ static int vmw_dma_select_mode(struct vmw_private *dev_priv)
    static const char *names[vmw_dma_map_max] = {
        [vmw_dma_phys] = "Using physical TTM page addresses.",
        [vmw_dma_alloc_coherent] = "Using coherent TTM pages.",
-       [vmw_dma_map_populate] = "Keeping DMA mappings.",
+       [vmw_dma_map_populate] = "Caching DMA mappings.",
        [vmw_dma_map_bind] = "Giving up DMA mappings early."};

    if (vmw_force_coherent)
        dev_priv->map_mode = vmw_dma_alloc_coherent;
-   else if (vmw_assume_iommu(dev_priv->dev))
-       dev_priv->map_mode = vmw_dma_map_populate;
-   else if (!vmw_force_iommu)
-       dev_priv->map_mode = vmw_dma_phys;
-   else if (IS_ENABLED(CONFIG_SWIOTLB) && swiotlb_nr_tbl())
-       dev_priv->map_mode = vmw_dma_alloc_coherent;
+   else if (vmw_restrict_iommu)
+       dev_priv->map_mode = vmw_dma_map_bind;
    else
        dev_priv->map_mode = vmw_dma_map_populate;

-   if (dev_priv->map_mode == vmw_dma_map_populate && vmw_restrict_iommu)
-       dev_priv->map_mode = vmw_dma_map_bind;
-
    /* No TTM coherent page pool? FIXME: Ask TTM instead! */
         if (!(IS_ENABLED(CONFIG_SWIOTLB) || IS_ENABLED(CONFIG_INTEL_IOMMU)) &&
        (dev_priv->map_mode == vmw_dma_alloc_coherent))

Leave a Reply

Your email address will not be published. Required fields are marked *