drm/nv50: enable page flipping
authorBen Skeggs <bskeggs@redhat.com>
Mon, 7 Feb 2011 04:27:04 +0000 (14:27 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Thu, 24 Feb 2011 20:45:17 +0000 (06:45 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_display.c
drivers/gpu/drm/nouveau/nouveau_state.c
drivers/gpu/drm/nouveau/nv50_graph.c

index 3a30d82..d6da139 100644 (file)
@@ -297,6 +297,14 @@ nouveau_crtc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb,
        mutex_lock(&chan->mutex);
 
        /* Emit a page flip */
+       if (dev_priv->card_type >= NV_50) {
+               ret = nv50_display_flip_next(crtc, fb, chan);
+               if (ret) {
+                       nouveau_channel_put(&chan);
+                       goto fail_unreserve;
+               }
+       }
+
        ret = nouveau_page_flip_emit(chan, old_bo, new_bo, s, &fence);
        nouveau_channel_put(&chan);
        if (ret)
@@ -347,7 +355,8 @@ nouveau_finish_page_flip(struct nouveau_channel *chan,
        }
 
        list_del(&s->head);
-       *ps = *s;
+       if (ps)
+               *ps = *s;
        kfree(s);
 
        spin_unlock_irqrestore(&dev->event_lock, flags);
index 805c0b3..e03cd34 100644 (file)
@@ -1118,7 +1118,7 @@ int nouveau_ioctl_getparam(struct drm_device *dev, void *data,
                getparam->value = 1;
                break;
        case NOUVEAU_GETPARAM_HAS_PAGEFLIP:
-               getparam->value = (dev_priv->card_type < NV_50);
+               getparam->value = (dev_priv->card_type < NV_C0) ? 1 : 0;
                break;
        case NOUVEAU_GETPARAM_GRAPH_UNITS:
                /* NV40 and NV50 versions are quite different, but register
index 37e21d2..7b7b5e7 100644 (file)
@@ -409,12 +409,7 @@ static int
 nv50_graph_nvsw_mthd_page_flip(struct nouveau_channel *chan,
                               u32 class, u32 mthd, u32 data)
 {
-       struct nouveau_page_flip_state s;
-
-       if (!nouveau_finish_page_flip(chan, &s)) {
-               /* XXX - Do something here */
-       }
-
+       nouveau_finish_page_flip(chan, NULL);
        return 0;
 }