diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_object.c')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_object.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c index 342deaccc15..91541e63d58 100644 --- a/drivers/gpu/drm/radeon/radeon_object.c +++ b/drivers/gpu/drm/radeon/radeon_object.c | |||
@@ -224,7 +224,8 @@ void radeon_bo_unref(struct radeon_bo **bo) | |||
224 | *bo = NULL; | 224 | *bo = NULL; |
225 | } | 225 | } |
226 | 226 | ||
227 | int radeon_bo_pin(struct radeon_bo *bo, u32 domain, u64 *gpu_addr) | 227 | int radeon_bo_pin_restricted(struct radeon_bo *bo, u32 domain, u64 max_offset, |
228 | u64 *gpu_addr) | ||
228 | { | 229 | { |
229 | int r, i; | 230 | int r, i; |
230 | 231 | ||
@@ -232,6 +233,7 @@ int radeon_bo_pin(struct radeon_bo *bo, u32 domain, u64 *gpu_addr) | |||
232 | bo->pin_count++; | 233 | bo->pin_count++; |
233 | if (gpu_addr) | 234 | if (gpu_addr) |
234 | *gpu_addr = radeon_bo_gpu_offset(bo); | 235 | *gpu_addr = radeon_bo_gpu_offset(bo); |
236 | WARN_ON_ONCE(max_offset != 0); | ||
235 | return 0; | 237 | return 0; |
236 | } | 238 | } |
237 | radeon_ttm_placement_from_domain(bo, domain); | 239 | radeon_ttm_placement_from_domain(bo, domain); |
@@ -239,6 +241,15 @@ int radeon_bo_pin(struct radeon_bo *bo, u32 domain, u64 *gpu_addr) | |||
239 | /* force to pin into visible video ram */ | 241 | /* force to pin into visible video ram */ |
240 | bo->placement.lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT; | 242 | bo->placement.lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT; |
241 | } | 243 | } |
244 | if (max_offset) { | ||
245 | u64 lpfn = max_offset >> PAGE_SHIFT; | ||
246 | |||
247 | if (!bo->placement.lpfn) | ||
248 | bo->placement.lpfn = bo->rdev->mc.gtt_size >> PAGE_SHIFT; | ||
249 | |||
250 | if (lpfn < bo->placement.lpfn) | ||
251 | bo->placement.lpfn = lpfn; | ||
252 | } | ||
242 | for (i = 0; i < bo->placement.num_placement; i++) | 253 | for (i = 0; i < bo->placement.num_placement; i++) |
243 | bo->placements[i] |= TTM_PL_FLAG_NO_EVICT; | 254 | bo->placements[i] |= TTM_PL_FLAG_NO_EVICT; |
244 | r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false, false); | 255 | r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false, false); |
@@ -252,6 +263,11 @@ int radeon_bo_pin(struct radeon_bo *bo, u32 domain, u64 *gpu_addr) | |||
252 | return r; | 263 | return r; |
253 | } | 264 | } |
254 | 265 | ||
266 | int radeon_bo_pin(struct radeon_bo *bo, u32 domain, u64 *gpu_addr) | ||
267 | { | ||
268 | return radeon_bo_pin_restricted(bo, domain, 0, gpu_addr); | ||
269 | } | ||
270 | |||
255 | int radeon_bo_unpin(struct radeon_bo *bo) | 271 | int radeon_bo_unpin(struct radeon_bo *bo) |
256 | { | 272 | { |
257 | int r, i; | 273 | int r, i; |