diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2014-12-05 11:26:23 +1000 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2015-01-10 23:57:07 +1000 |
commit | 933e1b6723ea968dfb5e93ae14f292abb2c5e91c (patch) | |
tree | 053a270b999e07586f614a29af3d1f66fa48ae37 /nvkm/engine/device/base.c | |
parent | 77aaee78e26f4b174e44f9547792e10b61666176 (diff) | |
download | nouveau-933e1b6723ea968dfb5e93ae14f292abb2c5e91c.tar.gz |
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: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'nvkm/engine/device/base.c')
-rw-r--r-- | nvkm/engine/device/base.c | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/nvkm/engine/device/base.c b/nvkm/engine/device/base.c index e2da1d402..7c0cbcde7 100644 --- a/nvkm/engine/device/base.c +++ b/nvkm/engine/device/base.c @@ -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 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 (!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(!device)) + nv_assert("BAD CAST -> NvDevice, 0x%08x\n", nv_hclass(obj)); #endif - return (void *)device; } |