@@ -1710,7 +1710,7 @@ static int vcn_v4_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
17101710
17111711 create = ptr + addr + offset - start ;
17121712
1713- /* H246 , HEVC and VP9 can run on any instance */
1713+ /* H264 , HEVC and VP9 can run on any instance */
17141714 if (create [0 ] == 0x7 || create [0 ] == 0x10 || create [0 ] == 0x11 )
17151715 continue ;
17161716
@@ -1724,7 +1724,29 @@ static int vcn_v4_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
17241724 return r ;
17251725}
17261726
1727- #define RADEON_VCN_ENGINE_TYPE_DECODE (0x00000003)
1727+ #define RADEON_VCN_ENGINE_TYPE_ENCODE (0x00000002)
1728+ #define RADEON_VCN_ENGINE_TYPE_DECODE (0x00000003)
1729+
1730+ #define RADEON_VCN_ENGINE_INFO (0x30000001)
1731+ #define RADEON_VCN_ENGINE_INFO_MAX_OFFSET 16
1732+
1733+ #define RENCODE_ENCODE_STANDARD_AV1 2
1734+ #define RENCODE_IB_PARAM_SESSION_INIT 0x00000003
1735+ #define RENCODE_IB_PARAM_SESSION_INIT_MAX_OFFSET 64
1736+
1737+ /* return the offset in ib if id is found, -1 otherwise
1738+ * to speed up the searching we only search upto max_offset
1739+ */
1740+ static int vcn_v4_0_enc_find_ib_param (struct amdgpu_ib * ib , uint32_t id , int max_offset )
1741+ {
1742+ int i ;
1743+
1744+ for (i = 0 ; i < ib -> length_dw && i < max_offset && ib -> ptr [i ] >= 8 ; i += ib -> ptr [i ]/4 ) {
1745+ if (ib -> ptr [i + 1 ] == id )
1746+ return i ;
1747+ }
1748+ return -1 ;
1749+ }
17281750
17291751static int vcn_v4_0_ring_patch_cs_in_place (struct amdgpu_cs_parser * p ,
17301752 struct amdgpu_job * job ,
@@ -1734,27 +1756,35 @@ static int vcn_v4_0_ring_patch_cs_in_place(struct amdgpu_cs_parser *p,
17341756 struct amdgpu_vcn_decode_buffer * decode_buffer ;
17351757 uint64_t addr ;
17361758 uint32_t val ;
1759+ int idx ;
17371760
17381761 /* The first instance can decode anything */
17391762 if (!ring -> me )
17401763 return 0 ;
17411764
1742- /* unified queue ib header has 8 double words. */
1743- if (ib -> length_dw < 8 )
1744- return 0 ;
1745-
1746- val = amdgpu_ib_get_value (ib , 6 ); //RADEON_VCN_ENGINE_TYPE
1747- if (val != RADEON_VCN_ENGINE_TYPE_DECODE )
1748- return 0 ;
1749-
1750- decode_buffer = (struct amdgpu_vcn_decode_buffer * )& ib -> ptr [10 ];
1751-
1752- if (!(decode_buffer -> valid_buf_flag & 0x1 ))
1765+ /* RADEON_VCN_ENGINE_INFO is at the top of ib block */
1766+ idx = vcn_v4_0_enc_find_ib_param (ib , RADEON_VCN_ENGINE_INFO ,
1767+ RADEON_VCN_ENGINE_INFO_MAX_OFFSET );
1768+ if (idx < 0 ) /* engine info is missing */
17531769 return 0 ;
17541770
1755- addr = ((u64 )decode_buffer -> msg_buffer_address_hi ) << 32 |
1756- decode_buffer -> msg_buffer_address_lo ;
1757- return vcn_v4_0_dec_msg (p , job , addr );
1771+ val = amdgpu_ib_get_value (ib , idx + 2 ); /* RADEON_VCN_ENGINE_TYPE */
1772+ if (val == RADEON_VCN_ENGINE_TYPE_DECODE ) {
1773+ decode_buffer = (struct amdgpu_vcn_decode_buffer * )& ib -> ptr [idx + 6 ];
1774+
1775+ if (!(decode_buffer -> valid_buf_flag & 0x1 ))
1776+ return 0 ;
1777+
1778+ addr = ((u64 )decode_buffer -> msg_buffer_address_hi ) << 32 |
1779+ decode_buffer -> msg_buffer_address_lo ;
1780+ return vcn_v4_0_dec_msg (p , job , addr );
1781+ } else if (val == RADEON_VCN_ENGINE_TYPE_ENCODE ) {
1782+ idx = vcn_v4_0_enc_find_ib_param (ib , RENCODE_IB_PARAM_SESSION_INIT ,
1783+ RENCODE_IB_PARAM_SESSION_INIT_MAX_OFFSET );
1784+ if (idx >= 0 && ib -> ptr [idx + 2 ] == RENCODE_ENCODE_STANDARD_AV1 )
1785+ return vcn_v4_0_limit_sched (p , job );
1786+ }
1787+ return 0 ;
17581788}
17591789
17601790static const struct amdgpu_ring_funcs vcn_v4_0_unified_ring_vm_funcs = {
0 commit comments