From c79a191b2799fb36a7b64c0f9ddc20383ed0dcdb Mon Sep 17 00:00:00 2001 From: Ben Skeggs Date: Thu, 20 Aug 2015 14:54:19 +1000 Subject: [PATCH] drm/nouveau/xtensa: convert user classes to new-style nvkm_object Signed-off-by: Ben Skeggs --- drivers/gpu/drm/nouveau/include/nvif/class.h | 4 ++ .../gpu/drm/nouveau/include/nvkm/engine/bsp.h | 2 +- .../gpu/drm/nouveau/include/nvkm/engine/vp.h | 2 +- .../drm/nouveau/include/nvkm/engine/xtensa.h | 13 ++--- drivers/gpu/drm/nouveau/nvkm/engine/bsp/g84.c | 41 ++++------------ drivers/gpu/drm/nouveau/nvkm/engine/vp/g84.c | 41 ++++------------ drivers/gpu/drm/nouveau/nvkm/engine/xtensa.c | 47 ++++++++++++++----- 7 files changed, 63 insertions(+), 87 deletions(-) diff --git a/drivers/gpu/drm/nouveau/include/nvif/class.h b/drivers/gpu/drm/nouveau/include/nvif/class.h index 10b6685cf5e7..1ce75be9c2d4 100644 --- a/drivers/gpu/drm/nouveau/include/nvif/class.h +++ b/drivers/gpu/drm/nouveau/include/nvif/class.h @@ -45,6 +45,8 @@ #define GM107_DISP 0x00009470 #define GM204_DISP 0x00009570 +#define NV74_VP2 0x00007476 + #define NV50_DISP_CURSOR 0x0000507a #define G82_DISP_CURSOR 0x0000827a #define GT214_DISP_CURSOR 0x0000857a @@ -94,6 +96,8 @@ #define MAXWELL_A 0x0000b097 #define MAXWELL_B 0x0000b197 +#define NV74_BSP 0x000074b0 + #define GT212_MSVLD 0x000085b1 #define IGT21A_MSVLD 0x000086b1 #define G98_MSVLD 0x000088b1 diff --git a/drivers/gpu/drm/nouveau/include/nvkm/engine/bsp.h b/drivers/gpu/drm/nouveau/include/nvkm/engine/bsp.h index e489beef2b92..af2134586eb7 100644 --- a/drivers/gpu/drm/nouveau/include/nvkm/engine/bsp.h +++ b/drivers/gpu/drm/nouveau/include/nvkm/engine/bsp.h @@ -1,5 +1,5 @@ #ifndef __NVKM_BSP_H__ #define __NVKM_BSP_H__ -#include +#include extern struct nvkm_oclass g84_bsp_oclass; #endif diff --git a/drivers/gpu/drm/nouveau/include/nvkm/engine/vp.h b/drivers/gpu/drm/nouveau/include/nvkm/engine/vp.h index 7851f18c5add..145216d31225 100644 --- a/drivers/gpu/drm/nouveau/include/nvkm/engine/vp.h +++ b/drivers/gpu/drm/nouveau/include/nvkm/engine/vp.h @@ -1,5 +1,5 @@ #ifndef __NVKM_VP_H__ #define __NVKM_VP_H__ -#include +#include extern struct nvkm_oclass g84_vp_oclass; #endif diff --git a/drivers/gpu/drm/nouveau/include/nvkm/engine/xtensa.h b/drivers/gpu/drm/nouveau/include/nvkm/engine/xtensa.h index b05babfe0ca4..6a53812c064d 100644 --- a/drivers/gpu/drm/nouveau/include/nvkm/engine/xtensa.h +++ b/drivers/gpu/drm/nouveau/include/nvkm/engine/xtensa.h @@ -1,9 +1,11 @@ #ifndef __NVKM_XTENSA_H__ #define __NVKM_XTENSA_H__ +#define nvkm_xtensa(p) container_of((p), struct nvkm_xtensa, engine) #include struct nvkm_xtensa { struct nvkm_engine engine; + const struct nvkm_xtensa_func *func; u32 addr; struct nvkm_memory *gpu_fw; @@ -11,16 +13,15 @@ struct nvkm_xtensa { u32 unkd28; }; +struct nvkm_xtensa_func { + void (*init)(struct nvkm_xtensa *); + struct nvkm_sclass sclass[]; +}; + #define nvkm_xtensa_create(p,e,c,b,d,i,f,r) \ nvkm_xtensa_create_((p), (e), (c), (b), (d), (i), (f), \ sizeof(**r),(void **)r) -int _nvkm_xtensa_engctx_ctor(struct nvkm_object *, - struct nvkm_object *, - struct nvkm_oclass *, void *, u32, - struct nvkm_object **); - -void _nvkm_xtensa_intr(struct nvkm_subdev *); int nvkm_xtensa_create_(struct nvkm_object *, struct nvkm_object *, struct nvkm_oclass *, u32, bool, diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/bsp/g84.c b/drivers/gpu/drm/nouveau/nvkm/engine/bsp/g84.c index 0f140bcd8e75..176495d9e708 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/bsp/g84.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/bsp/g84.c @@ -22,41 +22,17 @@ * Authors: Ben Skeggs, Ilia Mirkin */ #include -#include -#include +#include -/******************************************************************************* - * BSP object classes - ******************************************************************************/ - -static struct nvkm_oclass -g84_bsp_sclass[] = { - { 0x74b0, &nvkm_object_ofuncs }, - {}, +static const struct nvkm_xtensa_func +g84_bsp_func = { + .sclass = { + { -1, -1, NV74_BSP }, + {} + } }; -/******************************************************************************* - * BSP context - ******************************************************************************/ - -static struct nvkm_oclass -g84_bsp_cclass = { - .handle = NV_ENGCTX(BSP, 0x84), - .ofuncs = &(struct nvkm_ofuncs) { - .ctor = _nvkm_xtensa_engctx_ctor, - .dtor = _nvkm_engctx_dtor, - .init = _nvkm_engctx_init, - .fini = _nvkm_engctx_fini, - .rd32 = _nvkm_engctx_rd32, - .wr32 = _nvkm_engctx_wr32, - }, -}; - -/******************************************************************************* - * BSP engine/subdev functions - ******************************************************************************/ - static int g84_bsp_ctor(struct nvkm_object *parent, struct nvkm_object *engine, struct nvkm_oclass *oclass, void *data, u32 size, @@ -71,9 +47,8 @@ g84_bsp_ctor(struct nvkm_object *parent, struct nvkm_object *engine, if (ret) return ret; + bsp->func = &g84_bsp_func; nv_subdev(bsp)->unit = 0x04008000; - nv_engine(bsp)->cclass = &g84_bsp_cclass; - nv_engine(bsp)->sclass = g84_bsp_sclass; bsp->fifo_val = 0x1111; bsp->unkd28 = 0x90044; return 0; diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/vp/g84.c b/drivers/gpu/drm/nouveau/nvkm/engine/vp/g84.c index a4ff78a34566..0035498024ec 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/vp/g84.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/vp/g84.c @@ -22,41 +22,17 @@ * Authors: Ben Skeggs, Ilia Mirkin */ #include -#include -#include +#include -/******************************************************************************* - * VP object classes - ******************************************************************************/ - -static struct nvkm_oclass -g84_vp_sclass[] = { - { 0x7476, &nvkm_object_ofuncs }, - {}, +static const struct nvkm_xtensa_func +g84_vp_func = { + .sclass = { + { -1, -1, NV74_VP2 }, + {} + } }; -/******************************************************************************* - * PVP context - ******************************************************************************/ - -static struct nvkm_oclass -g84_vp_cclass = { - .handle = NV_ENGCTX(VP, 0x84), - .ofuncs = &(struct nvkm_ofuncs) { - .ctor = _nvkm_xtensa_engctx_ctor, - .dtor = _nvkm_engctx_dtor, - .init = _nvkm_engctx_init, - .fini = _nvkm_engctx_fini, - .rd32 = _nvkm_engctx_rd32, - .wr32 = _nvkm_engctx_wr32, - }, -}; - -/******************************************************************************* - * PVP engine/subdev functions - ******************************************************************************/ - static int g84_vp_ctor(struct nvkm_object *parent, struct nvkm_object *engine, struct nvkm_oclass *oclass, void *data, u32 size, @@ -71,9 +47,8 @@ g84_vp_ctor(struct nvkm_object *parent, struct nvkm_object *engine, if (ret) return ret; + vp->func = &g84_vp_func; nv_subdev(vp)->unit = 0x01020000; - nv_engine(vp)->cclass = &g84_vp_cclass; - nv_engine(vp)->sclass = g84_vp_sclass; vp->fifo_val = 0x111; vp->unkd28 = 0x9c544; return 0; diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/xtensa.c b/drivers/gpu/drm/nouveau/nvkm/engine/xtensa.c index 6ffc6c4315b6..fa8700005189 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/xtensa.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/xtensa.c @@ -20,23 +20,37 @@ * OTHER DEALINGS IN THE SOFTWARE. */ #include +#include -#include - -int -_nvkm_xtensa_engctx_ctor(struct nvkm_object *parent, struct nvkm_object *engine, - struct nvkm_oclass *oclass, void *data, u32 size, - struct nvkm_object **pobject) +static int +nvkm_xtensa_oclass_get(struct nvkm_oclass *oclass, int index) { - struct nvkm_engctx *engctx; - int ret; + struct nvkm_xtensa *xtensa = nvkm_xtensa(oclass->engine); + int c = 0; - ret = nvkm_engctx_create(parent, engine, oclass, NULL, 0x10000, 0x1000, - NVOBJ_FLAG_ZERO_ALLOC, &engctx); - *pobject = nv_object(engctx); - return ret; + while (xtensa->func->sclass[c].oclass) { + if (c++ == index) { + oclass->base = xtensa->func->sclass[index]; + return index; + } + } + + return c; } +static int +nvkm_xtensa_cclass_bind(struct nvkm_object *object, struct nvkm_gpuobj *parent, + int align, struct nvkm_gpuobj **pgpuobj) +{ + return nvkm_gpuobj_new(object->engine->subdev.device, 0x10000, align, + true, parent, pgpuobj); +} + +static const struct nvkm_object_func +nvkm_xtensa_cclass = { + .bind = nvkm_xtensa_cclass_bind, +}; + void _nvkm_xtensa_intr(struct nvkm_subdev *subdev) { @@ -58,6 +72,12 @@ _nvkm_xtensa_intr(struct nvkm_subdev *subdev) } } +static const struct nvkm_engine_func +nvkm_xtensa = { + .fifo.sclass = nvkm_xtensa_oclass_get, + .cclass = &nvkm_xtensa_cclass, +}; + int nvkm_xtensa_create_(struct nvkm_object *parent, struct nvkm_object *engine, struct nvkm_oclass *oclass, u32 addr, bool enable, @@ -73,7 +93,8 @@ nvkm_xtensa_create_(struct nvkm_object *parent, struct nvkm_object *engine, if (ret) return ret; - nv_subdev(xtensa)->intr = _nvkm_xtensa_intr; + xtensa->engine.subdev.intr = _nvkm_xtensa_intr; + xtensa->engine.func = &nvkm_xtensa; xtensa->addr = addr; return 0; }