*/
 int drm_mm_insert_node_generic(struct drm_mm *mm, struct drm_mm_node *node,
                               unsigned long size, unsigned alignment,
-                              unsigned long color)
+                              unsigned long color,
+                              enum drm_mm_search_flags flags)
 {
        struct drm_mm_node *hole_node;
 
        hole_node = drm_mm_search_free_generic(mm, size, alignment,
-                                              color, 0);
+                                              color, flags);
        if (!hole_node)
                return -ENOSPC;
 
 }
 EXPORT_SYMBOL(drm_mm_insert_node_generic);
 
-int drm_mm_insert_node(struct drm_mm *mm, struct drm_mm_node *node,
-                      unsigned long size, unsigned alignment)
-{
-       return drm_mm_insert_node_generic(mm, node, size, alignment, 0);
-}
-EXPORT_SYMBOL(drm_mm_insert_node);
-
 static void drm_mm_insert_helper_range(struct drm_mm_node *hole_node,
                                       struct drm_mm_node *node,
                                       unsigned long size, unsigned alignment,
  */
 int drm_mm_insert_node_in_range_generic(struct drm_mm *mm, struct drm_mm_node *node,
                                        unsigned long size, unsigned alignment, unsigned long color,
-                                       unsigned long start, unsigned long end)
+                                       unsigned long start, unsigned long end,
+                                       enum drm_mm_search_flags flags)
 {
        struct drm_mm_node *hole_node;
 
        hole_node = drm_mm_search_free_in_range_generic(mm,
                                                        size, alignment, color,
-                                                       start, end, 0);
+                                                       start, end, flags);
        if (!hole_node)
                return -ENOSPC;
 
 }
 EXPORT_SYMBOL(drm_mm_insert_node_in_range_generic);
 
-int drm_mm_insert_node_in_range(struct drm_mm *mm, struct drm_mm_node *node,
-                               unsigned long size, unsigned alignment,
-                               unsigned long start, unsigned long end)
-{
-       return drm_mm_insert_node_in_range_generic(mm, node, size, alignment, 0, start, end);
-}
-EXPORT_SYMBOL(drm_mm_insert_node_in_range);
-
 /**
  * Remove a memory node from the allocator.
  */
                                               unsigned long size,
                                               unsigned alignment,
                                               unsigned long color,
-                                              bool best_match)
+                                              enum drm_mm_search_flags flags)
 {
        struct drm_mm_node *entry;
        struct drm_mm_node *best;
                if (!check_free_hole(adj_start, adj_end, size, alignment))
                        continue;
 
-               if (!best_match)
+               if (!(flags & DRM_MM_SEARCH_BEST))
                        return entry;
 
                if (entry->size < best_size) {
                                                        unsigned long color,
                                                        unsigned long start,
                                                        unsigned long end,
-                                                       bool best_match)
+                                                       enum drm_mm_search_flags flags)
 {
        struct drm_mm_node *entry;
        struct drm_mm_node *best;
                if (!check_free_hole(adj_start, adj_end, size, alignment))
                        continue;
 
-               if (!best_match)
+               if (!(flags & DRM_MM_SEARCH_BEST))
                        return entry;
 
                if (entry->size < best_size) {
  * corrupted.
  *
  * When the scan list is empty, the selected memory nodes can be freed. An
- * immediately following drm_mm_search_free with best_match = 0 will then return
- * the just freed block (because its at the top of the free_stack list).
+ * immediately following drm_mm_search_free with !DRM_MM_SEARCH_BEST will then
+ * return the just freed block (because its at the top of the free_stack list).
  *
  * Returns one if this block should be evicted, zero otherwise. Will always
  * return zero when no hole has been found.
 
                goto out_unlock;
        }
 
-       ret = drm_mm_insert_node_generic(&mgr->vm_addr_space_mm,
-                                        &node->vm_node, pages, 0, 0);
+       ret = drm_mm_insert_node(&mgr->vm_addr_space_mm, &node->vm_node,
+                                pages, 0, DRM_MM_SEARCH_DEFAULT);
        if (ret)
                goto out_unlock;
 
 
        ret = drm_mm_insert_node_in_range_generic(&dev_priv->mm.gtt_space,
                                                  &obj->gtt_space,
                                                  size, alignment,
-                                                 obj->cache_level, 0, gtt_max);
+                                                 obj->cache_level, 0, gtt_max,
+                                                 DRM_MM_SEARCH_DEFAULT);
        if (ret) {
                ret = i915_gem_evict_something(dev, size, alignment,
                                               obj->cache_level,
 
 
        /* Try to over-allocate to reduce reallocations and fragmentation */
        compressed_fb = drm_mm_search_free(&dev_priv->mm.stolen,
-                                          size <<= 1, 4096, 0);
+                                          size <<= 1, 4096,
+                                          DRM_MM_SEARCH_DEFAULT);
        if (!compressed_fb)
                compressed_fb = drm_mm_search_free(&dev_priv->mm.stolen,
-                                                  size >>= 1, 4096, 0);
+                                                  size >>= 1, 4096,
+                                                  DRM_MM_SEARCH_DEFAULT);
        if (compressed_fb)
                compressed_fb = drm_mm_get_block(compressed_fb, size, 4096);
        if (!compressed_fb)
                I915_WRITE(DPFC_CB_BASE, compressed_fb->start);
        } else {
                compressed_llb = drm_mm_search_free(&dev_priv->mm.stolen,
-                                                   4096, 4096, 0);
+                                                   4096, 4096,
+                                                   DRM_MM_SEARCH_DEFAULT);
                if (compressed_llb)
                        compressed_llb = drm_mm_get_block(compressed_llb,
                                                          4096, 4096);
        if (size == 0)
                return NULL;
 
-       stolen = drm_mm_search_free(&dev_priv->mm.stolen, size, 4096, 0);
+       stolen = drm_mm_search_free(&dev_priv->mm.stolen, size, 4096,
+                                   DRM_MM_SEARCH_DEFAULT);
        if (stolen)
                stolen = drm_mm_get_block(stolen, size, 4096);
        if (stolen == NULL)
 
        if (pool == AGP_TYPE) {
                retval = drm_mm_insert_node(&dev_priv->agp_mm,
                                            &item->mm_node,
-                                           mem->size, 0);
+                                           mem->size, 0,
+                                           DRM_MM_SEARCH_DEFAULT);
                offset = item->mm_node.start;
        } else {
 #if defined(CONFIG_FB_SIS) || defined(CONFIG_FB_SIS_MODULE)
 #else
                retval = drm_mm_insert_node(&dev_priv->vram_mm,
                                            &item->mm_node,
-                                           mem->size, 0);
+                                           mem->size, 0,
+                                           DRM_MM_SEARCH_DEFAULT);
                offset = item->mm_node.start;
 #endif
        }
 
                spin_lock(&rman->lock);
                node = drm_mm_search_free_in_range(mm,
                                        mem->num_pages, mem->page_alignment,
-                                       placement->fpfn, lpfn, 1);
+                                       placement->fpfn, lpfn,
+                                       DRM_MM_SEARCH_BEST);
                if (unlikely(node == NULL)) {
                        spin_unlock(&rman->lock);
                        return 0;
 
        if (mem->type == VIA_MEM_AGP)
                retval = drm_mm_insert_node(&dev_priv->agp_mm,
                                            &item->mm_node,
-                                           tmpSize, 0);
+                                           tmpSize, 0, DRM_MM_SEARCH_DEFAULT);
        else
                retval = drm_mm_insert_node(&dev_priv->vram_mm,
                                            &item->mm_node,
-                                           tmpSize, 0);
+                                           tmpSize, 0, DRM_MM_SEARCH_DEFAULT);
        if (retval)
                goto fail_alloc;
 
 
 #include <linux/seq_file.h>
 #endif
 
+enum drm_mm_search_flags {
+       DRM_MM_SEARCH_DEFAULT =         0,
+       DRM_MM_SEARCH_BEST =            1 << 0,
+};
+
 struct drm_mm_node {
        struct list_head node_list;
        struct list_head hole_stack;
                                                start, end, 1);
 }
 
-extern int drm_mm_insert_node(struct drm_mm *mm,
-                             struct drm_mm_node *node,
-                             unsigned long size,
-                             unsigned alignment);
-extern int drm_mm_insert_node_in_range(struct drm_mm *mm,
-                                      struct drm_mm_node *node,
-                                      unsigned long size,
-                                      unsigned alignment,
-                                      unsigned long start,
-                                      unsigned long end);
 extern int drm_mm_insert_node_generic(struct drm_mm *mm,
                                      struct drm_mm_node *node,
                                      unsigned long size,
                                      unsigned alignment,
-                                     unsigned long color);
+                                     unsigned long color,
+                                     enum drm_mm_search_flags flags);
+static inline int drm_mm_insert_node(struct drm_mm *mm,
+                                    struct drm_mm_node *node,
+                                    unsigned long size,
+                                    unsigned alignment,
+                                    enum drm_mm_search_flags flags)
+{
+       return drm_mm_insert_node_generic(mm, node, size, alignment, 0, flags);
+}
+
 extern int drm_mm_insert_node_in_range_generic(struct drm_mm *mm,
                                       struct drm_mm_node *node,
                                       unsigned long size,
                                       unsigned alignment,
                                       unsigned long color,
                                       unsigned long start,
-                                      unsigned long end);
+                                      unsigned long end,
+                                      enum drm_mm_search_flags flags);
+static inline int drm_mm_insert_node_in_range(struct drm_mm *mm,
+                                             struct drm_mm_node *node,
+                                             unsigned long size,
+                                             unsigned alignment,
+                                             unsigned long start,
+                                             unsigned long end,
+                                             enum drm_mm_search_flags flags)
+{
+       return drm_mm_insert_node_in_range_generic(mm, node, size, alignment,
+                                                  0, start, end, flags);
+}
+
 extern void drm_mm_put_block(struct drm_mm_node *cur);
 extern void drm_mm_remove_node(struct drm_mm_node *node);
 extern void drm_mm_replace_node(struct drm_mm_node *old, struct drm_mm_node *new);
                                                      unsigned long size,
                                                      unsigned alignment,
                                                      unsigned long color,
-                                                     bool best_match);
+                                                     enum drm_mm_search_flags flags);
 extern struct drm_mm_node *drm_mm_search_free_in_range_generic(
                                                const struct drm_mm *mm,
                                                unsigned long size,
                                                unsigned long color,
                                                unsigned long start,
                                                unsigned long end,
-                                               bool best_match);
+                                               enum drm_mm_search_flags flags);
 static inline struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm,
                                                     unsigned long size,
                                                     unsigned alignment,
-                                                    bool best_match)
+                                                    enum drm_mm_search_flags flags)
 {
-       return drm_mm_search_free_generic(mm,size, alignment, 0, best_match);
+       return drm_mm_search_free_generic(mm,size, alignment, 0, flags);
 }
 static inline  struct drm_mm_node *drm_mm_search_free_in_range(
                                                const struct drm_mm *mm,
                                                unsigned alignment,
                                                unsigned long start,
                                                unsigned long end,
-                                               bool best_match)
+                                               enum drm_mm_search_flags flags)
 {
        return drm_mm_search_free_in_range_generic(mm, size, alignment, 0,
-                                                  start, end, best_match);
+                                                  start, end, flags);
 }
 
 extern void drm_mm_init(struct drm_mm *mm,