diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c | 34 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c | 14 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c | 8 | 
5 files changed, 50 insertions, 11 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c index dfb6cfd83760..02138aa55793 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c @@ -88,8 +88,8 @@ int amdgpu_map_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm,  	}  	r = amdgpu_vm_bo_map(adev, *bo_va, csa_addr, 0, size, -			     AMDGPU_VM_PAGE_READABLE | AMDGPU_VM_PAGE_WRITEABLE | -			     AMDGPU_VM_PAGE_EXECUTABLE); +			     AMDGPU_PTE_READABLE | AMDGPU_PTE_WRITEABLE | +			     AMDGPU_PTE_EXECUTABLE);  	if (r) {  		DRM_ERROR("failed to do bo_map on static CSA, err=%d\n", r); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c index 5743ebb2f1b7..ce27cb5bb05e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c @@ -285,6 +285,36 @@ static int amdgpu_dma_buf_begin_cpu_access(struct dma_buf *dma_buf,  	return ret;  } +static int amdgpu_dma_buf_vmap(struct dma_buf *dma_buf, struct iosys_map *map) +{ +	struct drm_gem_object *obj = dma_buf->priv; +	struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj); +	int ret; + +	/* +	 * Pin to keep buffer in place while it's vmap'ed. The actual +	 * domain is not that important as long as it's mapable. Using +	 * GTT and VRAM should be compatible with most use cases. +	 */ +	ret = amdgpu_bo_pin(bo, AMDGPU_GEM_DOMAIN_GTT | AMDGPU_GEM_DOMAIN_VRAM); +	if (ret) +		return ret; +	ret = drm_gem_dmabuf_vmap(dma_buf, map); +	if (ret) +		amdgpu_bo_unpin(bo); + +	return ret; +} + +static void amdgpu_dma_buf_vunmap(struct dma_buf *dma_buf, struct iosys_map *map) +{ +	struct drm_gem_object *obj = dma_buf->priv; +	struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj); + +	drm_gem_dmabuf_vunmap(dma_buf, map); +	amdgpu_bo_unpin(bo); +} +  const struct dma_buf_ops amdgpu_dmabuf_ops = {  	.attach = amdgpu_dma_buf_attach,  	.pin = amdgpu_dma_buf_pin, @@ -294,8 +324,8 @@ const struct dma_buf_ops amdgpu_dmabuf_ops = {  	.release = drm_gem_dmabuf_release,  	.begin_cpu_access = amdgpu_dma_buf_begin_cpu_access,  	.mmap = drm_gem_dmabuf_mmap, -	.vmap = drm_gem_dmabuf_vmap, -	.vunmap = drm_gem_dmabuf_vunmap, +	.vmap = amdgpu_dma_buf_vmap, +	.vunmap = amdgpu_dma_buf_vunmap,  };  /** diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c index c3ace8030530..8190c24a649a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c @@ -471,6 +471,7 @@ amdgpu_userq_create(struct drm_file *filp, union drm_amdgpu_userq *args)  	if (index == (uint64_t)-EINVAL) {  		drm_file_err(uq_mgr->file, "Failed to get doorbell for queue\n");  		kfree(queue); +		r = -EINVAL;  		goto unlock;  	} diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c index c01c241a1b06..c85de8c8f6f5 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c @@ -1612,9 +1612,9 @@ static int gfx_v11_0_sw_init(struct amdgpu_ip_block *ip_block)  	case IP_VERSION(11, 0, 2):  	case IP_VERSION(11, 0, 3):  		if (!adev->gfx.disable_uq && -		    adev->gfx.me_fw_version  >= 2390 && -		    adev->gfx.pfp_fw_version >= 2530 && -		    adev->gfx.mec_fw_version >= 2600 && +		    adev->gfx.me_fw_version  >= 2420 && +		    adev->gfx.pfp_fw_version >= 2580 && +		    adev->gfx.mec_fw_version >= 2650 &&  		    adev->mes.fw_version[0] >= 120) {  			adev->userq_funcs[AMDGPU_HW_IP_GFX] = &userq_mes_funcs;  			adev->userq_funcs[AMDGPU_HW_IP_COMPUTE] = &userq_mes_funcs; @@ -4129,6 +4129,8 @@ static int gfx_v11_0_gfx_mqd_init(struct amdgpu_device *adev, void *m,  #endif  	if (prop->tmz_queue)  		tmp = REG_SET_FIELD(tmp, CP_GFX_HQD_CNTL, TMZ_MATCH, 1); +	if (!prop->kernel_queue) +		tmp = REG_SET_FIELD(tmp, CP_GFX_HQD_CNTL, RB_NON_PRIV, 1);  	mqd->cp_gfx_hqd_cntl = tmp;  	/* set up cp_doorbell_control */ @@ -4281,8 +4283,10 @@ static int gfx_v11_0_compute_mqd_init(struct amdgpu_device *adev, void *m,  	tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, UNORD_DISPATCH, 1);  	tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, TUNNEL_DISPATCH,  			    prop->allow_tunneling); -	tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, PRIV_STATE, 1); -	tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, KMD_QUEUE, 1); +	if (prop->kernel_queue) { +		tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, PRIV_STATE, 1); +		tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, KMD_QUEUE, 1); +	}  	if (prop->tmz_queue)  		tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, TMZ, 1);  	mqd->cp_hqd_pq_control = tmp; diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c index 3e138527d534..fd44d5503e28 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c @@ -3026,6 +3026,8 @@ static int gfx_v12_0_gfx_mqd_init(struct amdgpu_device *adev, void *m,  #endif  	if (prop->tmz_queue)  		tmp = REG_SET_FIELD(tmp, CP_GFX_HQD_CNTL, TMZ_MATCH, 1); +	if (!prop->kernel_queue) +		tmp = REG_SET_FIELD(tmp, CP_GFX_HQD_CNTL, RB_NON_PRIV, 1);  	mqd->cp_gfx_hqd_cntl = tmp;  	/* set up cp_doorbell_control */ @@ -3175,8 +3177,10 @@ static int gfx_v12_0_compute_mqd_init(struct amdgpu_device *adev, void *m,  			    (order_base_2(AMDGPU_GPU_PAGE_SIZE / 4) - 1));  	tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, UNORD_DISPATCH, 1);  	tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, TUNNEL_DISPATCH, 0); -	tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, PRIV_STATE, 1); -	tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, KMD_QUEUE, 1); +	if (prop->kernel_queue) { +		tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, PRIV_STATE, 1); +		tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, KMD_QUEUE, 1); +	}  	if (prop->tmz_queue)  		tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, TMZ, 1);  	mqd->cp_hqd_pq_control = tmp; | 
