drm/nv50: 0x50 needs semaphore yields too
authorBen Skeggs <bskeggs@redhat.com>
Mon, 31 Jan 2011 06:42:28 +0000 (16:42 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Thu, 24 Feb 2011 20:44:25 +0000 (06:44 +1000)
Evil, evil chipset.  Worst of both worlds.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_fence.c

index 1334868a3eeb545c342e86cb1ac019415fd2fad0..d820ad29dfe1aba94e42525630f78a2fcf9fe9c4 100644 (file)
@@ -330,9 +330,18 @@ semaphore_acquire(struct nouveau_channel *chan, struct nouveau_semaphore *sema)
        int ret;
 
        if (dev_priv->chipset < 0x84) {
-               ret = RING_SPACE(chan, 3);
-               if (ret)
-                       return ret;
+               if (dev_priv->chipset < 0x50) {
+                       ret = RING_SPACE(chan, 3);
+                       if (ret)
+                               return ret;
+               } else {
+                       ret = RING_SPACE(chan, 5);
+                       if (ret)
+                               return ret;
+
+                       BEGIN_RING(chan, NvSubSw, NV_SW_YIELD, 1);
+                       OUT_RING  (chan, 0);
+               }
 
                BEGIN_RING(chan, NvSubSw, NV_SW_SEMAPHORE_OFFSET, 2);
                OUT_RING  (chan, sema->mem->start);
@@ -401,7 +410,7 @@ semaphore_release(struct nouveau_channel *chan, struct nouveau_semaphore *sema)
        int ret;
 
        if (dev_priv->chipset < 0x84) {
-               ret = RING_SPACE(chan, 4);
+               ret = RING_SPACE(chan, (dev_priv->chipset != 0x50) ? 4 : 6);
                if (ret)
                        return ret;
 
@@ -409,6 +418,10 @@ semaphore_release(struct nouveau_channel *chan, struct nouveau_semaphore *sema)
                OUT_RING  (chan, sema->mem->start);
                BEGIN_RING(chan, NvSubSw, NV_SW_SEMAPHORE_RELEASE, 1);
                OUT_RING  (chan, 1);
+               if (dev_priv->chipset == 0x50) {
+                       BEGIN_RING(chan, NvSubSw, NV_SW_YIELD, 1);
+                       OUT_RING  (chan, 0);
+               }
        } else
        if (dev_priv->chipset < 0xc0) {
                /*