radeon_object.c 18.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
/*
 * Copyright 2009 Jerome Glisse.
 * All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sub license, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
 * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
 * USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 * The above copyright notice and this permission notice (including the
 * next paragraph) shall be included in all copies or substantial portions
 * of the Software.
 *
 */
/*
 * Authors:
 *    Jerome Glisse <glisse@freedesktop.org>
 *    Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
 *    Dave Airlie
 */
#include <linux/list.h>
33
#include <linux/slab.h>
34
#include <drm/drmP.h>
35
#include <drm/radeon_drm.h>
36
#include "radeon.h"
37
#include "radeon_trace.h"
38 39 40 41


int radeon_ttm_init(struct radeon_device *rdev);
void radeon_ttm_fini(struct radeon_device *rdev);
42
static void radeon_bo_clear_surface_reg(struct radeon_bo *bo);
43 44 45 46 47 48

/*
 * To exclude mutual BO access we rely on bo_reserve exclusion, as all
 * function are calling it.
 */

49
static void radeon_bo_clear_va(struct radeon_bo *bo)
50 51 52 53 54
{
	struct radeon_bo_va *bo_va, *tmp;

	list_for_each_entry_safe(bo_va, tmp, &bo->va, bo_list) {
		/* remove from all vm address space */
55
		radeon_vm_bo_rmv(bo->rdev, bo_va);
56 57 58
	}
}

59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
static void radeon_update_memory_usage(struct radeon_bo *bo,
				       unsigned mem_type, int sign)
{
	struct radeon_device *rdev = bo->rdev;
	u64 size = (u64)bo->tbo.num_pages << PAGE_SHIFT;

	switch (mem_type) {
	case TTM_PL_TT:
		if (sign > 0)
			atomic64_add(size, &rdev->gtt_usage);
		else
			atomic64_sub(size, &rdev->gtt_usage);
		break;
	case TTM_PL_VRAM:
		if (sign > 0)
			atomic64_add(size, &rdev->vram_usage);
		else
			atomic64_sub(size, &rdev->vram_usage);
		break;
	}
}

81
static void radeon_ttm_bo_destroy(struct ttm_buffer_object *tbo)
82
{
83
	struct radeon_bo *bo;
84

85
	bo = container_of(tbo, struct radeon_bo, tbo);
86 87 88

	radeon_update_memory_usage(bo, bo->tbo.mem.mem_type, -1);

89 90 91 92
	mutex_lock(&bo->rdev->gem.mutex);
	list_del_init(&bo->list);
	mutex_unlock(&bo->rdev->gem.mutex);
	radeon_bo_clear_surface_reg(bo);
93
	radeon_bo_clear_va(bo);
94
	drm_gem_object_release(&bo->gem_base);
95
	kfree(bo);
96 97
}

98 99 100 101 102 103 104
bool radeon_ttm_bo_is_radeon_bo(struct ttm_buffer_object *bo)
{
	if (bo->destroy == &radeon_ttm_bo_destroy)
		return true;
	return false;
}

105 106
void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
{
107
	u32 c = 0, i;
108 109

	rbo->placement.fpfn = 0;
110
	rbo->placement.lpfn = 0;
111
	rbo->placement.placement = rbo->placements;
112
	rbo->placement.busy_placement = rbo->placements;
113 114 115
	if (domain & RADEON_GEM_DOMAIN_VRAM)
		rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |
					TTM_PL_FLAG_VRAM;
116 117 118 119 120 121 122 123 124
	if (domain & RADEON_GEM_DOMAIN_GTT) {
		if (rbo->rdev->flags & RADEON_IS_AGP) {
			rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_TT;
		} else {
			rbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_TT;
		}
	}
	if (domain & RADEON_GEM_DOMAIN_CPU) {
		if (rbo->rdev->flags & RADEON_IS_AGP) {
125
			rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_SYSTEM;
126
		} else {
127
			rbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_SYSTEM;
128 129
		}
	}
130 131
	if (!c)
		rbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
132 133
	rbo->placement.num_placement = c;
	rbo->placement.num_busy_placement = c;
134 135 136 137 138 139 140 141 142 143 144

	/*
	 * Use two-ended allocation depending on the buffer size to
	 * improve fragmentation quality.
	 * 512kb was measured as the most optimal number.
	 */
	if (rbo->tbo.mem.size > 512 * 1024) {
		for (i = 0; i < c; i++) {
			rbo->placements[i] |= TTM_PL_FLAG_TOPDOWN;
		}
	}
145 146
}

147
int radeon_bo_create(struct radeon_device *rdev,
148
		     unsigned long size, int byte_align, bool kernel, u32 domain,
149
		     struct sg_table *sg, struct radeon_bo **bo_ptr)
150
{
151
	struct radeon_bo *bo;
152
	enum ttm_bo_type type;
153
	unsigned long page_align = roundup(byte_align, PAGE_SIZE) >> PAGE_SHIFT;
154
	size_t acc_size;
155 156
	int r;

157 158
	size = ALIGN(size, PAGE_SIZE);

159 160
	if (kernel) {
		type = ttm_bo_type_kernel;
161 162
	} else if (sg) {
		type = ttm_bo_type_sg;
163 164 165
	} else {
		type = ttm_bo_type_device;
	}
166
	*bo_ptr = NULL;
167

168 169 170
	acc_size = ttm_bo_dma_acc_size(&rdev->mman.bdev, size,
				       sizeof(struct radeon_bo));

171 172
	bo = kzalloc(sizeof(struct radeon_bo), GFP_KERNEL);
	if (bo == NULL)
173
		return -ENOMEM;
174 175 176 177 178
	r = drm_gem_object_init(rdev->ddev, &bo->gem_base, size);
	if (unlikely(r)) {
		kfree(bo);
		return r;
	}
179 180 181
	bo->rdev = rdev;
	bo->surface_reg = -1;
	INIT_LIST_HEAD(&bo->list);
182
	INIT_LIST_HEAD(&bo->va);
183 184 185
	bo->initial_domain = domain & (RADEON_GEM_DOMAIN_VRAM |
	                               RADEON_GEM_DOMAIN_GTT |
	                               RADEON_GEM_DOMAIN_CPU);
186
	radeon_ttm_placement_from_domain(bo, domain);
187
	/* Kernel allocation are uninterruptible */
188
	down_read(&rdev->pm.mclk_lock);
189
	r = ttm_bo_init(&rdev->mman.bdev, &bo->tbo, size, type,
190
			&bo->placement, page_align, !kernel, NULL,
191
			acc_size, sg, &radeon_ttm_bo_destroy);
192
	up_read(&rdev->pm.mclk_lock);
193 194 195
	if (unlikely(r != 0)) {
		return r;
	}
196
	*bo_ptr = bo;
197

198
	trace_radeon_bo_create(bo);
199

200 201 202
	return 0;
}

203
int radeon_bo_kmap(struct radeon_bo *bo, void **ptr)
204
{
205
	bool is_iomem;
206 207
	int r;

208
	if (bo->kptr) {
209
		if (ptr) {
210
			*ptr = bo->kptr;
211 212 213
		}
		return 0;
	}
214
	r = ttm_bo_kmap(&bo->tbo, 0, bo->tbo.num_pages, &bo->kmap);
215 216 217
	if (r) {
		return r;
	}
218
	bo->kptr = ttm_kmap_obj_virtual(&bo->kmap, &is_iomem);
219
	if (ptr) {
220
		*ptr = bo->kptr;
221
	}
222
	radeon_bo_check_tiling(bo, 0, 0);
223 224 225
	return 0;
}

226
void radeon_bo_kunmap(struct radeon_bo *bo)
227
{
228
	if (bo->kptr == NULL)
229
		return;
230 231 232
	bo->kptr = NULL;
	radeon_bo_check_tiling(bo, 0, 0);
	ttm_bo_kunmap(&bo->kmap);
233 234
}

235
void radeon_bo_unref(struct radeon_bo **bo)
236
{
237
	struct ttm_buffer_object *tbo;
238
	struct radeon_device *rdev;
239

240
	if ((*bo) == NULL)
241
		return;
242
	rdev = (*bo)->rdev;
243
	tbo = &((*bo)->tbo);
244
	down_read(&rdev->pm.mclk_lock);
245
	ttm_bo_unref(&tbo);
246
	up_read(&rdev->pm.mclk_lock);
247 248
	if (tbo == NULL)
		*bo = NULL;
249 250
}

251 252
int radeon_bo_pin_restricted(struct radeon_bo *bo, u32 domain, u64 max_offset,
			     u64 *gpu_addr)
253
{
254
	int r, i;
255

256 257 258 259
	if (bo->pin_count) {
		bo->pin_count++;
		if (gpu_addr)
			*gpu_addr = radeon_bo_gpu_offset(bo);
260 261 262 263 264 265 266 267

		if (max_offset != 0) {
			u64 domain_start;

			if (domain == RADEON_GEM_DOMAIN_VRAM)
				domain_start = bo->rdev->mc.vram_start;
			else
				domain_start = bo->rdev->mc.gtt_start;
268 269
			WARN_ON_ONCE(max_offset <
				     (radeon_bo_gpu_offset(bo) - domain_start));
270 271
		}

272 273
		return 0;
	}
274
	radeon_ttm_placement_from_domain(bo, domain);
275 276 277 278
	if (domain == RADEON_GEM_DOMAIN_VRAM) {
		/* force to pin into visible video ram */
		bo->placement.lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
	}
279 280 281 282 283 284 285 286 287
	if (max_offset) {
		u64 lpfn = max_offset >> PAGE_SHIFT;

		if (!bo->placement.lpfn)
			bo->placement.lpfn = bo->rdev->mc.gtt_size >> PAGE_SHIFT;

		if (lpfn < bo->placement.lpfn)
			bo->placement.lpfn = lpfn;
	}
288 289
	for (i = 0; i < bo->placement.num_placement; i++)
		bo->placements[i] |= TTM_PL_FLAG_NO_EVICT;
290
	r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false);
291 292 293 294
	if (likely(r == 0)) {
		bo->pin_count = 1;
		if (gpu_addr != NULL)
			*gpu_addr = radeon_bo_gpu_offset(bo);
295
	}
296
	if (unlikely(r != 0))
297
		dev_err(bo->rdev->dev, "%p pin failed\n", bo);
298 299
	return r;
}
300 301 302 303 304

int radeon_bo_pin(struct radeon_bo *bo, u32 domain, u64 *gpu_addr)
{
	return radeon_bo_pin_restricted(bo, domain, 0, gpu_addr);
}
305

306
int radeon_bo_unpin(struct radeon_bo *bo)
307
{
308
	int r, i;
309

310 311 312
	if (!bo->pin_count) {
		dev_warn(bo->rdev->dev, "%p unpin not necessary\n", bo);
		return 0;
313
	}
314 315 316
	bo->pin_count--;
	if (bo->pin_count)
		return 0;
317 318
	for (i = 0; i < bo->placement.num_placement; i++)
		bo->placements[i] &= ~TTM_PL_FLAG_NO_EVICT;
319
	r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false);
320
	if (unlikely(r != 0))
321
		dev_err(bo->rdev->dev, "%p validate failed for unpin\n", bo);
322
	return r;
323 324
}

325
int radeon_bo_evict_vram(struct radeon_device *rdev)
326
{
327 328
	/* late 2.6.33 fix IGP hibernate - we need pm ops to do this correct */
	if (0 && (rdev->flags & RADEON_IS_IGP)) {
329 330 331
		if (rdev->mc.igp_sideport_enabled == false)
			/* Useless to evict on IGP chips */
			return 0;
332 333 334 335
	}
	return ttm_bo_evict_mm(&rdev->mman.bdev, TTM_PL_VRAM);
}

336
void radeon_bo_force_delete(struct radeon_device *rdev)
337
{
338
	struct radeon_bo *bo, *n;
339 340 341 342

	if (list_empty(&rdev->gem.objects)) {
		return;
	}
343 344
	dev_err(rdev->dev, "Userspace still has active objects !\n");
	list_for_each_entry_safe(bo, n, &rdev->gem.objects, list) {
345
		mutex_lock(&rdev->ddev->struct_mutex);
346
		dev_err(rdev->dev, "%p %p %lu %lu force free\n",
347 348
			&bo->gem_base, bo, (unsigned long)bo->gem_base.size,
			*((unsigned long *)&bo->gem_base.refcount));
349 350 351
		mutex_lock(&bo->rdev->gem.mutex);
		list_del_init(&bo->list);
		mutex_unlock(&bo->rdev->gem.mutex);
352
		/* this should unref the ttm bo */
353
		drm_gem_object_unreference(&bo->gem_base);
354 355 356 357
		mutex_unlock(&rdev->ddev->struct_mutex);
	}
}

358
int radeon_bo_init(struct radeon_device *rdev)
359
{
360
	/* Add an MTRR for the VRAM */
361
	if (!rdev->fastfb_working) {
362 363
		rdev->mc.vram_mtrr = arch_phys_wc_add(rdev->mc.aper_base,
						      rdev->mc.aper_size);
364
	}
365 366 367 368 369
	DRM_INFO("Detected VRAM RAM=%lluM, BAR=%lluM\n",
		rdev->mc.mc_vram_size >> 20,
		(unsigned long long)rdev->mc.aper_size >> 20);
	DRM_INFO("RAM width %dbits %cDR\n",
			rdev->mc.vram_width, rdev->mc.vram_is_ddr ? 'D' : 'S');
370 371 372
	return radeon_ttm_init(rdev);
}

373
void radeon_bo_fini(struct radeon_device *rdev)
374 375
{
	radeon_ttm_fini(rdev);
376
	arch_phys_wc_del(rdev->mc.vram_mtrr);
377 378
}

379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432
/* Returns how many bytes TTM can move per IB.
 */
static u64 radeon_bo_get_threshold_for_moves(struct radeon_device *rdev)
{
	u64 real_vram_size = rdev->mc.real_vram_size;
	u64 vram_usage = atomic64_read(&rdev->vram_usage);

	/* This function is based on the current VRAM usage.
	 *
	 * - If all of VRAM is free, allow relocating the number of bytes that
	 *   is equal to 1/4 of the size of VRAM for this IB.

	 * - If more than one half of VRAM is occupied, only allow relocating
	 *   1 MB of data for this IB.
	 *
	 * - From 0 to one half of used VRAM, the threshold decreases
	 *   linearly.
	 *         __________________
	 * 1/4 of -|\               |
	 * VRAM    | \              |
	 *         |  \             |
	 *         |   \            |
	 *         |    \           |
	 *         |     \          |
	 *         |      \         |
	 *         |       \________|1 MB
	 *         |----------------|
	 *    VRAM 0 %             100 %
	 *         used            used
	 *
	 * Note: It's a threshold, not a limit. The threshold must be crossed
	 * for buffer relocations to stop, so any buffer of an arbitrary size
	 * can be moved as long as the threshold isn't crossed before
	 * the relocation takes place. We don't want to disable buffer
	 * relocations completely.
	 *
	 * The idea is that buffers should be placed in VRAM at creation time
	 * and TTM should only do a minimum number of relocations during
	 * command submission. In practice, you need to submit at least
	 * a dozen IBs to move all buffers to VRAM if they are in GTT.
	 *
	 * Also, things can get pretty crazy under memory pressure and actual
	 * VRAM usage can change a lot, so playing safe even at 50% does
	 * consistently increase performance.
	 */

	u64 half_vram = real_vram_size >> 1;
	u64 half_free_vram = vram_usage >= half_vram ? 0 : half_vram - vram_usage;
	u64 bytes_moved_threshold = half_free_vram >> 1;
	return max(bytes_moved_threshold, 1024*1024ull);
}

int radeon_bo_list_validate(struct radeon_device *rdev,
			    struct ww_acquire_ctx *ticket,
433
			    struct list_head *head, int ring)
434
{
435
	struct radeon_cs_reloc *lobj;
436
	struct radeon_bo *bo;
437
	int r;
438 439
	u64 bytes_moved = 0, initial_bytes_moved;
	u64 bytes_moved_threshold = radeon_bo_get_threshold_for_moves(rdev);
440

441
	r = ttm_eu_reserve_buffers(ticket, head);
442 443 444
	if (unlikely(r != 0)) {
		return r;
	}
445

446
	list_for_each_entry(lobj, head, tv.head) {
447
		bo = lobj->robj;
448
		if (!bo->pin_count) {
449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467
			u32 domain = lobj->domain;
			u32 current_domain =
				radeon_mem_type_to_domain(bo->tbo.mem.mem_type);

			/* Check if this buffer will be moved and don't move it
			 * if we have moved too many buffers for this IB already.
			 *
			 * Note that this allows moving at least one buffer of
			 * any size, because it doesn't take the current "bo"
			 * into account. We don't want to disallow buffer moves
			 * completely.
			 */
			if (current_domain != RADEON_GEM_DOMAIN_CPU &&
			    (domain & current_domain) == 0 && /* will be moved */
			    bytes_moved > bytes_moved_threshold) {
				/* don't move it */
				domain = current_domain;
			}

468 469
		retry:
			radeon_ttm_placement_from_domain(bo, domain);
C
Christian König 已提交
470 471
			if (ring == R600_RING_TYPE_UVD_INDEX)
				radeon_uvd_force_into_uvd_segment(bo);
472 473 474 475 476 477

			initial_bytes_moved = atomic64_read(&rdev->num_bytes_moved);
			r = ttm_bo_validate(&bo->tbo, &bo->placement, true, false);
			bytes_moved += atomic64_read(&rdev->num_bytes_moved) -
				       initial_bytes_moved;

478
			if (unlikely(r)) {
479 480
				if (r != -ERESTARTSYS && domain != lobj->alt_domain) {
					domain = lobj->alt_domain;
481 482
					goto retry;
				}
483
				ttm_eu_backoff_reservation(ticket, head);
484
				return r;
485
			}
486
		}
487 488
		lobj->gpu_offset = radeon_bo_gpu_offset(bo);
		lobj->tiling_flags = bo->tiling_flags;
489 490 491 492
	}
	return 0;
}

493
int radeon_bo_fbdev_mmap(struct radeon_bo *bo,
494 495
			     struct vm_area_struct *vma)
{
496
	return ttm_fbdev_mmap(vma, &bo->tbo);
497 498
}

499
int radeon_bo_get_surface_reg(struct radeon_bo *bo)
500
{
501
	struct radeon_device *rdev = bo->rdev;
502
	struct radeon_surface_reg *reg;
503
	struct radeon_bo *old_object;
504 505 506
	int steal;
	int i;

507
	lockdep_assert_held(&bo->tbo.resv->lock.base);
508 509

	if (!bo->tiling_flags)
510 511
		return 0;

512 513 514
	if (bo->surface_reg >= 0) {
		reg = &rdev->surface_regs[bo->surface_reg];
		i = bo->surface_reg;
515 516 517 518 519 520 521
		goto out;
	}

	steal = -1;
	for (i = 0; i < RADEON_GEM_MAX_SURFACES; i++) {

		reg = &rdev->surface_regs[i];
522
		if (!reg->bo)
523 524
			break;

525
		old_object = reg->bo;
526 527 528 529 530 531 532 533 534 535
		if (old_object->pin_count == 0)
			steal = i;
	}

	/* if we are all out */
	if (i == RADEON_GEM_MAX_SURFACES) {
		if (steal == -1)
			return -ENOMEM;
		/* find someone with a surface reg and nuke their BO */
		reg = &rdev->surface_regs[steal];
536
		old_object = reg->bo;
537 538
		/* blow away the mapping */
		DRM_DEBUG("stealing surface reg %d from %p\n", steal, old_object);
539
		ttm_bo_unmap_virtual(&old_object->tbo);
540 541 542 543
		old_object->surface_reg = -1;
		i = steal;
	}

544 545
	bo->surface_reg = i;
	reg->bo = bo;
546 547

out:
548
	radeon_set_surface_reg(rdev, i, bo->tiling_flags, bo->pitch,
549
			       bo->tbo.mem.start << PAGE_SHIFT,
550
			       bo->tbo.num_pages << PAGE_SHIFT);
551 552 553
	return 0;
}

554
static void radeon_bo_clear_surface_reg(struct radeon_bo *bo)
555
{
556
	struct radeon_device *rdev = bo->rdev;
557 558
	struct radeon_surface_reg *reg;

559
	if (bo->surface_reg == -1)
560 561
		return;

562 563
	reg = &rdev->surface_regs[bo->surface_reg];
	radeon_clear_surface_reg(rdev, bo->surface_reg);
564

565 566
	reg->bo = NULL;
	bo->surface_reg = -1;
567 568
}

569 570
int radeon_bo_set_tiling_flags(struct radeon_bo *bo,
				uint32_t tiling_flags, uint32_t pitch)
571
{
572
	struct radeon_device *rdev = bo->rdev;
573 574
	int r;

575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619
	if (rdev->family >= CHIP_CEDAR) {
		unsigned bankw, bankh, mtaspect, tilesplit, stilesplit;

		bankw = (tiling_flags >> RADEON_TILING_EG_BANKW_SHIFT) & RADEON_TILING_EG_BANKW_MASK;
		bankh = (tiling_flags >> RADEON_TILING_EG_BANKH_SHIFT) & RADEON_TILING_EG_BANKH_MASK;
		mtaspect = (tiling_flags >> RADEON_TILING_EG_MACRO_TILE_ASPECT_SHIFT) & RADEON_TILING_EG_MACRO_TILE_ASPECT_MASK;
		tilesplit = (tiling_flags >> RADEON_TILING_EG_TILE_SPLIT_SHIFT) & RADEON_TILING_EG_TILE_SPLIT_MASK;
		stilesplit = (tiling_flags >> RADEON_TILING_EG_STENCIL_TILE_SPLIT_SHIFT) & RADEON_TILING_EG_STENCIL_TILE_SPLIT_MASK;
		switch (bankw) {
		case 0:
		case 1:
		case 2:
		case 4:
		case 8:
			break;
		default:
			return -EINVAL;
		}
		switch (bankh) {
		case 0:
		case 1:
		case 2:
		case 4:
		case 8:
			break;
		default:
			return -EINVAL;
		}
		switch (mtaspect) {
		case 0:
		case 1:
		case 2:
		case 4:
		case 8:
			break;
		default:
			return -EINVAL;
		}
		if (tilesplit > 6) {
			return -EINVAL;
		}
		if (stilesplit > 6) {
			return -EINVAL;
		}
	}
620 621 622 623 624 625 626
	r = radeon_bo_reserve(bo, false);
	if (unlikely(r != 0))
		return r;
	bo->tiling_flags = tiling_flags;
	bo->pitch = pitch;
	radeon_bo_unreserve(bo);
	return 0;
627 628
}

629 630 631
void radeon_bo_get_tiling_flags(struct radeon_bo *bo,
				uint32_t *tiling_flags,
				uint32_t *pitch)
632
{
633 634
	lockdep_assert_held(&bo->tbo.resv->lock.base);

635
	if (tiling_flags)
636
		*tiling_flags = bo->tiling_flags;
637
	if (pitch)
638
		*pitch = bo->pitch;
639 640
}

641 642
int radeon_bo_check_tiling(struct radeon_bo *bo, bool has_moved,
				bool force_drop)
643
{
644 645
	if (!force_drop)
		lockdep_assert_held(&bo->tbo.resv->lock.base);
646 647

	if (!(bo->tiling_flags & RADEON_TILING_SURFACE))
648 649 650
		return 0;

	if (force_drop) {
651
		radeon_bo_clear_surface_reg(bo);
652 653 654
		return 0;
	}

655
	if (bo->tbo.mem.mem_type != TTM_PL_VRAM) {
656 657 658
		if (!has_moved)
			return 0;

659 660
		if (bo->surface_reg >= 0)
			radeon_bo_clear_surface_reg(bo);
661 662 663
		return 0;
	}

664
	if ((bo->surface_reg >= 0) && !has_moved)
665 666
		return 0;

667
	return radeon_bo_get_surface_reg(bo);
668 669 670
}

void radeon_bo_move_notify(struct ttm_buffer_object *bo,
671
			   struct ttm_mem_reg *new_mem)
672
{
673
	struct radeon_bo *rbo;
674

675 676
	if (!radeon_ttm_bo_is_radeon_bo(bo))
		return;
677

678
	rbo = container_of(bo, struct radeon_bo, tbo);
679
	radeon_bo_check_tiling(rbo, 0, 1);
680
	radeon_vm_bo_invalidate(rbo->rdev, rbo);
681 682 683 684 685 686 687

	/* update statistics */
	if (!new_mem)
		return;

	radeon_update_memory_usage(rbo, bo->mem.mem_type, -1);
	radeon_update_memory_usage(rbo, new_mem->mem_type, 1);
688 689
}

690
int radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
691
{
692
	struct radeon_device *rdev;
693
	struct radeon_bo *rbo;
694 695 696
	unsigned long offset, size;
	int r;

697
	if (!radeon_ttm_bo_is_radeon_bo(bo))
698
		return 0;
699
	rbo = container_of(bo, struct radeon_bo, tbo);
700
	radeon_bo_check_tiling(rbo, 0, 0);
701 702 703
	rdev = rbo->rdev;
	if (bo->mem.mem_type == TTM_PL_VRAM) {
		size = bo->mem.num_pages << PAGE_SHIFT;
704
		offset = bo->mem.start << PAGE_SHIFT;
705 706 707 708
		if ((offset + size) > rdev->mc.visible_vram_size) {
			/* hurrah the memory is not visible ! */
			radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_VRAM);
			rbo->placement.lpfn = rdev->mc.visible_vram_size >> PAGE_SHIFT;
709
			r = ttm_bo_validate(bo, &rbo->placement, false, false);
710 711
			if (unlikely(r != 0))
				return r;
712
			offset = bo->mem.start << PAGE_SHIFT;
713 714 715 716 717 718
			/* this should not happen */
			if ((offset + size) > rdev->mc.visible_vram_size)
				return -EINVAL;
		}
	}
	return 0;
719
}
720

721
int radeon_bo_wait(struct radeon_bo *bo, u32 *mem_type, bool no_wait)
722 723 724 725 726 727 728 729 730 731
{
	int r;

	r = ttm_bo_reserve(&bo->tbo, true, no_wait, false, 0);
	if (unlikely(r != 0))
		return r;
	spin_lock(&bo->tbo.bdev->fence_lock);
	if (mem_type)
		*mem_type = bo->tbo.mem.mem_type;
	if (bo->tbo.sync_obj)
732
		r = ttm_bo_wait(&bo->tbo, true, true, no_wait);
733 734 735 736
	spin_unlock(&bo->tbo.bdev->fence_lock);
	ttm_bo_unreserve(&bo->tbo);
	return r;
}