Add struct and helper functions to manage an array of gem objects. See added kernel docs for details. Signed-off-by: Gerd Hoffmann <kraxel@xxxxxxxxxx> --- include/drm/drm_gem_array_helper.h | 15 +++++ drivers/gpu/drm/drm_gem_array_helper.c | 76 ++++++++++++++++++++++++++ drivers/gpu/drm/Makefile | 3 +- 3 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 include/drm/drm_gem_array_helper.h create mode 100644 drivers/gpu/drm/drm_gem_array_helper.c diff --git a/include/drm/drm_gem_array_helper.h b/include/drm/drm_gem_array_helper.h new file mode 100644 index 000000000000..adf7961247b3 --- /dev/null +++ b/include/drm/drm_gem_array_helper.h @@ -0,0 +1,15 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __DRM_GEM_ARRAY_HELPER_H__ +#define __DRM_GEM_ARRAY_HELPER_H__ + +struct drm_gem_object_array { + u32 nents; + struct drm_gem_object *objs[]; +}; + +struct drm_gem_object_array *drm_gem_array_alloc(u32 nents); +struct drm_gem_object_array * +drm_gem_array_from_handles(struct drm_file *drm_file, u32 *handles, u32 nents); +void drm_gem_array_put_free(struct drm_gem_object_array *objs); + +#endif /* __DRM_GEM_ARRAY_HELPER_H__ */ diff --git a/drivers/gpu/drm/drm_gem_array_helper.c b/drivers/gpu/drm/drm_gem_array_helper.c new file mode 100644 index 000000000000..d35c77c4a02d --- /dev/null +++ b/drivers/gpu/drm/drm_gem_array_helper.c @@ -0,0 +1,76 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#include <drm/drm_gem.h> +#include <drm/drm_gem_array_helper.h> + +/** + * drm_gem_array_alloc -- allocate gem object array of the given size. + * + * @nents: number of entries needed. + * + * Returns: An array of gem objects on success, NULL on failure. + */ +struct drm_gem_object_array *drm_gem_array_alloc(u32 nents) +{ + struct drm_gem_object_array *objs; + size_t size = sizeof(*objs) + sizeof(objs->objs[0]) * nents; + + objs = kzalloc(size, GFP_KERNEL); + if (!objs) + return NULL; + + objs->nents = nents; + return objs; +} +EXPORT_SYMBOL(drm_gem_array_alloc); + +static void drm_gem_array_free(struct drm_gem_object_array *objs) +{ + kfree(objs); +} + +/** + * drm_gem_array_from_handles -- lookup an array of gem handles. + * + * @drm_file: drm file-private structure to use for the handle look up + * @handles: the array of handles to lookup. + * @nents: the numer of handles. + * + * Returns: An array of gem objects on success, NULL on failure. + */ +struct drm_gem_object_array* +drm_gem_array_from_handles(struct drm_file *drm_file, u32 *handles, u32 nents) +{ + struct drm_gem_object_array *objs; + u32 i; + + objs = drm_gem_array_alloc(nents); + if (!objs) + return NULL; + + for (i = 0; i < nents; i++) { + objs->objs[i] = drm_gem_object_lookup(drm_file, handles[i]); + if (!objs->objs[i]) { + drm_gem_array_put_free(objs); + return NULL; + } + } + return objs; +} + +/** + * drm_gem_array_put_free -- put gem objects and free array. + * + * @objs: the gem object array. + */ +void drm_gem_array_put_free(struct drm_gem_object_array *objs) +{ + u32 i; + + for (i = 0; i < objs->nents; i++) { + if (!objs->objs[i]) + continue; + drm_gem_object_put_unlocked(objs->objs[i]); + } + drm_gem_array_free(objs); +} diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile index 9d630a28a788..d32e7de0937b 100644 --- a/drivers/gpu/drm/Makefile +++ b/drivers/gpu/drm/Makefile @@ -43,7 +43,8 @@ drm_kms_helper-y := drm_crtc_helper.o drm_dp_helper.o drm_dsc.o drm_probe_helper drm_simple_kms_helper.o drm_modeset_helper.o \ drm_scdc_helper.o drm_gem_framebuffer_helper.o \ drm_atomic_state_helper.o drm_damage_helper.o \ - drm_format_helper.o drm_self_refresh_helper.o + drm_format_helper.o drm_self_refresh_helper.o \ + drm_gem_array_helper.o drm_kms_helper-$(CONFIG_DRM_PANEL_BRIDGE) += bridge/panel.o drm_kms_helper-$(CONFIG_DRM_FBDEV_EMULATION) += drm_fb_helper.o -- 2.18.1 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel