Loading drivers/gpu/drm/nouveau/include/nvkm/engine/ce.h +2 −2 Original line number Diff line number Diff line #ifndef __NVKM_CE_H__ #define __NVKM_CE_H__ #include <core/engine.h> #include <engine/falcon.h> void gt215_ce_intr(struct nvkm_subdev *); void gt215_ce_intr(struct nvkm_falcon *, struct nvkm_fifo_chan *); extern struct nvkm_oclass gt215_ce_oclass; extern struct nvkm_oclass gf100_ce0_oclass; Loading drivers/gpu/drm/nouveau/include/nvkm/engine/falcon.h +12 −8 Original line number Diff line number Diff line #ifndef __NVKM_FALCON_H__ #define __NVKM_FALCON_H__ #include <core/engctx.h> struct nvkm_fifo_chan; struct nvkm_falcon_chan { struct nvkm_engctx base; Loading Loading @@ -30,6 +31,7 @@ struct nvkm_falcon_data { struct nvkm_falcon { struct nvkm_engine engine; const struct nvkm_falcon_func *func; u32 addr; u8 version; Loading @@ -51,10 +53,14 @@ struct nvkm_falcon { } data; }; struct nvkm_falcon_func { void (*intr)(struct nvkm_falcon *, struct nvkm_fifo_chan *); }; #define nv_falcon(priv) ((struct nvkm_falcon *)priv) #define nvkm_falcon_create(p,e,c,b,d,i,f,r) \ nvkm_falcon_create_((p), (e), (c), (b), (d), (i), (f), \ #define nvkm_falcon_create(a,p,e,c,b,d,i,f,r) \ nvkm_falcon_create_((a), (p), (e), (c), (b), (d), (i), (f), \ sizeof(**r),(void **)r) #define nvkm_falcon_destroy(p) \ nvkm_engine_destroy(&(p)->engine) Loading @@ -67,12 +73,10 @@ struct nvkm_falcon { _nvkm_falcon_fini(nv_object(_falcon), (s)); \ }) int nvkm_falcon_create_(struct nvkm_object *, struct nvkm_object *, int nvkm_falcon_create_(const struct nvkm_falcon_func *, struct nvkm_object *, struct nvkm_object *, struct nvkm_oclass *, u32, bool, const char *, const char *, int, void **); void nvkm_falcon_intr(struct nvkm_subdev *subdev); #define _nvkm_falcon_dtor _nvkm_engine_dtor int _nvkm_falcon_init(struct nvkm_object *); int _nvkm_falcon_fini(struct nvkm_object *, bool); Loading drivers/gpu/drm/nouveau/nvkm/engine/ce/gf100.c +9 −6 Original line number Diff line number Diff line Loading @@ -88,6 +88,11 @@ gf100_ce_init(struct nvkm_object *object) return 0; } static const struct nvkm_falcon_func gf100_ce_func = { .intr = gt215_ce_intr, }; static int gf100_ce0_ctor(struct nvkm_object *parent, struct nvkm_object *engine, struct nvkm_oclass *oclass, void *data, u32 size, Loading @@ -96,14 +101,13 @@ gf100_ce0_ctor(struct nvkm_object *parent, struct nvkm_object *engine, struct nvkm_falcon *ce; int ret; ret = nvkm_falcon_create(parent, engine, oclass, 0x104000, true, "PCE0", "ce0", &ce); ret = nvkm_falcon_create(&gf100_ce_func, parent, engine, oclass, 0x104000, true, "PCE0", "ce0", &ce); *pobject = nv_object(ce); if (ret) return ret; nv_subdev(ce)->unit = 0x00000040; nv_subdev(ce)->intr = gt215_ce_intr; nv_engine(ce)->cclass = &gf100_ce0_cclass; nv_engine(ce)->sclass = gf100_ce0_sclass; nv_falcon(ce)->code.data = gf100_ce_code; Loading @@ -121,14 +125,13 @@ gf100_ce1_ctor(struct nvkm_object *parent, struct nvkm_object *engine, struct nvkm_falcon *ce; int ret; ret = nvkm_falcon_create(parent, engine, oclass, 0x105000, true, "PCE1", "ce1", &ce); ret = nvkm_falcon_create(&gf100_ce_func, parent, engine, oclass, 0x105000, true, "PCE1", "ce1", &ce); *pobject = nv_object(ce); if (ret) return ret; nv_subdev(ce)->unit = 0x00000080; nv_subdev(ce)->intr = gt215_ce_intr; nv_engine(ce)->cclass = &gf100_ce1_cclass; nv_engine(ce)->sclass = gf100_ce1_sclass; nv_falcon(ce)->code.data = gf100_ce_code; Loading drivers/gpu/drm/nouveau/nvkm/engine/ce/gt215.c +18 −36 Original line number Diff line number Diff line Loading @@ -22,7 +22,6 @@ * Authors: Ben Skeggs */ #include <engine/ce.h> #include <engine/falcon.h> #include <engine/fifo.h> #include "fuc/gt215.fuc3.h" Loading Loading @@ -70,46 +69,30 @@ gt215_ce_isr_error_name[] = { }; void gt215_ce_intr(struct nvkm_subdev *subdev) gt215_ce_intr(struct nvkm_falcon *ce, struct nvkm_fifo_chan *chan) { struct nvkm_falcon *ce = (void *)subdev; struct nvkm_engine *engine = &ce->engine; struct nvkm_device *device = engine->subdev.device; struct nvkm_fifo *fifo = device->fifo; struct nvkm_object *engctx; const struct nvkm_enum *en; struct nvkm_subdev *subdev = &ce->engine.subdev; struct nvkm_device *device = subdev->device; const u32 base = (nv_subidx(subdev) - NVDEV_ENGINE_CE0) * 0x1000; u32 dispatch = nvkm_rd32(device, 0x10401c + base); u32 stat = nvkm_rd32(device, 0x104008 + base) & dispatch & ~(dispatch >> 16); u64 inst = nvkm_rd32(device, 0x104050 + base) & 0x3fffffff; u32 ssta = nvkm_rd32(device, 0x104040 + base) & 0x0000ffff; u32 addr = nvkm_rd32(device, 0x104040 + base) >> 16; u32 mthd = (addr & 0x07ff) << 2; u32 subc = (addr & 0x3800) >> 11; u32 data = nvkm_rd32(device, 0x104044 + base); int chid; engctx = nvkm_engctx_get(engine, inst); chid = fifo->chid(fifo, engctx); if (stat & 0x00000040) { en = nvkm_enum_find(gt215_ce_isr_error_name, ssta); nvkm_error(subdev, "DISPATCH_ERROR %04x [%s] " "ch %d [%010llx %s] subc %d " "mthd %04x data %08x\n", ssta, en ? en->name : "", chid, inst << 12, nvkm_client_name(engctx), subc, mthd, data); nvkm_wr32(device, 0x104004 + base, 0x00000040); stat &= ~0x00000040; } if (stat) { nvkm_error(subdev, "intr %08x\n", stat); nvkm_wr32(device, 0x104004 + base, stat); const struct nvkm_enum *en = nvkm_enum_find(gt215_ce_isr_error_name, ssta); nvkm_error(subdev, "DISPATCH_ERROR %04x [%s] ch %d [%010llx %s] " "subc %d mthd %04x data %08x\n", ssta, en ? en->name : "", chan ? chan->chid : -1, chan ? chan->inst : 0, nvkm_client_name(chan), subc, mthd, data); } nvkm_engctx_put(engctx); } static const struct nvkm_falcon_func gt215_ce_func = { .intr = gt215_ce_intr, }; static int gt215_ce_ctor(struct nvkm_object *parent, struct nvkm_object *engine, Loading @@ -120,14 +103,13 @@ gt215_ce_ctor(struct nvkm_object *parent, struct nvkm_object *engine, struct nvkm_falcon *ce; int ret; ret = nvkm_falcon_create(parent, engine, oclass, 0x104000, enable, "PCE0", "ce0", &ce); ret = nvkm_falcon_create(>215_ce_func, parent, engine, oclass, 0x104000, enable, "PCE0", "ce0", &ce); *pobject = nv_object(ce); if (ret) return ret; nv_subdev(ce)->unit = 0x00802000; nv_subdev(ce)->intr = gt215_ce_intr; nv_engine(ce)->cclass = >215_ce_cclass; nv_engine(ce)->sclass = gt215_ce_sclass; nv_falcon(ce)->code.data = gt215_ce_code; Loading drivers/gpu/drm/nouveau/nvkm/engine/falcon.c +23 −4 Original line number Diff line number Diff line Loading @@ -20,17 +20,31 @@ * OTHER DEALINGS IN THE SOFTWARE. */ #include <engine/falcon.h> #include <engine/fifo.h> #include <subdev/timer.h> void static void nvkm_falcon_intr(struct nvkm_subdev *subdev) { struct nvkm_falcon *falcon = (void *)subdev; struct nvkm_device *device = falcon->engine.subdev.device; const u32 base = falcon->addr; u32 dispatch = nvkm_rd32(device, base + 0x01c); u32 intr = nvkm_rd32(device, base + 0x008) & dispatch & ~(dispatch >> 16); u32 dest = nvkm_rd32(device, base + 0x01c); u32 intr = nvkm_rd32(device, base + 0x008) & dest & ~(dest >> 16); u32 inst = nvkm_rd32(device, base + 0x050) & 0x3fffffff; struct nvkm_fifo_chan *chan; unsigned long flags; chan = nvkm_fifo_chan_inst(device->fifo, (u64)inst << 12, &flags); if (intr & 0x00000040) { if (falcon->func->intr) { falcon->func->intr(falcon, chan); nvkm_wr32(device, base + 0x004, 0x00000040); intr &= ~0x00000040; } } if (intr & 0x00000010) { nvkm_debug(subdev, "ucode halted\n"); Loading @@ -42,6 +56,8 @@ nvkm_falcon_intr(struct nvkm_subdev *subdev) nvkm_error(subdev, "intr %08x\n", intr); nvkm_wr32(device, base + 0x004, intr); } nvkm_fifo_chan_put(device->fifo, flags, &chan); } static void * Loading Loading @@ -260,7 +276,8 @@ _nvkm_falcon_fini(struct nvkm_object *object, bool suspend) } int nvkm_falcon_create_(struct nvkm_object *parent, struct nvkm_object *engine, nvkm_falcon_create_(const struct nvkm_falcon_func *func, struct nvkm_object *parent, struct nvkm_object *engine, struct nvkm_oclass *oclass, u32 addr, bool enable, const char *iname, const char *fname, int length, void **pobject) Loading @@ -274,6 +291,8 @@ nvkm_falcon_create_(struct nvkm_object *parent, struct nvkm_object *engine, if (ret) return ret; falcon->engine.subdev.intr = nvkm_falcon_intr; falcon->func = func; falcon->addr = addr; return 0; } Loading
drivers/gpu/drm/nouveau/include/nvkm/engine/ce.h +2 −2 Original line number Diff line number Diff line #ifndef __NVKM_CE_H__ #define __NVKM_CE_H__ #include <core/engine.h> #include <engine/falcon.h> void gt215_ce_intr(struct nvkm_subdev *); void gt215_ce_intr(struct nvkm_falcon *, struct nvkm_fifo_chan *); extern struct nvkm_oclass gt215_ce_oclass; extern struct nvkm_oclass gf100_ce0_oclass; Loading
drivers/gpu/drm/nouveau/include/nvkm/engine/falcon.h +12 −8 Original line number Diff line number Diff line #ifndef __NVKM_FALCON_H__ #define __NVKM_FALCON_H__ #include <core/engctx.h> struct nvkm_fifo_chan; struct nvkm_falcon_chan { struct nvkm_engctx base; Loading Loading @@ -30,6 +31,7 @@ struct nvkm_falcon_data { struct nvkm_falcon { struct nvkm_engine engine; const struct nvkm_falcon_func *func; u32 addr; u8 version; Loading @@ -51,10 +53,14 @@ struct nvkm_falcon { } data; }; struct nvkm_falcon_func { void (*intr)(struct nvkm_falcon *, struct nvkm_fifo_chan *); }; #define nv_falcon(priv) ((struct nvkm_falcon *)priv) #define nvkm_falcon_create(p,e,c,b,d,i,f,r) \ nvkm_falcon_create_((p), (e), (c), (b), (d), (i), (f), \ #define nvkm_falcon_create(a,p,e,c,b,d,i,f,r) \ nvkm_falcon_create_((a), (p), (e), (c), (b), (d), (i), (f), \ sizeof(**r),(void **)r) #define nvkm_falcon_destroy(p) \ nvkm_engine_destroy(&(p)->engine) Loading @@ -67,12 +73,10 @@ struct nvkm_falcon { _nvkm_falcon_fini(nv_object(_falcon), (s)); \ }) int nvkm_falcon_create_(struct nvkm_object *, struct nvkm_object *, int nvkm_falcon_create_(const struct nvkm_falcon_func *, struct nvkm_object *, struct nvkm_object *, struct nvkm_oclass *, u32, bool, const char *, const char *, int, void **); void nvkm_falcon_intr(struct nvkm_subdev *subdev); #define _nvkm_falcon_dtor _nvkm_engine_dtor int _nvkm_falcon_init(struct nvkm_object *); int _nvkm_falcon_fini(struct nvkm_object *, bool); Loading
drivers/gpu/drm/nouveau/nvkm/engine/ce/gf100.c +9 −6 Original line number Diff line number Diff line Loading @@ -88,6 +88,11 @@ gf100_ce_init(struct nvkm_object *object) return 0; } static const struct nvkm_falcon_func gf100_ce_func = { .intr = gt215_ce_intr, }; static int gf100_ce0_ctor(struct nvkm_object *parent, struct nvkm_object *engine, struct nvkm_oclass *oclass, void *data, u32 size, Loading @@ -96,14 +101,13 @@ gf100_ce0_ctor(struct nvkm_object *parent, struct nvkm_object *engine, struct nvkm_falcon *ce; int ret; ret = nvkm_falcon_create(parent, engine, oclass, 0x104000, true, "PCE0", "ce0", &ce); ret = nvkm_falcon_create(&gf100_ce_func, parent, engine, oclass, 0x104000, true, "PCE0", "ce0", &ce); *pobject = nv_object(ce); if (ret) return ret; nv_subdev(ce)->unit = 0x00000040; nv_subdev(ce)->intr = gt215_ce_intr; nv_engine(ce)->cclass = &gf100_ce0_cclass; nv_engine(ce)->sclass = gf100_ce0_sclass; nv_falcon(ce)->code.data = gf100_ce_code; Loading @@ -121,14 +125,13 @@ gf100_ce1_ctor(struct nvkm_object *parent, struct nvkm_object *engine, struct nvkm_falcon *ce; int ret; ret = nvkm_falcon_create(parent, engine, oclass, 0x105000, true, "PCE1", "ce1", &ce); ret = nvkm_falcon_create(&gf100_ce_func, parent, engine, oclass, 0x105000, true, "PCE1", "ce1", &ce); *pobject = nv_object(ce); if (ret) return ret; nv_subdev(ce)->unit = 0x00000080; nv_subdev(ce)->intr = gt215_ce_intr; nv_engine(ce)->cclass = &gf100_ce1_cclass; nv_engine(ce)->sclass = gf100_ce1_sclass; nv_falcon(ce)->code.data = gf100_ce_code; Loading
drivers/gpu/drm/nouveau/nvkm/engine/ce/gt215.c +18 −36 Original line number Diff line number Diff line Loading @@ -22,7 +22,6 @@ * Authors: Ben Skeggs */ #include <engine/ce.h> #include <engine/falcon.h> #include <engine/fifo.h> #include "fuc/gt215.fuc3.h" Loading Loading @@ -70,46 +69,30 @@ gt215_ce_isr_error_name[] = { }; void gt215_ce_intr(struct nvkm_subdev *subdev) gt215_ce_intr(struct nvkm_falcon *ce, struct nvkm_fifo_chan *chan) { struct nvkm_falcon *ce = (void *)subdev; struct nvkm_engine *engine = &ce->engine; struct nvkm_device *device = engine->subdev.device; struct nvkm_fifo *fifo = device->fifo; struct nvkm_object *engctx; const struct nvkm_enum *en; struct nvkm_subdev *subdev = &ce->engine.subdev; struct nvkm_device *device = subdev->device; const u32 base = (nv_subidx(subdev) - NVDEV_ENGINE_CE0) * 0x1000; u32 dispatch = nvkm_rd32(device, 0x10401c + base); u32 stat = nvkm_rd32(device, 0x104008 + base) & dispatch & ~(dispatch >> 16); u64 inst = nvkm_rd32(device, 0x104050 + base) & 0x3fffffff; u32 ssta = nvkm_rd32(device, 0x104040 + base) & 0x0000ffff; u32 addr = nvkm_rd32(device, 0x104040 + base) >> 16; u32 mthd = (addr & 0x07ff) << 2; u32 subc = (addr & 0x3800) >> 11; u32 data = nvkm_rd32(device, 0x104044 + base); int chid; engctx = nvkm_engctx_get(engine, inst); chid = fifo->chid(fifo, engctx); if (stat & 0x00000040) { en = nvkm_enum_find(gt215_ce_isr_error_name, ssta); nvkm_error(subdev, "DISPATCH_ERROR %04x [%s] " "ch %d [%010llx %s] subc %d " "mthd %04x data %08x\n", ssta, en ? en->name : "", chid, inst << 12, nvkm_client_name(engctx), subc, mthd, data); nvkm_wr32(device, 0x104004 + base, 0x00000040); stat &= ~0x00000040; } if (stat) { nvkm_error(subdev, "intr %08x\n", stat); nvkm_wr32(device, 0x104004 + base, stat); const struct nvkm_enum *en = nvkm_enum_find(gt215_ce_isr_error_name, ssta); nvkm_error(subdev, "DISPATCH_ERROR %04x [%s] ch %d [%010llx %s] " "subc %d mthd %04x data %08x\n", ssta, en ? en->name : "", chan ? chan->chid : -1, chan ? chan->inst : 0, nvkm_client_name(chan), subc, mthd, data); } nvkm_engctx_put(engctx); } static const struct nvkm_falcon_func gt215_ce_func = { .intr = gt215_ce_intr, }; static int gt215_ce_ctor(struct nvkm_object *parent, struct nvkm_object *engine, Loading @@ -120,14 +103,13 @@ gt215_ce_ctor(struct nvkm_object *parent, struct nvkm_object *engine, struct nvkm_falcon *ce; int ret; ret = nvkm_falcon_create(parent, engine, oclass, 0x104000, enable, "PCE0", "ce0", &ce); ret = nvkm_falcon_create(>215_ce_func, parent, engine, oclass, 0x104000, enable, "PCE0", "ce0", &ce); *pobject = nv_object(ce); if (ret) return ret; nv_subdev(ce)->unit = 0x00802000; nv_subdev(ce)->intr = gt215_ce_intr; nv_engine(ce)->cclass = >215_ce_cclass; nv_engine(ce)->sclass = gt215_ce_sclass; nv_falcon(ce)->code.data = gt215_ce_code; Loading
drivers/gpu/drm/nouveau/nvkm/engine/falcon.c +23 −4 Original line number Diff line number Diff line Loading @@ -20,17 +20,31 @@ * OTHER DEALINGS IN THE SOFTWARE. */ #include <engine/falcon.h> #include <engine/fifo.h> #include <subdev/timer.h> void static void nvkm_falcon_intr(struct nvkm_subdev *subdev) { struct nvkm_falcon *falcon = (void *)subdev; struct nvkm_device *device = falcon->engine.subdev.device; const u32 base = falcon->addr; u32 dispatch = nvkm_rd32(device, base + 0x01c); u32 intr = nvkm_rd32(device, base + 0x008) & dispatch & ~(dispatch >> 16); u32 dest = nvkm_rd32(device, base + 0x01c); u32 intr = nvkm_rd32(device, base + 0x008) & dest & ~(dest >> 16); u32 inst = nvkm_rd32(device, base + 0x050) & 0x3fffffff; struct nvkm_fifo_chan *chan; unsigned long flags; chan = nvkm_fifo_chan_inst(device->fifo, (u64)inst << 12, &flags); if (intr & 0x00000040) { if (falcon->func->intr) { falcon->func->intr(falcon, chan); nvkm_wr32(device, base + 0x004, 0x00000040); intr &= ~0x00000040; } } if (intr & 0x00000010) { nvkm_debug(subdev, "ucode halted\n"); Loading @@ -42,6 +56,8 @@ nvkm_falcon_intr(struct nvkm_subdev *subdev) nvkm_error(subdev, "intr %08x\n", intr); nvkm_wr32(device, base + 0x004, intr); } nvkm_fifo_chan_put(device->fifo, flags, &chan); } static void * Loading Loading @@ -260,7 +276,8 @@ _nvkm_falcon_fini(struct nvkm_object *object, bool suspend) } int nvkm_falcon_create_(struct nvkm_object *parent, struct nvkm_object *engine, nvkm_falcon_create_(const struct nvkm_falcon_func *func, struct nvkm_object *parent, struct nvkm_object *engine, struct nvkm_oclass *oclass, u32 addr, bool enable, const char *iname, const char *fname, int length, void **pobject) Loading @@ -274,6 +291,8 @@ nvkm_falcon_create_(struct nvkm_object *parent, struct nvkm_object *engine, if (ret) return ret; falcon->engine.subdev.intr = nvkm_falcon_intr; falcon->func = func; falcon->addr = addr; return 0; }