nouveau: disallow pushbuf BOs in multiple memory types
authorBen Skeggs <bskeggs@redhat.com>
Mon, 7 Jan 2013 03:07:13 +0000 (13:07 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Mon, 7 Jan 2013 03:15:28 +0000 (13:15 +1000)
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

index 0e37ce3..ff8e125 100644 (file)
@@ -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;