Commit 0710cc31 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

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



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 19fef52d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@ struct nvkm_client {

	struct nvkm_client_notify *notify[16];
	struct rb_root objroot;
	struct rb_root dmaroot;

	struct nvkm_handle *root;

+16 −5
Original line number Diff line number Diff line
#ifndef __NVKM_DMA_H__
#define __NVKM_DMA_H__
#include <core/engine.h>
struct nvkm_client;
struct nvkm_gpuobj;

struct nvkm_dmaobj {
	struct nvkm_object base;
	const struct nvkm_dmaobj_func *func;
	struct nvkm_dma *dma;

	struct nvkm_object object;
	u32 target;
	u32 access;
	u64 start;
	u64 limit;

	struct rb_node rb;
	u64 handle; /*XXX HANDLE MERGE */
};

struct nvkm_dmaobj_func {
	int (*bind)(struct nvkm_dmaobj *, struct nvkm_gpuobj *, int align,
		    struct nvkm_gpuobj **);
};

struct nvkm_dma {
	struct nvkm_engine engine;

	/* creates a "physical" dma object from a struct nvkm_dmaobj */
	int (*bind)(struct nvkm_dmaobj *dmaobj, struct nvkm_gpuobj *parent,
		    struct nvkm_gpuobj **);
};

struct nvkm_dmaobj *
nvkm_dma_search(struct nvkm_dma *, struct nvkm_client *, u64 object);

extern struct nvkm_oclass *nv04_dmaeng_oclass;
extern struct nvkm_oclass *nv50_dmaeng_oclass;
extern struct nvkm_oclass *gf100_dmaeng_oclass;
+1 −0
Original line number Diff line number Diff line
@@ -314,6 +314,7 @@ nvkm_client_new(const char *name, u64 device, const char *cfg,
	client->device = device;
	client->debug = nvkm_dbgopt(dbg, "CLIENT");
	client->objroot = RB_ROOT;
	client->dmaroot = RB_ROOT;

	ret = nvkm_handle_create(NULL, ~0, &client->object, &client->root);
	if (ret)
+19 −8
Original line number Diff line number Diff line
@@ -292,11 +292,12 @@ nvkm_udevice_child_get(struct nvkm_object *object, int index,
		   (1ULL << NVDEV_ENGINE_FIFO) |
		   (1ULL << NVDEV_ENGINE_DISP) |
		   (1ULL << NVDEV_ENGINE_PM);
	const struct nvkm_device_oclass *sclass;
	const struct nvkm_device_oclass *sclass = NULL;
	int i;

	for (; i = __ffs64(mask), mask; mask &= ~(1ULL << i)) {
		if ((engine = nvkm_device_engine(device, i))) {
	for (; i = __ffs64(mask), mask && !sclass; mask &= ~(1ULL << i)) {
		if ((engine = nvkm_device_engine(device, i)) &&
		    !engine->func) {
			struct nvkm_oclass *sclass = engine->sclass;
			int c = 0;
			while (sclass && sclass->ofuncs) {
@@ -312,17 +313,27 @@ nvkm_udevice_child_get(struct nvkm_object *object, int index,
				sclass++;
			}
			index -= c;
			continue;
		}

		if (!(engine = nvkm_device_engine(device, i)) ||
		    !(engine->func->base.sclass))
			continue;
		oclass->engine = engine;

		index -= engine->func->base.sclass(oclass, index, &sclass);
	}

	if (!sclass) {
		switch (index) {
		case 0: sclass = &nvkm_control_oclass; break;
		default:
			return -EINVAL;
		}
		oclass->base = sclass->base;
	}

	oclass->ctor = nvkm_udevice_child_new;
	oclass->base = sclass->base;
	oclass->priv = sclass;
	return 0;
}
+12 −19
Original line number Diff line number Diff line
@@ -209,8 +209,9 @@ nv50_disp_dmac_create_(struct nvkm_object *parent,
		       struct nvkm_oclass *oclass, u64 pushbuf, int head,
		       int length, void **pobject)
{
	struct nvkm_device *device = parent->engine->subdev.device;
	struct nvkm_client *client = nvkm_client(parent);
	struct nvkm_handle *handle;
	struct nvkm_dma *dma = device->dma;
	struct nvkm_dmaobj *dmaobj;
	struct nv50_disp_dmac *dmac;
	int ret;
@@ -221,14 +222,10 @@ nv50_disp_dmac_create_(struct nvkm_object *parent,
	if (ret)
		return ret;

	handle = nvkm_client_search(client, pushbuf);
	if (!handle)
	dmaobj = nvkm_dma_search(dma, client, pushbuf);
	if (!dmaobj)
		return -ENOENT;
	dmaobj = (void *)handle->object;

	switch (nv_mclass(dmaobj)) {
	case 0x0002:
	case 0x003d:
	if (dmaobj->limit - dmaobj->start != 0xfff)
		return -EINVAL;

@@ -242,10 +239,6 @@ nv50_disp_dmac_create_(struct nvkm_object *parent,
	default:
		return -EINVAL;
	}
		break;
	default:
		return -EINVAL;
	}

	return 0;
}
Loading