diff options
Diffstat (limited to 'drivers/gpu/drm/nouveau/nouveau_sgdma.c')
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_sgdma.c | 19 | 
1 files changed, 19 insertions, 0 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_sgdma.c b/drivers/gpu/drm/nouveau/nouveau_sgdma.c index ed1590577b6..1d6ee8b5515 100644 --- a/drivers/gpu/drm/nouveau/nouveau_sgdma.c +++ b/drivers/gpu/drm/nouveau/nouveau_sgdma.c @@ -1,6 +1,7 @@  #include "drmP.h"  #include "nouveau_drv.h"  #include <linux/pagemap.h> +#include <linux/slab.h>  #define NV_CTXDMA_PAGE_SHIFT 12  #define NV_CTXDMA_PAGE_SIZE  (1 << NV_CTXDMA_PAGE_SHIFT) @@ -171,6 +172,24 @@ nouveau_sgdma_unbind(struct ttm_backend *be)  	}  	dev_priv->engine.instmem.finish_access(nvbe->dev); +	if (dev_priv->card_type == NV_50) { +		nv_wr32(dev, 0x100c80, 0x00050001); +		if (!nv_wait(0x100c80, 0x00000001, 0x00000000)) { +			NV_ERROR(dev, "timeout: (0x100c80 & 1) == 0 (2)\n"); +			NV_ERROR(dev, "0x100c80 = 0x%08x\n", +						nv_rd32(dev, 0x100c80)); +			return -EBUSY; +		} + +		nv_wr32(dev, 0x100c80, 0x00000001); +		if (!nv_wait(0x100c80, 0x00000001, 0x00000000)) { +			NV_ERROR(dev, "timeout: (0x100c80 & 1) == 0 (2)\n"); +			NV_ERROR(dev, "0x100c80 = 0x%08x\n", +						nv_rd32(dev, 0x100c80)); +			return -EBUSY; +		} +	} +  	nvbe->bound = false;  	return 0;  }  |