Skip to content

Commit cfdde91

Browse files
nowrepgregkh
authored andcommitted
drm/amdgpu/vcn4: Fix IB parsing with multiple engine info packages
commit 2b10cb5 upstream. There can be multiple engine info packages in one IB and the first one may be common engine, not decode/encode. We need to parse the entire IB instead of stopping after finding first engine info. Signed-off-by: David Rosca <david.rosca@amd.com> Reviewed-by: Leo Liu <leo.liu@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> (cherry picked from commit dc8f9f0) Cc: stable@vger.kernel.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 9adb902 commit cfdde91

File tree

1 file changed

+21
-31
lines changed

1 file changed

+21
-31
lines changed

drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c

Lines changed: 21 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1747,22 +1747,16 @@ static int vcn_v4_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
17471747

17481748
#define RADEON_VCN_ENGINE_TYPE_ENCODE (0x00000002)
17491749
#define RADEON_VCN_ENGINE_TYPE_DECODE (0x00000003)
1750-
17511750
#define RADEON_VCN_ENGINE_INFO (0x30000001)
1752-
#define RADEON_VCN_ENGINE_INFO_MAX_OFFSET 16
1753-
17541751
#define RENCODE_ENCODE_STANDARD_AV1 2
17551752
#define RENCODE_IB_PARAM_SESSION_INIT 0x00000003
1756-
#define RENCODE_IB_PARAM_SESSION_INIT_MAX_OFFSET 64
17571753

1758-
/* return the offset in ib if id is found, -1 otherwise
1759-
* to speed up the searching we only search upto max_offset
1760-
*/
1761-
static int vcn_v4_0_enc_find_ib_param(struct amdgpu_ib *ib, uint32_t id, int max_offset)
1754+
/* return the offset in ib if id is found, -1 otherwise */
1755+
static int vcn_v4_0_enc_find_ib_param(struct amdgpu_ib *ib, uint32_t id, int start)
17621756
{
17631757
int i;
17641758

1765-
for (i = 0; i < ib->length_dw && i < max_offset && ib->ptr[i] >= 8; i += ib->ptr[i]/4) {
1759+
for (i = start; i < ib->length_dw && ib->ptr[i] >= 8; i += ib->ptr[i] / 4) {
17661760
if (ib->ptr[i + 1] == id)
17671761
return i;
17681762
}
@@ -1777,33 +1771,29 @@ static int vcn_v4_0_ring_patch_cs_in_place(struct amdgpu_cs_parser *p,
17771771
struct amdgpu_vcn_decode_buffer *decode_buffer;
17781772
uint64_t addr;
17791773
uint32_t val;
1780-
int idx;
1774+
int idx = 0, sidx;
17811775

17821776
/* The first instance can decode anything */
17831777
if (!ring->me)
17841778
return 0;
17851779

1786-
/* RADEON_VCN_ENGINE_INFO is at the top of ib block */
1787-
idx = vcn_v4_0_enc_find_ib_param(ib, RADEON_VCN_ENGINE_INFO,
1788-
RADEON_VCN_ENGINE_INFO_MAX_OFFSET);
1789-
if (idx < 0) /* engine info is missing */
1790-
return 0;
1791-
1792-
val = amdgpu_ib_get_value(ib, idx + 2); /* RADEON_VCN_ENGINE_TYPE */
1793-
if (val == RADEON_VCN_ENGINE_TYPE_DECODE) {
1794-
decode_buffer = (struct amdgpu_vcn_decode_buffer *)&ib->ptr[idx + 6];
1795-
1796-
if (!(decode_buffer->valid_buf_flag & 0x1))
1797-
return 0;
1798-
1799-
addr = ((u64)decode_buffer->msg_buffer_address_hi) << 32 |
1800-
decode_buffer->msg_buffer_address_lo;
1801-
return vcn_v4_0_dec_msg(p, job, addr);
1802-
} else if (val == RADEON_VCN_ENGINE_TYPE_ENCODE) {
1803-
idx = vcn_v4_0_enc_find_ib_param(ib, RENCODE_IB_PARAM_SESSION_INIT,
1804-
RENCODE_IB_PARAM_SESSION_INIT_MAX_OFFSET);
1805-
if (idx >= 0 && ib->ptr[idx + 2] == RENCODE_ENCODE_STANDARD_AV1)
1806-
return vcn_v4_0_limit_sched(p, job);
1780+
while ((idx = vcn_v4_0_enc_find_ib_param(ib, RADEON_VCN_ENGINE_INFO, idx)) >= 0) {
1781+
val = amdgpu_ib_get_value(ib, idx + 2); /* RADEON_VCN_ENGINE_TYPE */
1782+
if (val == RADEON_VCN_ENGINE_TYPE_DECODE) {
1783+
decode_buffer = (struct amdgpu_vcn_decode_buffer *)&ib->ptr[idx + 6];
1784+
1785+
if (!(decode_buffer->valid_buf_flag & 0x1))
1786+
return 0;
1787+
1788+
addr = ((u64)decode_buffer->msg_buffer_address_hi) << 32 |
1789+
decode_buffer->msg_buffer_address_lo;
1790+
return vcn_v4_0_dec_msg(p, job, addr);
1791+
} else if (val == RADEON_VCN_ENGINE_TYPE_ENCODE) {
1792+
sidx = vcn_v4_0_enc_find_ib_param(ib, RENCODE_IB_PARAM_SESSION_INIT, idx);
1793+
if (sidx >= 0 && ib->ptr[sidx + 2] == RENCODE_ENCODE_STANDARD_AV1)
1794+
return vcn_v4_0_limit_sched(p, job);
1795+
}
1796+
idx += ib->ptr[idx] / 4;
18071797
}
18081798
return 0;
18091799
}

0 commit comments

Comments
 (0)