diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/uvd_v2_2.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/uvd_v2_2.c | 29 | 
1 files changed, 29 insertions, 0 deletions
| diff --git a/drivers/gpu/drm/radeon/uvd_v2_2.c b/drivers/gpu/drm/radeon/uvd_v2_2.c index 89193519f8a1..7ed778cec7c6 100644 --- a/drivers/gpu/drm/radeon/uvd_v2_2.c +++ b/drivers/gpu/drm/radeon/uvd_v2_2.c @@ -60,6 +60,35 @@ void uvd_v2_2_fence_emit(struct radeon_device *rdev,  }  /** + * uvd_v2_2_semaphore_emit - emit semaphore command + * + * @rdev: radeon_device pointer + * @ring: radeon_ring pointer + * @semaphore: semaphore to emit commands for + * @emit_wait: true if we should emit a wait command + * + * Emit a semaphore command (either wait or signal) to the UVD ring. + */ +bool uvd_v2_2_semaphore_emit(struct radeon_device *rdev, +			     struct radeon_ring *ring, +			     struct radeon_semaphore *semaphore, +			     bool emit_wait) +{ +	uint64_t addr = semaphore->gpu_addr; + +	radeon_ring_write(ring, PACKET0(UVD_SEMA_ADDR_LOW, 0)); +	radeon_ring_write(ring, (addr >> 3) & 0x000FFFFF); + +	radeon_ring_write(ring, PACKET0(UVD_SEMA_ADDR_HIGH, 0)); +	radeon_ring_write(ring, (addr >> 23) & 0x000FFFFF); + +	radeon_ring_write(ring, PACKET0(UVD_SEMA_CMD, 0)); +	radeon_ring_write(ring, emit_wait ? 1 : 0); + +	return true; +} + +/**   * uvd_v2_2_resume - memory controller programming   *   * @rdev: radeon_device pointer | 
