From: Alan Cox Date: Fri, 15 Jul 2011 16:33:08 +0000 (+0100) Subject: gma500: allow the creation of 'stolen' memory objects X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=7d7b7adf6bf934064c8fdc4031e75f1a20aaac92;p=linux-beck.git gma500: allow the creation of 'stolen' memory objects For things like cursors and many kinds of framebuffer set up we are actually best using the stolen memory when possible. Signed-off-by: Alan Cox Signed-off-by: Greg Kroah-Hartman --- diff --git a/drivers/staging/gma500/gem.c b/drivers/staging/gma500/gem.c index d7b74b64844f..65fdd6b8ab16 100644 --- a/drivers/staging/gma500/gem.c +++ b/drivers/staging/gma500/gem.c @@ -251,6 +251,21 @@ fail: } } +static int psb_gem_create_stolen(struct drm_file *file, struct drm_device *dev, + int size, u32 *handle) +{ + struct gtt_range *gtt = psb_gtt_alloc_range(dev, size, "gem", 1); + if (gtt == NULL) + return -ENOMEM; + if (drm_gem_private_object_init(dev, >t->gem, size) != 0) + goto free_gtt; + if (drm_gem_handle_create(file, >t->gem, handle) == 0) + return 0; +free_gtt: + psb_gtt_free_range(dev, gtt); + return -ENOMEM; +} + /* * GEM interfaces for our specific client */ @@ -258,6 +273,15 @@ int psb_gem_create_ioctl(struct drm_device *dev, void *data, struct drm_file *file) { struct drm_psb_gem_create *args = data; + int ret; + if (args->flags & PSB_GEM_CREATE_STOLEN) { + ret = psb_gem_create_stolen(file, dev, args->size, + &args->handle); + if (ret == 0) + return 0; + /* Fall throguh */ + args->flags &= ~PSB_GEM_CREATE_STOLEN; + } return psb_gem_create(file, dev, args->size, &args->handle); } diff --git a/drivers/staging/gma500/psb_drm.h b/drivers/staging/gma500/psb_drm.h index 70115a9f6e68..0da846835688 100644 --- a/drivers/staging/gma500/psb_drm.h +++ b/drivers/staging/gma500/psb_drm.h @@ -189,7 +189,8 @@ struct psb_drm_dpu_rect { struct drm_psb_gem_create { __u64 size; __u32 handle; - __u32 pad; + __u32 flags; +#define PSB_GEM_CREATE_STOLEN 1 /* Stolen memory can be used */ }; #define PSB_2D_OP_BUFLEN 16