Blob Blame History Raw
From 891517f5111cd82909906d5e8ee0299db0d46762 Mon Sep 17 00:00:00 2001
From: Ben Skeggs <bskeggs@redhat.com>
Date: Mon, 7 Jan 2013 13:07:13 +1000
Subject: [PATCH] nouveau: disallow pushbuf BOs in multiple memory types

Under certain circumstances it's possible for libdrm to decide to move
a GART|VRAM pushbuf to be VRAM-only.  This causes the kernel to reject
the command submission on GF8 and up, due to a stricter policy where
buffers are only allowed to move to memory types that were specified
at creation time.

The simplest fix for this is to force the creation-time memory type for
the lifetime of the push buffer.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
---
 nouveau/pushbuf.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/nouveau/pushbuf.c b/nouveau/pushbuf.c
index 0e37ce3..ff8e125 100644
--- a/nouveau/pushbuf.c
+++ b/nouveau/pushbuf.c
@@ -574,13 +574,13 @@ nouveau_pushbuf_new(struct nouveau_client *client, struct nouveau_object *chan,
 	push->client = client;
 	push->channel = immediate ? chan : NULL;
 	push->flags = NOUVEAU_BO_RD;
-	if (fifo->pushbuf & NOUVEAU_GEM_DOMAIN_VRAM) {
-		push->flags |= NOUVEAU_BO_VRAM;
-		nvpb->type   = NOUVEAU_BO_VRAM;
-	}
 	if (fifo->pushbuf & NOUVEAU_GEM_DOMAIN_GART) {
 		push->flags |= NOUVEAU_BO_GART;
 		nvpb->type   = NOUVEAU_BO_GART;
+	} else
+	if (fifo->pushbuf & NOUVEAU_GEM_DOMAIN_VRAM) {
+		push->flags |= NOUVEAU_BO_VRAM;
+		nvpb->type   = NOUVEAU_BO_VRAM;
 	}
 	nvpb->type |= NOUVEAU_BO_MAP;
 
-- 
1.8.0.1