diff options
Diffstat (limited to 'drm/nouveau/nvkm/engine/fifo/nv50.c')
-rw-r--r-- | drm/nouveau/nvkm/engine/fifo/nv50.c | 103 |
1 files changed, 51 insertions, 52 deletions
diff --git a/drm/nouveau/nvkm/engine/fifo/nv50.c b/drm/nouveau/nvkm/engine/fifo/nv50.c index ad653e9c4..66eb12c2b 100644 --- a/drm/nouveau/nvkm/engine/fifo/nv50.c +++ b/drm/nouveau/nvkm/engine/fifo/nv50.c @@ -24,6 +24,8 @@ #include "nv50.h" #include "channv50.h" +#include <core/gpuobj.h> + static void nv50_fifo_runlist_update_locked(struct nv50_fifo *fifo) { @@ -49,22 +51,34 @@ nv50_fifo_runlist_update_locked(struct nv50_fifo *fifo) void nv50_fifo_runlist_update(struct nv50_fifo *fifo) { - mutex_lock(&nv_subdev(fifo)->mutex); + mutex_lock(&fifo->base.engine.subdev.mutex); nv50_fifo_runlist_update_locked(fifo); - mutex_unlock(&nv_subdev(fifo)->mutex); + mutex_unlock(&fifo->base.engine.subdev.mutex); } int -nv50_fifo_init(struct nvkm_object *object) +nv50_fifo_oneinit(struct nvkm_fifo *base) { - struct nv50_fifo *fifo = (void *)object; + struct nv50_fifo *fifo = nv50_fifo(base); struct nvkm_device *device = fifo->base.engine.subdev.device; - int ret, i; + int ret; - ret = nvkm_fifo_init(&fifo->base); + ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST, 128 * 4, 0x1000, + false, &fifo->runlist[0]); if (ret) return ret; + return nvkm_memory_new(device, NVKM_MEM_TARGET_INST, 128 * 4, 0x1000, + false, &fifo->runlist[1]); +} + +void +nv50_fifo_init(struct nvkm_fifo *base) +{ + struct nv50_fifo *fifo = nv50_fifo(base); + struct nvkm_device *device = fifo->base.engine.subdev.device; + int i; + nvkm_mask(device, 0x000200, 0x00000100, 0x00000000); nvkm_mask(device, 0x000200, 0x00000100, 0x00000100); nvkm_wr32(device, 0x00250c, 0x6f3cfc34); @@ -80,69 +94,54 @@ nv50_fifo_init(struct nvkm_object *object) nvkm_wr32(device, 0x003200, 0x00000001); nvkm_wr32(device, 0x003250, 0x00000001); nvkm_wr32(device, 0x002500, 0x00000001); - return 0; } -void -nv50_fifo_dtor(struct nvkm_object *object) +void * +nv50_fifo_dtor(struct nvkm_fifo *base) { - struct nv50_fifo *fifo = (void *)object; - + struct nv50_fifo *fifo = nv50_fifo(base); nvkm_memory_del(&fifo->runlist[1]); nvkm_memory_del(&fifo->runlist[0]); - - nvkm_fifo_destroy(&fifo->base); + return fifo; } -static const struct nvkm_fifo_func -nv50_fifo_func = { - .chan = { - &nv50_fifo_dma_oclass, - &nv50_fifo_gpfifo_oclass, - NULL - }, -}; - -static int -nv50_fifo_ctor(struct nvkm_object *parent, struct nvkm_object *engine, - struct nvkm_oclass *oclass, void *data, u32 size, - struct nvkm_object **pobject) +int +nv50_fifo_new_(const struct nvkm_fifo_func *func, struct nvkm_device *device, + int index, struct nvkm_fifo **pfifo) { - struct nvkm_device *device = (void *)parent; struct nv50_fifo *fifo; int ret; - ret = nvkm_fifo_create(parent, engine, oclass, 1, 127, &fifo); - *pobject = nv_object(fifo); - if (ret) - return ret; - - fifo->base.func = &nv50_fifo_func; - - ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST, 128 * 4, 0x1000, - false, &fifo->runlist[0]); - if (ret) - return ret; + if (!(fifo = kzalloc(sizeof(*fifo), GFP_KERNEL))) + return -ENOMEM; + *pfifo = &fifo->base; - ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST, 128 * 4, 0x1000, - false, &fifo->runlist[1]); + ret = nvkm_fifo_ctor(func, device, index, 128, &fifo->base); if (ret) return ret; - nv_subdev(fifo)->unit = 0x00000100; - nv_subdev(fifo)->intr = nv04_fifo_intr; - fifo->base.pause = nv04_fifo_pause; - fifo->base.start = nv04_fifo_start; + set_bit(0, fifo->base.mask); /* PIO channel */ + set_bit(127, fifo->base.mask); /* inactive channel */ return 0; } -struct nvkm_oclass * -nv50_fifo_oclass = &(struct nvkm_oclass) { - .handle = NV_ENGINE(FIFO, 0x50), - .ofuncs = &(struct nvkm_ofuncs) { - .ctor = nv50_fifo_ctor, - .dtor = nv50_fifo_dtor, - .init = nv50_fifo_init, - .fini = _nvkm_fifo_fini, +static const struct nvkm_fifo_func +nv50_fifo = { + .dtor = nv50_fifo_dtor, + .oneinit = nv50_fifo_oneinit, + .init = nv50_fifo_init, + .intr = nv04_fifo_intr, + .pause = nv04_fifo_pause, + .start = nv04_fifo_start, + .chan = { + &nv50_fifo_dma_oclass, + &nv50_fifo_gpfifo_oclass, + NULL }, }; + +int +nv50_fifo_new(struct nvkm_device *device, int index, struct nvkm_fifo **pfifo) +{ + return nv50_fifo_new_(&nv50_fifo, device, index, pfifo); +} |