diff options
Diffstat (limited to 'nvkm/core')
-rw-r--r-- | nvkm/core/engine.c | 8 | ||||
-rw-r--r-- | nvkm/core/subdev.c | 11 |
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 |