Commit 218f978d authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/mpeg: convert user classes to new-style nvkm_object



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 27f3d6cf
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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
+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 {
@@ -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);
+11 −35
Original line number Diff line number Diff line
@@ -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,
@@ -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;
}

+96 −110
Original line number Diff line number Diff line
@@ -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
@@ -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)
{
@@ -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,
@@ -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;
}
+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