diff --git a/drivers/gpu/drm/nouveau/core/core/engine.c b/drivers/gpu/drm/nouveau/core/core/engine.c index 1f6954ae9dd36e51141a9b810d91e49f1ddad2b2..4835056b068967e62bd6ca0462f36467e8549585 100644 --- a/drivers/gpu/drm/nouveau/core/core/engine.c +++ b/drivers/gpu/drm/nouveau/core/core/engine.c @@ -26,6 +26,15 @@ #include #include +struct nouveau_engine * +nouveau_engine(void *obj, int sub) +{ + struct nouveau_subdev *subdev = nouveau_subdev(obj, sub); + if (subdev && nv_iclass(subdev, NV_ENGINE_CLASS)) + return nv_engine(subdev); + return NULL; +} + int nouveau_engine_create_(struct nouveau_object *parent, struct nouveau_object *engobj, diff --git a/drivers/gpu/drm/nouveau/core/core/subdev.c b/drivers/gpu/drm/nouveau/core/core/subdev.c index 28157bf57da15875cd300687aa93f52d300b694e..edae535406e572fad78160b6e515197621049229 100644 --- a/drivers/gpu/drm/nouveau/core/core/subdev.c +++ b/drivers/gpu/drm/nouveau/core/core/subdev.c @@ -27,6 +27,14 @@ #include #include +struct nouveau_subdev * +nouveau_subdev(void *obj, int sub) +{ + if (nv_device(obj)->subdev[sub]) + return nv_subdev(nv_device(obj)->subdev[sub]); + return NULL; +} + void nouveau_subdev_reset(struct nouveau_object *subdev) { diff --git a/drivers/gpu/drm/nouveau/core/engine/device/base.c b/drivers/gpu/drm/nouveau/core/engine/device/base.c index 714a93eb1fd3d6dd85ef6384d30e5260d32089d4..e2da1d4029cd692e92b682d42ea400e4e172116a 100644 --- a/drivers/gpu/drm/nouveau/core/engine/device/base.c +++ b/drivers/gpu/drm/nouveau/core/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 }, diff --git a/drivers/gpu/drm/nouveau/core/include/core/device.h b/drivers/gpu/drm/nouveau/core/include/core/device.h index 33b35c487cba6819723582acde7f1b0bb282fe24..21a055aca5131c9d46e402a3a9fddbdd19ad2dc8 100644 --- a/drivers/gpu/drm/nouveau/core/include/core/device.h +++ b/drivers/gpu/drm/nouveau/core/include/core/device.h @@ -105,44 +105,7 @@ struct nouveau_device { int nouveau_device_list(u64 *name, int size); -static inline 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 inline struct nouveau_subdev * -nouveau_subdev(void *obj, int sub) -{ - if (nv_device(obj)->subdev[sub]) - return nv_subdev(nv_device(obj)->subdev[sub]); - return NULL; -} - -static inline struct nouveau_engine * -nouveau_engine(void *obj, int sub) -{ - struct nouveau_subdev *subdev = nouveau_subdev(obj, sub); - if (subdev && nv_iclass(subdev, NV_ENGINE_CLASS)) - return nv_engine(subdev); - return NULL; -} +struct nouveau_device *nv_device(void *obj); static inline bool nv_device_match(struct nouveau_object *object, u16 dev, u16 ven, u16 sub) diff --git a/drivers/gpu/drm/nouveau/core/include/core/engine.h b/drivers/gpu/drm/nouveau/core/include/core/engine.h index 8945755eeec04496ae000f49944cf35e9cb6c036..be04250a1c0097ce96daac31861f7e2ba5afac9f 100644 --- a/drivers/gpu/drm/nouveau/core/include/core/engine.h +++ b/drivers/gpu/drm/nouveau/core/include/core/engine.h @@ -35,6 +35,8 @@ nv_engidx(struct nouveau_object *object) return nv_subidx(object); } +struct nouveau_engine *nouveau_engine(void *obj, int idx); + #define nouveau_engine_create(p,e,c,d,i,f,r) \ nouveau_engine_create_((p), (e), (c), (d), (i), (f), \ sizeof(**r),(void **)r) diff --git a/drivers/gpu/drm/nouveau/core/include/core/subdev.h b/drivers/gpu/drm/nouveau/core/include/core/subdev.h index c24d64ba9a6bd1b5f144385e4bb54b1d1bb860cd..d9739aed0150e69d2aada513207c8c412f130d05 100644 --- a/drivers/gpu/drm/nouveau/core/include/core/subdev.h +++ b/drivers/gpu/drm/nouveau/core/include/core/subdev.h @@ -33,6 +33,8 @@ nv_subidx(struct nouveau_object *object) return nv_hclass(nv_subdev(object)) & 0xff; } +struct nouveau_subdev *nouveau_subdev(void *obj, int idx); + #define nouveau_subdev_create(p,e,o,v,s,f,d) \ nouveau_subdev_create_((p), (e), (o), (v), (s), (f), \ sizeof(**d),(void **)d)