diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 60 | 
1 files changed, 33 insertions, 27 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index dc34b50e6b29..9c85a90be293 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c @@ -382,8 +382,7 @@ retry:  	p->bytes_moved += ctx.bytes_moved;  	if (adev->gmc.visible_vram_size < adev->gmc.real_vram_size && -	    bo->tbo.mem.mem_type == TTM_PL_VRAM && -	    bo->tbo.mem.start < adev->gmc.visible_vram_size >> PAGE_SHIFT) +	    amdgpu_bo_in_cpu_visible_vram(bo))  		p->bytes_moved_vis += ctx.bytes_moved;  	if (unlikely(r == -ENOMEM) && domain != bo->allowed_domains) { @@ -411,7 +410,6 @@ static bool amdgpu_cs_try_evict(struct amdgpu_cs_parser *p,  		struct amdgpu_bo_list_entry *candidate = p->evictable;  		struct amdgpu_bo *bo = candidate->robj;  		struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); -		u64 initial_bytes_moved, bytes_moved;  		bool update_bytes_moved_vis;  		uint32_t other; @@ -435,18 +433,14 @@ static bool amdgpu_cs_try_evict(struct amdgpu_cs_parser *p,  			continue;  		/* Good we can try to move this BO somewhere else */ -		amdgpu_ttm_placement_from_domain(bo, other);  		update_bytes_moved_vis =  			adev->gmc.visible_vram_size < adev->gmc.real_vram_size && -			bo->tbo.mem.mem_type == TTM_PL_VRAM && -			bo->tbo.mem.start < adev->gmc.visible_vram_size >> PAGE_SHIFT; -		initial_bytes_moved = atomic64_read(&adev->num_bytes_moved); +			amdgpu_bo_in_cpu_visible_vram(bo); +		amdgpu_ttm_placement_from_domain(bo, other);  		r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx); -		bytes_moved = atomic64_read(&adev->num_bytes_moved) - -			initial_bytes_moved; -		p->bytes_moved += bytes_moved; +		p->bytes_moved += ctx.bytes_moved;  		if (update_bytes_moved_vis) -			p->bytes_moved_vis += bytes_moved; +			p->bytes_moved_vis += ctx.bytes_moved;  		if (unlikely(r))  			break; @@ -528,6 +522,9 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,  	struct amdgpu_bo_list_entry *e;  	struct list_head duplicates;  	unsigned i, tries = 10; +	struct amdgpu_bo *gds; +	struct amdgpu_bo *gws; +	struct amdgpu_bo *oa;  	int r;  	INIT_LIST_HEAD(&p->validated); @@ -536,7 +533,7 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,  	if (p->bo_list) {  		amdgpu_bo_list_get_list(p->bo_list, &p->validated);  		if (p->bo_list->first_userptr != p->bo_list->num_entries) -			p->mn = amdgpu_mn_get(p->adev); +			p->mn = amdgpu_mn_get(p->adev, AMDGPU_MN_TYPE_GFX);  	}  	INIT_LIST_HEAD(&duplicates); @@ -658,31 +655,36 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,  	amdgpu_cs_report_moved_bytes(p->adev, p->bytes_moved,  				     p->bytes_moved_vis); +  	if (p->bo_list) { -		struct amdgpu_bo *gds = p->bo_list->gds_obj; -		struct amdgpu_bo *gws = p->bo_list->gws_obj; -		struct amdgpu_bo *oa = p->bo_list->oa_obj;  		struct amdgpu_vm *vm = &fpriv->vm;  		unsigned i; +		gds = p->bo_list->gds_obj; +		gws = p->bo_list->gws_obj; +		oa = p->bo_list->oa_obj;  		for (i = 0; i < p->bo_list->num_entries; i++) {  			struct amdgpu_bo *bo = p->bo_list->array[i].robj;  			p->bo_list->array[i].bo_va = amdgpu_vm_bo_find(vm, bo);  		} +	} else { +		gds = p->adev->gds.gds_gfx_bo; +		gws = p->adev->gds.gws_gfx_bo; +		oa = p->adev->gds.oa_gfx_bo; +	} -		if (gds) { -			p->job->gds_base = amdgpu_bo_gpu_offset(gds); -			p->job->gds_size = amdgpu_bo_size(gds); -		} -		if (gws) { -			p->job->gws_base = amdgpu_bo_gpu_offset(gws); -			p->job->gws_size = amdgpu_bo_size(gws); -		} -		if (oa) { -			p->job->oa_base = amdgpu_bo_gpu_offset(oa); -			p->job->oa_size = amdgpu_bo_size(oa); -		} +	if (gds) { +		p->job->gds_base = amdgpu_bo_gpu_offset(gds); +		p->job->gds_size = amdgpu_bo_size(gds); +	} +	if (gws) { +		p->job->gws_base = amdgpu_bo_gpu_offset(gws); +		p->job->gws_size = amdgpu_bo_size(gws); +	} +	if (oa) { +		p->job->oa_base = amdgpu_bo_gpu_offset(oa); +		p->job->oa_size = amdgpu_bo_size(oa);  	}  	if (!r && p->uf_entry.robj) { @@ -925,6 +927,10 @@ static int amdgpu_cs_ib_vm_chunk(struct amdgpu_device *adev,  		r = amdgpu_bo_vm_update_pte(p);  		if (r)  			return r; + +		r = reservation_object_reserve_shared(vm->root.base.bo->tbo.resv); +		if (r) +			return r;  	}  	return amdgpu_cs_sync_rings(p);  |