Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/nouveau/parent: remove some (now) unnecessary special-case handling

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>

+14 -49
+1 -7
drivers/gpu/drm/nouveau/include/nvkm/core/parent.h
··· 2 2 #define __NVKM_PARENT_H__ 3 3 #include <core/object.h> 4 4 5 - struct nvkm_sclass { 6 - struct nvkm_sclass *sclass; 7 - struct nvkm_engine *engine; 8 - struct nvkm_oclass *oclass; 9 - }; 10 - 11 5 struct nvkm_parent { 12 6 struct nvkm_object object; 13 7 14 - struct nvkm_sclass *sclass; 8 + struct nvkm_oclass *sclass; 15 9 u64 engine; 16 10 17 11 int (*context_attach)(struct nvkm_object *, struct nvkm_object *);
+13 -42
drivers/gpu/drm/nouveau/nvkm/core/parent.c
··· 30 30 struct nvkm_object **pengine, 31 31 struct nvkm_oclass **poclass) 32 32 { 33 - struct nvkm_sclass *sclass; 33 + struct nvkm_oclass *sclass, *oclass; 34 34 struct nvkm_engine *engine; 35 - struct nvkm_oclass *oclass; 36 35 u64 mask; 36 + int i; 37 37 38 38 sclass = nv_parent(parent)->sclass; 39 - while (sclass) { 40 - if ((sclass->oclass->handle & 0xffff) == handle) { 39 + while ((oclass = sclass++) && oclass->ofuncs) { 40 + if (oclass->handle == handle) { 41 41 *pengine = &parent->engine->subdev.object; 42 - *poclass = sclass->oclass; 42 + *poclass = oclass; 43 43 return 0; 44 44 } 45 - 46 - sclass = sclass->sclass; 47 45 } 48 46 49 47 mask = nv_parent(parent)->engine; 50 - while (mask) { 51 - int i = __ffs64(mask); 52 - 53 - if (nv_iclass(parent, NV_CLIENT_CLASS)) 54 - engine = nv_engine(nv_client(parent)->device); 55 - else 56 - engine = nvkm_engine(parent, i); 57 - 48 + while (i = __ffs64(mask), mask) { 49 + engine = nvkm_engine(parent, i); 58 50 if (engine) { 59 51 oclass = engine->sclass; 60 52 while (oclass->ofuncs) { 61 - if ((oclass->handle & 0xffff) == handle) { 53 + if (oclass->handle == handle) { 62 54 *pengine = nv_object(engine); 63 55 *poclass = oclass; 64 56 return 0; ··· 68 76 int 69 77 nvkm_parent_lclass(struct nvkm_object *parent, u32 *lclass, int size) 70 78 { 71 - struct nvkm_sclass *sclass; 79 + struct nvkm_oclass *sclass, *oclass; 72 80 struct nvkm_engine *engine; 73 - struct nvkm_oclass *oclass; 74 81 int nr = -1, i; 75 82 u64 mask; 76 83 77 84 sclass = nv_parent(parent)->sclass; 78 - while (sclass) { 85 + while ((oclass = sclass++) && oclass->ofuncs) { 79 86 if (++nr < size) 80 - lclass[nr] = sclass->oclass->handle & 0xffff; 81 - sclass = sclass->sclass; 87 + lclass[nr] = oclass->handle; 82 88 } 83 89 84 90 mask = nv_parent(parent)->engine; ··· 85 95 if (engine && (oclass = engine->sclass)) { 86 96 while (oclass->ofuncs) { 87 97 if (++nr < size) 88 - lclass[nr] = oclass->handle & 0xffff; 98 + lclass[nr] = oclass->handle; 89 99 oclass++; 90 100 } 91 101 } ··· 103 113 int size, void **pobject) 104 114 { 105 115 struct nvkm_parent *object; 106 - struct nvkm_sclass *nclass; 107 116 int ret; 108 117 109 118 ret = nvkm_object_create_(parent, engine, oclass, pclass | ··· 111 122 if (ret) 112 123 return ret; 113 124 114 - while (sclass && sclass->ofuncs) { 115 - nclass = kzalloc(sizeof(*nclass), GFP_KERNEL); 116 - if (!nclass) 117 - return -ENOMEM; 118 - 119 - nclass->sclass = object->sclass; 120 - object->sclass = nclass; 121 - nclass->engine = engine ? nv_engine(engine) : NULL; 122 - nclass->oclass = sclass; 123 - sclass++; 124 - } 125 - 125 + object->sclass = sclass; 126 126 object->engine = engcls; 127 127 return 0; 128 128 } ··· 119 141 void 120 142 nvkm_parent_destroy(struct nvkm_parent *parent) 121 143 { 122 - struct nvkm_sclass *sclass; 123 - 124 - while ((sclass = parent->sclass)) { 125 - parent->sclass = sclass->sclass; 126 - kfree(sclass); 127 - } 128 - 129 144 nvkm_object_destroy(&parent->object); 130 145 } 131 146