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

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

drm/nouveau/device: decouple from engine machinery



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent a1bfb29a
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -4,7 +4,6 @@
#include <core/event.h>

enum nvkm_devidx {
	NVDEV_ENGINE_DEVICE,
	NVDEV_SUBDEV_VBIOS,

	/* All subdevs from DEVINIT to DEVINIT_LAST will be created before
@@ -65,7 +64,10 @@ enum nvkm_devidx {

struct nvkm_device {
	struct nvkm_engine engine;

	struct list_head head;
	struct mutex mutex;
	int refcount;

	struct pci_dev *pdev;
	struct platform_device *platformdev;
@@ -210,11 +212,15 @@ enum nv_bus_type {
	NVKM_BUS_PLATFORM,
};

extern struct nvkm_ofuncs nvkm_udevice_ofuncs;

int  nvkm_device_new(void *, enum nv_bus_type type, u64 name,
		     const char *sname, const char *cfg, const char *dbg,
		     bool detect, bool mmio, u64 subdev_mask,
		     struct nvkm_device **);
void nvkm_device_del(struct nvkm_device **);
int  nvkm_device_init(struct nvkm_device *);
int  nvkm_device_fini(struct nvkm_device *, bool suspend);

/* device logging */
#define nvdev_printk_(d,l,p,f,a...) do {                                       \
+8 −3
Original line number Diff line number Diff line
@@ -226,6 +226,12 @@ nvkm_client_del(struct nvkm_client **pclient)
	}
}

static struct nvkm_oclass
nvkm_client_sclass[] = {
	{ NV_DEVICE, &nvkm_udevice_ofuncs },
	{}
};

int
nvkm_client_new(const char *name, u64 devname, const char *cfg,
		const char *dbg, struct nvkm_client **pclient)
@@ -239,9 +245,8 @@ nvkm_client_new(const char *name, u64 devname, const char *cfg,
		return -ENODEV;

	ret = nvkm_namedb_create(NULL, NULL, &nvkm_client_oclass,
				 NV_CLIENT_CLASS, NULL,
				 (1ULL << NVDEV_ENGINE_DEVICE),
				 &client);
				 NV_CLIENT_CLASS, nvkm_client_sclass,
				 0, &client);
	*pclient = client;
	if (ret)
		return ret;
+2 −7
Original line number Diff line number Diff line
@@ -216,7 +216,6 @@ nvkm_gpuobj_new(struct nvkm_object *parent, struct nvkm_object *pargpu,
		u32 size, u32 align, u32 flags,
		struct nvkm_gpuobj **pgpuobj)
{
	struct nvkm_object *engine = parent;
	struct nvkm_gpuobj_class args = {
		.pargpu = pargpu,
		.size = size,
@@ -224,12 +223,8 @@ nvkm_gpuobj_new(struct nvkm_object *parent, struct nvkm_object *pargpu,
		.flags = flags,
	};

	if (!nv_iclass(engine, NV_SUBDEV_CLASS))
		engine = &engine->engine->subdev.object;
	BUG_ON(engine == NULL);

	return nvkm_object_ctor(parent, engine, &_nvkm_gpuobj_oclass,
				&args, sizeof(args),
	return nvkm_object_ctor(parent, &parent->engine->subdev.object,
				&_nvkm_gpuobj_oclass, &args, sizeof(args),
				(struct nvkm_object **)pgpuobj);
}

+1 −1
Original line number Diff line number Diff line
@@ -31,7 +31,7 @@ nvkm_subdev(void *obj, int idx)
	struct nvkm_object *object = nv_object(obj);
	while (object && !nv_iclass(object, NV_SUBDEV_CLASS))
		object = object->parent;
	if (object == NULL || nv_subidx(nv_subdev(object)) != idx)
	if (object == NULL || !object->parent || nv_subidx(nv_subdev(object)) != idx)
		object = nv_device(obj)->subdev[idx];
	return object ? nv_subdev(object) : NULL;
}
+19 −18
Original line number Diff line number Diff line
@@ -61,13 +61,24 @@ nvkm_device_list(u64 *name, int size)
	return nr;
}

#include <core/parent.h>

struct nvkm_device *
nv_device(void *obj)
{
	struct nvkm_object *device = nv_object(obj);

	if (device->engine == NULL) {
		while (device && device->parent)
		while (device && device->parent) {
			if (nv_mclass(device) == 0x0080) {
				struct {
					struct nvkm_parent base;
					struct nvkm_device *device;
				} *udevice = (void *)device;
				return udevice->device;
			}
			device = device->parent;
		}
	} else {
		device = &nv_object(obj)->engine->subdev.object;
		if (device && device->parent)
@@ -79,12 +90,6 @@ nv_device(void *obj)
	return (void *)device;
}

static struct nvkm_oclass
nvkm_device_sclass[] = {
	{ 0x0080, &nvkm_udevice_ofuncs },
	{}
};

static int
nvkm_device_event_ctor(struct nvkm_object *object, void *data, u32 size,
		       struct nvkm_notify *notify)
@@ -103,10 +108,9 @@ nvkm_device_event_func = {
	.ctor = nvkm_device_event_ctor,
};

static int
nvkm_device_fini(struct nvkm_object *object, bool suspend)
int
nvkm_device_fini(struct nvkm_device *device, bool suspend)
{
	struct nvkm_device *device = (void *)object;
	struct nvkm_object *subdev;
	int ret, i;

@@ -136,10 +140,9 @@ nvkm_device_fini(struct nvkm_object *object, bool suspend)
	return ret;
}

static int
nvkm_device_init(struct nvkm_object *object)
int
nvkm_device_init(struct nvkm_device *device)
{
	struct nvkm_device *device = (void *)object;
	struct nvkm_object *subdev;
	int ret, i = 0, c;

@@ -147,7 +150,7 @@ nvkm_device_init(struct nvkm_object *object)
	if (ret)
		goto fail;

	for (i = 1, c = 1; i < NVDEV_SUBDEV_NR; i++) {
	for (i = 0, c = 0; i < NVDEV_SUBDEV_NR; i++) {
#define _(s,m) case s: if (device->oclass[s] && !device->subdev[s]) {          \
		ret = nvkm_object_ctor(nv_object(device), NULL,                \
				       device->oclass[s], NULL,  (s),          \
@@ -286,10 +289,7 @@ nv_device_get_irq(struct nvkm_device *device, bool stall)

static struct nvkm_oclass
nvkm_device_oclass = {
	.handle = NV_ENGINE(DEVICE, 0x00),
	.ofuncs = &(struct nvkm_ofuncs) {
		.init = nvkm_device_init,
		.fini = nvkm_device_fini,
	},
};

@@ -356,7 +356,6 @@ nvkm_device_new(void *dev, enum nv_bus_type type, u64 name,
	device->name = sname;

	nv_subdev(device)->debug = nvkm_dbgopt(device->dbgopt, "DEVICE");
	nv_engine(device)->sclass = nvkm_device_sclass;
	list_add_tail(&device->head, &nv_devices);

	ret = nvkm_event_init(&nvkm_device_event_func, 1, 1, &device->event);
@@ -482,6 +481,8 @@ nvkm_device_new(void *dev, enum nv_bus_type type, u64 name,
			device->oclass[i] = NULL;
	}

	atomic_set(&device->engine.subdev.object.usecount, 2);
	mutex_init(&device->mutex);
done:
	mutex_unlock(&nv_devices_mutex);
	return ret;
Loading