Re: use generic DMA mapping code in powerpc V4

2019-01-05 Thread Christian Zigotzky
Next step: c446404b041130fbd9d1772d184f24715cf2362f (powerpc/dma: remove 
dma_nommu_mmap_coherent)


git clone git://git.infradead.org/users/hch/misc.git -b powerpc-dma.6 a

git checkout c446404b041130fbd9d1772d184f24715cf2362f

Output:

Note: checking out 'c446404b041130fbd9d1772d184f24715cf2362f'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b 

HEAD is now at c446404... powerpc/dma: remove dma_nommu_mmap_coherent

-

Link to the Git: 
http://git.infradead.org/users/hch/misc.git/shortlog/refs/heads/powerpc-dma.6


Result: PASEMI onboard ethernet works and the X5000 (P5020 board) boots.

-- Christian
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

[PATCH 4/4] drm/vmwgfx: unwind spaghetti code in vmw_dma_select_mode

2019-01-05 Thread Christoph Hellwig
Just use a simple if/else chain to select the DMA mode.

Signed-off-by: Christoph Hellwig 
---
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 25 ++---
 1 file changed, 6 insertions(+), 19 deletions(-)

diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
index c2060f6cc9e8..86387735a90b 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -566,34 +566,21 @@ static int vmw_dma_select_mode(struct vmw_private 
*dev_priv)
[vmw_dma_map_populate] = "Keeping DMA mappings.",
[vmw_dma_map_bind] = "Giving up DMA mappings early."};
 
-   if (intel_iommu_enabled) {
+   if (vmw_force_coherent)
+   dev_priv->map_mode = vmw_dma_alloc_coherent;
+   else if (intel_iommu_enabled)
dev_priv->map_mode = vmw_dma_map_populate;
-   goto out_fixup;
-   }
-
-   if (!(vmw_force_iommu || vmw_force_coherent)) {
+   else if (!vmw_force_iommu)
dev_priv->map_mode = vmw_dma_phys;
-   DRM_INFO("DMA map mode: %s\n", names[dev_priv->map_mode]);
-   return 0;
-   }
-
-#ifdef CONFIG_SWIOTLB
-   if (swiotlb_nr_tbl())
+   else if (IS_ENABLED(CONFIG_SWIOTLB) && swiotlb_nr_tbl())
dev_priv->map_mode = vmw_dma_alloc_coherent;
else
-#endif
dev_priv->map_mode = vmw_dma_map_populate;
 
-out_fixup:
-   if (dev_priv->map_mode == vmw_dma_map_populate &&
-   vmw_restrict_iommu)
+   if (dev_priv->map_mode == vmw_dma_map_populate && vmw_restrict_iommu)
dev_priv->map_mode = vmw_dma_map_bind;
 
-   if (vmw_force_coherent)
-   dev_priv->map_mode = vmw_dma_alloc_coherent;
-
DRM_INFO("DMA map mode: %s\n", names[dev_priv->map_mode]);
-
return 0;
 }
 
-- 
2.20.1

___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


[PATCH 2/4] drm/vmwgfx: remove CONFIG_INTEL_IOMMU ifdefs

2019-01-05 Thread Christoph Hellwig
intel_iommu_enabled is defined as always false for !CONFIG_INTEL_IOMMU,
so remove the ifdefs around it.

Signed-off-by: Christoph Hellwig 
---
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 18 --
 1 file changed, 18 deletions(-)

diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
index 69e325b2d954..236052ad233c 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -567,12 +567,10 @@ static int vmw_dma_select_mode(struct vmw_private 
*dev_priv)
[vmw_dma_map_bind] = "Giving up DMA mappings early."};
const struct dma_map_ops *dma_ops = get_dma_ops(dev_priv->dev->dev);
 
-#ifdef CONFIG_INTEL_IOMMU
if (intel_iommu_enabled) {
dev_priv->map_mode = vmw_dma_map_populate;
goto out_fixup;
}
-#endif
 
if (!(vmw_force_iommu || vmw_force_coherent)) {
dev_priv->map_mode = vmw_dma_phys;
@@ -589,9 +587,7 @@ static int vmw_dma_select_mode(struct vmw_private *dev_priv)
dev_priv->map_mode = vmw_dma_map_populate;
 #endif
 
-#ifdef CONFIG_INTEL_IOMMU
 out_fixup:
-#endif
if (dev_priv->map_mode == vmw_dma_map_populate &&
vmw_restrict_iommu)
dev_priv->map_mode = vmw_dma_map_bind;
@@ -599,13 +595,6 @@ static int vmw_dma_select_mode(struct vmw_private 
*dev_priv)
if (vmw_force_coherent)
dev_priv->map_mode = vmw_dma_alloc_coherent;
 
-#if !defined(CONFIG_SWIOTLB) && !defined(CONFIG_INTEL_IOMMU)
-   /*
-* No coherent page pool
-*/
-   if (dev_priv->map_mode == vmw_dma_alloc_coherent)
-   return -EINVAL;
-#endif
DRM_INFO("DMA map mode: %s\n", names[dev_priv->map_mode]);
 
return 0;
@@ -619,7 +608,6 @@ static int vmw_dma_select_mode(struct vmw_private *dev_priv)
  * With 32-bit we can only handle 32 bit PFNs. Optionally set that
  * restriction also for 64-bit systems.
  */
-#ifdef CONFIG_INTEL_IOMMU
 static int vmw_dma_masks(struct vmw_private *dev_priv)
 {
struct drm_device *dev = dev_priv->dev;
@@ -631,12 +619,6 @@ static int vmw_dma_masks(struct vmw_private *dev_priv)
}
return 0;
 }
-#else
-static int vmw_dma_masks(struct vmw_private *dev_priv)
-{
-   return 0;
-}
-#endif
 
 static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
 {
-- 
2.20.1

___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


[PATCH 3/4] drm/vmwgfx: fix the check when to use dma_alloc_coherent

2019-01-05 Thread Christoph Hellwig
Since Linux 4.21 we merged the swiotlb ops into the DMA direct ops,
so they would always have a the sync_single methods.  But late in
the cicle we also removed the direct ops entirely, so we'd see NULL
DMA ops.  Switch vmw_dma_select_mode to only detect swiotlb presence
using swiotlb_nr_tbl() instead.

Fixes: 55897af630 ("dma-direct: merge swiotlb_dma_ops into the dma_direct code")
Fixes: 356da6d0cd ("dma-mapping: bypass indirect calls for dma-direct")
Signed-off-by: Christoph Hellwig 
---
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 11 ---
 1 file changed, 4 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
index 236052ad233c..c2060f6cc9e8 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -565,7 +565,6 @@ static int vmw_dma_select_mode(struct vmw_private *dev_priv)
[vmw_dma_alloc_coherent] = "Using coherent TTM pages.",
[vmw_dma_map_populate] = "Keeping DMA mappings.",
[vmw_dma_map_bind] = "Giving up DMA mappings early."};
-   const struct dma_map_ops *dma_ops = get_dma_ops(dev_priv->dev->dev);
 
if (intel_iommu_enabled) {
dev_priv->map_mode = vmw_dma_map_populate;
@@ -578,14 +577,12 @@ static int vmw_dma_select_mode(struct vmw_private 
*dev_priv)
return 0;
}
 
-   dev_priv->map_mode = vmw_dma_map_populate;
-
-   if (dma_ops && dma_ops->sync_single_for_cpu)
-   dev_priv->map_mode = vmw_dma_alloc_coherent;
 #ifdef CONFIG_SWIOTLB
-   if (swiotlb_nr_tbl() == 0)
-   dev_priv->map_mode = vmw_dma_map_populate;
+   if (swiotlb_nr_tbl())
+   dev_priv->map_mode = vmw_dma_alloc_coherent;
+   else
 #endif
+   dev_priv->map_mode = vmw_dma_map_populate;
 
 out_fixup:
if (dev_priv->map_mode == vmw_dma_map_populate &&
-- 
2.20.1

___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


fix DMA ops layering violations in vmwgfx

2019-01-05 Thread Christoph Hellwig
Hi Thomas,

vmwgfx has been doing some odd checks based on DMA ops which rely
on deep DMA mapping layer internals, and I think the changes in
Linux 4.21 finally broke most of these implicit assumptions.

The real fix is in patch 3, but I think the others are important
to make it clear what is actually going on.
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


[PATCH 1/4] drm/vmwgfx: remove CONFIG_X86 ifdefs

2019-01-05 Thread Christoph Hellwig
The driver depends on CONFIG_X86 so these are dead code.

Signed-off-by: Christoph Hellwig 
---
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 6 --
 1 file changed, 6 deletions(-)

diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
index 25afb1d594e3..69e325b2d954 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -565,7 +565,6 @@ static int vmw_dma_select_mode(struct vmw_private *dev_priv)
[vmw_dma_alloc_coherent] = "Using coherent TTM pages.",
[vmw_dma_map_populate] = "Keeping DMA mappings.",
[vmw_dma_map_bind] = "Giving up DMA mappings early."};
-#ifdef CONFIG_X86
const struct dma_map_ops *dma_ops = get_dma_ops(dev_priv->dev->dev);
 
 #ifdef CONFIG_INTEL_IOMMU
@@ -607,11 +606,6 @@ static int vmw_dma_select_mode(struct vmw_private 
*dev_priv)
if (dev_priv->map_mode == vmw_dma_alloc_coherent)
return -EINVAL;
 #endif
-
-#else /* CONFIG_X86 */
-   dev_priv->map_mode = vmw_dma_map_populate;
-#endif /* CONFIG_X86 */
-
DRM_INFO("DMA map mode: %s\n", names[dev_priv->map_mode]);
 
return 0;
-- 
2.20.1

___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu