diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c')
| -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); |
