Skip to content

Commit 6dc4edd

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 c53a644 commit 6dc4edd

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
@@ -1840,22 +1840,16 @@ static int vcn_v4_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
18401840

18411841
#define RADEON_VCN_ENGINE_TYPE_ENCODE (0x00000002)
18421842
#define RADEON_VCN_ENGINE_TYPE_DECODE (0x00000003)
1843-
18441843
#define RADEON_VCN_ENGINE_INFO (0x30000001)
1845-
#define RADEON_VCN_ENGINE_INFO_MAX_OFFSET 16
1846-
18471844
#define RENCODE_ENCODE_STANDARD_AV1 2
18481845
#define RENCODE_IB_PARAM_SESSION_INIT 0x00000003
1849-
#define RENCODE_IB_PARAM_SESSION_INIT_MAX_OFFSET 64
18501846

1851-
/* return the offset in ib if id is found, -1 otherwise
1852-
* to speed up the searching we only search upto max_offset
1853-
*/
1854-
static int vcn_v4_0_enc_find_ib_param(struct amdgpu_ib *ib, uint32_t id, int max_offset)
1847+
/* return the offset in ib if id is found, -1 otherwise */
1848+
static int vcn_v4_0_enc_find_ib_param(struct amdgpu_ib *ib, uint32_t id, int start)
18551849
{
18561850
int i;
18571851

1858-
for (i = 0; i < ib->length_dw && i < max_offset && ib->ptr[i] >= 8; i += ib->ptr[i]/4) {
1852+
for (i = start; i < ib->length_dw && ib->ptr[i] >= 8; i += ib->ptr[i] / 4) {
18591853
if (ib->ptr[i + 1] == id)
18601854
return i;
18611855
}
@@ -1870,33 +1864,29 @@ static int vcn_v4_0_ring_patch_cs_in_place(struct amdgpu_cs_parser *p,
18701864
struct amdgpu_vcn_decode_buffer *decode_buffer;
18711865
uint64_t addr;
18721866
uint32_t val;
1873-
int idx;
1867+
int idx = 0, sidx;
18741868

18751869
/* The first instance can decode anything */
18761870
if (!ring->me)
18771871
return 0;
18781872

1879-
/* RADEON_VCN_ENGINE_INFO is at the top of ib block */
1880-
idx = vcn_v4_0_enc_find_ib_param(ib, RADEON_VCN_ENGINE_INFO,
1881-
RADEON_VCN_ENGINE_INFO_MAX_OFFSET);
1882-
if (idx < 0) /* engine info is missing */
1883-
return 0;
1884-
1885-
val = amdgpu_ib_get_value(ib, idx + 2); /* RADEON_VCN_ENGINE_TYPE */
1886-
if (val == RADEON_VCN_ENGINE_TYPE_DECODE) {
1887-
decode_buffer = (struct amdgpu_vcn_decode_buffer *)&ib->ptr[idx + 6];
1888-
1889-
if (!(decode_buffer->valid_buf_flag & 0x1))
1890-
return 0;
1891-
1892-
addr = ((u64)decode_buffer->msg_buffer_address_hi) << 32 |
1893-
decode_buffer->msg_buffer_address_lo;
1894-
return vcn_v4_0_dec_msg(p, job, addr);
1895-
} else if (val == RADEON_VCN_ENGINE_TYPE_ENCODE) {
1896-
idx = vcn_v4_0_enc_find_ib_param(ib, RENCODE_IB_PARAM_SESSION_INIT,
1897-
RENCODE_IB_PARAM_SESSION_INIT_MAX_OFFSET);
1898-
if (idx >= 0 && ib->ptr[idx + 2] == RENCODE_ENCODE_STANDARD_AV1)
1899-
return vcn_v4_0_limit_sched(p, job);
1873+
while ((idx = vcn_v4_0_enc_find_ib_param(ib, RADEON_VCN_ENGINE_INFO, idx)) >= 0) {
1874+
val = amdgpu_ib_get_value(ib, idx + 2); /* RADEON_VCN_ENGINE_TYPE */
1875+
if (val == RADEON_VCN_ENGINE_TYPE_DECODE) {
1876+
decode_buffer = (struct amdgpu_vcn_decode_buffer *)&ib->ptr[idx + 6];
1877+
1878+
if (!(decode_buffer->valid_buf_flag & 0x1))
1879+
return 0;
1880+
1881+
addr = ((u64)decode_buffer->msg_buffer_address_hi) << 32 |
1882+
decode_buffer->msg_buffer_address_lo;
1883+
return vcn_v4_0_dec_msg(p, job, addr);
1884+
} else if (val == RADEON_VCN_ENGINE_TYPE_ENCODE) {
1885+
sidx = vcn_v4_0_enc_find_ib_param(ib, RENCODE_IB_PARAM_SESSION_INIT, idx);
1886+
if (sidx >= 0 && ib->ptr[sidx + 2] == RENCODE_ENCODE_STANDARD_AV1)
1887+
return vcn_v4_0_limit_sched(p, job);
1888+
}
1889+
idx += ib->ptr[idx] / 4;
19001890
}
19011891
return 0;
19021892
}

0 commit comments

Comments
 (0)