@@ -1747,22 +1747,16 @@ static int vcn_v4_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
1747
1747
1748
1748
#define RADEON_VCN_ENGINE_TYPE_ENCODE (0x00000002)
1749
1749
#define RADEON_VCN_ENGINE_TYPE_DECODE (0x00000003)
1750
-
1751
1750
#define RADEON_VCN_ENGINE_INFO (0x30000001)
1752
- #define RADEON_VCN_ENGINE_INFO_MAX_OFFSET 16
1753
-
1754
1751
#define RENCODE_ENCODE_STANDARD_AV1 2
1755
1752
#define RENCODE_IB_PARAM_SESSION_INIT 0x00000003
1756
- #define RENCODE_IB_PARAM_SESSION_INIT_MAX_OFFSET 64
1757
1753
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 )
1762
1756
{
1763
1757
int i ;
1764
1758
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 ) {
1766
1760
if (ib -> ptr [i + 1 ] == id )
1767
1761
return i ;
1768
1762
}
@@ -1777,33 +1771,29 @@ static int vcn_v4_0_ring_patch_cs_in_place(struct amdgpu_cs_parser *p,
1777
1771
struct amdgpu_vcn_decode_buffer * decode_buffer ;
1778
1772
uint64_t addr ;
1779
1773
uint32_t val ;
1780
- int idx ;
1774
+ int idx = 0 , sidx ;
1781
1775
1782
1776
/* The first instance can decode anything */
1783
1777
if (!ring -> me )
1784
1778
return 0 ;
1785
1779
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 ;
1807
1797
}
1808
1798
return 0 ;
1809
1799
}
0 commit comments