diff --git a/shared-core/nouveau_drv.h b/shared-core/nouveau_drv.h
index 158d6fd..ae7f4d3 100644
--- a/shared-core/nouveau_drv.h
+++ b/shared-core/nouveau_drv.h
@@ -179,6 +179,7 @@ struct nouveau_instmem_engine {
 	void	(*clear)(struct drm_device *, struct nouveau_gpuobj *);
 	int	(*bind)(struct drm_device *, struct nouveau_gpuobj *);
 	int	(*unbind)(struct drm_device *, struct nouveau_gpuobj *);
+	int     (*flush)(struct drm_device *);
 };
 
 struct nouveau_mc_engine {
@@ -570,6 +571,7 @@ extern int  nv50_instmem_populate(struct drm_device *, struct nouveau_gpuobj *,
 extern void nv50_instmem_clear(struct drm_device *, struct nouveau_gpuobj *);
 extern int  nv50_instmem_bind(struct drm_device *, struct nouveau_gpuobj *);
 extern int  nv50_instmem_unbind(struct drm_device *, struct nouveau_gpuobj *);
+extern void nv50_instmem_flush(struct drm_device *);
 
 /* nv04_mc.c */
 extern int  nv04_mc_init(struct drm_device *);
diff --git a/shared-core/nouveau_object.c b/shared-core/nouveau_object.c
index 19325f3..d7adb1c 100644
--- a/shared-core/nouveau_object.c
+++ b/shared-core/nouveau_object.c
@@ -769,6 +769,8 @@ nouveau_gpuobj_dma_new(struct nouveau_channel *chan, int class,
 		INSTANCE_WR(*gpuobj, 5, flags5);
 	}
 
+	dev_priv->Engine.instmem.flush(dev);
+
 	(*gpuobj)->engine = NVOBJ_ENGINE_SW;
 	(*gpuobj)->class  = class;
 	return 0;
diff --git a/shared-core/nouveau_state.c b/shared-core/nouveau_state.c
index 0b6002c..a15f11b 100644
--- a/shared-core/nouveau_state.c
+++ b/shared-core/nouveau_state.c
@@ -252,6 +252,7 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
 		engine->instmem.clear		= nv50_instmem_clear;
 		engine->instmem.bind		= nv50_instmem_bind;
 		engine->instmem.unbind		= nv50_instmem_unbind;
+		engine->instmem.flush		= nv50_instmem_flush;
 		engine->mc.init		= nv50_mc_init;
 		engine->mc.takedown	= nv50_mc_takedown;
 		engine->timer.init	= nv04_timer_init;
diff --git a/shared-core/nv50_instmem.c b/shared-core/nv50_instmem.c
index d76ebf3..88ee241 100644
--- a/shared-core/nv50_instmem.c
+++ b/shared-core/nv50_instmem.c
@@ -297,8 +297,8 @@ nv50_instmem_bind(struct drm_device *dev, struct nouveau_gpuobj *gpuobj)
 		vram += NV50_INSTMEM_PAGE_SIZE;
 	}
 
-	NV_WRITE(0x070000, 0x00000001);
-	while(NV_READ(0x070000) & 1);
+	dev_priv->Engine.instmem.flush(dev);
+
 	NV_WRITE(0x100c80, 0x00040001);
 	while(NV_READ(0x100c80) & 1);
 	NV_WRITE(0x100c80, 0x00060001);
@@ -329,3 +329,13 @@ nv50_instmem_unbind(struct drm_device *dev, struct nouveau_gpuobj *gpuobj)
 	gpuobj->im_bound = 0;
 	return 0;
 }
+
+void
+nv50_instmem_flush(struct drm_device *dev)
+{
+	struct drm_nouveau_private *dev_priv = dev->dev_private;
+
+	NV_WRITE(0x070000, 0x00000001);
+	while(NV_READ(0x070000) & 1);
+}
+
