diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c | 150 | 
1 files changed, 28 insertions, 122 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c index 7a6beb2e7c4e..428cfd58b37d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c @@ -193,6 +193,8 @@ int amdgpu_vcn_sw_fini(struct amdgpu_device *adev)  {  	int i, j; +	cancel_delayed_work_sync(&adev->vcn.idle_work); +  	if (adev->vcn.indirect_sram) {  		amdgpu_bo_free_kernel(&adev->vcn.dpg_sram_bo,  				      &adev->vcn.dpg_sram_gpu_addr, @@ -212,8 +214,6 @@ int amdgpu_vcn_sw_fini(struct amdgpu_device *adev)  		for (i = 0; i < adev->vcn.num_enc_rings; ++i)  			amdgpu_ring_fini(&adev->vcn.inst[j].ring_enc[i]); - -		amdgpu_ring_fini(&adev->vcn.inst[j].ring_jpeg);  	}  	release_firmware(adev->vcn.fw); @@ -306,7 +306,7 @@ static void amdgpu_vcn_idle_work_handler(struct work_struct *work)  			else  				new_state.fw_based = VCN_DPG_STATE__UNPAUSE; -			if (amdgpu_fence_count_emitted(&adev->vcn.inst[j].ring_jpeg)) +			if (amdgpu_fence_count_emitted(&adev->jpeg.inst[j].ring_dec))  				new_state.jpeg = VCN_DPG_STATE__PAUSE;  			else  				new_state.jpeg = VCN_DPG_STATE__UNPAUSE; @@ -314,7 +314,7 @@ static void amdgpu_vcn_idle_work_handler(struct work_struct *work)  			adev->vcn.pause_dpg_mode(adev, &new_state);  		} -		fence[j] += amdgpu_fence_count_emitted(&adev->vcn.inst[j].ring_jpeg); +		fence[j] += amdgpu_fence_count_emitted(&adev->jpeg.inst[j].ring_dec);  		fence[j] += amdgpu_fence_count_emitted(&adev->vcn.inst[j].ring_dec);  		fences += fence[j];  	} @@ -358,7 +358,7 @@ void amdgpu_vcn_ring_begin_use(struct amdgpu_ring *ring)  		else  			new_state.fw_based = VCN_DPG_STATE__UNPAUSE; -		if (amdgpu_fence_count_emitted(&adev->vcn.inst[ring->me].ring_jpeg)) +		if (amdgpu_fence_count_emitted(&adev->jpeg.inst[ring->me].ring_dec))  			new_state.jpeg = VCN_DPG_STATE__PAUSE;  		else  			new_state.jpeg = VCN_DPG_STATE__UNPAUSE; @@ -569,13 +569,14 @@ int amdgpu_vcn_enc_ring_test_ring(struct amdgpu_ring *ring)  }  static int amdgpu_vcn_enc_get_create_msg(struct amdgpu_ring *ring, uint32_t handle, -			      struct dma_fence **fence) +					 struct amdgpu_bo *bo, +					 struct dma_fence **fence)  {  	const unsigned ib_size_dw = 16;  	struct amdgpu_job *job;  	struct amdgpu_ib *ib;  	struct dma_fence *f = NULL; -	uint64_t dummy; +	uint64_t addr;  	int i, r;  	r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, &job); @@ -583,14 +584,14 @@ static int amdgpu_vcn_enc_get_create_msg(struct amdgpu_ring *ring, uint32_t hand  		return r;  	ib = &job->ibs[0]; -	dummy = ib->gpu_addr + 1024; +	addr = amdgpu_bo_gpu_offset(bo);  	ib->length_dw = 0;  	ib->ptr[ib->length_dw++] = 0x00000018;  	ib->ptr[ib->length_dw++] = 0x00000001; /* session info */  	ib->ptr[ib->length_dw++] = handle; -	ib->ptr[ib->length_dw++] = upper_32_bits(dummy); -	ib->ptr[ib->length_dw++] = dummy; +	ib->ptr[ib->length_dw++] = upper_32_bits(addr); +	ib->ptr[ib->length_dw++] = addr;  	ib->ptr[ib->length_dw++] = 0x0000000b;  	ib->ptr[ib->length_dw++] = 0x00000014; @@ -621,13 +622,14 @@ err:  }  static int amdgpu_vcn_enc_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle, -				struct dma_fence **fence) +					  struct amdgpu_bo *bo, +					  struct dma_fence **fence)  {  	const unsigned ib_size_dw = 16;  	struct amdgpu_job *job;  	struct amdgpu_ib *ib;  	struct dma_fence *f = NULL; -	uint64_t dummy; +	uint64_t addr;  	int i, r;  	r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, &job); @@ -635,14 +637,14 @@ static int amdgpu_vcn_enc_get_destroy_msg(struct amdgpu_ring *ring, uint32_t han  		return r;  	ib = &job->ibs[0]; -	dummy = ib->gpu_addr + 1024; +	addr = amdgpu_bo_gpu_offset(bo);  	ib->length_dw = 0;  	ib->ptr[ib->length_dw++] = 0x00000018;  	ib->ptr[ib->length_dw++] = 0x00000001;  	ib->ptr[ib->length_dw++] = handle; -	ib->ptr[ib->length_dw++] = upper_32_bits(dummy); -	ib->ptr[ib->length_dw++] = dummy; +	ib->ptr[ib->length_dw++] = upper_32_bits(addr); +	ib->ptr[ib->length_dw++] = addr;  	ib->ptr[ib->length_dw++] = 0x0000000b;  	ib->ptr[ib->length_dw++] = 0x00000014; @@ -675,13 +677,20 @@ err:  int amdgpu_vcn_enc_ring_test_ib(struct amdgpu_ring *ring, long timeout)  {  	struct dma_fence *fence = NULL; +	struct amdgpu_bo *bo = NULL;  	long r; -	r = amdgpu_vcn_enc_get_create_msg(ring, 1, NULL); +	r = amdgpu_bo_create_reserved(ring->adev, 128 * 1024, PAGE_SIZE, +				      AMDGPU_GEM_DOMAIN_VRAM, +				      &bo, NULL, NULL); +	if (r) +		return r; + +	r = amdgpu_vcn_enc_get_create_msg(ring, 1, bo, NULL);  	if (r)  		goto error; -	r = amdgpu_vcn_enc_get_destroy_msg(ring, 1, &fence); +	r = amdgpu_vcn_enc_get_destroy_msg(ring, 1, bo, &fence);  	if (r)  		goto error; @@ -693,110 +702,7 @@ int amdgpu_vcn_enc_ring_test_ib(struct amdgpu_ring *ring, long timeout)  error:  	dma_fence_put(fence); -	return r; -} - -int amdgpu_vcn_jpeg_ring_test_ring(struct amdgpu_ring *ring) -{ -	struct amdgpu_device *adev = ring->adev; -	uint32_t tmp = 0; -	unsigned i; -	int r; - -	WREG32(adev->vcn.inst[ring->me].external.jpeg_pitch, 0xCAFEDEAD); -	r = amdgpu_ring_alloc(ring, 3); -	if (r) -		return r; - -	amdgpu_ring_write(ring, PACKET0(adev->vcn.internal.jpeg_pitch, 0)); -	amdgpu_ring_write(ring, 0xDEADBEEF); -	amdgpu_ring_commit(ring); - -	for (i = 0; i < adev->usec_timeout; i++) { -		tmp = RREG32(adev->vcn.inst[ring->me].external.jpeg_pitch); -		if (tmp == 0xDEADBEEF) -			break; -		udelay(1); -	} - -	if (i >= adev->usec_timeout) -		r = -ETIMEDOUT; - -	return r; -} - -static int amdgpu_vcn_jpeg_set_reg(struct amdgpu_ring *ring, uint32_t handle, -		struct dma_fence **fence) -{ -	struct amdgpu_device *adev = ring->adev; -	struct amdgpu_job *job; -	struct amdgpu_ib *ib; -	struct dma_fence *f = NULL; -	const unsigned ib_size_dw = 16; -	int i, r; - -	r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, &job); -	if (r) -		return r; - -	ib = &job->ibs[0]; - -	ib->ptr[0] = PACKETJ(adev->vcn.internal.jpeg_pitch, 0, 0, PACKETJ_TYPE0); -	ib->ptr[1] = 0xDEADBEEF; -	for (i = 2; i < 16; i += 2) { -		ib->ptr[i] = PACKETJ(0, 0, 0, PACKETJ_TYPE6); -		ib->ptr[i+1] = 0; -	} -	ib->length_dw = 16; - -	r = amdgpu_job_submit_direct(job, ring, &f); -	if (r) -		goto err; - -	if (fence) -		*fence = dma_fence_get(f); -	dma_fence_put(f); - -	return 0; - -err: -	amdgpu_job_free(job); -	return r; -} - -int amdgpu_vcn_jpeg_ring_test_ib(struct amdgpu_ring *ring, long timeout) -{ -	struct amdgpu_device *adev = ring->adev; -	uint32_t tmp = 0; -	unsigned i; -	struct dma_fence *fence = NULL; -	long r = 0; - -	r = amdgpu_vcn_jpeg_set_reg(ring, 1, &fence); -	if (r) -		goto error; - -	r = dma_fence_wait_timeout(fence, false, timeout); -	if (r == 0) { -		r = -ETIMEDOUT; -		goto error; -	} else if (r < 0) { -		goto error; -	} else { -		r = 0; -	} - -	for (i = 0; i < adev->usec_timeout; i++) { -		tmp = RREG32(adev->vcn.inst[ring->me].external.jpeg_pitch); -		if (tmp == 0xDEADBEEF) -			break; -		udelay(1); -	} - -	if (i >= adev->usec_timeout) -		r = -ETIMEDOUT; - -	dma_fence_put(fence); -error: +	amdgpu_bo_unreserve(bo); +	amdgpu_bo_unref(&bo);  	return r;  }  | 
