Remove i915 buddy references and add DRM buddy
functions

Signed-off-by: Arunpravin <arunpravin.paneersel...@amd.com>
---
 drivers/gpu/drm/i915/Makefile                 |  1 -
 drivers/gpu/drm/i915/i915_module.c            |  3 -
 drivers/gpu/drm/i915/i915_scatterlist.c       | 11 +--
 drivers/gpu/drm/i915/i915_ttm_buddy_manager.c | 91 +++++++++----------
 drivers/gpu/drm/i915/i915_ttm_buddy_manager.h |  5 +-
 5 files changed, 53 insertions(+), 58 deletions(-)

diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index 467872cca027..fc5ca8c4ccb2 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -161,7 +161,6 @@ gem-y += \
 i915-y += \
          $(gem-y) \
          i915_active.o \
-         i915_buddy.o \
          i915_cmd_parser.o \
          i915_gem_evict.o \
          i915_gem_gtt.o \
diff --git a/drivers/gpu/drm/i915/i915_module.c 
b/drivers/gpu/drm/i915/i915_module.c
index ab2295dd4500..121b4178c5ca 100644
--- a/drivers/gpu/drm/i915/i915_module.c
+++ b/drivers/gpu/drm/i915/i915_module.c
@@ -9,7 +9,6 @@
 #include "gem/i915_gem_context.h"
 #include "gem/i915_gem_object.h"
 #include "i915_active.h"
-#include "i915_buddy.h"
 #include "i915_params.h"
 #include "i915_pci.h"
 #include "i915_perf.h"
@@ -50,8 +49,6 @@ static const struct {
        { .init = i915_check_nomodeset },
        { .init = i915_active_module_init,
          .exit = i915_active_module_exit },
-       { .init = i915_buddy_module_init,
-         .exit = i915_buddy_module_exit },
        { .init = i915_context_module_init,
          .exit = i915_context_module_exit },
        { .init = i915_gem_context_module_init,
diff --git a/drivers/gpu/drm/i915/i915_scatterlist.c 
b/drivers/gpu/drm/i915/i915_scatterlist.c
index 4a6712dca838..84d622aa32d2 100644
--- a/drivers/gpu/drm/i915/i915_scatterlist.c
+++ b/drivers/gpu/drm/i915/i915_scatterlist.c
@@ -5,10 +5,9 @@
  */
 
 #include "i915_scatterlist.h"
-
-#include "i915_buddy.h"
 #include "i915_ttm_buddy_manager.h"
 
+#include <drm/drm_buddy.h>
 #include <drm/drm_mm.h>
 
 #include <linux/slab.h>
@@ -126,9 +125,9 @@ struct sg_table *i915_sg_from_buddy_resource(struct 
ttm_resource *res,
        struct i915_ttm_buddy_resource *bman_res = to_ttm_buddy_resource(res);
        const u64 size = res->num_pages << PAGE_SHIFT;
        const u64 max_segment = rounddown(UINT_MAX, PAGE_SIZE);
-       struct i915_buddy_mm *mm = bman_res->mm;
+       struct drm_buddy_mm *mm = bman_res->mm;
        struct list_head *blocks = &bman_res->blocks;
-       struct i915_buddy_block *block;
+       struct drm_buddy_block *block;
        struct scatterlist *sg;
        struct sg_table *st;
        resource_size_t prev_end;
@@ -151,8 +150,8 @@ struct sg_table *i915_sg_from_buddy_resource(struct 
ttm_resource *res,
        list_for_each_entry(block, blocks, link) {
                u64 block_size, offset;
 
-               block_size = min_t(u64, size, i915_buddy_block_size(mm, block));
-               offset = i915_buddy_block_offset(block);
+               block_size = min_t(u64, size, drm_buddy_block_size(mm, block));
+               offset = drm_buddy_block_offset(block);
 
                while (block_size) {
                        u64 len;
diff --git a/drivers/gpu/drm/i915/i915_ttm_buddy_manager.c 
b/drivers/gpu/drm/i915/i915_ttm_buddy_manager.c
index d59fbb019032..d09ea6c83a27 100644
--- a/drivers/gpu/drm/i915/i915_ttm_buddy_manager.c
+++ b/drivers/gpu/drm/i915/i915_ttm_buddy_manager.c
@@ -7,15 +7,15 @@
 
 #include <drm/ttm/ttm_bo_driver.h>
 #include <drm/ttm/ttm_placement.h>
+#include <drm/drm_buddy.h>
 
 #include "i915_ttm_buddy_manager.h"
 
-#include "i915_buddy.h"
 #include "i915_gem.h"
 
 struct i915_ttm_buddy_manager {
        struct ttm_resource_manager manager;
-       struct i915_buddy_mm mm;
+       struct drm_buddy_mm mm;
        struct list_head reserved;
        struct mutex lock;
        u64 default_page_size;
@@ -34,15 +34,12 @@ static int i915_ttm_buddy_man_alloc(struct 
ttm_resource_manager *man,
 {
        struct i915_ttm_buddy_manager *bman = to_buddy_manager(man);
        struct i915_ttm_buddy_resource *bman_res;
-       struct i915_buddy_mm *mm = &bman->mm;
+       struct drm_buddy_mm *mm = &bman->mm;
        unsigned long n_pages;
-       unsigned int min_order;
        u64 min_page_size;
        u64 size;
        int err;
 
-       GEM_BUG_ON(place->fpfn || place->lpfn);
-
        bman_res = kzalloc(sizeof(*bman_res), GFP_KERNEL);
        if (!bman_res)
                return -ENOMEM;
@@ -59,11 +56,12 @@ static int i915_ttm_buddy_man_alloc(struct 
ttm_resource_manager *man,
                min_page_size = bo->page_alignment << PAGE_SHIFT;
 
        GEM_BUG_ON(min_page_size < mm->chunk_size);
-       min_order = ilog2(min_page_size) - ilog2(mm->chunk_size);
-       if (place->flags & TTM_PL_FLAG_CONTIGUOUS) {
+
+       if (place->flags & TTM_PL_FLAG_CONTIGUOUS)
                size = roundup_pow_of_two(size);
-               min_order = ilog2(size) - ilog2(mm->chunk_size);
-       }
+
+       if (place->fpfn || place->lpfn)
+               bman_res->flags |= DRM_BUDDY_RANGE_ALLOCATION;
 
        if (size > mm->size) {
                err = -E2BIG;
@@ -72,41 +70,34 @@ static int i915_ttm_buddy_man_alloc(struct 
ttm_resource_manager *man,
 
        n_pages = size >> ilog2(mm->chunk_size);
 
-       do {
-               struct i915_buddy_block *block;
-               unsigned int order;
-
-               order = fls(n_pages) - 1;
-               GEM_BUG_ON(order > mm->max_order);
-               GEM_BUG_ON(order < min_order);
-
-               do {
-                       mutex_lock(&bman->lock);
-                       block = i915_buddy_alloc(mm, order);
-                       mutex_unlock(&bman->lock);
-                       if (!IS_ERR(block))
-                               break;
-
-                       if (order-- == min_order) {
-                               err = -ENOSPC;
-                               goto err_free_blocks;
-                       }
-               } while (1);
+       mutex_lock(&bman->lock);
+       err = drm_buddy_alloc(mm, (uint64_t)place->fpfn << PAGE_SHIFT,
+                                 (uint64_t)place->lpfn << PAGE_SHIFT,
+                                 (uint64_t)n_pages << PAGE_SHIFT,
+                                  min_page_size,
+                                  &bman_res->blocks,
+                                  bman_res->flags);
+       mutex_unlock(&bman->lock);
 
-               n_pages -= BIT(order);
+       if (unlikely(err))
+               goto err_free_blocks;
 
-               list_add_tail(&block->link, &bman_res->blocks);
+#if 0
+       if (place->flags & TTM_PL_FLAG_CONTIGUOUS) {
+               err = drm_buddy_free_unused_pages(mm, (uint64_t)n_pages << 
PAGE_SHIFT,
+                                                      &bman_res->blocks);
 
-               if (!n_pages)
-                       break;
-       } while (1);
+               if (unlikely(err))
+                       goto err_free_blocks;
+       }
+#endif
 
        *res = &bman_res->base;
        return 0;
 
 err_free_blocks:
        mutex_lock(&bman->lock);
-       i915_buddy_free_list(mm, &bman_res->blocks);
+       drm_buddy_free_list(mm, &bman_res->blocks);
        mutex_unlock(&bman->lock);
 err_free_res:
        kfree(bman_res);
@@ -120,7 +111,7 @@ static void i915_ttm_buddy_man_free(struct 
ttm_resource_manager *man,
        struct i915_ttm_buddy_manager *bman = to_buddy_manager(man);
 
        mutex_lock(&bman->lock);
-       i915_buddy_free_list(&bman->mm, &bman_res->blocks);
+       drm_buddy_free_list(&bman->mm, &bman_res->blocks);
        mutex_unlock(&bman->lock);
 
        kfree(bman_res);
@@ -130,17 +121,17 @@ static void i915_ttm_buddy_man_debug(struct 
ttm_resource_manager *man,
                                     struct drm_printer *printer)
 {
        struct i915_ttm_buddy_manager *bman = to_buddy_manager(man);
-       struct i915_buddy_block *block;
+       struct drm_buddy_block *block;
 
        mutex_lock(&bman->lock);
        drm_printf(printer, "default_page_size: %lluKiB\n",
                   bman->default_page_size >> 10);
 
-       i915_buddy_print(&bman->mm, printer);
+       drm_buddy_print(&bman->mm, printer);
 
        drm_printf(printer, "reserved:\n");
        list_for_each_entry(block, &bman->reserved, link)
-               i915_buddy_block_print(&bman->mm, block, printer);
+               drm_buddy_block_print(&bman->mm, block, printer);
        mutex_unlock(&bman->lock);
 }
 
@@ -190,7 +181,7 @@ int i915_ttm_buddy_man_init(struct ttm_device *bdev,
        if (!bman)
                return -ENOMEM;
 
-       err = i915_buddy_init(&bman->mm, size, chunk_size);
+       err = drm_buddy_init(&bman->mm, size, chunk_size);
        if (err)
                goto err_free_bman;
 
@@ -228,7 +219,7 @@ int i915_ttm_buddy_man_fini(struct ttm_device *bdev, 
unsigned int type)
 {
        struct ttm_resource_manager *man = ttm_manager_type(bdev, type);
        struct i915_ttm_buddy_manager *bman = to_buddy_manager(man);
-       struct i915_buddy_mm *mm = &bman->mm;
+       struct drm_buddy_mm *mm = &bman->mm;
        int ret;
 
        ttm_resource_manager_set_used(man, false);
@@ -240,8 +231,8 @@ int i915_ttm_buddy_man_fini(struct ttm_device *bdev, 
unsigned int type)
        ttm_set_driver_manager(bdev, type, NULL);
 
        mutex_lock(&bman->lock);
-       i915_buddy_free_list(mm, &bman->reserved);
-       i915_buddy_fini(mm);
+       drm_buddy_free_list(mm, &bman->reserved);
+       drm_buddy_fini(mm);
        mutex_unlock(&bman->lock);
 
        ttm_resource_manager_cleanup(man);
@@ -264,11 +255,19 @@ int i915_ttm_buddy_man_reserve(struct 
ttm_resource_manager *man,
                               u64 start, u64 size)
 {
        struct i915_ttm_buddy_manager *bman = to_buddy_manager(man);
-       struct i915_buddy_mm *mm = &bman->mm;
+       struct drm_buddy_mm *mm = &bman->mm;
+       unsigned long flags = 0;
+       u64 min_size;
        int ret;
 
+       min_size = size;
+       flags |= DRM_BUDDY_RANGE_ALLOCATION;
+
        mutex_lock(&bman->lock);
-       ret = i915_buddy_alloc_range(mm, &bman->reserved, start, size);
+       ret = drm_buddy_alloc(mm, start, start + size,
+                                 size, min_size,
+                                 &bman->reserved,
+                                 flags);
        mutex_unlock(&bman->lock);
 
        return ret;
diff --git a/drivers/gpu/drm/i915/i915_ttm_buddy_manager.h 
b/drivers/gpu/drm/i915/i915_ttm_buddy_manager.h
index 0722d33f3e14..c8c0dea1cdca 100644
--- a/drivers/gpu/drm/i915/i915_ttm_buddy_manager.h
+++ b/drivers/gpu/drm/i915/i915_ttm_buddy_manager.h
@@ -13,7 +13,7 @@
 
 struct ttm_device;
 struct ttm_resource_manager;
-struct i915_buddy_mm;
+struct drm_buddy_mm;
 
 /**
  * struct i915_ttm_buddy_resource
@@ -28,7 +28,8 @@ struct i915_buddy_mm;
 struct i915_ttm_buddy_resource {
        struct ttm_resource base;
        struct list_head blocks;
-       struct i915_buddy_mm *mm;
+       unsigned long flags;
+       struct drm_buddy_mm *mm;
 };
 
 /**
-- 
2.25.1

Reply via email to