Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f86770aa authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/dmaobj: merge everything except ctor and bind together



Simplifies things a little, and currently no reason to need
chipset-specific dmaobj constructors.

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 0a32241d
Loading
Loading
Loading
Loading
+57 −19
Original line number Diff line number Diff line
@@ -28,37 +28,39 @@
#include <subdev/fb.h>
#include <engine/dmaobj.h>

int
nouveau_dmaobj_create_(struct nouveau_object *parent,
static int
nouveau_dmaobj_ctor(struct nouveau_object *parent,
		    struct nouveau_object *engine,
		       struct nouveau_oclass *oclass,
		       void *data, u32 size, int len, void **pobject)
		    struct nouveau_oclass *oclass, void *data, u32 size,
		    struct nouveau_object **pobject)
{
	struct nouveau_dmaeng *dmaeng = (void *)engine;
	struct nouveau_dmaobj *dmaobj;
	struct nouveau_gpuobj *gpuobj;
	struct nv_dma_class *args = data;
	struct nouveau_dmaobj *object;
	int ret;

	if (size < sizeof(*args))
		return -EINVAL;

	ret = nouveau_object_create_(parent, engine, oclass, 0, len, pobject);
	object = *pobject;
	ret = nouveau_object_create(parent, engine, oclass, 0, &dmaobj);
	*pobject = nv_object(dmaobj);
	if (ret)
		return ret;

	switch (args->flags & NV_DMA_TARGET_MASK) {
	case NV_DMA_TARGET_VM:
		object->target = NV_MEM_TARGET_VM;
		dmaobj->target = NV_MEM_TARGET_VM;
		break;
	case NV_DMA_TARGET_VRAM:
		object->target = NV_MEM_TARGET_VRAM;
		dmaobj->target = NV_MEM_TARGET_VRAM;
		break;
	case NV_DMA_TARGET_PCI:
		object->target = NV_MEM_TARGET_PCI;
		dmaobj->target = NV_MEM_TARGET_PCI;
		break;
	case NV_DMA_TARGET_PCI_US:
	case NV_DMA_TARGET_AGP:
		object->target = NV_MEM_TARGET_PCI_NOSNOOP;
		dmaobj->target = NV_MEM_TARGET_PCI_NOSNOOP;
		break;
	default:
		return -EINVAL;
@@ -66,22 +68,58 @@ nouveau_dmaobj_create_(struct nouveau_object *parent,

	switch (args->flags & NV_DMA_ACCESS_MASK) {
	case NV_DMA_ACCESS_VM:
		object->access = NV_MEM_ACCESS_VM;
		dmaobj->access = NV_MEM_ACCESS_VM;
		break;
	case NV_DMA_ACCESS_RD:
		object->access = NV_MEM_ACCESS_RO;
		dmaobj->access = NV_MEM_ACCESS_RO;
		break;
	case NV_DMA_ACCESS_WR:
		object->access = NV_MEM_ACCESS_WO;
		dmaobj->access = NV_MEM_ACCESS_WO;
		break;
	case NV_DMA_ACCESS_RDWR:
		object->access = NV_MEM_ACCESS_RW;
		dmaobj->access = NV_MEM_ACCESS_RW;
		break;
	default:
		return -EINVAL;
	}

	object->start = args->start;
	object->limit = args->limit;
	return 0;
	dmaobj->start = args->start;
	dmaobj->limit = args->limit;

	switch (nv_mclass(parent)) {
	case NV_DEVICE_CLASS:
		break;
	case NV03_CHANNEL_DMA_CLASS:
	case NV10_CHANNEL_DMA_CLASS:
	case NV17_CHANNEL_DMA_CLASS:
	case NV40_CHANNEL_DMA_CLASS:
	case NV50_CHANNEL_DMA_CLASS:
	case NV84_CHANNEL_DMA_CLASS:
	case NV50_CHANNEL_IND_CLASS:
	case NV84_CHANNEL_IND_CLASS:
		ret = dmaeng->bind(dmaeng, *pobject, dmaobj, &gpuobj);
		nouveau_object_ref(NULL, pobject);
		*pobject = nv_object(gpuobj);
		break;
	default:
		return -EINVAL;
	}

	return ret;
}

static struct nouveau_ofuncs
nouveau_dmaobj_ofuncs = {
	.ctor = nouveau_dmaobj_ctor,
	.dtor = nouveau_object_destroy,
	.init = nouveau_object_init,
	.fini = nouveau_object_fini,
};

struct nouveau_oclass
nouveau_dmaobj_sclass[] = {
	{ NV_DMA_FROM_MEMORY_CLASS, &nouveau_dmaobj_ofuncs },
	{ NV_DMA_TO_MEMORY_CLASS, &nouveau_dmaobj_ofuncs },
	{ NV_DMA_IN_MEMORY_CLASS, &nouveau_dmaobj_ofuncs },
	{}
};
+1 −55
Original line number Diff line number Diff line
@@ -34,10 +34,6 @@ struct nv04_dmaeng_priv {
	struct nouveau_dmaeng base;
};

struct nv04_dmaobj_priv {
	struct nouveau_dmaobj base;
};

static int
nv04_dmaobj_bind(struct nouveau_dmaeng *dmaeng,
		 struct nouveau_object *parent,
@@ -105,56 +101,6 @@ nv04_dmaobj_bind(struct nouveau_dmaeng *dmaeng,
	return ret;
}

static int
nv04_dmaobj_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
		 struct nouveau_oclass *oclass, void *data, u32 size,
		 struct nouveau_object **pobject)
{
	struct nouveau_dmaeng *dmaeng = (void *)engine;
	struct nv04_dmaobj_priv *dmaobj;
	struct nouveau_gpuobj *gpuobj;
	int ret;

	ret = nouveau_dmaobj_create(parent, engine, oclass,
				    data, size, &dmaobj);
	*pobject = nv_object(dmaobj);
	if (ret)
		return ret;

	switch (nv_mclass(parent)) {
	case NV_DEVICE_CLASS:
		break;
	case NV03_CHANNEL_DMA_CLASS:
	case NV10_CHANNEL_DMA_CLASS:
	case NV17_CHANNEL_DMA_CLASS:
	case NV40_CHANNEL_DMA_CLASS:
		ret = dmaeng->bind(dmaeng, *pobject, &dmaobj->base, &gpuobj);
		nouveau_object_ref(NULL, pobject);
		*pobject = nv_object(gpuobj);
		break;
	default:
		return -EINVAL;
	}

	return ret;
}

static struct nouveau_ofuncs
nv04_dmaobj_ofuncs = {
	.ctor = nv04_dmaobj_ctor,
	.dtor = _nouveau_dmaobj_dtor,
	.init = _nouveau_dmaobj_init,
	.fini = _nouveau_dmaobj_fini,
};

static struct nouveau_oclass
nv04_dmaobj_sclass[] = {
	{ 0x0002, &nv04_dmaobj_ofuncs },
	{ 0x0003, &nv04_dmaobj_ofuncs },
	{ 0x003d, &nv04_dmaobj_ofuncs },
	{}
};

static int
nv04_dmaeng_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
		 struct nouveau_oclass *oclass, void *data, u32 size,
@@ -168,7 +114,7 @@ nv04_dmaeng_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
	if (ret)
		return ret;

	priv->base.base.sclass = nv04_dmaobj_sclass;
	nv_engine(priv)->sclass = nouveau_dmaobj_sclass;
	priv->base.bind = nv04_dmaobj_bind;
	return 0;
}
+1 −55
Original line number Diff line number Diff line
@@ -32,10 +32,6 @@ struct nv50_dmaeng_priv {
	struct nouveau_dmaeng base;
};

struct nv50_dmaobj_priv {
	struct nouveau_dmaobj base;
};

static int
nv50_dmaobj_bind(struct nouveau_dmaeng *dmaeng,
		 struct nouveau_object *parent,
@@ -93,56 +89,6 @@ nv50_dmaobj_bind(struct nouveau_dmaeng *dmaeng,
	return ret;
}

static int
nv50_dmaobj_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
		 struct nouveau_oclass *oclass, void *data, u32 size,
		 struct nouveau_object **pobject)
{
	struct nouveau_dmaeng *dmaeng = (void *)engine;
	struct nv50_dmaobj_priv *dmaobj;
	struct nouveau_gpuobj *gpuobj;
	int ret;

	ret = nouveau_dmaobj_create(parent, engine, oclass,
				    data, size, &dmaobj);
	*pobject = nv_object(dmaobj);
	if (ret)
		return ret;

	switch (nv_mclass(parent)) {
	case NV_DEVICE_CLASS:
		break;
	case NV50_CHANNEL_DMA_CLASS:
	case NV84_CHANNEL_DMA_CLASS:
	case NV50_CHANNEL_IND_CLASS:
	case NV84_CHANNEL_IND_CLASS:
		ret = dmaeng->bind(dmaeng, *pobject, &dmaobj->base, &gpuobj);
		nouveau_object_ref(NULL, pobject);
		*pobject = nv_object(gpuobj);
		break;
	default:
		return -EINVAL;
	}

	return ret;
}

static struct nouveau_ofuncs
nv50_dmaobj_ofuncs = {
	.ctor = nv50_dmaobj_ctor,
	.dtor = _nouveau_dmaobj_dtor,
	.init = _nouveau_dmaobj_init,
	.fini = _nouveau_dmaobj_fini,
};

static struct nouveau_oclass
nv50_dmaobj_sclass[] = {
	{ 0x0002, &nv50_dmaobj_ofuncs },
	{ 0x0003, &nv50_dmaobj_ofuncs },
	{ 0x003d, &nv50_dmaobj_ofuncs },
	{}
};

static int
nv50_dmaeng_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
		 struct nouveau_oclass *oclass, void *data, u32 size,
@@ -156,7 +102,7 @@ nv50_dmaeng_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
	if (ret)
		return ret;

	priv->base.base.sclass = nv50_dmaobj_sclass;
	nv_engine(priv)->sclass = nouveau_dmaobj_sclass;
	priv->base.bind = nv50_dmaobj_bind;
	return 0;
}
+2 −42
Original line number Diff line number Diff line
@@ -22,54 +22,14 @@
 * Authors: Ben Skeggs
 */

#include <core/gpuobj.h>
#include <core/device.h>

#include <subdev/fb.h>
#include <engine/dmaobj.h>

struct nvc0_dmaeng_priv {
	struct nouveau_dmaeng base;
};

struct nvc0_dmaobj_priv {
	struct nouveau_dmaobj base;
};

static int
nvc0_dmaobj_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
		 struct nouveau_oclass *oclass, void *data, u32 size,
		 struct nouveau_object **pobject)
{
	struct nvc0_dmaobj_priv *dmaobj;
	int ret;

	ret = nouveau_dmaobj_create(parent, engine, oclass, data, size, &dmaobj);
	*pobject = nv_object(dmaobj);
	if (ret)
		return ret;

	if (dmaobj->base.target != NV_MEM_TARGET_VM || dmaobj->base.start)
		return -EINVAL;

	return 0;
}

static struct nouveau_ofuncs
nvc0_dmaobj_ofuncs = {
	.ctor = nvc0_dmaobj_ctor,
	.dtor = _nouveau_dmaobj_dtor,
	.init = _nouveau_dmaobj_init,
	.fini = _nouveau_dmaobj_fini,
};

static struct nouveau_oclass
nvc0_dmaobj_sclass[] = {
	{ 0x0002, &nvc0_dmaobj_ofuncs },
	{ 0x0003, &nvc0_dmaobj_ofuncs },
	{ 0x003d, &nvc0_dmaobj_ofuncs },
	{}
};

static int
nvc0_dmaeng_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
		 struct nouveau_oclass *oclass, void *data, u32 size,
@@ -83,7 +43,7 @@ nvc0_dmaeng_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
	if (ret)
		return ret;

	priv->base.base.sclass = nvc0_dmaobj_sclass;
	nv_engine(priv)->sclass = nouveau_dmaobj_sclass;
	return 0;
}

+2 −17
Original line number Diff line number Diff line
@@ -14,23 +14,6 @@ struct nouveau_dmaobj {
	u64 limit;
};

#define nouveau_dmaobj_create(p,e,c,a,s,d)                                     \
	nouveau_dmaobj_create_((p), (e), (c), (a), (s), sizeof(**d), (void **)d)
#define nouveau_dmaobj_destroy(p)                                              \
	nouveau_object_destroy(&(p)->base)
#define nouveau_dmaobj_init(p)                                                 \
	nouveau_object_init(&(p)->base)
#define nouveau_dmaobj_fini(p,s)                                               \
	nouveau_object_fini(&(p)->base, (s))

int nouveau_dmaobj_create_(struct nouveau_object *, struct nouveau_object *,
			   struct nouveau_oclass *, void *data, u32 size,
			   int length, void **);

#define _nouveau_dmaobj_dtor nouveau_object_destroy
#define _nouveau_dmaobj_init nouveau_object_init
#define _nouveau_dmaobj_fini nouveau_object_fini

struct nouveau_dmaeng {
	struct nouveau_engine base;
	int (*bind)(struct nouveau_dmaeng *, struct nouveau_object *parent,
@@ -54,4 +37,6 @@ extern struct nouveau_oclass nv04_dmaeng_oclass;
extern struct nouveau_oclass nv50_dmaeng_oclass;
extern struct nouveau_oclass nvc0_dmaeng_oclass;

extern struct nouveau_oclass nouveau_dmaobj_sclass[];

#endif