- Add res cursor support for drm buddy
- Replace if..else statement with switch case statement

Signed-off-by: Arunpravin <arunpravin.paneersel...@amd.com>
---
 .../gpu/drm/amd/amdgpu/amdgpu_res_cursor.h    | 97 +++++++++++++++----
 1 file changed, 78 insertions(+), 19 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_res_cursor.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_res_cursor.h
index acfa207cf970..2c17e948355e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_res_cursor.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_res_cursor.h
@@ -30,12 +30,15 @@
 #include <drm/ttm/ttm_resource.h>
 #include <drm/ttm/ttm_range_manager.h>
 
+#include "amdgpu_vram_mgr.h"
+
 /* state back for walking over vram_mgr and gtt_mgr allocations */
 struct amdgpu_res_cursor {
        uint64_t                start;
        uint64_t                size;
        uint64_t                remaining;
-       struct drm_mm_node      *node;
+       void                    *node;
+       uint32_t                mem_type;
 };
 
 /**
@@ -52,27 +55,63 @@ static inline void amdgpu_res_first(struct ttm_resource 
*res,
                                    uint64_t start, uint64_t size,
                                    struct amdgpu_res_cursor *cur)
 {
+       struct drm_buddy_block *block;
+       struct list_head *head, *next;
        struct drm_mm_node *node;
 
-       if (!res || res->mem_type == TTM_PL_SYSTEM) {
-               cur->start = start;
-               cur->size = size;
-               cur->remaining = size;
-               cur->node = NULL;
-               WARN_ON(res && start + size > res->num_pages << PAGE_SHIFT);
-               return;
-       }
+       if (!res)
+               goto err_out;
 
        BUG_ON(start + size > res->num_pages << PAGE_SHIFT);
 
-       node = to_ttm_range_mgr_node(res)->mm_nodes;
-       while (start >= node->size << PAGE_SHIFT)
-               start -= node++->size << PAGE_SHIFT;
+       cur->mem_type = res->mem_type;
+
+       switch (cur->mem_type) {
+       case TTM_PL_VRAM:
+               head = &to_amdgpu_vram_mgr_node(res)->blocks;
+
+               block = list_first_entry_or_null(head,
+                                                struct drm_buddy_block,
+                                                link);
+               if (!block)
+                       goto err_out;
+
+               while (start >= node_size(block)) {
+                       start -= node_size(block);
+
+                       next = block->link.next;
+                       if (next != head)
+                               block = list_entry(next, struct 
drm_buddy_block, link);
+               }
+
+               cur->start = node_start(block) + start;
+               cur->size = min(node_size(block) - start, size);
+               cur->remaining = size;
+               cur->node = block;
+               break;
+       case TTM_PL_TT:
+               node = to_ttm_range_mgr_node(res)->mm_nodes;
+               while (start >= node->size << PAGE_SHIFT)
+                       start -= node++->size << PAGE_SHIFT;
+
+               cur->start = (node->start << PAGE_SHIFT) + start;
+               cur->size = min((node->size << PAGE_SHIFT) - start, size);
+               cur->remaining = size;
+               cur->node = node;
+               break;
+       default:
+               goto err_out;
+       }
 
-       cur->start = (node->start << PAGE_SHIFT) + start;
-       cur->size = min((node->size << PAGE_SHIFT) - start, size);
+       return;
+
+err_out:
+       cur->start = start;
+       cur->size = size;
        cur->remaining = size;
-       cur->node = node;
+       cur->node = NULL;
+       WARN_ON(res && start + size > res->num_pages << PAGE_SHIFT);
+       return;
 }
 
 /**
@@ -85,7 +124,9 @@ static inline void amdgpu_res_first(struct ttm_resource *res,
  */
 static inline void amdgpu_res_next(struct amdgpu_res_cursor *cur, uint64_t 
size)
 {
-       struct drm_mm_node *node = cur->node;
+       struct drm_buddy_block *block;
+       struct drm_mm_node *node;
+       struct list_head *next;
 
        BUG_ON(size > cur->remaining);
 
@@ -99,9 +140,27 @@ static inline void amdgpu_res_next(struct amdgpu_res_cursor 
*cur, uint64_t size)
                return;
        }
 
-       cur->node = ++node;
-       cur->start = node->start << PAGE_SHIFT;
-       cur->size = min(node->size << PAGE_SHIFT, cur->remaining);
+       switch (cur->mem_type) {
+       case TTM_PL_VRAM:
+               block = cur->node;
+
+               next = block->link.next;
+               block = list_entry(next, struct drm_buddy_block, link);
+
+               cur->node = block;
+               cur->start = node_start(block);
+               cur->size = min(node_size(block), cur->remaining);
+               break;
+       case TTM_PL_TT:
+               node = cur->node;
+
+               cur->node = ++node;
+               cur->start = node->start << PAGE_SHIFT;
+               cur->size = min(node->size << PAGE_SHIFT, cur->remaining);
+               break;
+       default:
+               return;
+       }
 }
 
 #endif
-- 
2.25.1

Reply via email to