aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
index 9e577e3d3147..a4831fe0223b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
@@ -93,7 +93,6 @@ static int amdgpu_vram_mgr_new(struct ttm_mem_type_manager *man,
93 const struct ttm_place *place, 93 const struct ttm_place *place,
94 struct ttm_mem_reg *mem) 94 struct ttm_mem_reg *mem)
95{ 95{
96 struct amdgpu_bo *bo = container_of(tbo, struct amdgpu_bo, tbo);
97 struct amdgpu_vram_mgr *mgr = man->priv; 96 struct amdgpu_vram_mgr *mgr = man->priv;
98 struct drm_mm *mm = &mgr->mm; 97 struct drm_mm *mm = &mgr->mm;
99 struct drm_mm_node *nodes; 98 struct drm_mm_node *nodes;
@@ -106,8 +105,8 @@ static int amdgpu_vram_mgr_new(struct ttm_mem_type_manager *man,
106 if (!lpfn) 105 if (!lpfn)
107 lpfn = man->size; 106 lpfn = man->size;
108 107
109 if (bo->flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS || 108 if (place->flags & TTM_PL_FLAG_CONTIGUOUS ||
110 place->lpfn || amdgpu_vram_page_split == -1) { 109 amdgpu_vram_page_split == -1) {
111 pages_per_node = ~0ul; 110 pages_per_node = ~0ul;
112 num_nodes = 1; 111 num_nodes = 1;
113 } else { 112 } else {
@@ -124,12 +123,14 @@ static int amdgpu_vram_mgr_new(struct ttm_mem_type_manager *man,
124 if (place->flags & TTM_PL_FLAG_TOPDOWN) 123 if (place->flags & TTM_PL_FLAG_TOPDOWN)
125 mode = DRM_MM_INSERT_HIGH; 124 mode = DRM_MM_INSERT_HIGH;
126 125
126 mem->start = 0;
127 pages_left = mem->num_pages; 127 pages_left = mem->num_pages;
128 128
129 spin_lock(&mgr->lock); 129 spin_lock(&mgr->lock);
130 for (i = 0; i < num_nodes; ++i) { 130 for (i = 0; i < num_nodes; ++i) {
131 unsigned long pages = min(pages_left, pages_per_node); 131 unsigned long pages = min(pages_left, pages_per_node);
132 uint32_t alignment = mem->page_alignment; 132 uint32_t alignment = mem->page_alignment;
133 unsigned long start;
133 134
134 if (pages == pages_per_node) 135 if (pages == pages_per_node)
135 alignment = pages_per_node; 136 alignment = pages_per_node;
@@ -141,11 +142,19 @@ static int amdgpu_vram_mgr_new(struct ttm_mem_type_manager *man,
141 if (unlikely(r)) 142 if (unlikely(r))
142 goto error; 143 goto error;
143 144
145 /* Calculate a virtual BO start address to easily check if
146 * everything is CPU accessible.
147 */
148 start = nodes[i].start + nodes[i].size;
149 if (start > mem->num_pages)
150 start -= mem->num_pages;
151 else
152 start = 0;
153 mem->start = max(mem->start, start);
144 pages_left -= pages; 154 pages_left -= pages;
145 } 155 }
146 spin_unlock(&mgr->lock); 156 spin_unlock(&mgr->lock);
147 157
148 mem->start = num_nodes == 1 ? nodes[0].start : AMDGPU_BO_INVALID_OFFSET;
149 mem->mm_node = nodes; 158 mem->mm_node = nodes;
150 159
151 return 0; 160 return 0;