aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2011-02-06 23:27:04 -0500
committerBen Skeggs <bskeggs@redhat.com>2011-02-24 15:45:17 -0500
commitd7117e0d4e21034202833088e51fc21f8c8271f9 (patch)
tree09e1b038a47385c16fd03722e704a5c8cdf8eed4
parent1d3fac0c2ae3bb1b054df2f203fdaf08a1d42370 (diff)
drm/nv50: enable page flipping
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_display.c11
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_state.c2
-rw-r--r--drivers/gpu/drm/nouveau/nv50_graph.c7
3 files changed, 12 insertions, 8 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c
index 3a30d822dec1..d6da139155d6 100644
--- a/drivers/gpu/drm/nouveau/nouveau_display.c
+++ b/drivers/gpu/drm/nouveau/nouveau_display.c
@@ -297,6 +297,14 @@ nouveau_crtc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb,
297 mutex_lock(&chan->mutex); 297 mutex_lock(&chan->mutex);
298 298
299 /* Emit a page flip */ 299 /* Emit a page flip */
300 if (dev_priv->card_type >= NV_50) {
301 ret = nv50_display_flip_next(crtc, fb, chan);
302 if (ret) {
303 nouveau_channel_put(&chan);
304 goto fail_unreserve;
305 }
306 }
307
300 ret = nouveau_page_flip_emit(chan, old_bo, new_bo, s, &fence); 308 ret = nouveau_page_flip_emit(chan, old_bo, new_bo, s, &fence);
301 nouveau_channel_put(&chan); 309 nouveau_channel_put(&chan);
302 if (ret) 310 if (ret)
@@ -347,7 +355,8 @@ nouveau_finish_page_flip(struct nouveau_channel *chan,
347 } 355 }
348 356
349 list_del(&s->head); 357 list_del(&s->head);
350 *ps = *s; 358 if (ps)
359 *ps = *s;
351 kfree(s); 360 kfree(s);
352 361
353 spin_unlock_irqrestore(&dev->event_lock, flags); 362 spin_unlock_irqrestore(&dev->event_lock, flags);
diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c
index 805c0b3fcdb7..e03cd3445466 100644
--- a/drivers/gpu/drm/nouveau/nouveau_state.c
+++ b/drivers/gpu/drm/nouveau/nouveau_state.c
@@ -1118,7 +1118,7 @@ int nouveau_ioctl_getparam(struct drm_device *dev, void *data,
1118 getparam->value = 1; 1118 getparam->value = 1;
1119 break; 1119 break;
1120 case NOUVEAU_GETPARAM_HAS_PAGEFLIP: 1120 case NOUVEAU_GETPARAM_HAS_PAGEFLIP:
1121 getparam->value = (dev_priv->card_type < NV_50); 1121 getparam->value = (dev_priv->card_type < NV_C0) ? 1 : 0;
1122 break; 1122 break;
1123 case NOUVEAU_GETPARAM_GRAPH_UNITS: 1123 case NOUVEAU_GETPARAM_GRAPH_UNITS:
1124 /* NV40 and NV50 versions are quite different, but register 1124 /* NV40 and NV50 versions are quite different, but register
diff --git a/drivers/gpu/drm/nouveau/nv50_graph.c b/drivers/gpu/drm/nouveau/nv50_graph.c
index 37e21d2be95b..7b7b5e77d99e 100644
--- a/drivers/gpu/drm/nouveau/nv50_graph.c
+++ b/drivers/gpu/drm/nouveau/nv50_graph.c
@@ -409,12 +409,7 @@ static int
409nv50_graph_nvsw_mthd_page_flip(struct nouveau_channel *chan, 409nv50_graph_nvsw_mthd_page_flip(struct nouveau_channel *chan,
410 u32 class, u32 mthd, u32 data) 410 u32 class, u32 mthd, u32 data)
411{ 411{
412 struct nouveau_page_flip_state s; 412 nouveau_finish_page_flip(chan, NULL);
413
414 if (!nouveau_finish_page_flip(chan, &s)) {
415 /* XXX - Do something here */
416 }
417
418 return 0; 413 return 0;
419} 414}
420 415