Commit 81a00960 authored by Thomas Hellstrom's avatar Thomas Hellstrom
Browse files

drm/vmwgfx: Fix the refuse_dma mode when using guest-backed objects



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: default avatarThomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: default avatarBrian Paul <brianp@vmware.com>
parent d3bd37f5
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -1241,7 +1241,8 @@ int vmw_cmdbuf_set_pool_size(struct vmw_cmdbuf_man *man,
		 * actually call into the already enabled manager, when
		 * actually call into the already enabled manager, when
		 * binding the MOB.
		 * binding the MOB.
		 */
		 */
		if (!(dev_priv->capabilities & SVGA_CAP_DX))
		if (!(dev_priv->capabilities & SVGA_CAP_DX) ||
		    !dev_priv->has_mob)
			return -ENOMEM;
			return -ENOMEM;


		ret = ttm_bo_create(&dev_priv->bdev, size, ttm_bo_type_device,
		ret = ttm_bo_create(&dev_priv->bdev, size, ttm_bo_type_device,
+4 −2
Original line number Original line Diff line number Diff line
@@ -682,8 +682,10 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)


	ret = vmw_dma_select_mode(dev_priv);
	ret = vmw_dma_select_mode(dev_priv);
	if (unlikely(ret != 0)) {
	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;
		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);
	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;
		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;
		dev_priv->has_mob = true;
		if (ttm_bo_init_mm(&dev_priv->bdev, VMW_PL_MOB,
		if (ttm_bo_init_mm(&dev_priv->bdev, VMW_PL_MOB,
				   VMW_PL_MOB) != 0) {
				   VMW_PL_MOB) != 0) {
+1 −1
Original line number Original line Diff line number Diff line
@@ -1888,7 +1888,7 @@ int vmw_kms_stdu_init_display(struct vmw_private *dev_priv)




	/* Do nothing if Screen Target support is turned off */
	/* 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;
		return -ENOSYS;


	if (!(dev_priv->capabilities & SVGA_CAP_GBOBJECTS))
	if (!(dev_priv->capabilities & SVGA_CAP_GBOBJECTS))