]> Git Repo - J-linux.git/blobdiff - drivers/gpu/drm/amd/amdgpu/amdgpu_res_cursor.h
Merge branch 'for-next' into for-linus
[J-linux.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_res_cursor.h
index acfa207cf970462d9a23de925669fd4a00756567..6546552e596ce4ace56d57712ba7d47528ea1d90 100644 (file)
 #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 fallback;
 
        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_resource(res)->blocks;
+
+               block = list_first_entry_or_null(head,
+                                                struct drm_buddy_block,
+                                                link);
+               if (!block)
+                       goto fallback;
+
+               while (start >= amdgpu_vram_mgr_block_size(block)) {
+                       start -= amdgpu_vram_mgr_block_size(block);
+
+                       next = block->link.next;
+                       if (next != head)
+                               block = list_entry(next, struct drm_buddy_block, link);
+               }
+
+               cur->start = amdgpu_vram_mgr_block_start(block) + start;
+               cur->size = min(amdgpu_vram_mgr_block_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 fallback;
+       }
 
-       cur->start = (node->start << PAGE_SHIFT) + start;
-       cur->size = min((node->size << PAGE_SHIFT) - start, size);
+       return;
+
+fallback:
+       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 = amdgpu_vram_mgr_block_start(block);
+               cur->size = min(amdgpu_vram_mgr_block_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
This page took 0.030651 seconds and 4 git commands to generate.