@@ -1840,22 +1840,16 @@ static int vcn_v4_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
1840
1840
1841
1841
#define RADEON_VCN_ENGINE_TYPE_ENCODE (0x00000002)
1842
1842
#define RADEON_VCN_ENGINE_TYPE_DECODE (0x00000003)
1843
-
1844
1843
#define RADEON_VCN_ENGINE_INFO (0x30000001)
1845
- #define RADEON_VCN_ENGINE_INFO_MAX_OFFSET 16
1846
-
1847
1844
#define RENCODE_ENCODE_STANDARD_AV1 2
1848
1845
#define RENCODE_IB_PARAM_SESSION_INIT 0x00000003
1849
- #define RENCODE_IB_PARAM_SESSION_INIT_MAX_OFFSET 64
1850
1846
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 )
1855
1849
{
1856
1850
int i ;
1857
1851
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 ) {
1859
1853
if (ib -> ptr [i + 1 ] == id )
1860
1854
return i ;
1861
1855
}
@@ -1870,33 +1864,29 @@ static int vcn_v4_0_ring_patch_cs_in_place(struct amdgpu_cs_parser *p,
1870
1864
struct amdgpu_vcn_decode_buffer * decode_buffer ;
1871
1865
uint64_t addr ;
1872
1866
uint32_t val ;
1873
- int idx ;
1867
+ int idx = 0 , sidx ;
1874
1868
1875
1869
/* The first instance can decode anything */
1876
1870
if (!ring -> me )
1877
1871
return 0 ;
1878
1872
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 ;
1900
1890
}
1901
1891
return 0 ;
1902
1892
}
0 commit comments