Loading drivers/gpu/drm/nouveau/core/core/parent.c +33 −0 Original line number Diff line number Diff line Loading @@ -74,6 +74,39 @@ nouveau_parent_sclass(struct nouveau_object *parent, u16 handle, return -EINVAL; } int nouveau_parent_lclass(struct nouveau_object *parent, u32 *lclass, int size) { struct nouveau_sclass *sclass; struct nouveau_engine *engine; struct nouveau_oclass *oclass; int nr = -1, i; u64 mask; sclass = nv_parent(parent)->sclass; while (sclass) { if (++nr < size) lclass[nr] = sclass->oclass->handle; sclass = sclass->sclass; } mask = nv_parent(parent)->engine; while (i = __ffs64(mask), mask) { engine = nouveau_engine(parent, i); if (engine && (oclass = engine->sclass)) { while (oclass->ofuncs) { if (++nr < size) lclass[nr] = oclass->handle; oclass++; } } mask &= ~(1ULL << i); } return nr + 1; } int nouveau_parent_create_(struct nouveau_object *parent, struct nouveau_object *engine, Loading drivers/gpu/drm/nouveau/core/include/core/parent.h +1 −0 Original line number Diff line number Diff line Loading @@ -57,5 +57,6 @@ void _nouveau_parent_dtor(struct nouveau_object *); int nouveau_parent_sclass(struct nouveau_object *, u16 handle, struct nouveau_object **pengine, struct nouveau_oclass **poclass); int nouveau_parent_lclass(struct nouveau_object *, u32 *, int); #endif Loading
drivers/gpu/drm/nouveau/core/core/parent.c +33 −0 Original line number Diff line number Diff line Loading @@ -74,6 +74,39 @@ nouveau_parent_sclass(struct nouveau_object *parent, u16 handle, return -EINVAL; } int nouveau_parent_lclass(struct nouveau_object *parent, u32 *lclass, int size) { struct nouveau_sclass *sclass; struct nouveau_engine *engine; struct nouveau_oclass *oclass; int nr = -1, i; u64 mask; sclass = nv_parent(parent)->sclass; while (sclass) { if (++nr < size) lclass[nr] = sclass->oclass->handle; sclass = sclass->sclass; } mask = nv_parent(parent)->engine; while (i = __ffs64(mask), mask) { engine = nouveau_engine(parent, i); if (engine && (oclass = engine->sclass)) { while (oclass->ofuncs) { if (++nr < size) lclass[nr] = oclass->handle; oclass++; } } mask &= ~(1ULL << i); } return nr + 1; } int nouveau_parent_create_(struct nouveau_object *parent, struct nouveau_object *engine, Loading
drivers/gpu/drm/nouveau/core/include/core/parent.h +1 −0 Original line number Diff line number Diff line Loading @@ -57,5 +57,6 @@ void _nouveau_parent_dtor(struct nouveau_object *); int nouveau_parent_sclass(struct nouveau_object *, u16 handle, struct nouveau_object **pengine, struct nouveau_oclass **poclass); int nouveau_parent_lclass(struct nouveau_object *, u32 *, int); #endif