Commit 2cf10d23 authored by Alan Cox's avatar Alan Cox Committed by Greg Kroah-Hartman
Browse files

gma500: Use the GEM tweaks to provide a GEM frame buffer



We can now make our system frame buffer a GEM object.

Signed-off-by: default avatarAlan Cox <alan@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 635816e1
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -186,6 +186,8 @@ static int psbfb_vm_fault(struct vm_area_struct *vma, 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;

	/* FIXME: assumes fb at stolen base which may not be true */
	unsigned long phys_addr = (unsigned long)dev_priv->stolen_base;

	page_num = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
@@ -381,8 +383,11 @@ static struct gtt_range *psbfb_alloc(struct drm_device *dev, int aligned_size)
	struct gtt_range *backing;
	/* Begin by trying to use stolen memory backing */
	backing = psb_gtt_alloc_range(dev, aligned_size, "fb", 1);
	if (backing)
	if (backing) {
	        if (drm_gem_private_object_init(dev, &backing->gem, aligned_size) == 0)
        		return backing;
                psb_gtt_free_range(dev, backing);
        }
	/* Next try using GEM host memory */
	backing = psb_gtt_alloc_range(dev, aligned_size, "fb(gem)", 0);
	if (backing == NULL)
@@ -683,8 +688,6 @@ static int psb_user_framebuffer_create_handle(struct drm_framebuffer *fb,
{
        struct psb_framebuffer *psbfb = to_psb_fb(fb);
        struct gtt_range *r = psbfb->gtt;
        if (r->stolen)
                return -EOPNOTSUPP;
        return drm_gem_handle_create(file_priv, &r->gem, handle);
}

+8 −3
Original line number Diff line number Diff line
@@ -49,7 +49,7 @@ void psb_gem_free_object(struct drm_gem_object *obj)
		kfree(list->map);
		list->map = NULL;
	}
	drm_gem_object_release(obj);
	drm_gem_object_release_wrap(obj);
	/* This must occur last as it frees up the memory of the GEM object */
	psb_gtt_free_range(obj->dev, gtt);
}
@@ -268,9 +268,11 @@ int psb_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
	unsigned long pfn;
	pgoff_t page_offset;
	struct drm_device *dev;
	struct drm_psb_private *dev_priv;

	obj = vma->vm_private_data;	/* GEM object */
	dev = obj->dev;
	dev_priv = dev->dev_private;

	r = container_of(obj, struct gtt_range, gem);	/* Get the gtt range */

@@ -295,7 +297,10 @@ int psb_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
				>> PAGE_SHIFT;

	/* CPU view of the page, don't go via the GART for CPU writes */
	pfn = page_to_phys(r->pages[page_offset]) >> PAGE_SHIFT;
	if (r->stolen)
		pfn = (dev_priv->stolen_base + r->offset) >> PAGE_SHIFT;
	else
		pfn = page_to_pfn(r->pages[page_offset]);
	ret = vm_insert_pfn(vma, (unsigned long)vmf->virtual_address, pfn);

fail: