static void nouveau_drm_vblank_disable(struct drm_device *dev, int head) { struct nouveau_drm *drm = nouveau_drm(dev); struct nouveau_disp *pdisp = nouveau_disp(drm->device); nouveau_event_put(pdisp->vblank, head, &drm->vblank); }
int nv50_software_context_ctor(struct nouveau_object *parent, struct nouveau_object *engine, struct nouveau_oclass *oclass, void *data, u32 size, struct nouveau_object **pobject) { struct nouveau_disp *pdisp = nouveau_disp(parent); struct nv50_software_cclass *pclass = (void *)oclass; struct nv50_software_chan *chan; int ret, i; ret = nouveau_software_context_create(parent, engine, oclass, &chan); *pobject = nv_object(chan); if (ret) return ret; chan->vblank.nr_event = pdisp ? pdisp->vblank->index_nr : 0; chan->vblank.event = kzalloc(chan->vblank.nr_event * sizeof(*chan->vblank.event), GFP_KERNEL); if (!chan->vblank.event) return -ENOMEM; for (i = 0; i < chan->vblank.nr_event; i++) { ret = nouveau_event_new(pdisp->vblank, i, pclass->vblank, chan, &chan->vblank.event[i]); if (ret) return ret; } chan->vblank.channel = nv_gpuobj(parent->parent)->addr >> 12; return 0; }
static int nouveau_drm_vblank_enable(struct drm_device *dev, int head) { struct nouveau_drm *drm = nouveau_drm(dev); struct nouveau_disp *pdisp = nouveau_disp(drm->device); nouveau_event_get(pdisp->vblank, head, &drm->vblank); return 0; }
static void nouveau_drm_vblank_disable(struct drm_device *dev, int head) { struct nouveau_drm *drm = nouveau_drm(dev); struct nouveau_disp *pdisp = nouveau_disp(drm->device); if (drm->vblank[head].func) nouveau_event_put(pdisp->vblank, head, &drm->vblank[head]); else WARN_ON_ONCE(1); drm->vblank[head].func = NULL; }
static int nouveau_drm_vblank_enable(struct drm_device *dev, int head) { struct nouveau_drm *drm = nouveau_drm(dev); struct nouveau_disp *pdisp = nouveau_disp(drm->device); if (WARN_ON_ONCE(head > ARRAY_SIZE(drm->vblank))) return -EIO; WARN_ON_ONCE(drm->vblank[head].func); drm->vblank[head].func = nouveau_drm_vblank_handler; nouveau_event_get(pdisp->vblank, head, &drm->vblank[head]); return 0; }
static int nvc0_software_mthd_vblsem_release(struct nouveau_object *object, u32 mthd, void *args, u32 size) { struct nvc0_software_chan *chan = (void *)nv_engctx(object->parent); struct nouveau_disp *disp = nouveau_disp(object); u32 crtc = *(u32 *)args; if ((nv_device(object)->card_type < NV_E0 && crtc > 1) || crtc > 3) return -EINVAL; nouveau_event_get(disp->vblank, crtc, &chan->base.vblank.event); return 0; }