summaryrefslogtreecommitdiff
path: root/nvkm/core
diff options
context:
space:
mode:
Diffstat (limited to 'nvkm/core')
-rw-r--r--nvkm/core/engine.c8
-rw-r--r--nvkm/core/subdev.c11
2 files changed, 11 insertions, 8 deletions
diff --git a/nvkm/core/engine.c b/nvkm/core/engine.c
index 4835056b0..85bf4b3d1 100644
--- a/nvkm/core/engine.c
+++ b/nvkm/core/engine.c
@@ -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;
}
diff --git a/nvkm/core/subdev.c b/nvkm/core/subdev.c
index edae53540..69ba1482c 100644
--- a/nvkm/core/subdev.c
+++ b/nvkm/core/subdev.c
@@ -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