diff options
| author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2023-07-17 15:37:56 +0200 | 
|---|---|---|
| committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2023-07-17 15:37:57 +0200 | 
| commit | 6c7f27441d6af776a89147027c6f4a11c0162c64 (patch) | |
| tree | fc6f19c0b243dd77de3f270e1c2e8a41be086531 /drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c | |
| parent | fdf0eaf11452d72945af31804e2a1048ee1b574c (diff) | |
| parent | 36672dda2eb715af99e9abbcdc400d46598b691c (diff) | |
Merge tag 'drm-misc-next-2023-07-13' of git://anongit.freedesktop.org/drm/drm-misc into drm-next
drm-misc-next for v6.6:
UAPI Changes:
 * fbdev:
   * Make fbdev userspace interfaces optional; only leaves the
     framebuffer console active
 * prime:
   * Support dma-buf self-import for all drivers automatically: improves
     support for many userspace compositors
Cross-subsystem Changes:
 * backlight:
   * Fix interaction with fbdev in several drivers
 * base: Convert struct platform.remove to return void; part of a larger,
   tree-wide effort
 * dma-buf: Acquire reservation lock for mmap() in exporters; part
   of an on-going effort to simplify locking around dma-bufs
 * fbdev:
   * Use Linux device instead of fbdev device in many places
   * Use deferred-I/O helper macros in various drivers
 * i2c: Convert struct i2c from .probe_new to .probe; part of a larger,
   tree-wide effort
 * video:
   * Avoid including <linux/screen_info.h>
Core Changes:
 * atomic:
   * Improve logging
 * prime:
   * Remove struct drm_driver.gem_prime_mmap plus driver updates: all
     drivers now implement this callback with drm_gem_prime_mmap()
 * gem:
   * Support execution contexts: provides locking over multiple GEM
     objects
 * ttm:
   * Support init_on_free
   * Swapout fixes
Driver Changes:
 * accel:
   * ivpu: MMU updates; Support debugfs
 * ast:
   * Improve device-model detection
   * Cleanups
 * bridge:
   * dw-hdmi: Improve support for YUV420 bus format
   * dw-mipi-dsi: Fix enable/disable of DSI controller
   * lt9611uxc: Use MODULE_FIRMWARE()
   * ps8640: Remove broken EDID code
   * samsung-dsim: Fix command transfer
   * tc358764: Handle HS/VS polarity; Use BIT() macro; Various cleanups
   * Cleanups
 * ingenic:
   * Kconfig REGMAP fixes
 * loongson:
   * Support display controller
 * mgag200:
   * Minor fixes
 * mxsfb:
   * Support disabling overlay planes
 * nouveau:
   * Improve VRAM detection
   * Various fixes and cleanups
 * panel:
   * panel-edp: Support AUO B116XAB01.4
   * Support Visionox R66451 plus DT bindings
   * Cleanups
 * ssd130x:
   * Support per-controller default resolution plus DT bindings
   * Reduce memory-allocation overhead
   * Cleanups
 * tidss:
   * Support TI AM625 plus DT bindings
   * Implement new connector model plus driver updates
 * vkms
   * Improve write-back support
   * Documentation fixes
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
From: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20230713090830.GA23281@linux-uq9g
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c | 90 | 
1 files changed, 43 insertions, 47 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c index e9091ebfe230..3e3dadd6d0f3 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c @@ -22,6 +22,7 @@   */  #include <linux/firmware.h> +#include <drm/drm_exec.h>  #include "amdgpu_mes.h"  #include "amdgpu.h" @@ -1168,34 +1169,31 @@ int amdgpu_mes_ctx_map_meta_data(struct amdgpu_device *adev,  				 struct amdgpu_mes_ctx_data *ctx_data)  {  	struct amdgpu_bo_va *bo_va; -	struct ww_acquire_ctx ticket; -	struct list_head list; -	struct amdgpu_bo_list_entry pd; -	struct ttm_validate_buffer csa_tv;  	struct amdgpu_sync sync; +	struct drm_exec exec;  	int r;  	amdgpu_sync_create(&sync); -	INIT_LIST_HEAD(&list); -	INIT_LIST_HEAD(&csa_tv.head); -	csa_tv.bo = &ctx_data->meta_data_obj->tbo; -	csa_tv.num_shared = 1; - -	list_add(&csa_tv.head, &list); -	amdgpu_vm_get_pd_bo(vm, &list, &pd); - -	r = ttm_eu_reserve_buffers(&ticket, &list, true, NULL); -	if (r) { -		DRM_ERROR("failed to reserve meta data BO: err=%d\n", r); -		return r; +	drm_exec_init(&exec, 0); +	drm_exec_until_all_locked(&exec) { +		r = drm_exec_lock_obj(&exec, +				      &ctx_data->meta_data_obj->tbo.base); +		drm_exec_retry_on_contention(&exec); +		if (unlikely(r)) +			goto error_fini_exec; + +		r = amdgpu_vm_lock_pd(vm, &exec, 0); +		drm_exec_retry_on_contention(&exec); +		if (unlikely(r)) +			goto error_fini_exec;  	}  	bo_va = amdgpu_vm_bo_add(adev, vm, ctx_data->meta_data_obj);  	if (!bo_va) { -		ttm_eu_backoff_reservation(&ticket, &list);  		DRM_ERROR("failed to create bo_va for meta data BO\n"); -		return -ENOMEM; +		r = -ENOMEM; +		goto error_fini_exec;  	}  	r = amdgpu_vm_bo_map(adev, bo_va, ctx_data->meta_data_gpu_addr, 0, @@ -1205,33 +1203,35 @@ int amdgpu_mes_ctx_map_meta_data(struct amdgpu_device *adev,  	if (r) {  		DRM_ERROR("failed to do bo_map on meta data, err=%d\n", r); -		goto error; +		goto error_del_bo_va;  	}  	r = amdgpu_vm_bo_update(adev, bo_va, false);  	if (r) {  		DRM_ERROR("failed to do vm_bo_update on meta data\n"); -		goto error; +		goto error_del_bo_va;  	}  	amdgpu_sync_fence(&sync, bo_va->last_pt_update);  	r = amdgpu_vm_update_pdes(adev, vm, false);  	if (r) {  		DRM_ERROR("failed to update pdes on meta data\n"); -		goto error; +		goto error_del_bo_va;  	}  	amdgpu_sync_fence(&sync, vm->last_update);  	amdgpu_sync_wait(&sync, false); -	ttm_eu_backoff_reservation(&ticket, &list); +	drm_exec_fini(&exec);  	amdgpu_sync_free(&sync);  	ctx_data->meta_data_va = bo_va;  	return 0; -error: +error_del_bo_va:  	amdgpu_vm_bo_del(adev, bo_va); -	ttm_eu_backoff_reservation(&ticket, &list); + +error_fini_exec: +	drm_exec_fini(&exec);  	amdgpu_sync_free(&sync);  	return r;  } @@ -1242,34 +1242,30 @@ int amdgpu_mes_ctx_unmap_meta_data(struct amdgpu_device *adev,  	struct amdgpu_bo_va *bo_va = ctx_data->meta_data_va;  	struct amdgpu_bo *bo = ctx_data->meta_data_obj;  	struct amdgpu_vm *vm = bo_va->base.vm; -	struct amdgpu_bo_list_entry vm_pd; -	struct list_head list, duplicates; -	struct dma_fence *fence = NULL; -	struct ttm_validate_buffer tv; -	struct ww_acquire_ctx ticket; -	long r = 0; - -	INIT_LIST_HEAD(&list); -	INIT_LIST_HEAD(&duplicates); - -	tv.bo = &bo->tbo; -	tv.num_shared = 2; -	list_add(&tv.head, &list); - -	amdgpu_vm_get_pd_bo(vm, &list, &vm_pd); - -	r = ttm_eu_reserve_buffers(&ticket, &list, false, &duplicates); -	if (r) { -		dev_err(adev->dev, "leaking bo va because " -			"we fail to reserve bo (%ld)\n", r); -		return r; +	struct dma_fence *fence; +	struct drm_exec exec; +	long r; + +	drm_exec_init(&exec, 0); +	drm_exec_until_all_locked(&exec) { +		r = drm_exec_lock_obj(&exec, +				      &ctx_data->meta_data_obj->tbo.base); +		drm_exec_retry_on_contention(&exec); +		if (unlikely(r)) +			goto out_unlock; + +		r = amdgpu_vm_lock_pd(vm, &exec, 0); +		drm_exec_retry_on_contention(&exec); +		if (unlikely(r)) +			goto out_unlock;  	}  	amdgpu_vm_bo_del(adev, bo_va);  	if (!amdgpu_vm_ready(vm))  		goto out_unlock; -	r = dma_resv_get_singleton(bo->tbo.base.resv, DMA_RESV_USAGE_BOOKKEEP, &fence); +	r = dma_resv_get_singleton(bo->tbo.base.resv, DMA_RESV_USAGE_BOOKKEEP, +				   &fence);  	if (r)  		goto out_unlock;  	if (fence) { @@ -1288,7 +1284,7 @@ int amdgpu_mes_ctx_unmap_meta_data(struct amdgpu_device *adev,  out_unlock:  	if (unlikely(r < 0))  		dev_err(adev->dev, "failed to clear page tables (%ld)\n", r); -	ttm_eu_backoff_reservation(&ticket, &list); +	drm_exec_fini(&exec);  	return r;  } | 
