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 nv04_software_context_ctor(struct nouveau_object *parent, struct nouveau_object *engine, struct nouveau_oclass *oclass, void *data, u32 size, struct nouveau_object **pobject) { struct nv04_software_chan *chan; int ret; ret = nouveau_software_context_create(parent, engine, oclass, &chan); *pobject = nv_object(chan); if (ret) return ret; return 0; }
static int nvc0_software_context_ctor(struct nouveau_object *parent, struct nouveau_object *engine, struct nouveau_oclass *oclass, void *data, u32 size, struct nouveau_object **pobject) { struct nvc0_software_chan *chan; int ret; nv_warn(parent, "[%s]\n", __PRETTY_FUNCTION__); ret = nouveau_software_context_create(parent, engine, oclass, &chan); *pobject = nv_object(chan); if (ret) return ret; chan->base.vblank.channel = nv_gpuobj(parent->parent)->addr >> 12; chan->base.vblank.event.func = nvc0_software_vblsem_release; return 0; }