From: Thomas Hellstrom <[email protected]>

When we refuse DMA from system pages for whatever reason, we don't
handle that correctly when guest-backed objects was enabled.
Since guest-backed objects by definition require DMA to and from
system pages, disable all functionality that relies on them.
That basically amounts to 3D acceleration and screen targets.

Signed-off-by: Thomas Hellstrom <[email protected]>
Reviewed-by: Brian Paul <[email protected]>
---
 drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c | 3 ++-
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.c    | 6 ++++--
 drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c   | 2 +-
 3 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c
index 065015d2a8f6..3b41cf63110a 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c
@@ -1241,7 +1241,8 @@ int vmw_cmdbuf_set_pool_size(struct vmw_cmdbuf_man *man,
                 * actually call into the already enabled manager, when
                 * binding the MOB.
                 */
-               if (!(dev_priv->capabilities & SVGA_CAP_DX))
+               if (!(dev_priv->capabilities & SVGA_CAP_DX) ||
+                   !dev_priv->has_mob)
                        return -ENOMEM;
 
                ret = ttm_bo_create(&dev_priv->bdev, size, ttm_bo_type_device,
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
index cf3dc56d7cf4..f2ec3155468d 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -682,8 +682,10 @@ static int vmw_driver_load(struct drm_device *dev, 
unsigned long chipset)
 
        ret = vmw_dma_select_mode(dev_priv);
        if (unlikely(ret != 0)) {
-               DRM_INFO("Restricting capabilities due to IOMMU setup.\n");
+               DRM_INFO("Restricting capabilities since DMA not available.\n");
                refuse_dma = true;
+               if (dev_priv->capabilities & SVGA_CAP_GBOBJECTS)
+                       DRM_INFO("Disabling 3D acceleration.\n");
        }
 
        dev_priv->vram_size = vmw_read(dev_priv, SVGA_REG_VRAM_SIZE);
@@ -866,7 +868,7 @@ static int vmw_driver_load(struct drm_device *dev, unsigned 
long chipset)
                dev_priv->has_gmr = false;
        }
 
-       if (dev_priv->capabilities & SVGA_CAP_GBOBJECTS) {
+       if (dev_priv->capabilities & SVGA_CAP_GBOBJECTS && !refuse_dma) {
                dev_priv->has_mob = true;
                if (ttm_bo_init_mm(&dev_priv->bdev, VMW_PL_MOB,
                                   VMW_PL_MOB) != 0) {
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
index 570687a1a327..68aecb6d9f87 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
@@ -1888,7 +1888,7 @@ int vmw_kms_stdu_init_display(struct vmw_private 
*dev_priv)
 
 
        /* Do nothing if Screen Target support is turned off */
-       if (!VMWGFX_ENABLE_SCREEN_TARGET_OTABLE)
+       if (!VMWGFX_ENABLE_SCREEN_TARGET_OTABLE || !dev_priv->has_mob)
                return -ENOSYS;
 
        if (!(dev_priv->capabilities & SVGA_CAP_GBOBJECTS))
-- 
2.21.1

_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to