diff options
| author | Dave Airlie <airlied@redhat.com> | 2022-07-15 15:07:24 +1000 | 
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2022-07-15 15:07:26 +1000 | 
| commit | 60693e3a38903e39e4fac0a9849b698fc36228bd (patch) | |
| tree | 083fc10b2243117b789bd2fb69a7b3aabdbae69f /drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c | |
| parent | 0180290abb5ce5c870f84a00ffeda5802f641dce (diff) | |
| parent | b7be3ae759160aa3355ebeb0583f67fb9bda4dae (diff) | |
Merge tag 'amd-drm-next-5.20-2022-07-14' of https://gitlab.freedesktop.org/agd5f/linux into drm-next
amd-drm-next-5.20-2022-07-14:
amdgpu:
- DCN3.2 updates
- DC SubVP support
- DP MST fixes
- Audio fixes
- DC code cleanup
- SMU13 updates
- Adjust GART size on newer APUs for S/G display
- Soft reset for GFX 11
- Soft reset for SDMA 6
- Add gfxoff status query for vangogh
- Improve BO domain pinning
- Fix timestamps for cursor only commits
- MES fixes
- DCN 3.1.4 support
- Misc fixes
- Misc code cleanup
amdkfd:
- Simplify GPUVM validation
- Unified memory for CWSR save/restore area
- fix possible list corruption on queue failure
radeon:
- Fix bogus power of two warning
UAPI:
- Unified memory for CWSR save/restore area for KFD
  Proposed userspace: https://lists.freedesktop.org/archives/amd-gfx/2022-June/080952.html
Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Alex Deucher <alexander.deucher@amd.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220714214716.8203-1-alexander.deucher@amd.com
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c | 82 | 
1 files changed, 71 insertions, 11 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c index abf2bf7f1a79..5820c3f0e215 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c @@ -8525,14 +8525,45 @@ static u64 gfx_v10_0_ring_get_wptr_gfx(struct amdgpu_ring *ring)  static void gfx_v10_0_ring_set_wptr_gfx(struct amdgpu_ring *ring)  {  	struct amdgpu_device *adev = ring->adev; +	uint32_t *wptr_saved; +	uint32_t *is_queue_unmap; +	uint64_t aggregated_db_index; +	uint32_t mqd_size = adev->mqds[AMDGPU_HW_IP_GFX].mqd_size; +	uint64_t wptr_tmp; -	if (ring->use_doorbell) { -		/* XXX check if swapping is necessary on BE */ -		atomic64_set((atomic64_t *)ring->wptr_cpu_addr, ring->wptr); -		WDOORBELL64(ring->doorbell_index, ring->wptr); +	if (ring->is_mes_queue) { +		wptr_saved = (uint32_t *)(ring->mqd_ptr + mqd_size); +		is_queue_unmap = (uint32_t *)(ring->mqd_ptr + mqd_size + +					      sizeof(uint32_t)); +		aggregated_db_index = +			amdgpu_mes_get_aggregated_doorbell_index(adev, +			AMDGPU_MES_PRIORITY_LEVEL_NORMAL); + +		wptr_tmp = ring->wptr & ring->buf_mask; +		atomic64_set((atomic64_t *)ring->wptr_cpu_addr, wptr_tmp); +		*wptr_saved = wptr_tmp; +		/* assume doorbell always being used by mes mapped queue */ +		if (*is_queue_unmap) { +			WDOORBELL64(aggregated_db_index, wptr_tmp); +			WDOORBELL64(ring->doorbell_index, wptr_tmp); +		} else { +			WDOORBELL64(ring->doorbell_index, wptr_tmp); + +			if (*is_queue_unmap) +				WDOORBELL64(aggregated_db_index, wptr_tmp); +		}  	} else { -		WREG32_SOC15(GC, 0, mmCP_RB0_WPTR, lower_32_bits(ring->wptr)); -		WREG32_SOC15(GC, 0, mmCP_RB0_WPTR_HI, upper_32_bits(ring->wptr)); +		if (ring->use_doorbell) { +			/* XXX check if swapping is necessary on BE */ +			atomic64_set((atomic64_t *)ring->wptr_cpu_addr, +				     ring->wptr); +			WDOORBELL64(ring->doorbell_index, ring->wptr); +		} else { +			WREG32_SOC15(GC, 0, mmCP_RB0_WPTR, +				     lower_32_bits(ring->wptr)); +			WREG32_SOC15(GC, 0, mmCP_RB0_WPTR_HI, +				     upper_32_bits(ring->wptr)); +		}  	}  } @@ -8557,13 +8588,42 @@ static u64 gfx_v10_0_ring_get_wptr_compute(struct amdgpu_ring *ring)  static void gfx_v10_0_ring_set_wptr_compute(struct amdgpu_ring *ring)  {  	struct amdgpu_device *adev = ring->adev; +	uint32_t *wptr_saved; +	uint32_t *is_queue_unmap; +	uint64_t aggregated_db_index; +	uint32_t mqd_size = adev->mqds[AMDGPU_HW_IP_COMPUTE].mqd_size; +	uint64_t wptr_tmp; -	/* XXX check if swapping is necessary on BE */ -	if (ring->use_doorbell) { -		atomic64_set((atomic64_t *)ring->wptr_cpu_addr, ring->wptr); -		WDOORBELL64(ring->doorbell_index, ring->wptr); +	if (ring->is_mes_queue) { +		wptr_saved = (uint32_t *)(ring->mqd_ptr + mqd_size); +		is_queue_unmap = (uint32_t *)(ring->mqd_ptr + mqd_size + +					      sizeof(uint32_t)); +		aggregated_db_index = +			amdgpu_mes_get_aggregated_doorbell_index(adev, +			AMDGPU_MES_PRIORITY_LEVEL_NORMAL); + +		wptr_tmp = ring->wptr & ring->buf_mask; +		atomic64_set((atomic64_t *)ring->wptr_cpu_addr, wptr_tmp); +		*wptr_saved = wptr_tmp; +		/* assume doorbell always used by mes mapped queue */ +		if (*is_queue_unmap) { +			WDOORBELL64(aggregated_db_index, wptr_tmp); +			WDOORBELL64(ring->doorbell_index, wptr_tmp); +		} else { +			WDOORBELL64(ring->doorbell_index, wptr_tmp); + +			if (*is_queue_unmap) +				WDOORBELL64(aggregated_db_index, wptr_tmp); +		}  	} else { -		BUG(); /* only DOORBELL method supported on gfx10 now */ +		/* XXX check if swapping is necessary on BE */ +		if (ring->use_doorbell) { +			atomic64_set((atomic64_t *)ring->wptr_cpu_addr, +				     ring->wptr); +			WDOORBELL64(ring->doorbell_index, ring->wptr); +		} else { +			BUG(); /* only DOORBELL method supported on gfx10 now */ +		}  	}  }  | 
