Loading drivers/gpu/drm/nouveau/nvkm/engine/fifo/cgrp.h 0 → 100644 +11 −0 Original line number Diff line number Diff line #ifndef __NVKM_FIFO_CGRP_H__ #define __NVKM_FIFO_CGRP_H__ #include "priv.h" struct nvkm_fifo_cgrp { int id; struct list_head head; struct list_head chan; int chan_nr; }; #endif drivers/gpu/drm/nouveau/nvkm/engine/fifo/changk104.h +1 −0 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ struct gk104_fifo_chan { struct gk104_fifo *fifo; int runl; struct nvkm_fifo_cgrp *cgrp; struct list_head head; bool killed; Loading drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c +24 −2 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ * Authors: Ben Skeggs */ #include "gk104.h" #include "cgrp.h" #include "changk104.h" #include <core/client.h> Loading Loading @@ -145,6 +146,7 @@ gk104_fifo_runlist_commit(struct gk104_fifo *fifo, int runl) struct nvkm_subdev *subdev = &fifo->base.engine.subdev; struct nvkm_device *device = subdev->device; struct nvkm_memory *mem; struct nvkm_fifo_cgrp *cgrp; int nr = 0; int target; Loading @@ -156,6 +158,13 @@ gk104_fifo_runlist_commit(struct gk104_fifo *fifo, int runl) list_for_each_entry(chan, &fifo->runlist[runl].chan, head) { func->chan(chan, mem, nr++ * func->size); } list_for_each_entry(cgrp, &fifo->runlist[runl].cgrp, head) { func->cgrp(cgrp, mem, nr++ * func->size); list_for_each_entry(chan, &cgrp->chan, head) { func->chan(chan, mem, nr++ * func->size); } } nvkm_done(mem); switch (nvkm_memory_target(mem)) { Loading @@ -182,16 +191,28 @@ gk104_fifo_runlist_commit(struct gk104_fifo *fifo, int runl) void gk104_fifo_runlist_remove(struct gk104_fifo *fifo, struct gk104_fifo_chan *chan) { struct nvkm_fifo_cgrp *cgrp = chan->cgrp; mutex_lock(&fifo->base.engine.subdev.mutex); if (!list_empty(&chan->head)) { list_del_init(&chan->head); if (cgrp && !--cgrp->chan_nr) list_del_init(&cgrp->head); } mutex_unlock(&fifo->base.engine.subdev.mutex); } void gk104_fifo_runlist_insert(struct gk104_fifo *fifo, struct gk104_fifo_chan *chan) { struct nvkm_fifo_cgrp *cgrp = chan->cgrp; mutex_lock(&fifo->base.engine.subdev.mutex); if (cgrp) { if (!cgrp->chan_nr++) list_add_tail(&cgrp->head, &fifo->runlist[chan->runl].cgrp); list_add_tail(&chan->head, &cgrp->chan); } else { list_add_tail(&chan->head, &fifo->runlist[chan->runl].chan); } mutex_unlock(&fifo->base.engine.subdev.mutex); } Loading Loading @@ -898,6 +919,7 @@ gk104_fifo_oneinit(struct nvkm_fifo *base) } init_waitqueue_head(&fifo->runlist[i].wait); INIT_LIST_HEAD(&fifo->runlist[i].cgrp); INIT_LIST_HEAD(&fifo->runlist[i].chan); } Loading drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.h +8 −1 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ #define __GK104_FIFO_H__ #define gk104_fifo(p) container_of((p), struct gk104_fifo, base) #include "priv.h" struct nvkm_fifo_cgrp; #include <core/enum.h> #include <subdev/mmu.h> Loading Loading @@ -31,6 +32,7 @@ struct gk104_fifo { struct nvkm_memory *mem[2]; int next; wait_queue_head_t wait; struct list_head cgrp; struct list_head chan; u32 engm; } runlist[16]; Loading @@ -53,6 +55,8 @@ struct gk104_fifo_func { const struct gk104_fifo_runlist_func { u8 size; void (*cgrp)(struct nvkm_fifo_cgrp *, struct nvkm_memory *, u32 offset); void (*chan)(struct gk104_fifo_chan *, struct nvkm_memory *, u32 offset); } *runlist; Loading @@ -71,7 +75,6 @@ void gk104_fifo_runlist_remove(struct gk104_fifo *, struct gk104_fifo_chan *); void gk104_fifo_runlist_commit(struct gk104_fifo *, int runl); extern const struct nvkm_enum gk104_fifo_fault_access[]; extern const struct nvkm_enum gk104_fifo_fault_engine[]; extern const struct nvkm_enum gk104_fifo_fault_reason[]; extern const struct nvkm_enum gk104_fifo_fault_hubclient[]; Loading @@ -80,6 +83,10 @@ extern const struct gk104_fifo_runlist_func gk104_fifo_runlist; void gk104_fifo_runlist_chan(struct gk104_fifo_chan *, struct nvkm_memory *, u32); extern const struct gk104_fifo_runlist_func gk110_fifo_runlist; void gk110_fifo_runlist_cgrp(struct nvkm_fifo_cgrp *, struct nvkm_memory *, u32); extern const struct nvkm_enum gm107_fifo_fault_engine[]; extern const struct nvkm_enum gp100_fifo_fault_engine[]; #endif drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk110.c +20 −1 Original line number Diff line number Diff line Loading @@ -22,10 +22,29 @@ * Authors: Ben Skeggs */ #include "gk104.h" #include "cgrp.h" #include "changk104.h" #include <core/memory.h> #include <nvif/class.h> void gk110_fifo_runlist_cgrp(struct nvkm_fifo_cgrp *cgrp, struct nvkm_memory *memory, u32 offset) { nvkm_wo32(memory, offset + 0, (cgrp->chan_nr << 26) | (128 << 18) | (3 << 14) | 0x00002000 | cgrp->id); nvkm_wo32(memory, offset + 4, 0x00000000); } const struct gk104_fifo_runlist_func gk110_fifo_runlist = { .size = 8, .cgrp = gk110_fifo_runlist_cgrp, .chan = gk104_fifo_runlist_chan, }; static const struct gk104_fifo_func gk110_fifo = { .fault.access = gk104_fifo_fault_access, Loading @@ -33,7 +52,7 @@ gk110_fifo = { .fault.reason = gk104_fifo_fault_reason, .fault.hubclient = gk104_fifo_fault_hubclient, .fault.gpcclient = gk104_fifo_fault_gpcclient, .runlist = &gk104_fifo_runlist, .runlist = &gk110_fifo_runlist, .chan = {{0,0,KEPLER_CHANNEL_GPFIFO_B}, gk104_fifo_gpfifo_new }, }; Loading Loading
drivers/gpu/drm/nouveau/nvkm/engine/fifo/cgrp.h 0 → 100644 +11 −0 Original line number Diff line number Diff line #ifndef __NVKM_FIFO_CGRP_H__ #define __NVKM_FIFO_CGRP_H__ #include "priv.h" struct nvkm_fifo_cgrp { int id; struct list_head head; struct list_head chan; int chan_nr; }; #endif
drivers/gpu/drm/nouveau/nvkm/engine/fifo/changk104.h +1 −0 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ struct gk104_fifo_chan { struct gk104_fifo *fifo; int runl; struct nvkm_fifo_cgrp *cgrp; struct list_head head; bool killed; Loading
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c +24 −2 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ * Authors: Ben Skeggs */ #include "gk104.h" #include "cgrp.h" #include "changk104.h" #include <core/client.h> Loading Loading @@ -145,6 +146,7 @@ gk104_fifo_runlist_commit(struct gk104_fifo *fifo, int runl) struct nvkm_subdev *subdev = &fifo->base.engine.subdev; struct nvkm_device *device = subdev->device; struct nvkm_memory *mem; struct nvkm_fifo_cgrp *cgrp; int nr = 0; int target; Loading @@ -156,6 +158,13 @@ gk104_fifo_runlist_commit(struct gk104_fifo *fifo, int runl) list_for_each_entry(chan, &fifo->runlist[runl].chan, head) { func->chan(chan, mem, nr++ * func->size); } list_for_each_entry(cgrp, &fifo->runlist[runl].cgrp, head) { func->cgrp(cgrp, mem, nr++ * func->size); list_for_each_entry(chan, &cgrp->chan, head) { func->chan(chan, mem, nr++ * func->size); } } nvkm_done(mem); switch (nvkm_memory_target(mem)) { Loading @@ -182,16 +191,28 @@ gk104_fifo_runlist_commit(struct gk104_fifo *fifo, int runl) void gk104_fifo_runlist_remove(struct gk104_fifo *fifo, struct gk104_fifo_chan *chan) { struct nvkm_fifo_cgrp *cgrp = chan->cgrp; mutex_lock(&fifo->base.engine.subdev.mutex); if (!list_empty(&chan->head)) { list_del_init(&chan->head); if (cgrp && !--cgrp->chan_nr) list_del_init(&cgrp->head); } mutex_unlock(&fifo->base.engine.subdev.mutex); } void gk104_fifo_runlist_insert(struct gk104_fifo *fifo, struct gk104_fifo_chan *chan) { struct nvkm_fifo_cgrp *cgrp = chan->cgrp; mutex_lock(&fifo->base.engine.subdev.mutex); if (cgrp) { if (!cgrp->chan_nr++) list_add_tail(&cgrp->head, &fifo->runlist[chan->runl].cgrp); list_add_tail(&chan->head, &cgrp->chan); } else { list_add_tail(&chan->head, &fifo->runlist[chan->runl].chan); } mutex_unlock(&fifo->base.engine.subdev.mutex); } Loading Loading @@ -898,6 +919,7 @@ gk104_fifo_oneinit(struct nvkm_fifo *base) } init_waitqueue_head(&fifo->runlist[i].wait); INIT_LIST_HEAD(&fifo->runlist[i].cgrp); INIT_LIST_HEAD(&fifo->runlist[i].chan); } Loading
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.h +8 −1 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ #define __GK104_FIFO_H__ #define gk104_fifo(p) container_of((p), struct gk104_fifo, base) #include "priv.h" struct nvkm_fifo_cgrp; #include <core/enum.h> #include <subdev/mmu.h> Loading Loading @@ -31,6 +32,7 @@ struct gk104_fifo { struct nvkm_memory *mem[2]; int next; wait_queue_head_t wait; struct list_head cgrp; struct list_head chan; u32 engm; } runlist[16]; Loading @@ -53,6 +55,8 @@ struct gk104_fifo_func { const struct gk104_fifo_runlist_func { u8 size; void (*cgrp)(struct nvkm_fifo_cgrp *, struct nvkm_memory *, u32 offset); void (*chan)(struct gk104_fifo_chan *, struct nvkm_memory *, u32 offset); } *runlist; Loading @@ -71,7 +75,6 @@ void gk104_fifo_runlist_remove(struct gk104_fifo *, struct gk104_fifo_chan *); void gk104_fifo_runlist_commit(struct gk104_fifo *, int runl); extern const struct nvkm_enum gk104_fifo_fault_access[]; extern const struct nvkm_enum gk104_fifo_fault_engine[]; extern const struct nvkm_enum gk104_fifo_fault_reason[]; extern const struct nvkm_enum gk104_fifo_fault_hubclient[]; Loading @@ -80,6 +83,10 @@ extern const struct gk104_fifo_runlist_func gk104_fifo_runlist; void gk104_fifo_runlist_chan(struct gk104_fifo_chan *, struct nvkm_memory *, u32); extern const struct gk104_fifo_runlist_func gk110_fifo_runlist; void gk110_fifo_runlist_cgrp(struct nvkm_fifo_cgrp *, struct nvkm_memory *, u32); extern const struct nvkm_enum gm107_fifo_fault_engine[]; extern const struct nvkm_enum gp100_fifo_fault_engine[]; #endif
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk110.c +20 −1 Original line number Diff line number Diff line Loading @@ -22,10 +22,29 @@ * Authors: Ben Skeggs */ #include "gk104.h" #include "cgrp.h" #include "changk104.h" #include <core/memory.h> #include <nvif/class.h> void gk110_fifo_runlist_cgrp(struct nvkm_fifo_cgrp *cgrp, struct nvkm_memory *memory, u32 offset) { nvkm_wo32(memory, offset + 0, (cgrp->chan_nr << 26) | (128 << 18) | (3 << 14) | 0x00002000 | cgrp->id); nvkm_wo32(memory, offset + 4, 0x00000000); } const struct gk104_fifo_runlist_func gk110_fifo_runlist = { .size = 8, .cgrp = gk110_fifo_runlist_cgrp, .chan = gk104_fifo_runlist_chan, }; static const struct gk104_fifo_func gk110_fifo = { .fault.access = gk104_fifo_fault_access, Loading @@ -33,7 +52,7 @@ gk110_fifo = { .fault.reason = gk104_fifo_fault_reason, .fault.hubclient = gk104_fifo_fault_hubclient, .fault.gpcclient = gk104_fifo_fault_gpcclient, .runlist = &gk104_fifo_runlist, .runlist = &gk110_fifo_runlist, .chan = {{0,0,KEPLER_CHANNEL_GPFIFO_B}, gk104_fifo_gpfifo_new }, }; Loading