@@ -1903,22 +1903,16 @@ static int vcn_v4_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
19031903
19041904#define RADEON_VCN_ENGINE_TYPE_ENCODE (0x00000002)
19051905#define RADEON_VCN_ENGINE_TYPE_DECODE (0x00000003)
1906-
19071906#define RADEON_VCN_ENGINE_INFO (0x30000001)
1908- #define RADEON_VCN_ENGINE_INFO_MAX_OFFSET 16
1909-
19101907#define RENCODE_ENCODE_STANDARD_AV1 2
19111908#define RENCODE_IB_PARAM_SESSION_INIT 0x00000003
1912- #define RENCODE_IB_PARAM_SESSION_INIT_MAX_OFFSET 64
19131909
1914- /* return the offset in ib if id is found, -1 otherwise
1915- * to speed up the searching we only search upto max_offset
1916- */
1917- static int vcn_v4_0_enc_find_ib_param (struct amdgpu_ib * ib , uint32_t id , int max_offset )
1910+ /* return the offset in ib if id is found, -1 otherwise */
1911+ static int vcn_v4_0_enc_find_ib_param (struct amdgpu_ib * ib , uint32_t id , int start )
19181912{
19191913 int i ;
19201914
1921- for (i = 0 ; i < ib -> length_dw && i < max_offset && ib -> ptr [i ] >= 8 ; i += ib -> ptr [i ]/ 4 ) {
1915+ for (i = start ; i < ib -> length_dw && ib -> ptr [i ] >= 8 ; i += ib -> ptr [i ] / 4 ) {
19221916 if (ib -> ptr [i + 1 ] == id )
19231917 return i ;
19241918 }
@@ -1933,33 +1927,29 @@ static int vcn_v4_0_ring_patch_cs_in_place(struct amdgpu_cs_parser *p,
19331927 struct amdgpu_vcn_decode_buffer * decode_buffer ;
19341928 uint64_t addr ;
19351929 uint32_t val ;
1936- int idx ;
1930+ int idx = 0 , sidx ;
19371931
19381932 /* The first instance can decode anything */
19391933 if (!ring -> me )
19401934 return 0 ;
19411935
1942- /* RADEON_VCN_ENGINE_INFO is at the top of ib block */
1943- idx = vcn_v4_0_enc_find_ib_param (ib , RADEON_VCN_ENGINE_INFO ,
1944- RADEON_VCN_ENGINE_INFO_MAX_OFFSET );
1945- if (idx < 0 ) /* engine info is missing */
1946- return 0 ;
1947-
1948- val = amdgpu_ib_get_value (ib , idx + 2 ); /* RADEON_VCN_ENGINE_TYPE */
1949- if (val == RADEON_VCN_ENGINE_TYPE_DECODE ) {
1950- decode_buffer = (struct amdgpu_vcn_decode_buffer * )& ib -> ptr [idx + 6 ];
1951-
1952- if (!(decode_buffer -> valid_buf_flag & 0x1 ))
1953- return 0 ;
1954-
1955- addr = ((u64 )decode_buffer -> msg_buffer_address_hi ) << 32 |
1956- decode_buffer -> msg_buffer_address_lo ;
1957- return vcn_v4_0_dec_msg (p , job , addr );
1958- } else if (val == RADEON_VCN_ENGINE_TYPE_ENCODE ) {
1959- idx = vcn_v4_0_enc_find_ib_param (ib , RENCODE_IB_PARAM_SESSION_INIT ,
1960- RENCODE_IB_PARAM_SESSION_INIT_MAX_OFFSET );
1961- if (idx >= 0 && ib -> ptr [idx + 2 ] == RENCODE_ENCODE_STANDARD_AV1 )
1962- return vcn_v4_0_limit_sched (p , job );
1936+ while ((idx = vcn_v4_0_enc_find_ib_param (ib , RADEON_VCN_ENGINE_INFO , idx )) >= 0 ) {
1937+ val = amdgpu_ib_get_value (ib , idx + 2 ); /* RADEON_VCN_ENGINE_TYPE */
1938+ if (val == RADEON_VCN_ENGINE_TYPE_DECODE ) {
1939+ decode_buffer = (struct amdgpu_vcn_decode_buffer * )& ib -> ptr [idx + 6 ];
1940+
1941+ if (!(decode_buffer -> valid_buf_flag & 0x1 ))
1942+ return 0 ;
1943+
1944+ addr = ((u64 )decode_buffer -> msg_buffer_address_hi ) << 32 |
1945+ decode_buffer -> msg_buffer_address_lo ;
1946+ return vcn_v4_0_dec_msg (p , job , addr );
1947+ } else if (val == RADEON_VCN_ENGINE_TYPE_ENCODE ) {
1948+ sidx = vcn_v4_0_enc_find_ib_param (ib , RENCODE_IB_PARAM_SESSION_INIT , idx );
1949+ if (sidx >= 0 && ib -> ptr [sidx + 2 ] == RENCODE_ENCODE_STANDARD_AV1 )
1950+ return vcn_v4_0_limit_sched (p , job );
1951+ }
1952+ idx += ib -> ptr [idx ] / 4 ;
19631953 }
19641954 return 0 ;
19651955}
0 commit comments