diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c | 83 | 
1 files changed, 51 insertions, 32 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c index dac88d2dd70d..1cb1ec7beefe 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c @@ -135,9 +135,11 @@ int amdgpu_mes_init(struct amdgpu_device *adev)  	idr_init(&adev->mes.queue_id_idr);  	ida_init(&adev->mes.doorbell_ida);  	spin_lock_init(&adev->mes.queue_id_lock); -	spin_lock_init(&adev->mes.ring_lock);  	mutex_init(&adev->mes.mutex_hidden); +	for (i = 0; i < AMDGPU_MAX_MES_PIPES; i++) +		spin_lock_init(&adev->mes.ring_lock[i]); +  	adev->mes.total_max_queue = AMDGPU_FENCE_MES_QUEUE_ID_MASK;  	adev->mes.vmid_mask_mmhub = 0xffffff00;  	adev->mes.vmid_mask_gfxhub = 0xffffff00; @@ -163,36 +165,38 @@ int amdgpu_mes_init(struct amdgpu_device *adev)  			adev->mes.sdma_hqd_mask[i] = 0xfc;  	} -	r = amdgpu_device_wb_get(adev, &adev->mes.sch_ctx_offs); -	if (r) { -		dev_err(adev->dev, -			"(%d) ring trail_fence_offs wb alloc failed\n", r); -		goto error_ids; -	} -	adev->mes.sch_ctx_gpu_addr = -		adev->wb.gpu_addr + (adev->mes.sch_ctx_offs * 4); -	adev->mes.sch_ctx_ptr = -		(uint64_t *)&adev->wb.wb[adev->mes.sch_ctx_offs]; +	for (i = 0; i < AMDGPU_MAX_MES_PIPES; i++) { +		r = amdgpu_device_wb_get(adev, &adev->mes.sch_ctx_offs[i]); +		if (r) { +			dev_err(adev->dev, +				"(%d) ring trail_fence_offs wb alloc failed\n", +				r); +			goto error; +		} +		adev->mes.sch_ctx_gpu_addr[i] = +			adev->wb.gpu_addr + (adev->mes.sch_ctx_offs[i] * 4); +		adev->mes.sch_ctx_ptr[i] = +			(uint64_t *)&adev->wb.wb[adev->mes.sch_ctx_offs[i]]; -	r = amdgpu_device_wb_get(adev, &adev->mes.query_status_fence_offs); -	if (r) { -		amdgpu_device_wb_free(adev, adev->mes.sch_ctx_offs); -		dev_err(adev->dev, -			"(%d) query_status_fence_offs wb alloc failed\n", r); -		goto error_ids; +		r = amdgpu_device_wb_get(adev, +				 &adev->mes.query_status_fence_offs[i]); +		if (r) { +			dev_err(adev->dev, +			      "(%d) query_status_fence_offs wb alloc failed\n", +			      r); +			goto error; +		} +		adev->mes.query_status_fence_gpu_addr[i] = adev->wb.gpu_addr + +			(adev->mes.query_status_fence_offs[i] * 4); +		adev->mes.query_status_fence_ptr[i] = +			(uint64_t *)&adev->wb.wb[adev->mes.query_status_fence_offs[i]];  	} -	adev->mes.query_status_fence_gpu_addr = -		adev->wb.gpu_addr + (adev->mes.query_status_fence_offs * 4); -	adev->mes.query_status_fence_ptr = -		(uint64_t *)&adev->wb.wb[adev->mes.query_status_fence_offs];  	r = amdgpu_device_wb_get(adev, &adev->mes.read_val_offs);  	if (r) { -		amdgpu_device_wb_free(adev, adev->mes.sch_ctx_offs); -		amdgpu_device_wb_free(adev, adev->mes.query_status_fence_offs);  		dev_err(adev->dev,  			"(%d) read_val_offs alloc failed\n", r); -		goto error_ids; +		goto error;  	}  	adev->mes.read_val_gpu_addr =  		adev->wb.gpu_addr + (adev->mes.read_val_offs * 4); @@ -212,10 +216,16 @@ int amdgpu_mes_init(struct amdgpu_device *adev)  error_doorbell:  	amdgpu_mes_doorbell_free(adev);  error: -	amdgpu_device_wb_free(adev, adev->mes.sch_ctx_offs); -	amdgpu_device_wb_free(adev, adev->mes.query_status_fence_offs); -	amdgpu_device_wb_free(adev, adev->mes.read_val_offs); -error_ids: +	for (i = 0; i < AMDGPU_MAX_MES_PIPES; i++) { +		if (adev->mes.sch_ctx_ptr[i]) +			amdgpu_device_wb_free(adev, adev->mes.sch_ctx_offs[i]); +		if (adev->mes.query_status_fence_ptr[i]) +			amdgpu_device_wb_free(adev, +				      adev->mes.query_status_fence_offs[i]); +	} +	if (adev->mes.read_val_ptr) +		amdgpu_device_wb_free(adev, adev->mes.read_val_offs); +  	idr_destroy(&adev->mes.pasid_idr);  	idr_destroy(&adev->mes.gang_id_idr);  	idr_destroy(&adev->mes.queue_id_idr); @@ -226,13 +236,22 @@ error_ids:  void amdgpu_mes_fini(struct amdgpu_device *adev)  { +	int i; +  	amdgpu_bo_free_kernel(&adev->mes.event_log_gpu_obj,  			      &adev->mes.event_log_gpu_addr,  			      &adev->mes.event_log_cpu_addr); -	amdgpu_device_wb_free(adev, adev->mes.sch_ctx_offs); -	amdgpu_device_wb_free(adev, adev->mes.query_status_fence_offs); -	amdgpu_device_wb_free(adev, adev->mes.read_val_offs); +	for (i = 0; i < AMDGPU_MAX_MES_PIPES; i++) { +		if (adev->mes.sch_ctx_ptr[i]) +			amdgpu_device_wb_free(adev, adev->mes.sch_ctx_offs[i]); +		if (adev->mes.query_status_fence_ptr[i]) +			amdgpu_device_wb_free(adev, +				      adev->mes.query_status_fence_offs[i]); +	} +	if (adev->mes.read_val_ptr) +		amdgpu_device_wb_free(adev, adev->mes.read_val_offs); +  	amdgpu_mes_doorbell_free(adev);  	idr_destroy(&adev->mes.pasid_idr); @@ -1499,7 +1518,7 @@ int amdgpu_mes_init_microcode(struct amdgpu_device *adev, int pipe)  	amdgpu_ucode_ip_version_decode(adev, GC_HWIP, ucode_prefix,  				       sizeof(ucode_prefix)); -	if (adev->enable_uni_mes && pipe == AMDGPU_MES_SCHED_PIPE) { +	if (adev->enable_uni_mes) {  		snprintf(fw_name, sizeof(fw_name),  			 "amdgpu/%s_uni_mes.bin", ucode_prefix);  	} else if (amdgpu_ip_version(adev, GC_HWIP, 0) >= IP_VERSION(11, 0, 0) && |