aboutsummaryrefslogtreecommitdiff
path: root/drivers/mfd/glamo/glamo-buffer.c
diff options
context:
space:
mode:
authorThomas White <taw@bitwiz.org.uk>2009-11-10 00:06:38 +0100
committerThomas White <taw@bitwiz.org.uk>2009-11-15 14:24:28 +0100
commitc492dbbc420549a71cce8b0a8aea48c4a2c0e774 (patch)
tree31dda3bce39b6c92a3103b4e8578f134ff355f11 /drivers/mfd/glamo/glamo-buffer.c
parentc848d00bd43c47e7f11724330380e0c68ec7ae5e (diff)
Add interrupt-driven waitqueue for better GPU synchronisation
Signed-off-by: Thomas White <taw@bitwiz.org.uk>
Diffstat (limited to 'drivers/mfd/glamo/glamo-buffer.c')
-rw-r--r--drivers/mfd/glamo/glamo-buffer.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/drivers/mfd/glamo/glamo-buffer.c b/drivers/mfd/glamo/glamo-buffer.c
index a6d085f3303..2bf9fb538cd 100644
--- a/drivers/mfd/glamo/glamo-buffer.c
+++ b/drivers/mfd/glamo/glamo-buffer.c
@@ -151,8 +151,8 @@ int glamodrm_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
PAGE_SHIFT;
mutex_lock(&dev->struct_mutex);
- pfn = ((gdrm->vram->start + gobj->block->start) >> PAGE_SHIFT)
- + page_offset;
+ pfn = ((gdrm->vram->start + GLAMO_OFFSET_FB + gobj->block->start)
+ >> PAGE_SHIFT) + page_offset;
ret = vm_insert_pfn(vma, (unsigned long)vmf->virtual_address, pfn);
mutex_unlock(&dev->struct_mutex);
@@ -346,6 +346,19 @@ int glamo_buffer_init(struct glamodrm_handle *gdrm)
{
gdrm->mmgr = drm_calloc(1, sizeof(struct drm_mm), DRM_MEM_DRIVER);
drm_mm_init(gdrm->mmgr, 0, gdrm->vram_size);
+
+ /* Reserve a scratch buffer. We do this outside the protections
+ * of the other GEM code. To do this safely, the allocation must
+ * be a multiple of PAGE_SIZE. */
+ gdrm->scratch = drm_mm_search_free(gdrm->mmgr, PAGE_SIZE, 4, 1);
+ if ( gdrm->scratch ) {
+ gdrm->scratch = drm_mm_get_block(gdrm->scratch, PAGE_SIZE, 4);
+ }
+ if ( !gdrm->scratch ) {
+ printk(KERN_WARNING "[glamo-drm] Couldn't allocate"
+ " scratch buffer!\n");
+ }
+
return 0;
}