Skip to content

Instantly share code, notes, and snippets.

@tiagovignatti
Created July 23, 2015 13:23
Show Gist options
  • Save tiagovignatti/3c79ba7457e0360395ec to your computer and use it in GitHub Desktop.
Save tiagovignatti/3c79ba7457e0360395ec to your computer and use it in GitHub Desktop.
diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c
index e1790af..5526fd5 100644
--- a/drivers/gpu/drm/drm_stub.c
+++ b/drivers/gpu/drm/drm_stub.c
@@ -39,6 +39,7 @@
#include <drm/drmP.h>
#include <drm/drm_core.h>
+//unsigned int drm_debug = 15; /* 1 to enable debug output */
unsigned int drm_debug = 0; /* 1 to enable debug output */
EXPORT_SYMBOL(drm_debug);
diff --git a/drivers/gpu/drm/i915/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/i915_gem_dmabuf.c
index 5d0f65d..15058ac 100644
--- a/drivers/gpu/drm/i915/i915_gem_dmabuf.c
+++ b/drivers/gpu/drm/i915/i915_gem_dmabuf.c
@@ -195,11 +195,32 @@ static void i915_gem_dmabuf_kunmap(struct dma_buf *dma_buf, unsigned long page_n
}
+/** Flushes the CPU write domain for the object if it's dirty. */
+static void
+gem_object_flush_cpu_write_domain(struct drm_i915_gem_object *obj,
+ bool force)
+{
+ uint32_t old_write_domain;
+
+ if (obj->base.write_domain != I915_GEM_DOMAIN_CPU)
+ return;
+
+ if (i915_gem_clflush_object(obj, force))
+ i915_gem_chipset_flush(obj->base.dev);
+
+ old_write_domain = obj->base.write_domain;
+ obj->base.write_domain = 0;
+
+ trace_i915_gem_object_change_domain(obj,
+ obj->base.read_domains,
+ old_write_domain);
+}
+
static int i915_gem_dmabuf_mmap(struct dma_buf *dma_buf, struct vm_area_struct *vma)
{
struct drm_i915_gem_object *obj = dma_buf_to_obj(dma_buf);
struct drm_device *dev = obj->base.dev;
-
+#if 0
if (obj->base.size < vma->vm_end - vma->vm_start)
return -EINVAL;
@@ -212,6 +233,43 @@ static int i915_gem_dmabuf_mmap(struct dma_buf *dma_buf, struct vm_area_struct *
vma->vm_ops->open(vma);
return 0;
+#else
+ int ret;
+
+ if (INTEL_INFO(dev)->gen < 6)
+ return -EINVAL;
+
+ if (!obj->base.filp)
+ return -EINVAL;
+
+ /* TODO: change this snip with i915_gem_begin_cpu_access */
+ ret = i915_mutex_lock_interruptible(dev);
+ if (ret)
+ return ret;
+
+ ret = i915_gem_object_set_to_cpu_domain(obj, true);
+ mutex_unlock(&dev->struct_mutex);
+
+
+ ret = obj->base.filp->f_op->mmap(obj->base.filp, vma);
+ fput(vma->vm_file);
+ vma->vm_file = get_file(obj->base.filp);
+
+ /* TODO: double check whether the following is needed */
+ ret = i915_mutex_lock_interruptible(dev);
+ if (ret)
+ return ret;
+
+ /* Pinned buffers may be scanout, so flush the cache */
+// if (obj->pin_display)
+ gem_object_flush_cpu_write_domain(obj, true);
+
+// drm_gem_object_unreference(&obj->base);
+ mutex_unlock(&dev->struct_mutex);
+
+ DRM_DEBUG_DRIVER("MODIFIED returned okay\n");
+ return ret;
+#endif
}
static int i915_gem_begin_cpu_access(struct dma_buf *dma_buf, size_t start, size_t length, enum dma_data_direction direction)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment