summaryrefslogtreecommitdiff
path: root/nvkm/engine/device/base.c
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2014-12-05 11:20:19 +1000
committerBen Skeggs <bskeggs@redhat.com>2015-01-10 23:57:06 +1000
commit77aaee78e26f4b174e44f9547792e10b61666176 (patch)
tree6b84ad6bfb11d52ba621297de4fcade4be1dda46 /nvkm/engine/device/base.c
parentc4eb2e2bad75870f537a0e33aa405cb2b5595a31 (diff)
downloadnouveau-77aaee78e26f4b174e44f9547792e10b61666176.tar.gz
core: uninline subdev/engine/device lookup functions
These are a tad more complex than a direct cast with paranoia safeties. Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'nvkm/engine/device/base.c')
-rw-r--r--nvkm/engine/device/base.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/nvkm/engine/device/base.c b/nvkm/engine/device/base.c
index 714a93eb1..e2da1d402 100644
--- a/nvkm/engine/device/base.c
+++ b/nvkm/engine/device/base.c
@@ -508,6 +508,28 @@ nouveau_devobj_ofuncs = {
* nouveau_device: engine functions
*****************************************************************************/
+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)
+ 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));
+ }
+#endif
+
+ return (void *)device;
+}
+
static struct nouveau_oclass
nouveau_device_sclass[] = {
{ 0x0080, &nouveau_devobj_ofuncs },