1c6603c74SDaniel Vetter // SPDX-License-Identifier: GPL-2.0 2c6603c74SDaniel Vetter 3c6603c74SDaniel Vetter #ifndef _DRM_MANAGED_H_ 4c6603c74SDaniel Vetter #define _DRM_MANAGED_H_ 5c6603c74SDaniel Vetter 6c6603c74SDaniel Vetter #include <linux/gfp.h> 7c23d686fSDaniel Vetter #include <linux/overflow.h> 8c6603c74SDaniel Vetter #include <linux/types.h> 9c6603c74SDaniel Vetter 10c6603c74SDaniel Vetter struct drm_device; 11c6603c74SDaniel Vetter 12c6603c74SDaniel Vetter typedef void (*drmres_release_t)(struct drm_device *dev, void *res); 13c6603c74SDaniel Vetter 14c6603c74SDaniel Vetter #define drmm_add_action(dev, action, data) \ 15c6603c74SDaniel Vetter __drmm_add_action(dev, action, data, #action) 16c6603c74SDaniel Vetter 17c6603c74SDaniel Vetter int __must_check __drmm_add_action(struct drm_device *dev, 18c6603c74SDaniel Vetter drmres_release_t action, 19c6603c74SDaniel Vetter void *data, const char *name); 20c6603c74SDaniel Vetter 21f96306f9SDaniel Vetter #define drmm_add_action_or_reset(dev, action, data) \ 22f96306f9SDaniel Vetter __drmm_add_action_or_reset(dev, action, data, #action) 23f96306f9SDaniel Vetter 24f96306f9SDaniel Vetter int __must_check __drmm_add_action_or_reset(struct drm_device *dev, 25f96306f9SDaniel Vetter drmres_release_t action, 26f96306f9SDaniel Vetter void *data, const char *name); 27f96306f9SDaniel Vetter 28f96306f9SDaniel Vetter void drmm_add_final_kfree(struct drm_device *dev, void *container); 29c6603c74SDaniel Vetter 30c6603c74SDaniel Vetter void *drmm_kmalloc(struct drm_device *dev, size_t size, gfp_t gfp) __malloc; 31c6603c74SDaniel Vetter static inline void *drmm_kzalloc(struct drm_device *dev, size_t size, gfp_t gfp) 32c6603c74SDaniel Vetter { 33c6603c74SDaniel Vetter return drmm_kmalloc(dev, size, gfp | __GFP_ZERO); 34c6603c74SDaniel Vetter } 35c23d686fSDaniel Vetter static inline void *drmm_kmalloc_array(struct drm_device *dev, 36c23d686fSDaniel Vetter size_t n, size_t size, gfp_t flags) 37c23d686fSDaniel Vetter { 38c23d686fSDaniel Vetter size_t bytes; 39c23d686fSDaniel Vetter 40c23d686fSDaniel Vetter if (unlikely(check_mul_overflow(n, size, &bytes))) 41c23d686fSDaniel Vetter return NULL; 42c23d686fSDaniel Vetter 43c23d686fSDaniel Vetter return drmm_kmalloc(dev, bytes, flags); 44c23d686fSDaniel Vetter } 45c23d686fSDaniel Vetter static inline void *drmm_kcalloc(struct drm_device *dev, 46c23d686fSDaniel Vetter size_t n, size_t size, gfp_t flags) 47c23d686fSDaniel Vetter { 48c23d686fSDaniel Vetter return drmm_kmalloc_array(dev, n, size, flags | __GFP_ZERO); 49c23d686fSDaniel Vetter } 50a5c71fdbSDaniel Vetter char *drmm_kstrdup(struct drm_device *dev, const char *s, gfp_t gfp); 51c6603c74SDaniel Vetter 52c6603c74SDaniel Vetter void drmm_kfree(struct drm_device *dev, void *data); 53c6603c74SDaniel Vetter 54c6603c74SDaniel Vetter #endif 55