aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c47
1 files changed, 37 insertions, 10 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
index 988c0adaca91..dfde886cc6bd 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
@@ -372,11 +372,8 @@ static void vcn_v2_0_mc_resume(struct amdgpu_device *adev)
372 WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH, 372 WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH,
373 upper_32_bits(adev->vcn.gpu_addr)); 373 upper_32_bits(adev->vcn.gpu_addr));
374 offset = size; 374 offset = size;
375 /* No signed header for now from firmware
376 WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET0, 375 WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET0,
377 AMDGPU_UVD_FIRMWARE_OFFSET >> 3); 376 AMDGPU_UVD_FIRMWARE_OFFSET >> 3);
378 */
379 WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET0, 0);
380 } 377 }
381 378
382 WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_SIZE0, size); 379 WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_SIZE0, size);
@@ -1488,7 +1485,7 @@ static void vcn_v2_0_dec_ring_insert_start(struct amdgpu_ring *ring)
1488 amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_DATA0_INTERNAL_OFFSET, 0)); 1485 amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_DATA0_INTERNAL_OFFSET, 0));
1489 amdgpu_ring_write(ring, 0); 1486 amdgpu_ring_write(ring, 0);
1490 amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET, 0)); 1487 amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET, 0));
1491 amdgpu_ring_write(ring, VCN_DEC_CMD_PACKET_START << 1); 1488 amdgpu_ring_write(ring, VCN_DEC_KMD_CMD | (VCN_DEC_CMD_PACKET_START << 1));
1492} 1489}
1493 1490
1494/** 1491/**
@@ -1501,7 +1498,7 @@ static void vcn_v2_0_dec_ring_insert_start(struct amdgpu_ring *ring)
1501static void vcn_v2_0_dec_ring_insert_end(struct amdgpu_ring *ring) 1498static void vcn_v2_0_dec_ring_insert_end(struct amdgpu_ring *ring)
1502{ 1499{
1503 amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET, 0)); 1500 amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET, 0));
1504 amdgpu_ring_write(ring, VCN_DEC_CMD_PACKET_END << 1); 1501 amdgpu_ring_write(ring, VCN_DEC_KMD_CMD | (VCN_DEC_CMD_PACKET_END << 1));
1505} 1502}
1506 1503
1507/** 1504/**
@@ -1546,7 +1543,7 @@ static void vcn_v2_0_dec_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64
1546 amdgpu_ring_write(ring, upper_32_bits(addr) & 0xff); 1543 amdgpu_ring_write(ring, upper_32_bits(addr) & 0xff);
1547 1544
1548 amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET, 0)); 1545 amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET, 0));
1549 amdgpu_ring_write(ring, VCN_DEC_CMD_FENCE << 1); 1546 amdgpu_ring_write(ring, VCN_DEC_KMD_CMD | (VCN_DEC_CMD_FENCE << 1));
1550 1547
1551 amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_DATA0_INTERNAL_OFFSET, 0)); 1548 amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_DATA0_INTERNAL_OFFSET, 0));
1552 amdgpu_ring_write(ring, 0); 1549 amdgpu_ring_write(ring, 0);
@@ -1556,7 +1553,7 @@ static void vcn_v2_0_dec_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64
1556 1553
1557 amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET, 0)); 1554 amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET, 0));
1558 1555
1559 amdgpu_ring_write(ring, VCN_DEC_CMD_TRAP << 1); 1556 amdgpu_ring_write(ring, VCN_DEC_KMD_CMD | (VCN_DEC_CMD_TRAP << 1));
1560} 1557}
1561 1558
1562/** 1559/**
@@ -1600,7 +1597,7 @@ static void vcn_v2_0_dec_ring_emit_reg_wait(struct amdgpu_ring *ring,
1600 1597
1601 amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET, 0)); 1598 amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET, 0));
1602 1599
1603 amdgpu_ring_write(ring, VCN_DEC_CMD_REG_READ_COND_WAIT << 1); 1600 amdgpu_ring_write(ring, VCN_DEC_KMD_CMD | (VCN_DEC_CMD_REG_READ_COND_WAIT << 1));
1604} 1601}
1605 1602
1606static void vcn_v2_0_dec_ring_emit_vm_flush(struct amdgpu_ring *ring, 1603static void vcn_v2_0_dec_ring_emit_vm_flush(struct amdgpu_ring *ring,
@@ -1629,7 +1626,7 @@ static void vcn_v2_0_dec_ring_emit_wreg(struct amdgpu_ring *ring,
1629 1626
1630 amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET, 0)); 1627 amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET, 0));
1631 1628
1632 amdgpu_ring_write(ring, VCN_DEC_CMD_WRITE_REG << 1); 1629 amdgpu_ring_write(ring, VCN_DEC_KMD_CMD | (VCN_DEC_CMD_WRITE_REG << 1));
1633} 1630}
1634 1631
1635/** 1632/**
@@ -2082,6 +2079,36 @@ static int vcn_v2_0_process_interrupt(struct amdgpu_device *adev,
2082 return 0; 2079 return 0;
2083} 2080}
2084 2081
2082static int vcn_v2_0_dec_ring_test_ring(struct amdgpu_ring *ring)
2083{
2084 struct amdgpu_device *adev = ring->adev;
2085 uint32_t tmp = 0;
2086 unsigned i;
2087 int r;
2088
2089 WREG32(adev->vcn.external.scratch9, 0xCAFEDEAD);
2090 r = amdgpu_ring_alloc(ring, 4);
2091 if (r)
2092 return r;
2093 amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET, 0));
2094 amdgpu_ring_write(ring, VCN_DEC_KMD_CMD | (VCN_DEC_CMD_PACKET_START << 1));
2095 amdgpu_ring_write(ring, PACKET0(adev->vcn.internal.scratch9, 0));
2096 amdgpu_ring_write(ring, 0xDEADBEEF);
2097 amdgpu_ring_commit(ring);
2098 for (i = 0; i < adev->usec_timeout; i++) {
2099 tmp = RREG32(adev->vcn.external.scratch9);
2100 if (tmp == 0xDEADBEEF)
2101 break;
2102 DRM_UDELAY(1);
2103 }
2104
2105 if (i >= adev->usec_timeout)
2106 r = -ETIMEDOUT;
2107
2108 return r;
2109}
2110
2111
2085static int vcn_v2_0_set_powergating_state(void *handle, 2112static int vcn_v2_0_set_powergating_state(void *handle,
2086 enum amd_powergating_state state) 2113 enum amd_powergating_state state)
2087{ 2114{
@@ -2145,7 +2172,7 @@ static const struct amdgpu_ring_funcs vcn_v2_0_dec_ring_vm_funcs = {
2145 .emit_ib = vcn_v2_0_dec_ring_emit_ib, 2172 .emit_ib = vcn_v2_0_dec_ring_emit_ib,
2146 .emit_fence = vcn_v2_0_dec_ring_emit_fence, 2173 .emit_fence = vcn_v2_0_dec_ring_emit_fence,
2147 .emit_vm_flush = vcn_v2_0_dec_ring_emit_vm_flush, 2174 .emit_vm_flush = vcn_v2_0_dec_ring_emit_vm_flush,
2148 .test_ring = amdgpu_vcn_dec_ring_test_ring, 2175 .test_ring = vcn_v2_0_dec_ring_test_ring,
2149 .test_ib = amdgpu_vcn_dec_ring_test_ib, 2176 .test_ib = amdgpu_vcn_dec_ring_test_ib,
2150 .insert_nop = vcn_v2_0_dec_ring_insert_nop, 2177 .insert_nop = vcn_v2_0_dec_ring_insert_nop,
2151 .insert_start = vcn_v2_0_dec_ring_insert_start, 2178 .insert_start = vcn_v2_0_dec_ring_insert_start,