HDMI_AUDIO_ON,                  /* force turn on HDMI audio */
 };
 
-#define I915_GTT_RESERVED ((struct drm_mm_node *)0x1)
+#define I915_GTT_RESERVED (1<<0)
 #define I915_GTT_OFFSET_NONE ((u32)-1)
 
 struct drm_i915_gem_object_ops {
        unsigned long exec_handle;
        struct drm_i915_gem_exec_object2 *exec_entry;
 
-       /**
-        * Current offset of the object in GTT space.
-        *
-        * This is the same as gtt_space->start
-        */
-       uint32_t gtt_offset;
-
        struct intel_ring_buffer *ring;
 
        /** Breadcrumb of last rendering to the buffer. */
 
 
        drm_mm_put_block(obj->gtt_space);
        obj->gtt_space = NULL;
-       obj->gtt_offset = 0;
 
        return 0;
 }
        list_add_tail(&obj->mm_list, &dev_priv->mm.inactive_list);
 
        obj->gtt_space = node;
-       obj->gtt_offset = node->start;
 
        fenceable =
                node->size == fence_size &&
 
 
        /* Mark any preallocated objects as occupied */
        list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) {
+               uintptr_t offset = (uintptr_t) obj->gtt_space;
                int ret;
-               DRM_DEBUG_KMS("reserving preallocated space: %x + %zx\n",
-                             obj->gtt_offset, obj->base.size);
+               DRM_DEBUG_KMS("reserving preallocated space: %lx + %zx\n",
+                             offset, obj->base.size);
 
-               BUG_ON(obj->gtt_space != I915_GTT_RESERVED);
+               BUG_ON((offset & I915_GTT_RESERVED) != 0);
+               offset &= ~I915_GTT_RESERVED;
                obj->gtt_space = kzalloc(sizeof(*obj->gtt_space), GFP_KERNEL);
                if (!obj->gtt_space) {
-                       DRM_ERROR("Failed to preserve object at offset %x\n",
-                                 obj->gtt_offset);
+                       DRM_ERROR("Failed to preserve object at offset %lx\n",
+                                 offset);
                        continue;
                }
-               obj->gtt_space->start = obj->gtt_offset;
+               obj->gtt_space->start = (unsigned long)offset;
                obj->gtt_space->size = obj->base.size;
                ret = drm_mm_reserve_node(&dev_priv->mm.gtt_space,
                                          obj->gtt_space);
 
                        DRM_DEBUG_KMS("failed to allocate stolen GTT space\n");
                        goto free_out;
                }
-       } else
-               obj->gtt_space = I915_GTT_RESERVED;
+       } else {
+               if (WARN_ON(gtt_offset & ~PAGE_MASK))
+                       DRM_DEBUG_KMS("Cannot preserve non page aligned offset\n");
+               obj->gtt_space =
+                       (struct drm_mm_node *)((uintptr_t)(I915_GTT_RESERVED | gtt_offset));
+       }
 
-       obj->gtt_offset = gtt_offset;
        obj->has_global_gtt_mapping = 1;
 
        list_add_tail(&obj->global_list, &dev_priv->mm.bound_list);