drm/nouveau/parent: remove some (now) unnecessary special-case handling
authorBen Skeggs <bskeggs@redhat.com>
Thu, 20 Aug 2015 04:54:15 +0000 (14:54 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 28 Aug 2015 02:40:31 +0000 (12:40 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/include/nvkm/core/parent.h
drivers/gpu/drm/nouveau/nvkm/core/parent.c

index 57932131b601c8fef1076e129243d7927b2ad8b3..2e5266fa75841b4fb54370f102feb42e5ade3931 100644 (file)
@@ -2,16 +2,10 @@
 #define __NVKM_PARENT_H__
 #include <core/object.h>
 
-struct nvkm_sclass {
-       struct nvkm_sclass *sclass;
-       struct nvkm_engine *engine;
-       struct nvkm_oclass *oclass;
-};
-
 struct nvkm_parent {
        struct nvkm_object object;
 
-       struct nvkm_sclass *sclass;
+       struct nvkm_oclass *sclass;
        u64 engine;
 
        int  (*context_attach)(struct nvkm_object *, struct nvkm_object *);
index dd56cd1eeb389703056b499b197e23a679821c5f..5c75c64f227097d5f03c848a2022675783aa40b3 100644 (file)
@@ -30,35 +30,27 @@ nvkm_parent_sclass(struct nvkm_object *parent, u16 handle,
                   struct nvkm_object **pengine,
                   struct nvkm_oclass **poclass)
 {
-       struct nvkm_sclass *sclass;
+       struct nvkm_oclass *sclass, *oclass;
        struct nvkm_engine *engine;
-       struct nvkm_oclass *oclass;
        u64 mask;
+       int i;
 
        sclass = nv_parent(parent)->sclass;
-       while (sclass) {
-               if ((sclass->oclass->handle & 0xffff) == handle) {
+       while ((oclass = sclass++) && oclass->ofuncs) {
+               if (oclass->handle == handle) {
                        *pengine = &parent->engine->subdev.object;
-                       *poclass = sclass->oclass;
+                       *poclass = oclass;
                        return 0;
                }
-
-               sclass = sclass->sclass;
        }
 
        mask = nv_parent(parent)->engine;
-       while (mask) {
-               int i = __ffs64(mask);
-
-               if (nv_iclass(parent, NV_CLIENT_CLASS))
-                       engine = nv_engine(nv_client(parent)->device);
-               else
-                       engine = nvkm_engine(parent, i);
-
+       while (i = __ffs64(mask), mask) {
+               engine = nvkm_engine(parent, i);
                if (engine) {
                        oclass = engine->sclass;
                        while (oclass->ofuncs) {
-                               if ((oclass->handle & 0xffff) == handle) {
+                               if (oclass->handle == handle) {
                                        *pengine = nv_object(engine);
                                        *poclass = oclass;
                                        return 0;
@@ -76,17 +68,15 @@ nvkm_parent_sclass(struct nvkm_object *parent, u16 handle,
 int
 nvkm_parent_lclass(struct nvkm_object *parent, u32 *lclass, int size)
 {
-       struct nvkm_sclass *sclass;
+       struct nvkm_oclass *sclass, *oclass;
        struct nvkm_engine *engine;
-       struct nvkm_oclass *oclass;
        int nr = -1, i;
        u64 mask;
 
        sclass = nv_parent(parent)->sclass;
-       while (sclass) {
+       while ((oclass = sclass++) && oclass->ofuncs) {
                if (++nr < size)
-                       lclass[nr] = sclass->oclass->handle & 0xffff;
-               sclass = sclass->sclass;
+                       lclass[nr] = oclass->handle;
        }
 
        mask = nv_parent(parent)->engine;
@@ -95,7 +85,7 @@ nvkm_parent_lclass(struct nvkm_object *parent, u32 *lclass, int size)
                if (engine && (oclass = engine->sclass)) {
                        while (oclass->ofuncs) {
                                if (++nr < size)
-                                       lclass[nr] = oclass->handle & 0xffff;
+                                       lclass[nr] = oclass->handle;
                                oclass++;
                        }
                }
@@ -113,7 +103,6 @@ nvkm_parent_create_(struct nvkm_object *parent, struct nvkm_object *engine,
                    int size, void **pobject)
 {
        struct nvkm_parent *object;
-       struct nvkm_sclass *nclass;
        int ret;
 
        ret = nvkm_object_create_(parent, engine, oclass, pclass |
@@ -122,18 +111,7 @@ nvkm_parent_create_(struct nvkm_object *parent, struct nvkm_object *engine,
        if (ret)
                return ret;
 
-       while (sclass && sclass->ofuncs) {
-               nclass = kzalloc(sizeof(*nclass), GFP_KERNEL);
-               if (!nclass)
-                       return -ENOMEM;
-
-               nclass->sclass = object->sclass;
-               object->sclass = nclass;
-               nclass->engine = engine ? nv_engine(engine) : NULL;
-               nclass->oclass = sclass;
-               sclass++;
-       }
-
+       object->sclass = sclass;
        object->engine = engcls;
        return 0;
 }
@@ -141,13 +119,6 @@ nvkm_parent_create_(struct nvkm_object *parent, struct nvkm_object *engine,
 void
 nvkm_parent_destroy(struct nvkm_parent *parent)
 {
-       struct nvkm_sclass *sclass;
-
-       while ((sclass = parent->sclass)) {
-               parent->sclass = sclass->sclass;
-               kfree(sclass);
-       }
-
        nvkm_object_destroy(&parent->object);
 }