From 54d54776525f0a6dd3b16da2d8f6028ecc17671a Mon Sep 17 00:00:00 2001 From: Jianqun Xu Date: Fri, 24 Jun 2022 09:27:50 +0800 Subject: [PATCH] drm/rockchip: drm gem support flags ROCKCHIP_BO_DMA32 Userland can use the flag ROCKCHIP_BO_DMA32 to tell drm gem to get pages limit to 4GiB memory. Signed-off-by: Jianqun Xu Change-Id: Icdc77efae71ed6272f425ad93a07c8d3e98a9ca4 --- drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 11 ++++++++--- include/uapi/drm/rockchip_drm.h | 5 ++++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c index bd4454225c3d..744d5609d54c 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c @@ -606,7 +606,8 @@ static void rockchip_gem_release_object(struct rockchip_gem_object *rk_obj) } static struct rockchip_gem_object * - rockchip_gem_alloc_object(struct drm_device *drm, unsigned int size) +rockchip_gem_alloc_object(struct drm_device *drm, unsigned int size, + unsigned int flags) { struct address_space *mapping; struct rockchip_gem_object *rk_obj; @@ -617,6 +618,10 @@ static struct rockchip_gem_object * #else gfp_t gfp_mask = GFP_HIGHUSER | __GFP_RECLAIMABLE; #endif + + if (flags & ROCKCHIP_BO_DMA32) + gfp_mask |= __GFP_DMA32; + size = round_up(size, PAGE_SIZE); rk_obj = kzalloc(sizeof(*rk_obj), GFP_KERNEL); @@ -640,7 +645,7 @@ rockchip_gem_create_object(struct drm_device *drm, unsigned int size, struct rockchip_gem_object *rk_obj; int ret; - rk_obj = rockchip_gem_alloc_object(drm, size); + rk_obj = rockchip_gem_alloc_object(drm, size, flags); if (IS_ERR(rk_obj)) return rk_obj; rk_obj->flags = flags; @@ -847,7 +852,7 @@ rockchip_gem_prime_import_sg_table(struct drm_device *drm, struct rockchip_gem_object *rk_obj; int ret; - rk_obj = rockchip_gem_alloc_object(drm, attach->dmabuf->size); + rk_obj = rockchip_gem_alloc_object(drm, attach->dmabuf->size, 0); if (IS_ERR(rk_obj)) return ERR_CAST(rk_obj); diff --git a/include/uapi/drm/rockchip_drm.h b/include/uapi/drm/rockchip_drm.h index 246192fa2922..e14645c7dd0f 100644 --- a/include/uapi/drm/rockchip_drm.h +++ b/include/uapi/drm/rockchip_drm.h @@ -36,8 +36,11 @@ enum drm_rockchip_gem_mem_type { ROCKCHIP_BO_SECURE = 1 << 3, /* keep kmap for cma buffer or alloc kmap for other type memory */ ROCKCHIP_BO_ALLOC_KMAP = 1 << 4, + /* alloc page with gfp_dma32 */ + ROCKCHIP_BO_DMA32 = 1 << 5, ROCKCHIP_BO_MASK = ROCKCHIP_BO_CONTIG | ROCKCHIP_BO_CACHABLE | - ROCKCHIP_BO_WC | ROCKCHIP_BO_SECURE | ROCKCHIP_BO_ALLOC_KMAP, + ROCKCHIP_BO_WC | ROCKCHIP_BO_SECURE | ROCKCHIP_BO_ALLOC_KMAP | + ROCKCHIP_BO_DMA32, }; /**