diff options
Diffstat (limited to 'drm/nouveau/nvkm/core/engine.c')
-rw-r--r-- | drm/nouveau/nvkm/core/engine.c | 79 |
1 files changed, 8 insertions, 71 deletions
diff --git a/drm/nouveau/nvkm/core/engine.c b/drm/nouveau/nvkm/core/engine.c index 3fef9cc34..8a7bae7bd 100644 --- a/drm/nouveau/nvkm/core/engine.c +++ b/drm/nouveau/nvkm/core/engine.c @@ -67,29 +67,26 @@ nvkm_engine_tile(struct nvkm_engine *engine, int region) } static void -nvkm_engine_intr(struct nvkm_subdev *obj) +nvkm_engine_intr(struct nvkm_subdev *subdev) { - struct nvkm_engine *engine = container_of(obj, typeof(*engine), subdev); + struct nvkm_engine *engine = nvkm_engine(subdev); if (engine->func->intr) engine->func->intr(engine); } static int -nvkm_engine_fini(struct nvkm_subdev *obj, bool suspend) +nvkm_engine_fini(struct nvkm_subdev *subdev, bool suspend) { - struct nvkm_engine *engine = container_of(obj, typeof(*engine), subdev); - if (engine->subdev.object.oclass) - return engine->subdev.object.oclass->ofuncs->fini(&engine->subdev.object, suspend); + struct nvkm_engine *engine = nvkm_engine(subdev); if (engine->func->fini) return engine->func->fini(engine, suspend); return 0; } static int -nvkm_engine_init(struct nvkm_subdev *obj) +nvkm_engine_init(struct nvkm_subdev *subdev) { - struct nvkm_engine *engine = container_of(obj, typeof(*engine), subdev); - struct nvkm_subdev *subdev = &engine->subdev; + struct nvkm_engine *engine = nvkm_engine(subdev); struct nvkm_fb *fb = subdev->device->fb; int ret = 0, i; s64 time; @@ -99,9 +96,6 @@ nvkm_engine_init(struct nvkm_subdev *obj) return ret; } - if (engine->subdev.object.oclass) - return engine->subdev.object.oclass->ofuncs->init(&engine->subdev.object); - if (engine->func->oneinit && !engine->subdev.oneinit) { nvkm_trace(subdev, "one-time init running...\n"); time = ktime_to_us(ktime_get()); @@ -125,13 +119,9 @@ nvkm_engine_init(struct nvkm_subdev *obj) } static void * -nvkm_engine_dtor(struct nvkm_subdev *obj) +nvkm_engine_dtor(struct nvkm_subdev *subdev) { - struct nvkm_engine *engine = container_of(obj, typeof(*engine), subdev); - if (engine->subdev.object.oclass) { - engine->subdev.object.oclass->ofuncs->dtor(&engine->subdev.object); - return NULL; - } + struct nvkm_engine *engine = nvkm_engine(subdev); if (engine->func->dtor) return engine->func->dtor(engine); return engine; @@ -173,56 +163,3 @@ nvkm_engine_new_(const struct nvkm_engine_func *func, return nvkm_engine_ctor(func, device, index, pmc_enable, enable, *pengine); } - -struct nvkm_engine * -nvkm_engine(void *obj, int idx) -{ - obj = nvkm_subdev(obj, idx); - if (obj && nv_iclass(obj, NV_ENGINE_CLASS)) - return nv_engine(obj); - return NULL; -} - -int -nvkm_engine_create_(struct nvkm_object *parent, struct nvkm_object *engobj, - struct nvkm_oclass *oclass, bool enable, - const char *iname, const char *fname, - int length, void **pobject) -{ - struct nvkm_engine *engine; - int ret; - - ret = nvkm_subdev_create_(parent, engobj, oclass, NV_ENGINE_CLASS, - iname, fname, length, pobject); - engine = *pobject; - if (ret) - return ret; - - if (parent) { - struct nvkm_device *device = nv_device(parent); - int engidx = nv_engidx(engine); - - if (device->disable_mask & (1ULL << engidx)) { - if (!nvkm_boolopt(device->cfgopt, iname, false)) { - nvkm_debug(&engine->subdev, - "engine disabled by hw/fw\n"); - return -ENODEV; - } - - nvkm_warn(&engine->subdev, - "ignoring hw/fw engine disable\n"); - } - - if (!nvkm_boolopt(device->cfgopt, iname, enable)) { - if (!enable) - nvkm_warn(&engine->subdev, - "disabled, %s=1 to enable\n", iname); - return -ENODEV; - } - } - - INIT_LIST_HEAD(&engine->contexts); - spin_lock_init(&engine->lock); - engine->subdev.func = &nvkm_engine_func; - return 0; -} |