diff options
author | Christian König <christian.koenig@amd.com> | 2018-09-07 08:27:05 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2018-09-12 17:28:28 -0400 |
commit | 433ca054949a6c9daac0ace1be5c33b25092bffa (patch) | |
tree | 5d2f6af92f9c2c200534ab2f8ea778018507192a /drivers | |
parent | d8de8260a45aae8f74af77eae9a162bdc0ed48d2 (diff) |
drm/amdgpu: try allocating VRAM as power of two
Try to allocate VRAM in power of two sizes and only fallback to vram
split sizes if that fails.
Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Felix Kuehling <felix.kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 52 |
1 files changed, 40 insertions, 12 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c index 9cfa8a9ada92..3f9d5d00c9b3 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | |||
@@ -125,6 +125,28 @@ u64 amdgpu_vram_mgr_bo_visible_size(struct amdgpu_bo *bo) | |||
125 | } | 125 | } |
126 | 126 | ||
127 | /** | 127 | /** |
128 | * amdgpu_vram_mgr_virt_start - update virtual start address | ||
129 | * | ||
130 | * @mem: ttm_mem_reg to update | ||
131 | * @node: just allocated node | ||
132 | * | ||
133 | * Calculate a virtual BO start address to easily check if everything is CPU | ||
134 | * accessible. | ||
135 | */ | ||
136 | static void amdgpu_vram_mgr_virt_start(struct ttm_mem_reg *mem, | ||
137 | struct drm_mm_node *node) | ||
138 | { | ||
139 | unsigned long start; | ||
140 | |||
141 | start = node->start + node->size; | ||
142 | if (start > mem->num_pages) | ||
143 | start -= mem->num_pages; | ||
144 | else | ||
145 | start = 0; | ||
146 | mem->start = max(mem->start, start); | ||
147 | } | ||
148 | |||
149 | /** | ||
128 | * amdgpu_vram_mgr_new - allocate new ranges | 150 | * amdgpu_vram_mgr_new - allocate new ranges |
129 | * | 151 | * |
130 | * @man: TTM memory type manager | 152 | * @man: TTM memory type manager |
@@ -176,10 +198,25 @@ static int amdgpu_vram_mgr_new(struct ttm_mem_type_manager *man, | |||
176 | pages_left = mem->num_pages; | 198 | pages_left = mem->num_pages; |
177 | 199 | ||
178 | spin_lock(&mgr->lock); | 200 | spin_lock(&mgr->lock); |
179 | for (i = 0; i < num_nodes; ++i) { | 201 | for (i = 0; pages_left >= pages_per_node; ++i) { |
202 | unsigned long pages = rounddown_pow_of_two(pages_left); | ||
203 | |||
204 | r = drm_mm_insert_node_in_range(mm, &nodes[i], pages, | ||
205 | pages_per_node, 0, | ||
206 | place->fpfn, lpfn, | ||
207 | mode); | ||
208 | if (unlikely(r)) | ||
209 | break; | ||
210 | |||
211 | usage += nodes[i].size << PAGE_SHIFT; | ||
212 | vis_usage += amdgpu_vram_mgr_vis_size(adev, &nodes[i]); | ||
213 | amdgpu_vram_mgr_virt_start(mem, &nodes[i]); | ||
214 | pages_left -= pages; | ||
215 | } | ||
216 | |||
217 | for (; pages_left; ++i) { | ||
180 | unsigned long pages = min(pages_left, pages_per_node); | 218 | unsigned long pages = min(pages_left, pages_per_node); |
181 | uint32_t alignment = mem->page_alignment; | 219 | uint32_t alignment = mem->page_alignment; |
182 | unsigned long start; | ||
183 | 220 | ||
184 | if (pages == pages_per_node) | 221 | if (pages == pages_per_node) |
185 | alignment = pages_per_node; | 222 | alignment = pages_per_node; |
@@ -193,16 +230,7 @@ static int amdgpu_vram_mgr_new(struct ttm_mem_type_manager *man, | |||
193 | 230 | ||
194 | usage += nodes[i].size << PAGE_SHIFT; | 231 | usage += nodes[i].size << PAGE_SHIFT; |
195 | vis_usage += amdgpu_vram_mgr_vis_size(adev, &nodes[i]); | 232 | vis_usage += amdgpu_vram_mgr_vis_size(adev, &nodes[i]); |
196 | 233 | amdgpu_vram_mgr_virt_start(mem, &nodes[i]); | |
197 | /* Calculate a virtual BO start address to easily check if | ||
198 | * everything is CPU accessible. | ||
199 | */ | ||
200 | start = nodes[i].start + nodes[i].size; | ||
201 | if (start > mem->num_pages) | ||
202 | start -= mem->num_pages; | ||
203 | else | ||
204 | start = 0; | ||
205 | mem->start = max(mem->start, start); | ||
206 | pages_left -= pages; | 234 | pages_left -= pages; |
207 | } | 235 | } |
208 | spin_unlock(&mgr->lock); | 236 | spin_unlock(&mgr->lock); |