void * nv50_sw_chan_dtor(struct nvkm_sw_chan *base) { struct nv50_sw_chan *chan = nv50_sw_chan(base); int i; for (i = 0; i < ARRAY_SIZE(chan->vblank.notify); i++) nvkm_notify_fini(&chan->vblank.notify[i]); return chan; }
static bool gf100_sw_chan_mthd(struct nvkm_sw_chan *base, int subc, u32 mthd, u32 data) { struct nv50_sw_chan *chan = nv50_sw_chan(base); struct nvkm_engine *engine = chan->base.object.engine; struct nvkm_device *device = engine->subdev.device; switch (mthd) { case 0x0400: chan->vblank.offset &= 0x00ffffffffULL; chan->vblank.offset |= (u64)data << 32; return true; case 0x0404: chan->vblank.offset &= 0xff00000000ULL; chan->vblank.offset |= data; return true; case 0x0408: chan->vblank.value = data; return true; case 0x040c: if (data < device->disp->vblank.index_nr) { nvkm_notify_get(&chan->vblank.notify[data]); return true; } break; case 0x600: /* MP.PM_UNK000 */ nvkm_wr32(device, 0x419e00, data); return true; case 0x644: /* MP.TRAP_WARP_ERROR_EN */ if (!(data & ~0x001ffffe)) { nvkm_wr32(device, 0x419e44, data); return true; } break; case 0x6ac: /* MP.PM_UNK0AC */ nvkm_wr32(device, 0x419eac, data); return true; default: break; } return false; }
static bool nv50_sw_chan_mthd(struct nvkm_sw_chan *base, int subc, u32 mthd, u32 data) { struct nv50_sw_chan *chan = nv50_sw_chan(base); struct nvkm_engine *engine = chan->base.object.engine; struct nvkm_device *device = engine->subdev.device; switch (mthd) { case 0x018c: chan->vblank.ctxdma = data; return true; case 0x0400: chan->vblank.offset = data; return true; case 0x0404: chan->vblank.value = data; return true; case 0x0408: if (data < device->disp->vblank.index_nr) { nvkm_notify_get(&chan->vblank.notify[data]); return true; } break; default: break; } return false; }