diff options
| author | Maarten Lankhorst <maarten.lankhorst@linux.intel.com> | 2019-08-12 15:14:03 +0200 | 
|---|---|---|
| committer | Maarten Lankhorst <maarten.lankhorst@linux.intel.com> | 2019-08-12 15:14:03 +0200 | 
| commit | 181ae8844578d0a80f188c1d195fd6bb91bcec81 (patch) | |
| tree | bd6ebfb8eb390ea6927603ca4e33c263c82b2cd7 /drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c | |
| parent | 8f1c748b9a7751ee1297b4880788a09f7c802eb4 (diff) | |
| parent | d45331b00ddb179e291766617259261c112db872 (diff) | |
Merge remote-tracking branch 'drm/drm-fixes' into drm-misc-fixes
Backport requested for omap dma mask fix. I'm not sure it still
requires it, but just in case. :)
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c | 44 | 
1 files changed, 37 insertions, 7 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c index 1cfc2620b2dd..dfde886cc6bd 100644 --- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c @@ -1485,7 +1485,7 @@ static void vcn_v2_0_dec_ring_insert_start(struct amdgpu_ring *ring)  	amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_DATA0_INTERNAL_OFFSET, 0));  	amdgpu_ring_write(ring, 0);  	amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET, 0)); -	amdgpu_ring_write(ring, VCN_DEC_CMD_PACKET_START << 1); +	amdgpu_ring_write(ring, VCN_DEC_KMD_CMD | (VCN_DEC_CMD_PACKET_START << 1));  }  /** @@ -1498,7 +1498,7 @@ static void vcn_v2_0_dec_ring_insert_start(struct amdgpu_ring *ring)  static void vcn_v2_0_dec_ring_insert_end(struct amdgpu_ring *ring)  {  	amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET, 0)); -	amdgpu_ring_write(ring, VCN_DEC_CMD_PACKET_END << 1); +	amdgpu_ring_write(ring, VCN_DEC_KMD_CMD | (VCN_DEC_CMD_PACKET_END << 1));  }  /** @@ -1543,7 +1543,7 @@ static void vcn_v2_0_dec_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64  	amdgpu_ring_write(ring, upper_32_bits(addr) & 0xff);  	amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET, 0)); -	amdgpu_ring_write(ring, VCN_DEC_CMD_FENCE << 1); +	amdgpu_ring_write(ring, VCN_DEC_KMD_CMD | (VCN_DEC_CMD_FENCE << 1));  	amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_DATA0_INTERNAL_OFFSET, 0));  	amdgpu_ring_write(ring, 0); @@ -1553,7 +1553,7 @@ static void vcn_v2_0_dec_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64  	amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET, 0)); -	amdgpu_ring_write(ring, VCN_DEC_CMD_TRAP << 1); +	amdgpu_ring_write(ring, VCN_DEC_KMD_CMD | (VCN_DEC_CMD_TRAP << 1));  }  /** @@ -1597,7 +1597,7 @@ static void vcn_v2_0_dec_ring_emit_reg_wait(struct amdgpu_ring *ring,  	amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET, 0)); -	amdgpu_ring_write(ring, VCN_DEC_CMD_REG_READ_COND_WAIT << 1); +	amdgpu_ring_write(ring, VCN_DEC_KMD_CMD | (VCN_DEC_CMD_REG_READ_COND_WAIT << 1));  }  static void vcn_v2_0_dec_ring_emit_vm_flush(struct amdgpu_ring *ring, @@ -1626,7 +1626,7 @@ static void vcn_v2_0_dec_ring_emit_wreg(struct amdgpu_ring *ring,  	amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET, 0)); -	amdgpu_ring_write(ring, VCN_DEC_CMD_WRITE_REG << 1); +	amdgpu_ring_write(ring, VCN_DEC_KMD_CMD | (VCN_DEC_CMD_WRITE_REG << 1));  }  /** @@ -2079,6 +2079,36 @@ static int vcn_v2_0_process_interrupt(struct amdgpu_device *adev,  	return 0;  } +static int vcn_v2_0_dec_ring_test_ring(struct amdgpu_ring *ring) +{ +	struct amdgpu_device *adev = ring->adev; +	uint32_t tmp = 0; +	unsigned i; +	int r; + +	WREG32(adev->vcn.external.scratch9, 0xCAFEDEAD); +	r = amdgpu_ring_alloc(ring, 4); +	if (r) +		return r; +	amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET, 0)); +	amdgpu_ring_write(ring, VCN_DEC_KMD_CMD | (VCN_DEC_CMD_PACKET_START << 1)); +	amdgpu_ring_write(ring, PACKET0(adev->vcn.internal.scratch9, 0)); +	amdgpu_ring_write(ring, 0xDEADBEEF); +	amdgpu_ring_commit(ring); +	for (i = 0; i < adev->usec_timeout; i++) { +		tmp = RREG32(adev->vcn.external.scratch9); +		if (tmp == 0xDEADBEEF) +			break; +		DRM_UDELAY(1); +	} + +	if (i >= adev->usec_timeout) +		r = -ETIMEDOUT; + +	return r; +} + +  static int vcn_v2_0_set_powergating_state(void *handle,  					  enum amd_powergating_state state)  { @@ -2142,7 +2172,7 @@ static const struct amdgpu_ring_funcs vcn_v2_0_dec_ring_vm_funcs = {  	.emit_ib = vcn_v2_0_dec_ring_emit_ib,  	.emit_fence = vcn_v2_0_dec_ring_emit_fence,  	.emit_vm_flush = vcn_v2_0_dec_ring_emit_vm_flush, -	.test_ring = amdgpu_vcn_dec_ring_test_ring, +	.test_ring = vcn_v2_0_dec_ring_test_ring,  	.test_ib = amdgpu_vcn_dec_ring_test_ib,  	.insert_nop = vcn_v2_0_dec_ring_insert_nop,  	.insert_start = vcn_v2_0_dec_ring_insert_start,  | 
