diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_gart.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_gart.c | 13 | 
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c index 59d44937dd9..84b648a7ddd 100644 --- a/drivers/gpu/drm/radeon/radeon_gart.c +++ b/drivers/gpu/drm/radeon/radeon_gart.c @@ -289,8 +289,9 @@ int radeon_vm_manager_init(struct radeon_device *rdev)  	rdev->vm_manager.enabled = false;  	/* mark first vm as always in use, it's the system one */ +	/* allocate enough for 2 full VM pts */  	r = radeon_sa_bo_manager_init(rdev, &rdev->vm_manager.sa_manager, -				      rdev->vm_manager.max_pfn * 8, +				      rdev->vm_manager.max_pfn * 8 * 2,  				      RADEON_GEM_DOMAIN_VRAM);  	if (r) {  		dev_err(rdev->dev, "failed to allocate vm bo (%dKB)\n", @@ -633,7 +634,15 @@ int radeon_vm_init(struct radeon_device *rdev, struct radeon_vm *vm)  	mutex_init(&vm->mutex);  	INIT_LIST_HEAD(&vm->list);  	INIT_LIST_HEAD(&vm->va); -	vm->last_pfn = 0; +	/* SI requires equal sized PTs for all VMs, so always set +	 * last_pfn to max_pfn.  cayman allows variable sized +	 * pts so we can grow then as needed.  Once we switch +	 * to two level pts we can unify this again. +	 */ +	if (rdev->family >= CHIP_TAHITI) +		vm->last_pfn = rdev->vm_manager.max_pfn; +	else +		vm->last_pfn = 0;  	/* map the ib pool buffer at 0 in virtual address space, set  	 * read only  	 */  |