diff options
Diffstat (limited to 'drivers/gpu/drm/gma500/framebuffer.c')
| -rw-r--r-- | drivers/gpu/drm/gma500/framebuffer.c | 62 | 
1 files changed, 11 insertions, 51 deletions
diff --git a/drivers/gpu/drm/gma500/framebuffer.c b/drivers/gpu/drm/gma500/framebuffer.c index cb0a2ae916e0..2f00a37684a2 100644 --- a/drivers/gpu/drm/gma500/framebuffer.c +++ b/drivers/gpu/drm/gma500/framebuffer.c @@ -33,6 +33,7 @@  #include <drm/drm.h>  #include <drm/drm_crtc.h>  #include <drm/drm_fb_helper.h> +#include <drm/drm_gem_framebuffer_helper.h>  #include "psb_drv.h"  #include "psb_intel_reg.h" @@ -40,14 +41,9 @@  #include "framebuffer.h"  #include "gtt.h" -static void psb_user_framebuffer_destroy(struct drm_framebuffer *fb); -static int psb_user_framebuffer_create_handle(struct drm_framebuffer *fb, -					      struct drm_file *file_priv, -					      unsigned int *handle); -  static const struct drm_framebuffer_funcs psb_fb_funcs = { -	.destroy = psb_user_framebuffer_destroy, -	.create_handle = psb_user_framebuffer_create_handle, +	.destroy = drm_gem_fb_destroy, +	.create_handle = drm_gem_fb_create_handle,  };  #define CMAP_TOHW(_val, _width) ((((_val) << (_width)) + 0x7FFF - (_val)) >> 16) @@ -96,17 +92,18 @@ static int psbfb_pan(struct fb_var_screeninfo *var, struct fb_info *info)  	struct psb_fbdev *fbdev = info->par;  	struct psb_framebuffer *psbfb = &fbdev->pfb;  	struct drm_device *dev = psbfb->base.dev; +	struct gtt_range *gtt = to_gtt_range(psbfb->base.obj[0]);  	/*  	 *	We have to poke our nose in here. The core fb code assumes  	 *	panning is part of the hardware that can be invoked before  	 *	the actual fb is mapped. In our case that isn't quite true.  	 */ -	if (psbfb->gtt->npage) { +	if (gtt->npage) {  		/* GTT roll shifts in 4K pages, we need to shift the right  		   number of pages */  		int pages = info->fix.line_length >> 12; -		psb_gtt_roll(dev, psbfb->gtt, var->yoffset * pages); +		psb_gtt_roll(dev, gtt, var->yoffset * pages);  	}          return 0;  } @@ -117,13 +114,14 @@ static int psbfb_vm_fault(struct vm_fault *vmf)  	struct psb_framebuffer *psbfb = vma->vm_private_data;  	struct drm_device *dev = psbfb->base.dev;  	struct drm_psb_private *dev_priv = dev->dev_private; +	struct gtt_range *gtt = to_gtt_range(psbfb->base.obj[0]);  	int page_num;  	int i;  	unsigned long address;  	int ret;  	unsigned long pfn;  	unsigned long phys_addr = (unsigned long)dev_priv->stolen_base + -				  psbfb->gtt->offset; +				  gtt->offset;  	page_num = vma_pages(vma);  	address = vmf->address - (vmf->pgoff << PAGE_SHIFT); @@ -246,7 +244,7 @@ static int psb_framebuffer_init(struct drm_device *dev,  		return -EINVAL;  	drm_helper_mode_fill_fb_struct(dev, &fb->base, mode_cmd); -	fb->gtt = gt; +	fb->base.obj[0] = >->gem;  	ret = drm_framebuffer_init(dev, &fb->base, &psb_fb_funcs);  	if (ret) {  		dev_err(dev->dev, "framebuffer init failed: %d\n", ret); @@ -518,8 +516,8 @@ static int psb_fbdev_destroy(struct drm_device *dev, struct psb_fbdev *fbdev)  	drm_framebuffer_unregister_private(&psbfb->base);  	drm_framebuffer_cleanup(&psbfb->base); -	if (psbfb->gtt) -		drm_gem_object_unreference_unlocked(&psbfb->gtt->gem); +	if (psbfb->base.obj[0]) +		drm_gem_object_put_unlocked(psbfb->base.obj[0]);  	return 0;  } @@ -576,44 +574,6 @@ static void psb_fbdev_fini(struct drm_device *dev)  	dev_priv->fbdev = NULL;  } -/** - *	psb_user_framebuffer_create_handle - add hamdle to a framebuffer - *	@fb: framebuffer - *	@file_priv: our DRM file - *	@handle: returned handle - * - *	Our framebuffer object is a GTT range which also contains a GEM - *	object. We need to turn it into a handle for userspace. GEM will do - *	the work for us - */ -static int psb_user_framebuffer_create_handle(struct drm_framebuffer *fb, -					      struct drm_file *file_priv, -					      unsigned int *handle) -{ -	struct psb_framebuffer *psbfb = to_psb_fb(fb); -	struct gtt_range *r = psbfb->gtt; -	return drm_gem_handle_create(file_priv, &r->gem, handle); -} - -/** - *	psb_user_framebuffer_destroy	-	destruct user created fb - *	@fb: framebuffer - * - *	User framebuffers are backed by GEM objects so all we have to do is - *	clean up a bit and drop the reference, GEM will handle the fallout - */ -static void psb_user_framebuffer_destroy(struct drm_framebuffer *fb) -{ -	struct psb_framebuffer *psbfb = to_psb_fb(fb); -	struct gtt_range *r = psbfb->gtt; - -	/* Let DRM do its clean up */ -	drm_framebuffer_cleanup(fb); -	/*  We are no longer using the resource in GEM */ -	drm_gem_object_unreference_unlocked(&r->gem); -	kfree(fb); -} -  static const struct drm_mode_config_funcs psb_mode_funcs = {  	.fb_create = psb_user_framebuffer_create,  	.output_poll_changed = drm_fb_helper_output_poll_changed,  |