]> Git Repo - linux.git/blobdiff - drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
Merge tag 'backlight-next-5.14' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_vram_mgr.c
index 5ebfaed37e47ff7bf19ad7e80a04343b67852fce..436ec246a7daccded3a7f0943a4db29152feaca7 100644 (file)
@@ -219,19 +219,20 @@ static u64 amdgpu_vram_mgr_vis_size(struct amdgpu_device *adev,
 u64 amdgpu_vram_mgr_bo_visible_size(struct amdgpu_bo *bo)
 {
        struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
-       struct ttm_resource *mem = bo->tbo.resource;
-       struct drm_mm_node *nodes = mem->mm_node;
-       unsigned pages = mem->num_pages;
+       struct ttm_resource *res = bo->tbo.resource;
+       unsigned pages = res->num_pages;
+       struct drm_mm_node *mm;
        u64 usage;
 
        if (amdgpu_gmc_vram_full_visible(&adev->gmc))
                return amdgpu_bo_size(bo);
 
-       if (mem->start >= adev->gmc.visible_vram_size >> PAGE_SHIFT)
+       if (res->start >= adev->gmc.visible_vram_size >> PAGE_SHIFT)
                return 0;
 
-       for (usage = 0; nodes && pages; pages -= nodes->size, nodes++)
-               usage += amdgpu_vram_mgr_vis_size(adev, nodes);
+       mm = &container_of(res, struct ttm_range_mgr_node, base)->mm_nodes[0];
+       for (usage = 0; pages; pages -= mm->size, mm++)
+               usage += amdgpu_vram_mgr_vis_size(adev, mm);
 
        return usage;
 }
@@ -367,7 +368,7 @@ static void amdgpu_vram_mgr_virt_start(struct ttm_resource *mem,
 static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
                               struct ttm_buffer_object *tbo,
                               const struct ttm_place *place,
-                              struct ttm_resource *mem)
+                              struct ttm_resource **res)
 {
        unsigned long lpfn, num_nodes, pages_per_node, pages_left, pages;
        struct amdgpu_vram_mgr *mgr = to_vram_mgr(man);
@@ -388,7 +389,7 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
                max_bytes -= AMDGPU_VM_RESERVED_VRAM;
 
        /* bail out quickly if there's likely not enough VRAM for this BO */
-       mem_bytes = (u64)mem->num_pages << PAGE_SHIFT;
+       mem_bytes = tbo->base.size;
        if (atomic64_add_return(mem_bytes, &mgr->usage) > max_bytes) {
                r = -ENOSPC;
                goto error_sub;
@@ -406,7 +407,7 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
 #endif
                pages_per_node = max_t(uint32_t, pages_per_node,
                                       tbo->page_alignment);
-               num_nodes = DIV_ROUND_UP(mem->num_pages, pages_per_node);
+               num_nodes = DIV_ROUND_UP_ULL(PFN_UP(mem_bytes), pages_per_node);
        }
 
        node = kvmalloc(struct_size(node, mm_nodes, num_nodes),
@@ -422,8 +423,7 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
        if (place->flags & TTM_PL_FLAG_TOPDOWN)
                mode = DRM_MM_INSERT_HIGH;
 
-       mem->start = 0;
-       pages_left = mem->num_pages;
+       pages_left = node->base.num_pages;
 
        /* Limit maximum size to 2GB due to SG table limitations */
        pages = min(pages_left, 2UL << (30 - PAGE_SHIFT));
@@ -451,7 +451,7 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
                }
 
                vis_usage += amdgpu_vram_mgr_vis_size(adev, &node->mm_nodes[i]);
-               amdgpu_vram_mgr_virt_start(mem, &node->mm_nodes[i]);
+               amdgpu_vram_mgr_virt_start(&node->base, &node->mm_nodes[i]);
                pages_left -= pages;
                ++i;
 
@@ -461,10 +461,10 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
        spin_unlock(&mgr->lock);
 
        if (i == 1)
-               mem->placement |= TTM_PL_FLAG_CONTIGUOUS;
+               node->base.placement |= TTM_PL_FLAG_CONTIGUOUS;
 
        atomic64_add(vis_usage, &mgr->vis_usage);
-       mem->mm_node = &node->mm_nodes[0];
+       *res = &node->base;
        return 0;
 
 error_free:
@@ -487,28 +487,22 @@ error_sub:
  * Free the allocated VRAM again.
  */
 static void amdgpu_vram_mgr_del(struct ttm_resource_manager *man,
-                               struct ttm_resource *mem)
+                               struct ttm_resource *res)
 {
+       struct ttm_range_mgr_node *node = to_ttm_range_mgr_node(res);
        struct amdgpu_vram_mgr *mgr = to_vram_mgr(man);
        struct amdgpu_device *adev = to_amdgpu_device(mgr);
-       struct ttm_range_mgr_node *node;
        uint64_t usage = 0, vis_usage = 0;
-       unsigned pages = mem->num_pages;
-       struct drm_mm_node *nodes;
-
-       if (!mem->mm_node)
-               return;
-
-       node = to_ttm_range_mgr_node(mem);
-       nodes = &node->mm_nodes[0];
+       unsigned i, pages;
 
        spin_lock(&mgr->lock);
-       while (pages) {
-               pages -= nodes->size;
-               drm_mm_remove_node(nodes);
-               usage += nodes->size << PAGE_SHIFT;
-               vis_usage += amdgpu_vram_mgr_vis_size(adev, nodes);
-               ++nodes;
+       for (i = 0, pages = res->num_pages; pages;
+            pages -= node->mm_nodes[i].size, ++i) {
+               struct drm_mm_node *mm = &node->mm_nodes[i];
+
+               drm_mm_remove_node(mm);
+               usage += mm->size << PAGE_SHIFT;
+               vis_usage += amdgpu_vram_mgr_vis_size(adev, mm);
        }
        amdgpu_vram_mgr_do_reserve(man);
        spin_unlock(&mgr->lock);
@@ -533,7 +527,7 @@ static void amdgpu_vram_mgr_del(struct ttm_resource_manager *man,
  * Allocate and fill a sg table from a VRAM allocation.
  */
 int amdgpu_vram_mgr_alloc_sgt(struct amdgpu_device *adev,
-                             struct ttm_resource *mem,
+                             struct ttm_resource *res,
                              u64 offset, u64 length,
                              struct device *dev,
                              enum dma_data_direction dir,
@@ -549,7 +543,7 @@ int amdgpu_vram_mgr_alloc_sgt(struct amdgpu_device *adev,
                return -ENOMEM;
 
        /* Determine the number of DRM_MM nodes to export */
-       amdgpu_res_first(mem, offset, length, &cursor);
+       amdgpu_res_first(res, offset, length, &cursor);
        while (cursor.remaining) {
                num_entries++;
                amdgpu_res_next(&cursor, cursor.size);
@@ -569,7 +563,7 @@ int amdgpu_vram_mgr_alloc_sgt(struct amdgpu_device *adev,
         * and the number of bytes from it. Access the following
         * DRM_MM node(s) if more buffer needs to exported
         */
-       amdgpu_res_first(mem, offset, length, &cursor);
+       amdgpu_res_first(res, offset, length, &cursor);
        for_each_sgtable_sg((*sgt), sg, i) {
                phys_addr_t phys = cursor.start + adev->gmc.aper_base;
                size_t size = cursor.size;
This page took 0.042504 seconds and 4 git commands to generate.