Loading drivers/gpu/drm/nouveau/include/nvif/class.h +3 −0 Original line number Diff line number Diff line Loading @@ -45,6 +45,9 @@ #define GM107_DISP 0x00009470 #define GM204_DISP 0x00009570 #define NV31_MPEG 0x00003174 #define G82_MPEG 0x00008274 #define NV74_VP2 0x00007476 #define NV50_DISP_CURSOR 0x0000507a Loading drivers/gpu/drm/nouveau/include/nvkm/engine/mpeg.h +0 −24 Original line number Diff line number Diff line #ifndef __NVKM_MPEG_H__ #define __NVKM_MPEG_H__ #include <core/engctx.h> struct nvkm_mpeg_chan { struct nvkm_engctx base; }; #define nvkm_mpeg_context_create(p,e,c,g,s,a,f,d) \ nvkm_engctx_create((p), (e), (c), (g), (s), (a), (f), (d)) #define nvkm_mpeg_context_destroy(d) \ nvkm_engctx_destroy(&(d)->base) #define nvkm_mpeg_context_init(d) \ nvkm_engctx_init(&(d)->base) #define nvkm_mpeg_context_fini(d,s) \ nvkm_engctx_fini(&(d)->base, (s)) #define _nvkm_mpeg_context_dtor _nvkm_engctx_dtor #define _nvkm_mpeg_context_init _nvkm_engctx_init #define _nvkm_mpeg_context_fini _nvkm_engctx_fini #define _nvkm_mpeg_context_rd32 _nvkm_engctx_rd32 #define _nvkm_mpeg_context_wr32 _nvkm_engctx_wr32 #include <core/engine.h> struct nvkm_mpeg { Loading @@ -45,9 +24,6 @@ extern struct nvkm_oclass nv40_mpeg_oclass; extern struct nvkm_oclass nv44_mpeg_oclass; extern struct nvkm_oclass nv50_mpeg_oclass; extern struct nvkm_oclass g84_mpeg_oclass; extern struct nvkm_ofuncs nv31_mpeg_ofuncs; extern struct nvkm_oclass nv31_mpeg_cclass; extern struct nvkm_oclass nv31_mpeg_sclass[]; extern struct nvkm_oclass nv40_mpeg_sclass[]; void nv31_mpeg_intr(struct nvkm_subdev *); void nv31_mpeg_tile_prog(struct nvkm_engine *, int); Loading drivers/gpu/drm/nouveau/nvkm/engine/mpeg/g84.c +11 −35 Original line number Diff line number Diff line Loading @@ -21,43 +21,19 @@ * * Authors: Ben Skeggs */ #include <engine/mpeg.h> #include "priv.h" struct g84_mpeg_chan { struct nvkm_mpeg_chan base; }; /******************************************************************************* * MPEG object classes ******************************************************************************/ #include <nvif/class.h> static struct nvkm_oclass g84_mpeg_sclass[] = { { 0x8274, &nv50_mpeg_ofuncs }, static const struct nvkm_engine_func g84_mpeg = { .cclass = &nv50_mpeg_cclass, .sclass = { { -1, -1, G82_MPEG, &nv31_mpeg_object }, {} } }; /******************************************************************************* * PMPEG context ******************************************************************************/ static struct nvkm_oclass g84_mpeg_cclass = { .handle = NV_ENGCTX(MPEG, 0x84), .ofuncs = &(struct nvkm_ofuncs) { .ctor = nv50_mpeg_context_ctor, .dtor = _nvkm_mpeg_context_dtor, .init = _nvkm_mpeg_context_init, .fini = _nvkm_mpeg_context_fini, .rd32 = _nvkm_mpeg_context_rd32, .wr32 = _nvkm_mpeg_context_wr32, }, }; /******************************************************************************* * PMPEG engine/subdev functions ******************************************************************************/ static int g84_mpeg_ctor(struct nvkm_object *parent, struct nvkm_object *engine, struct nvkm_oclass *oclass, void *data, u32 size, Loading @@ -71,10 +47,10 @@ g84_mpeg_ctor(struct nvkm_object *parent, struct nvkm_object *engine, if (ret) return ret; mpeg->engine.func = &g84_mpeg; nv_subdev(mpeg)->unit = 0x00000002; nv_subdev(mpeg)->intr = nv50_mpeg_intr; nv_engine(mpeg)->cclass = &g84_mpeg_cclass; nv_engine(mpeg)->sclass = g84_mpeg_sclass; return 0; } Loading drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv31.c +96 −110 Original line number Diff line number Diff line Loading @@ -26,33 +26,99 @@ #include <core/client.h> #include <subdev/fb.h> #include <subdev/timer.h> #include <engine/fifo.h> #include <nvif/class.h> /******************************************************************************* * MPEG object classes ******************************************************************************/ static int nv31_mpeg_object_ctor(struct nvkm_object *parent, struct nvkm_object *engine, struct nvkm_oclass *oclass, void *data, u32 size, nv31_mpeg_object_bind(struct nvkm_object *object, struct nvkm_gpuobj *parent, int align, struct nvkm_gpuobj **pgpuobj) { int ret = nvkm_gpuobj_new(object->engine->subdev.device, 16, align, false, parent, pgpuobj); if (ret == 0) { nvkm_kmap(*pgpuobj); nvkm_wo32(*pgpuobj, 0x00, object->oclass_name); nvkm_wo32(*pgpuobj, 0x04, 0x00000000); nvkm_wo32(*pgpuobj, 0x08, 0x00000000); nvkm_wo32(*pgpuobj, 0x0c, 0x00000000); nvkm_done(*pgpuobj); } return ret; } const struct nvkm_object_func nv31_mpeg_object = { .bind = nv31_mpeg_object_bind, }; /******************************************************************************* * PMPEG context ******************************************************************************/ static void * nv31_mpeg_chan_dtor(struct nvkm_object *object) { struct nv31_mpeg_chan *chan = nv31_mpeg_chan(object); struct nv31_mpeg *mpeg = chan->mpeg; unsigned long flags; spin_lock_irqsave(&mpeg->base.engine.lock, flags); if (mpeg->chan == chan) mpeg->chan = NULL; spin_unlock_irqrestore(&mpeg->base.engine.lock, flags); return chan; } static const struct nvkm_object_func nv31_mpeg_chan = { .dtor = nv31_mpeg_chan_dtor, }; int nv31_mpeg_chan_new(struct nvkm_fifo_chan *fifoch, const struct nvkm_oclass *oclass, struct nvkm_object **pobject) { struct nvkm_gpuobj *obj; int ret; struct nv31_mpeg *mpeg = nv31_mpeg(oclass->engine); struct nv31_mpeg_chan *chan; unsigned long flags; int ret = -EBUSY; ret = nvkm_gpuobj_create(parent, engine, oclass, 0, parent, 20, 16, 0, &obj); *pobject = nv_object(obj); if (ret) if (!(chan = kzalloc(sizeof(*chan), GFP_KERNEL))) return -ENOMEM; nvkm_object_ctor(&nv31_mpeg_chan, oclass, &chan->object); chan->mpeg = mpeg; chan->fifo = fifoch; *pobject = &chan->object; spin_lock_irqsave(&mpeg->base.engine.lock, flags); if (!mpeg->chan) { mpeg->chan = chan; ret = 0; } spin_unlock_irqrestore(&mpeg->base.engine.lock, flags); return ret; } nvkm_kmap(obj); nvkm_wo32(obj, 0x00, nv_mclass(obj)); nvkm_wo32(obj, 0x04, 0x00000000); nvkm_wo32(obj, 0x08, 0x00000000); nvkm_wo32(obj, 0x0c, 0x00000000); nvkm_done(obj); return 0; /******************************************************************************* * PMPEG engine/subdev functions ******************************************************************************/ void nv31_mpeg_tile_prog(struct nvkm_engine *engine, int i) { struct nv31_mpeg *mpeg = (void *)engine; struct nvkm_device *device = mpeg->base.engine.subdev.device; struct nvkm_fb_tile *tile = &device->fb->tile.region[i]; nvkm_wr32(device, 0x00b008 + (i * 0x10), tile->pitch); nvkm_wr32(device, 0x00b004 + (i * 0x10), tile->limit); nvkm_wr32(device, 0x00b000 + (i * 0x10), tile->addr); } static bool Loading Loading @@ -109,95 +175,6 @@ nv31_mpeg_mthd(struct nv31_mpeg *mpeg, u32 mthd, u32 data) return false; } struct nvkm_ofuncs nv31_mpeg_ofuncs = { .ctor = nv31_mpeg_object_ctor, .dtor = _nvkm_gpuobj_dtor, .init = _nvkm_gpuobj_init, .fini = _nvkm_gpuobj_fini, .rd32 = _nvkm_gpuobj_rd32, .wr32 = _nvkm_gpuobj_wr32, }; struct nvkm_oclass nv31_mpeg_sclass[] = { { 0x3174, &nv31_mpeg_ofuncs }, {} }; /******************************************************************************* * PMPEG context ******************************************************************************/ static int nv31_mpeg_context_ctor(struct nvkm_object *parent, struct nvkm_object *engine, struct nvkm_oclass *oclass, void *data, u32 size, struct nvkm_object **pobject) { struct nv31_mpeg *mpeg = (void *)engine; struct nv31_mpeg_chan *chan; unsigned long flags; int ret; ret = nvkm_object_create(parent, engine, oclass, 0, &chan); *pobject = nv_object(chan); if (ret) return ret; spin_lock_irqsave(&nv_engine(mpeg)->lock, flags); if (mpeg->chan) { spin_unlock_irqrestore(&nv_engine(mpeg)->lock, flags); nvkm_object_destroy(&chan->base); *pobject = NULL; return -EBUSY; } chan->fifo = nvkm_fifo_chan(parent); mpeg->chan = chan; spin_unlock_irqrestore(&nv_engine(mpeg)->lock, flags); return 0; } static void nv31_mpeg_context_dtor(struct nvkm_object *object) { struct nv31_mpeg *mpeg = (void *)object->engine; struct nv31_mpeg_chan *chan = (void *)object; unsigned long flags; spin_lock_irqsave(&nv_engine(mpeg)->lock, flags); mpeg->chan = NULL; spin_unlock_irqrestore(&nv_engine(mpeg)->lock, flags); nvkm_object_destroy(&chan->base); } struct nvkm_oclass nv31_mpeg_cclass = { .handle = NV_ENGCTX(MPEG, 0x31), .ofuncs = &(struct nvkm_ofuncs) { .ctor = nv31_mpeg_context_ctor, .dtor = nv31_mpeg_context_dtor, .init = _nvkm_object_init, .fini = _nvkm_object_fini, }, }; /******************************************************************************* * PMPEG engine/subdev functions ******************************************************************************/ void nv31_mpeg_tile_prog(struct nvkm_engine *engine, int i) { struct nv31_mpeg *mpeg = (void *)engine; struct nvkm_device *device = mpeg->base.engine.subdev.device; struct nvkm_fb_tile *tile = &device->fb->tile.region[i]; nvkm_wr32(device, 0x00b008 + (i * 0x10), tile->pitch); nvkm_wr32(device, 0x00b004 + (i * 0x10), tile->limit); nvkm_wr32(device, 0x00b000 + (i * 0x10), tile->addr); } void nv31_mpeg_intr(struct nvkm_subdev *subdev) { Loading Loading @@ -231,13 +208,22 @@ nv31_mpeg_intr(struct nvkm_subdev *subdev) if (show) { nvkm_error(subdev, "ch %d [%s] %08x %08x %08x %08x\n", mpeg->chan ? mpeg->chan->fifo->chid : -1, mpeg->chan ? mpeg->chan->fifo->object.client->name : mpeg->chan ? mpeg->chan->object.client->name : "unknown", stat, type, mthd, data); } spin_unlock_irqrestore(&mpeg->base.engine.lock, flags); } static const struct nvkm_engine_func nv31_mpeg = { .fifo.cclass = nv31_mpeg_chan_new, .sclass = { { -1, -1, NV31_MPEG, &nv31_mpeg_object }, {} } }; static int nv31_mpeg_ctor(struct nvkm_object *parent, struct nvkm_object *engine, struct nvkm_oclass *oclass, void *data, u32 size, Loading @@ -251,11 +237,11 @@ nv31_mpeg_ctor(struct nvkm_object *parent, struct nvkm_object *engine, if (ret) return ret; mpeg->base.engine.func = &nv31_mpeg; mpeg->mthd_dma = nv31_mpeg_mthd_dma; nv_subdev(mpeg)->unit = 0x00000002; nv_subdev(mpeg)->intr = nv31_mpeg_intr; nv_engine(mpeg)->cclass = &nv31_mpeg_cclass; nv_engine(mpeg)->sclass = nv31_mpeg_sclass; nv_engine(mpeg)->tile_prog = nv31_mpeg_tile_prog; return 0; } Loading drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv31.h +13 −6 Original line number Diff line number Diff line #ifndef __NV31_MPEG_H__ #define __NV31_MPEG_H__ #define nv31_mpeg(p) container_of((p), struct nv31_mpeg, base.engine) #include "priv.h" #include <engine/mpeg.h> #include <engine/fifo.h> struct nv31_mpeg_chan { struct nvkm_object base; struct nvkm_fifo_chan *fifo; }; struct nv31_mpeg { struct nvkm_mpeg base; struct nv31_mpeg_chan *chan; bool (*mthd_dma)(struct nvkm_device *, u32 mthd, u32 data); }; #define nv31_mpeg_chan(p) container_of((p), struct nv31_mpeg_chan, object) struct nv31_mpeg_chan { struct nvkm_object object; struct nv31_mpeg *mpeg; struct nvkm_fifo_chan *fifo; }; int nv31_mpeg_chan_new(struct nvkm_fifo_chan *, const struct nvkm_oclass *, struct nvkm_object **); #endif Loading
drivers/gpu/drm/nouveau/include/nvif/class.h +3 −0 Original line number Diff line number Diff line Loading @@ -45,6 +45,9 @@ #define GM107_DISP 0x00009470 #define GM204_DISP 0x00009570 #define NV31_MPEG 0x00003174 #define G82_MPEG 0x00008274 #define NV74_VP2 0x00007476 #define NV50_DISP_CURSOR 0x0000507a Loading
drivers/gpu/drm/nouveau/include/nvkm/engine/mpeg.h +0 −24 Original line number Diff line number Diff line #ifndef __NVKM_MPEG_H__ #define __NVKM_MPEG_H__ #include <core/engctx.h> struct nvkm_mpeg_chan { struct nvkm_engctx base; }; #define nvkm_mpeg_context_create(p,e,c,g,s,a,f,d) \ nvkm_engctx_create((p), (e), (c), (g), (s), (a), (f), (d)) #define nvkm_mpeg_context_destroy(d) \ nvkm_engctx_destroy(&(d)->base) #define nvkm_mpeg_context_init(d) \ nvkm_engctx_init(&(d)->base) #define nvkm_mpeg_context_fini(d,s) \ nvkm_engctx_fini(&(d)->base, (s)) #define _nvkm_mpeg_context_dtor _nvkm_engctx_dtor #define _nvkm_mpeg_context_init _nvkm_engctx_init #define _nvkm_mpeg_context_fini _nvkm_engctx_fini #define _nvkm_mpeg_context_rd32 _nvkm_engctx_rd32 #define _nvkm_mpeg_context_wr32 _nvkm_engctx_wr32 #include <core/engine.h> struct nvkm_mpeg { Loading @@ -45,9 +24,6 @@ extern struct nvkm_oclass nv40_mpeg_oclass; extern struct nvkm_oclass nv44_mpeg_oclass; extern struct nvkm_oclass nv50_mpeg_oclass; extern struct nvkm_oclass g84_mpeg_oclass; extern struct nvkm_ofuncs nv31_mpeg_ofuncs; extern struct nvkm_oclass nv31_mpeg_cclass; extern struct nvkm_oclass nv31_mpeg_sclass[]; extern struct nvkm_oclass nv40_mpeg_sclass[]; void nv31_mpeg_intr(struct nvkm_subdev *); void nv31_mpeg_tile_prog(struct nvkm_engine *, int); Loading
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/g84.c +11 −35 Original line number Diff line number Diff line Loading @@ -21,43 +21,19 @@ * * Authors: Ben Skeggs */ #include <engine/mpeg.h> #include "priv.h" struct g84_mpeg_chan { struct nvkm_mpeg_chan base; }; /******************************************************************************* * MPEG object classes ******************************************************************************/ #include <nvif/class.h> static struct nvkm_oclass g84_mpeg_sclass[] = { { 0x8274, &nv50_mpeg_ofuncs }, static const struct nvkm_engine_func g84_mpeg = { .cclass = &nv50_mpeg_cclass, .sclass = { { -1, -1, G82_MPEG, &nv31_mpeg_object }, {} } }; /******************************************************************************* * PMPEG context ******************************************************************************/ static struct nvkm_oclass g84_mpeg_cclass = { .handle = NV_ENGCTX(MPEG, 0x84), .ofuncs = &(struct nvkm_ofuncs) { .ctor = nv50_mpeg_context_ctor, .dtor = _nvkm_mpeg_context_dtor, .init = _nvkm_mpeg_context_init, .fini = _nvkm_mpeg_context_fini, .rd32 = _nvkm_mpeg_context_rd32, .wr32 = _nvkm_mpeg_context_wr32, }, }; /******************************************************************************* * PMPEG engine/subdev functions ******************************************************************************/ static int g84_mpeg_ctor(struct nvkm_object *parent, struct nvkm_object *engine, struct nvkm_oclass *oclass, void *data, u32 size, Loading @@ -71,10 +47,10 @@ g84_mpeg_ctor(struct nvkm_object *parent, struct nvkm_object *engine, if (ret) return ret; mpeg->engine.func = &g84_mpeg; nv_subdev(mpeg)->unit = 0x00000002; nv_subdev(mpeg)->intr = nv50_mpeg_intr; nv_engine(mpeg)->cclass = &g84_mpeg_cclass; nv_engine(mpeg)->sclass = g84_mpeg_sclass; return 0; } Loading
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv31.c +96 −110 Original line number Diff line number Diff line Loading @@ -26,33 +26,99 @@ #include <core/client.h> #include <subdev/fb.h> #include <subdev/timer.h> #include <engine/fifo.h> #include <nvif/class.h> /******************************************************************************* * MPEG object classes ******************************************************************************/ static int nv31_mpeg_object_ctor(struct nvkm_object *parent, struct nvkm_object *engine, struct nvkm_oclass *oclass, void *data, u32 size, nv31_mpeg_object_bind(struct nvkm_object *object, struct nvkm_gpuobj *parent, int align, struct nvkm_gpuobj **pgpuobj) { int ret = nvkm_gpuobj_new(object->engine->subdev.device, 16, align, false, parent, pgpuobj); if (ret == 0) { nvkm_kmap(*pgpuobj); nvkm_wo32(*pgpuobj, 0x00, object->oclass_name); nvkm_wo32(*pgpuobj, 0x04, 0x00000000); nvkm_wo32(*pgpuobj, 0x08, 0x00000000); nvkm_wo32(*pgpuobj, 0x0c, 0x00000000); nvkm_done(*pgpuobj); } return ret; } const struct nvkm_object_func nv31_mpeg_object = { .bind = nv31_mpeg_object_bind, }; /******************************************************************************* * PMPEG context ******************************************************************************/ static void * nv31_mpeg_chan_dtor(struct nvkm_object *object) { struct nv31_mpeg_chan *chan = nv31_mpeg_chan(object); struct nv31_mpeg *mpeg = chan->mpeg; unsigned long flags; spin_lock_irqsave(&mpeg->base.engine.lock, flags); if (mpeg->chan == chan) mpeg->chan = NULL; spin_unlock_irqrestore(&mpeg->base.engine.lock, flags); return chan; } static const struct nvkm_object_func nv31_mpeg_chan = { .dtor = nv31_mpeg_chan_dtor, }; int nv31_mpeg_chan_new(struct nvkm_fifo_chan *fifoch, const struct nvkm_oclass *oclass, struct nvkm_object **pobject) { struct nvkm_gpuobj *obj; int ret; struct nv31_mpeg *mpeg = nv31_mpeg(oclass->engine); struct nv31_mpeg_chan *chan; unsigned long flags; int ret = -EBUSY; ret = nvkm_gpuobj_create(parent, engine, oclass, 0, parent, 20, 16, 0, &obj); *pobject = nv_object(obj); if (ret) if (!(chan = kzalloc(sizeof(*chan), GFP_KERNEL))) return -ENOMEM; nvkm_object_ctor(&nv31_mpeg_chan, oclass, &chan->object); chan->mpeg = mpeg; chan->fifo = fifoch; *pobject = &chan->object; spin_lock_irqsave(&mpeg->base.engine.lock, flags); if (!mpeg->chan) { mpeg->chan = chan; ret = 0; } spin_unlock_irqrestore(&mpeg->base.engine.lock, flags); return ret; } nvkm_kmap(obj); nvkm_wo32(obj, 0x00, nv_mclass(obj)); nvkm_wo32(obj, 0x04, 0x00000000); nvkm_wo32(obj, 0x08, 0x00000000); nvkm_wo32(obj, 0x0c, 0x00000000); nvkm_done(obj); return 0; /******************************************************************************* * PMPEG engine/subdev functions ******************************************************************************/ void nv31_mpeg_tile_prog(struct nvkm_engine *engine, int i) { struct nv31_mpeg *mpeg = (void *)engine; struct nvkm_device *device = mpeg->base.engine.subdev.device; struct nvkm_fb_tile *tile = &device->fb->tile.region[i]; nvkm_wr32(device, 0x00b008 + (i * 0x10), tile->pitch); nvkm_wr32(device, 0x00b004 + (i * 0x10), tile->limit); nvkm_wr32(device, 0x00b000 + (i * 0x10), tile->addr); } static bool Loading Loading @@ -109,95 +175,6 @@ nv31_mpeg_mthd(struct nv31_mpeg *mpeg, u32 mthd, u32 data) return false; } struct nvkm_ofuncs nv31_mpeg_ofuncs = { .ctor = nv31_mpeg_object_ctor, .dtor = _nvkm_gpuobj_dtor, .init = _nvkm_gpuobj_init, .fini = _nvkm_gpuobj_fini, .rd32 = _nvkm_gpuobj_rd32, .wr32 = _nvkm_gpuobj_wr32, }; struct nvkm_oclass nv31_mpeg_sclass[] = { { 0x3174, &nv31_mpeg_ofuncs }, {} }; /******************************************************************************* * PMPEG context ******************************************************************************/ static int nv31_mpeg_context_ctor(struct nvkm_object *parent, struct nvkm_object *engine, struct nvkm_oclass *oclass, void *data, u32 size, struct nvkm_object **pobject) { struct nv31_mpeg *mpeg = (void *)engine; struct nv31_mpeg_chan *chan; unsigned long flags; int ret; ret = nvkm_object_create(parent, engine, oclass, 0, &chan); *pobject = nv_object(chan); if (ret) return ret; spin_lock_irqsave(&nv_engine(mpeg)->lock, flags); if (mpeg->chan) { spin_unlock_irqrestore(&nv_engine(mpeg)->lock, flags); nvkm_object_destroy(&chan->base); *pobject = NULL; return -EBUSY; } chan->fifo = nvkm_fifo_chan(parent); mpeg->chan = chan; spin_unlock_irqrestore(&nv_engine(mpeg)->lock, flags); return 0; } static void nv31_mpeg_context_dtor(struct nvkm_object *object) { struct nv31_mpeg *mpeg = (void *)object->engine; struct nv31_mpeg_chan *chan = (void *)object; unsigned long flags; spin_lock_irqsave(&nv_engine(mpeg)->lock, flags); mpeg->chan = NULL; spin_unlock_irqrestore(&nv_engine(mpeg)->lock, flags); nvkm_object_destroy(&chan->base); } struct nvkm_oclass nv31_mpeg_cclass = { .handle = NV_ENGCTX(MPEG, 0x31), .ofuncs = &(struct nvkm_ofuncs) { .ctor = nv31_mpeg_context_ctor, .dtor = nv31_mpeg_context_dtor, .init = _nvkm_object_init, .fini = _nvkm_object_fini, }, }; /******************************************************************************* * PMPEG engine/subdev functions ******************************************************************************/ void nv31_mpeg_tile_prog(struct nvkm_engine *engine, int i) { struct nv31_mpeg *mpeg = (void *)engine; struct nvkm_device *device = mpeg->base.engine.subdev.device; struct nvkm_fb_tile *tile = &device->fb->tile.region[i]; nvkm_wr32(device, 0x00b008 + (i * 0x10), tile->pitch); nvkm_wr32(device, 0x00b004 + (i * 0x10), tile->limit); nvkm_wr32(device, 0x00b000 + (i * 0x10), tile->addr); } void nv31_mpeg_intr(struct nvkm_subdev *subdev) { Loading Loading @@ -231,13 +208,22 @@ nv31_mpeg_intr(struct nvkm_subdev *subdev) if (show) { nvkm_error(subdev, "ch %d [%s] %08x %08x %08x %08x\n", mpeg->chan ? mpeg->chan->fifo->chid : -1, mpeg->chan ? mpeg->chan->fifo->object.client->name : mpeg->chan ? mpeg->chan->object.client->name : "unknown", stat, type, mthd, data); } spin_unlock_irqrestore(&mpeg->base.engine.lock, flags); } static const struct nvkm_engine_func nv31_mpeg = { .fifo.cclass = nv31_mpeg_chan_new, .sclass = { { -1, -1, NV31_MPEG, &nv31_mpeg_object }, {} } }; static int nv31_mpeg_ctor(struct nvkm_object *parent, struct nvkm_object *engine, struct nvkm_oclass *oclass, void *data, u32 size, Loading @@ -251,11 +237,11 @@ nv31_mpeg_ctor(struct nvkm_object *parent, struct nvkm_object *engine, if (ret) return ret; mpeg->base.engine.func = &nv31_mpeg; mpeg->mthd_dma = nv31_mpeg_mthd_dma; nv_subdev(mpeg)->unit = 0x00000002; nv_subdev(mpeg)->intr = nv31_mpeg_intr; nv_engine(mpeg)->cclass = &nv31_mpeg_cclass; nv_engine(mpeg)->sclass = nv31_mpeg_sclass; nv_engine(mpeg)->tile_prog = nv31_mpeg_tile_prog; return 0; } Loading
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv31.h +13 −6 Original line number Diff line number Diff line #ifndef __NV31_MPEG_H__ #define __NV31_MPEG_H__ #define nv31_mpeg(p) container_of((p), struct nv31_mpeg, base.engine) #include "priv.h" #include <engine/mpeg.h> #include <engine/fifo.h> struct nv31_mpeg_chan { struct nvkm_object base; struct nvkm_fifo_chan *fifo; }; struct nv31_mpeg { struct nvkm_mpeg base; struct nv31_mpeg_chan *chan; bool (*mthd_dma)(struct nvkm_device *, u32 mthd, u32 data); }; #define nv31_mpeg_chan(p) container_of((p), struct nv31_mpeg_chan, object) struct nv31_mpeg_chan { struct nvkm_object object; struct nv31_mpeg *mpeg; struct nvkm_fifo_chan *fifo; }; int nv31_mpeg_chan_new(struct nvkm_fifo_chan *, const struct nvkm_oclass *, struct nvkm_object **); #endif