Commit 9d498e0f authored by Ben Skeggs's avatar Ben Skeggs
Browse files

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



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 8f0649b5
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -94,6 +94,28 @@
#define MAXWELL_A                                                    0x0000b097
#define MAXWELL_B                                                    0x0000b197

#define GT212_MSVLD                                                  0x000085b1
#define IGT21A_MSVLD                                                 0x000086b1
#define G98_MSVLD                                                    0x000088b1
#define GF100_MSVLD                                                  0x000090b1
#define GK104_MSVLD                                                  0x000095b1

#define GT212_MSPDEC                                                 0x000085b2
#define G98_MSPDEC                                                   0x000088b2
#define GF100_MSPDEC                                                 0x000090b2
#define GK104_MSPDEC                                                 0x000095b2

#define GT212_MSPPP                                                  0x000085b3
#define G98_MSPPP                                                    0x000088b3
#define GF100_MSPPP                                                  0x000090b3

#define G98_SEC                                                      0x000088b4

#define GT212_DMA                                                    0x000085b5
#define FERMI_DMA                                                    0x000090b5

#define FERMI_DECOMPRESS                                             0x000090b8

#define FERMI_COMPUTE_A                                              0x000090c0
#define FERMI_COMPUTE_B                                              0x000091c0

+3 −23
Original line number Diff line number Diff line
#ifndef __NVKM_FALCON_H__
#define __NVKM_FALCON_H__
#include <core/engctx.h>
#define nvkm_falcon(p) container_of((p), struct nvkm_falcon, engine)
#include <core/engine.h>
struct nvkm_fifo_chan;

struct nvkm_falcon_chan {
	struct nvkm_engctx base;
};

#define nvkm_falcon_context_create(p,e,c,g,s,a,f,d)                         \
	nvkm_engctx_create((p), (e), (c), (g), (s), (a), (f), (d))
#define nvkm_falcon_context_destroy(d)                                      \
	nvkm_engctx_destroy(&(d)->base)
#define nvkm_falcon_context_init(d)                                         \
	nvkm_engctx_init(&(d)->base)
#define nvkm_falcon_context_fini(d,s)                                       \
	nvkm_engctx_fini(&(d)->base, (s))

#define _nvkm_falcon_context_ctor _nvkm_engctx_ctor
#define _nvkm_falcon_context_dtor _nvkm_engctx_dtor
#define _nvkm_falcon_context_init _nvkm_engctx_init
#define _nvkm_falcon_context_fini _nvkm_engctx_fini
#define _nvkm_falcon_context_rd32 _nvkm_engctx_rd32
#define _nvkm_falcon_context_wr32 _nvkm_engctx_wr32

struct nvkm_falcon_data {
	bool external;
};

#include <core/engine.h>

struct nvkm_falcon {
	struct nvkm_engine engine;
	const struct nvkm_falcon_func *func;
@@ -55,6 +34,7 @@ struct nvkm_falcon {

struct nvkm_falcon_func {
	void (*intr)(struct nvkm_falcon *, struct nvkm_fifo_chan *);
	struct nvkm_sclass sclass[];
};

#define nv_falcon(priv) ((struct nvkm_falcon *)priv)
+17 −52
Original line number Diff line number Diff line
@@ -25,51 +25,7 @@
#include <engine/falcon.h>
#include "fuc/gf100.fuc3.h"

/*******************************************************************************
 * Copy object classes
 ******************************************************************************/

static struct nvkm_oclass
gf100_ce0_sclass[] = {
	{ 0x90b5, &nvkm_object_ofuncs },
	{},
};

static struct nvkm_oclass
gf100_ce1_sclass[] = {
	{ 0x90b8, &nvkm_object_ofuncs },
	{},
};

/*******************************************************************************
 * PCE context
 ******************************************************************************/

static struct nvkm_ofuncs
gf100_ce_context_ofuncs = {
	.ctor = _nvkm_falcon_context_ctor,
	.dtor = _nvkm_falcon_context_dtor,
	.init = _nvkm_falcon_context_init,
	.fini = _nvkm_falcon_context_fini,
	.rd32 = _nvkm_falcon_context_rd32,
	.wr32 = _nvkm_falcon_context_wr32,
};

static struct nvkm_oclass
gf100_ce0_cclass = {
	.handle = NV_ENGCTX(CE0, 0xc0),
	.ofuncs = &gf100_ce_context_ofuncs,
};

static struct nvkm_oclass
gf100_ce1_cclass = {
	.handle = NV_ENGCTX(CE1, 0xc0),
	.ofuncs = &gf100_ce_context_ofuncs,
};

/*******************************************************************************
 * PCE engine/subdev functions
 ******************************************************************************/
#include <nvif/class.h>

static int
gf100_ce_init(struct nvkm_object *object)
@@ -89,8 +45,12 @@ gf100_ce_init(struct nvkm_object *object)
}

static const struct nvkm_falcon_func
gf100_ce_func = {
gf100_ce0_func = {
	.intr = gt215_ce_intr,
	.sclass = {
		{ -1, -1, FERMI_DMA },
		{}
	}
};

static int
@@ -101,15 +61,13 @@ gf100_ce0_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
	struct nvkm_falcon *ce;
	int ret;

	ret = nvkm_falcon_create(&gf100_ce_func, parent, engine, oclass,
	ret = nvkm_falcon_create(&gf100_ce0_func, parent, engine, oclass,
				 0x104000, true, "PCE0", "ce0", &ce);
	*pobject = nv_object(ce);
	if (ret)
		return ret;

	nv_subdev(ce)->unit = 0x00000040;
	nv_engine(ce)->cclass = &gf100_ce0_cclass;
	nv_engine(ce)->sclass = gf100_ce0_sclass;
	nv_falcon(ce)->code.data = gf100_ce_code;
	nv_falcon(ce)->code.size = sizeof(gf100_ce_code);
	nv_falcon(ce)->data.data = gf100_ce_data;
@@ -117,6 +75,15 @@ gf100_ce0_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
	return 0;
}

static const struct nvkm_falcon_func
gf100_ce1_func = {
	.intr = gt215_ce_intr,
	.sclass = {
		{ -1, -1, FERMI_DECOMPRESS },
		{}
	}
};

static int
gf100_ce1_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
	       struct nvkm_oclass *oclass, void *data, u32 size,
@@ -125,15 +92,13 @@ gf100_ce1_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
	struct nvkm_falcon *ce;
	int ret;

	ret = nvkm_falcon_create(&gf100_ce_func, parent, engine, oclass,
	ret = nvkm_falcon_create(&gf100_ce1_func, parent, engine, oclass,
				 0x105000, true, "PCE1", "ce1", &ce);
	*pobject = nv_object(ce);
	if (ret)
		return ret;

	nv_subdev(ce)->unit = 0x00000080;
	nv_engine(ce)->cclass = &gf100_ce1_cclass;
	nv_engine(ce)->sclass = gf100_ce1_sclass;
	nv_falcon(ce)->code.data = gf100_ce_code;
	nv_falcon(ce)->code.size = sizeof(gf100_ce_code);
	nv_falcon(ce)->data.data = gf100_ce_data;
+5 −33
Original line number Diff line number Diff line
@@ -28,37 +28,7 @@
#include <core/client.h>
#include <core/enum.h>

/*******************************************************************************
 * Copy object classes
 ******************************************************************************/

static struct nvkm_oclass
gt215_ce_sclass[] = {
	{ 0x85b5, &nvkm_object_ofuncs },
	{}
};

/*******************************************************************************
 * PCE context
 ******************************************************************************/

static struct nvkm_oclass
gt215_ce_cclass = {
	.handle = NV_ENGCTX(CE0, 0xa3),
	.ofuncs = &(struct nvkm_ofuncs) {
		.ctor = _nvkm_falcon_context_ctor,
		.dtor = _nvkm_falcon_context_dtor,
		.init = _nvkm_falcon_context_init,
		.fini = _nvkm_falcon_context_fini,
		.rd32 = _nvkm_falcon_context_rd32,
		.wr32 = _nvkm_falcon_context_wr32,

	},
};

/*******************************************************************************
 * PCE engine/subdev functions
 ******************************************************************************/
#include <nvif/class.h>

static const struct nvkm_enum
gt215_ce_isr_error_name[] = {
@@ -93,6 +63,10 @@ gt215_ce_intr(struct nvkm_falcon *ce, struct nvkm_fifo_chan *chan)
static const struct nvkm_falcon_func
gt215_ce_func = {
	.intr = gt215_ce_intr,
	.sclass = {
		{ -1, -1, GT212_DMA },
		{}
	}
};

static int
@@ -111,8 +85,6 @@ gt215_ce_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
		return ret;

	nv_subdev(ce)->unit = 0x00802000;
	nv_engine(ce)->cclass = &gt215_ce_cclass;
	nv_engine(ce)->sclass = gt215_ce_sclass;
	nv_falcon(ce)->code.data = gt215_ce_code;
	nv_falcon(ce)->code.size = sizeof(gt215_ce_code);
	nv_falcon(ce)->data.data = gt215_ce_data;
+36 −0
Original line number Diff line number Diff line
@@ -24,6 +24,35 @@

#include <subdev/timer.h>

static int
nvkm_falcon_oclass_get(struct nvkm_oclass *oclass, int index)
{
	struct nvkm_falcon *falcon = nvkm_falcon(oclass->engine);
	int c = 0;

	while (falcon->func->sclass[c].oclass) {
		if (c++ == index) {
			oclass->base = falcon->func->sclass[index];
			return index;
		}
	}

	return c;
}

static int
nvkm_falcon_cclass_bind(struct nvkm_object *object, struct nvkm_gpuobj *parent,
			int align, struct nvkm_gpuobj **pgpuobj)
{
	return nvkm_gpuobj_new(object->engine->subdev.device, 256,
			       align, true, parent, pgpuobj);
}

static const struct nvkm_object_func
nvkm_falcon_cclass = {
	.bind = nvkm_falcon_cclass_bind,
};

static void
nvkm_falcon_intr(struct nvkm_subdev *subdev)
{
@@ -275,6 +304,12 @@ _nvkm_falcon_fini(struct nvkm_object *object, bool suspend)
	return nvkm_engine_fini_old(&falcon->engine, suspend);
}

static const struct nvkm_engine_func
nvkm_falcon = {
	.fifo.sclass = nvkm_falcon_oclass_get,
	.cclass = &nvkm_falcon_cclass,
};

int
nvkm_falcon_create_(const struct nvkm_falcon_func *func,
		    struct nvkm_object *parent, struct nvkm_object *engine,
@@ -292,6 +327,7 @@ nvkm_falcon_create_(const struct nvkm_falcon_func *func,
		return ret;

	falcon->engine.subdev.intr = nvkm_falcon_intr;
	falcon->engine.func = &nvkm_falcon;
	falcon->func = func;
	falcon->addr = addr;
	return 0;
Loading