Commit 3376ee37 authored by Ben Skeggs's avatar Ben Skeggs

drm/nvd0/disp: add support for page flipping

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 4acd4293
...@@ -466,7 +466,10 @@ nouveau_crtc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb, ...@@ -466,7 +466,10 @@ nouveau_crtc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb,
/* Emit a page flip */ /* Emit a page flip */
if (dev_priv->card_type >= NV_50) { if (dev_priv->card_type >= NV_50) {
ret = nv50_display_flip_next(crtc, fb, chan); if (dev_priv->card_type >= NV_D0)
ret = nvd0_display_flip_next(crtc, fb, chan, 0);
else
ret = nv50_display_flip_next(crtc, fb, chan);
if (ret) { if (ret) {
nouveau_channel_put(&chan); nouveau_channel_put(&chan);
goto fail_unreserve; goto fail_unreserve;
......
...@@ -1353,6 +1353,10 @@ extern int nvd0_display_create(struct drm_device *); ...@@ -1353,6 +1353,10 @@ extern int nvd0_display_create(struct drm_device *);
extern void nvd0_display_destroy(struct drm_device *); extern void nvd0_display_destroy(struct drm_device *);
extern int nvd0_display_init(struct drm_device *); extern int nvd0_display_init(struct drm_device *);
extern void nvd0_display_fini(struct drm_device *); extern void nvd0_display_fini(struct drm_device *);
struct nouveau_bo *nvd0_display_crtc_sema(struct drm_device *, int crtc);
void nvd0_display_flip_stop(struct drm_crtc *);
int nvd0_display_flip_next(struct drm_crtc *, struct drm_framebuffer *,
struct nouveau_channel *, u32 swap_interval);
/* nv04_crtc.c */ /* nv04_crtc.c */
extern int nv04_crtc_create(struct drm_device *, int index); extern int nv04_crtc_create(struct drm_device *, int index);
......
...@@ -723,14 +723,14 @@ nvc0_gpuobj_channel_init(struct nouveau_channel *chan, struct nouveau_vm *vm) ...@@ -723,14 +723,14 @@ nvc0_gpuobj_channel_init(struct nouveau_channel *chan, struct nouveau_vm *vm)
nv_wo32(chan->ramin, 0x020c, 0x000000ff); nv_wo32(chan->ramin, 0x020c, 0x000000ff);
/* map display semaphore buffers into channel's vm */ /* map display semaphore buffers into channel's vm */
if (dev_priv->card_type >= NV_D0) for (i = 0; i < dev->mode_config.num_crtc; i++) {
return 0; struct nouveau_bo *bo;
if (dev_priv->card_type >= NV_D0)
for (i = 0; i < 2; i++) { bo = nvd0_display_crtc_sema(dev, i);
struct nv50_display_crtc *dispc = &nv50_display(dev)->crtc[i]; else
bo = nv50_display(dev)->crtc[i].sem.bo;
ret = nouveau_bo_vma_add(dispc->sem.bo, chan->vm,
&chan->dispc_vma[i]); ret = nouveau_bo_vma_add(bo, chan->vm, &chan->dispc_vma[i]);
if (ret) if (ret)
return ret; return ret;
} }
...@@ -879,9 +879,14 @@ nouveau_gpuobj_channel_takedown(struct nouveau_channel *chan) ...@@ -879,9 +879,14 @@ nouveau_gpuobj_channel_takedown(struct nouveau_channel *chan)
NV_DEBUG(dev, "ch%d\n", chan->id); NV_DEBUG(dev, "ch%d\n", chan->id);
if (dev_priv->card_type >= NV_50 && dev_priv->card_type <= NV_C0) { if (dev_priv->card_type >= NV_D0) {
for (i = 0; i < dev->mode_config.num_crtc; i++) {
struct nouveau_bo *bo = nvd0_display_crtc_sema(dev, i);
nouveau_bo_vma_del(bo, &chan->dispc_vma[i]);
}
} else
if (dev_priv->card_type >= NV_50) {
struct nv50_display *disp = nv50_display(dev); struct nv50_display *disp = nv50_display(dev);
for (i = 0; i < dev->mode_config.num_crtc; i++) { for (i = 0; i < dev->mode_config.num_crtc; i++) {
struct nv50_display_crtc *dispc = &disp->crtc[i]; struct nv50_display_crtc *dispc = &disp->crtc[i];
nouveau_bo_vma_del(dispc->sem.bo, &chan->dispc_vma[i]); nouveau_bo_vma_del(dispc->sem.bo, &chan->dispc_vma[i]);
......
...@@ -1244,7 +1244,7 @@ int nouveau_ioctl_getparam(struct drm_device *dev, void *data, ...@@ -1244,7 +1244,7 @@ int nouveau_ioctl_getparam(struct drm_device *dev, void *data,
getparam->value = 1; getparam->value = 1;
break; break;
case NOUVEAU_GETPARAM_HAS_PAGEFLIP: case NOUVEAU_GETPARAM_HAS_PAGEFLIP:
getparam->value = dev_priv->card_type < NV_D0; getparam->value = 1;
break; break;
case NOUVEAU_GETPARAM_GRAPH_UNITS: case NOUVEAU_GETPARAM_GRAPH_UNITS:
/* NV40 and NV50 versions are quite different, but register /* NV40 and NV50 versions are quite different, but register
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment