diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 34 | 
1 files changed, 20 insertions, 14 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 223c63342ecd..c29fad97b63a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -876,6 +876,7 @@ static int amdgpu_vm_pt_create(struct amdgpu_device *adev,  	struct amdgpu_bo_param bp;  	struct amdgpu_bo *bo;  	struct dma_resv *resv; +	unsigned int num_entries;  	int r;  	memset(&bp, 0, sizeof(bp)); @@ -886,7 +887,14 @@ static int amdgpu_vm_pt_create(struct amdgpu_device *adev,  	bp.domain = amdgpu_bo_get_preferred_pin_domain(adev, bp.domain);  	bp.flags = AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS |  		AMDGPU_GEM_CREATE_CPU_GTT_USWC; -	bp.bo_ptr_size = sizeof(struct amdgpu_bo_vm); + +	if (level < AMDGPU_VM_PTB) +		num_entries = amdgpu_vm_num_entries(adev, level); +	else +		num_entries = 0; + +	bp.bo_ptr_size = struct_size((*vmbo), entries, num_entries); +  	if (vm->use_cpu_for_update)  		bp.flags |= AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED; @@ -957,19 +965,14 @@ static int amdgpu_vm_alloc_pts(struct amdgpu_device *adev,  	struct amdgpu_bo_vm *pt;  	int r; -	if (cursor->level < AMDGPU_VM_PTB && !entry->entries) { -		unsigned num_entries; - -		num_entries = amdgpu_vm_num_entries(adev, cursor->level); -		entry->entries = kvmalloc_array(num_entries, -						sizeof(*entry->entries), -						GFP_KERNEL | __GFP_ZERO); -		if (!entry->entries) -			return -ENOMEM; -	} - -	if (entry->base.bo) +	if (entry->base.bo) { +		if (cursor->level < AMDGPU_VM_PTB) +			entry->entries = +				to_amdgpu_bo_vm(entry->base.bo)->entries; +		else +			entry->entries = NULL;  		return 0; +	}  	r = amdgpu_vm_pt_create(adev, vm, cursor->level, immediate, &pt);  	if (r) @@ -981,6 +984,10 @@ static int amdgpu_vm_alloc_pts(struct amdgpu_device *adev,  	pt_bo = &pt->bo;  	pt_bo->parent = amdgpu_bo_ref(cursor->parent->base.bo);  	amdgpu_vm_bo_base_init(&entry->base, vm, pt_bo); +	if (cursor->level < AMDGPU_VM_PTB) +		entry->entries = pt->entries; +	else +		entry->entries = NULL;  	r = amdgpu_vm_clear_bo(adev, vm, pt, immediate);  	if (r) @@ -1010,7 +1017,6 @@ static void amdgpu_vm_free_table(struct amdgpu_vm_pt *entry)  		amdgpu_bo_unref(&shadow);  		amdgpu_bo_unref(&entry->base.bo);  	} -	kvfree(entry->entries);  	entry->entries = NULL;  } | 
