i915: set domain properly on fb mapping, flush out changes
authorJesse Barnes <jbarnes@virtuousgeek.org>
Sat, 16 Aug 2008 18:35:10 +0000 (11:35 -0700)
committerJesse Barnes <jbarnes@virtuousgeek.org>
Sat, 16 Aug 2008 18:35:10 +0000 (11:35 -0700)
The user visible ioctl does this, but since we call into GEM internals
directly, we have to flush things ourselves.  Fixes initial fb console
corruption.

linux-core/i915_gem.c
linux-core/intel_fb.c
shared-core/i915_drv.h

index 64ffa35..6966c84 100644 (file)
 #include <linux/swap.h>
 
 static int
-i915_gem_object_set_domain(struct drm_gem_object *obj,
-                           uint32_t read_domains,
-                           uint32_t write_domain);
-static int
 i915_gem_object_set_domain_range(struct drm_gem_object *obj,
                                 uint64_t offset,
                                 uint64_t size,
@@ -1318,7 +1314,7 @@ i915_gem_clflush_object(struct drm_gem_object *obj)
  *             MI_FLUSH
  *             drm_agp_chipset_flush
  */
-static int
+int
 i915_gem_object_set_domain(struct drm_gem_object *obj,
                            uint32_t read_domains,
                            uint32_t write_domain)
index ce8ac3d..c1391c0 100644 (file)
@@ -716,12 +716,18 @@ int intelfb_create(struct drm_device *dev, uint32_t fb_width, uint32_t fb_height
        obj_priv = fbo->driver_private;
 
        mutex_lock(&dev->struct_mutex);
+       /* Flush everything out, we'll be doing GTT only from now on */
+       i915_gem_object_set_domain(fbo, I915_GEM_DOMAIN_GTT,
+                                  I915_GEM_DOMAIN_GTT);
+
        ret = i915_gem_object_pin(fbo, PAGE_SIZE);
        if (ret) {
                DRM_ERROR("failed to pin fb: %d\n", ret);
                goto out_unref;
        }
 
+       i915_gem_clflush_object(fbo);
+
        fb = intel_user_framebuffer_create(dev, NULL, &mode_cmd);
        if (!fb) {
                DRM_ERROR("failed to allocate fb.\n");
index 087c6d6..a031afd 100644 (file)
@@ -627,6 +627,9 @@ int i915_gem_init_ringbuffer(struct drm_device *dev);
 void i915_gem_cleanup_ringbuffer(struct drm_device *dev);
 int i915_gem_do_init(struct drm_device *dev, unsigned long start,
                     unsigned long end);
+int i915_gem_object_set_domain(struct drm_gem_object *obj,
+                              uint32_t read_domains,
+                              uint32_t write_domain);
 void i915_gem_retire_work_handler(struct work_struct *work);
 void i915_gem_clflush_object(struct drm_gem_object *obj);
 #endif