@@ -1907,22 +1907,16 @@ static int vcn_v4_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
19071907
19081908#define RADEON_VCN_ENGINE_TYPE_ENCODE (0x00000002)
19091909#define RADEON_VCN_ENGINE_TYPE_DECODE (0x00000003)
1910-
19111910#define RADEON_VCN_ENGINE_INFO (0x30000001)
1912- #define RADEON_VCN_ENGINE_INFO_MAX_OFFSET 16
1913-
19141911#define RENCODE_ENCODE_STANDARD_AV1 2
19151912#define RENCODE_IB_PARAM_SESSION_INIT 0x00000003
1916- #define RENCODE_IB_PARAM_SESSION_INIT_MAX_OFFSET 64
19171913
1918- /* return the offset in ib if id is found, -1 otherwise
1919- * to speed up the searching we only search upto max_offset
1920- */
1921- static int vcn_v4_0_enc_find_ib_param (struct amdgpu_ib * ib , uint32_t id , int max_offset )
1914+ /* return the offset in ib if id is found, -1 otherwise */
1915+ static int vcn_v4_0_enc_find_ib_param (struct amdgpu_ib * ib , uint32_t id , int start )
19221916{
19231917 int i ;
19241918
1925- for (i = 0 ; i < ib -> length_dw && i < max_offset && ib -> ptr [i ] >= 8 ; i += ib -> ptr [i ]/ 4 ) {
1919+ for (i = start ; i < ib -> length_dw && ib -> ptr [i ] >= 8 ; i += ib -> ptr [i ] / 4 ) {
19261920 if (ib -> ptr [i + 1 ] == id )
19271921 return i ;
19281922 }
@@ -1937,33 +1931,29 @@ static int vcn_v4_0_ring_patch_cs_in_place(struct amdgpu_cs_parser *p,
19371931 struct amdgpu_vcn_decode_buffer * decode_buffer ;
19381932 uint64_t addr ;
19391933 uint32_t val ;
1940- int idx ;
1934+ int idx = 0 , sidx ;
19411935
19421936 /* The first instance can decode anything */
19431937 if (!ring -> me )
19441938 return 0 ;
19451939
1946- /* RADEON_VCN_ENGINE_INFO is at the top of ib block */
1947- idx = vcn_v4_0_enc_find_ib_param (ib , RADEON_VCN_ENGINE_INFO ,
1948- RADEON_VCN_ENGINE_INFO_MAX_OFFSET );
1949- if (idx < 0 ) /* engine info is missing */
1950- return 0 ;
1951-
1952- val = amdgpu_ib_get_value (ib , idx + 2 ); /* RADEON_VCN_ENGINE_TYPE */
1953- if (val == RADEON_VCN_ENGINE_TYPE_DECODE ) {
1954- decode_buffer = (struct amdgpu_vcn_decode_buffer * )& ib -> ptr [idx + 6 ];
1955-
1956- if (!(decode_buffer -> valid_buf_flag & 0x1 ))
1957- return 0 ;
1958-
1959- addr = ((u64 )decode_buffer -> msg_buffer_address_hi ) << 32 |
1960- decode_buffer -> msg_buffer_address_lo ;
1961- return vcn_v4_0_dec_msg (p , job , addr );
1962- } else if (val == RADEON_VCN_ENGINE_TYPE_ENCODE ) {
1963- idx = vcn_v4_0_enc_find_ib_param (ib , RENCODE_IB_PARAM_SESSION_INIT ,
1964- RENCODE_IB_PARAM_SESSION_INIT_MAX_OFFSET );
1965- if (idx >= 0 && ib -> ptr [idx + 2 ] == RENCODE_ENCODE_STANDARD_AV1 )
1966- return vcn_v4_0_limit_sched (p , job );
1940+ while ((idx = vcn_v4_0_enc_find_ib_param (ib , RADEON_VCN_ENGINE_INFO , idx )) >= 0 ) {
1941+ val = amdgpu_ib_get_value (ib , idx + 2 ); /* RADEON_VCN_ENGINE_TYPE */
1942+ if (val == RADEON_VCN_ENGINE_TYPE_DECODE ) {
1943+ decode_buffer = (struct amdgpu_vcn_decode_buffer * )& ib -> ptr [idx + 6 ];
1944+
1945+ if (!(decode_buffer -> valid_buf_flag & 0x1 ))
1946+ return 0 ;
1947+
1948+ addr = ((u64 )decode_buffer -> msg_buffer_address_hi ) << 32 |
1949+ decode_buffer -> msg_buffer_address_lo ;
1950+ return vcn_v4_0_dec_msg (p , job , addr );
1951+ } else if (val == RADEON_VCN_ENGINE_TYPE_ENCODE ) {
1952+ sidx = vcn_v4_0_enc_find_ib_param (ib , RENCODE_IB_PARAM_SESSION_INIT , idx );
1953+ if (sidx >= 0 && ib -> ptr [sidx + 2 ] == RENCODE_ENCODE_STANDARD_AV1 )
1954+ return vcn_v4_0_limit_sched (p , job );
1955+ }
1956+ idx += ib -> ptr [idx ] / 4 ;
19671957 }
19681958 return 0 ;
19691959}
0 commit comments