Commit 490d595f authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/core: fix subdev/engine/device lookup to not require engine pointer



It's about to not be valid for objects that aren't in the client
object tree.

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent a38f37a7
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -27,11 +27,11 @@
#include <core/option.h>

struct nouveau_engine *
nouveau_engine(void *obj, int sub)
nouveau_engine(void *obj, int idx)
{
	struct nouveau_subdev *subdev = nouveau_subdev(obj, sub);
	if (subdev && nv_iclass(subdev, NV_ENGINE_CLASS))
		return nv_engine(subdev);
	obj = nouveau_subdev(obj, idx);
	if (obj && nv_iclass(obj, NV_ENGINE_CLASS))
		return nv_engine(obj);
	return NULL;
}

+7 −4
Original line number Diff line number Diff line
@@ -28,11 +28,14 @@
#include <core/option.h>

struct nouveau_subdev *
nouveau_subdev(void *obj, int sub)
nouveau_subdev(void *obj, int idx)
{
	if (nv_device(obj)->subdev[sub])
		return nv_subdev(nv_device(obj)->subdev[sub]);
	return NULL;
	struct nouveau_object *object = nv_object(obj);
	while (object && !nv_iclass(object, NV_SUBDEV_CLASS))
		object = object->parent;
	if (object == NULL || nv_subidx(object) != idx)
		object = nv_device(obj)->subdev[idx];
	return object ? nv_subdev(object) : NULL;
}

void
+9 −13
Original line number Diff line number Diff line
@@ -511,22 +511,18 @@ nouveau_devobj_ofuncs = {
struct nouveau_device *
nv_device(void *obj)
{
	struct nouveau_object *object = nv_object(obj);
	struct nouveau_object *device = object;

	if (device->engine)
		device = device->engine;
	if (device->parent)
	struct nouveau_object *device = nv_object(obj);
	while (device && device->parent)
		device = device->parent;
	if (!nv_iclass(device, NV_ENGINE_CLASS)) {
		device = nv_object(obj)->engine;
		if (device && device->parent)
			device = device->parent;

#if CONFIG_NOUVEAU_DEBUG >= NV_DBG_PARANOIA
	if (unlikely(!nv_iclass(device, NV_SUBDEV_CLASS) ||
		     (nv_hclass(device) & 0xff) != NVDEV_ENGINE_DEVICE)) {
		nv_assert("BAD CAST -> NvDevice, 0x%08x 0x%08x",
			  nv_hclass(object), nv_hclass(device));
	}
#if CONFIG_NOUVEAU_DEBUG >= NV_DBG_PARANOIA
	if (unlikely(!device))
		nv_assert("BAD CAST -> NvDevice, 0x%08x\n", nv_hclass(obj));
#endif

	return (void *)device;
}