@@ -169,6 +169,10 @@ static int vcn_v4_0_3_sw_init(struct amdgpu_ip_block *ip_block)
169169 if (r )
170170 return r ;
171171
172+ /* VCN POISON TRAP */
173+ r = amdgpu_irq_add_id (adev , SOC15_IH_CLIENTID_VCN ,
174+ VCN_4_0__SRCID_UVD_POISON , & adev -> vcn .inst -> ras_poison_irq );
175+
172176 for (i = 0 ; i < adev -> vcn .num_vcn_inst ; i ++ ) {
173177
174178 r = amdgpu_vcn_sw_init (adev , i );
@@ -387,6 +391,9 @@ static int vcn_v4_0_3_hw_fini(struct amdgpu_ip_block *ip_block)
387391 vinst -> set_pg_state (vinst , AMD_PG_STATE_GATE );
388392 }
389393
394+ if (amdgpu_ras_is_supported (adev , AMDGPU_RAS_BLOCK__VCN ))
395+ amdgpu_irq_put (adev , & adev -> vcn .inst -> ras_poison_irq , 0 );
396+
390397 return 0 ;
391398}
392399
@@ -1814,11 +1821,24 @@ static int vcn_v4_0_3_process_interrupt(struct amdgpu_device *adev,
18141821 return 0 ;
18151822}
18161823
1824+ static int vcn_v4_0_3_set_ras_interrupt_state (struct amdgpu_device * adev ,
1825+ struct amdgpu_irq_src * source ,
1826+ unsigned int type ,
1827+ enum amdgpu_interrupt_state state )
1828+ {
1829+ return 0 ;
1830+ }
1831+
18171832static const struct amdgpu_irq_src_funcs vcn_v4_0_3_irq_funcs = {
18181833 .set = vcn_v4_0_3_set_interrupt_state ,
18191834 .process = vcn_v4_0_3_process_interrupt ,
18201835};
18211836
1837+ static const struct amdgpu_irq_src_funcs vcn_v4_0_3_ras_irq_funcs = {
1838+ .set = vcn_v4_0_3_set_ras_interrupt_state ,
1839+ .process = amdgpu_vcn_process_poison_irq ,
1840+ };
1841+
18221842/**
18231843 * vcn_v4_0_3_set_irq_funcs - set VCN block interrupt irq functions
18241844 *
@@ -1834,6 +1854,9 @@ static void vcn_v4_0_3_set_irq_funcs(struct amdgpu_device *adev)
18341854 adev -> vcn .inst -> irq .num_types ++ ;
18351855 }
18361856 adev -> vcn .inst -> irq .funcs = & vcn_v4_0_3_irq_funcs ;
1857+
1858+ adev -> vcn .inst -> ras_poison_irq .num_types = 1 ;
1859+ adev -> vcn .inst -> ras_poison_irq .funcs = & vcn_v4_0_3_ras_irq_funcs ;
18371860}
18381861
18391862static void vcn_v4_0_3_print_ip_state (struct amdgpu_ip_block * ip_block , struct drm_printer * p )
@@ -1981,9 +2004,44 @@ static void vcn_v4_0_3_reset_ras_error_count(struct amdgpu_device *adev)
19812004 vcn_v4_0_3_inst_reset_ras_error_count (adev , i );
19822005}
19832006
2007+ static uint32_t vcn_v4_0_3_query_poison_by_instance (struct amdgpu_device * adev ,
2008+ uint32_t instance , uint32_t sub_block )
2009+ {
2010+ uint32_t poison_stat = 0 , reg_value = 0 ;
2011+
2012+ switch (sub_block ) {
2013+ case AMDGPU_VCN_V4_0_3_VCPU_VCODEC :
2014+ reg_value = RREG32_SOC15 (VCN , instance , regUVD_RAS_VCPU_VCODEC_STATUS );
2015+ poison_stat = REG_GET_FIELD (reg_value , UVD_RAS_VCPU_VCODEC_STATUS , POISONED_PF );
2016+ break ;
2017+ default :
2018+ break ;
2019+ }
2020+
2021+ if (poison_stat )
2022+ dev_info (adev -> dev , "Poison detected in VCN%d, sub_block%d\n" ,
2023+ instance , sub_block );
2024+
2025+ return poison_stat ;
2026+ }
2027+
2028+ static bool vcn_v4_0_3_query_poison_status (struct amdgpu_device * adev )
2029+ {
2030+ uint32_t inst , sub ;
2031+ uint32_t poison_stat = 0 ;
2032+
2033+ for (inst = 0 ; inst < adev -> vcn .num_vcn_inst ; inst ++ )
2034+ for (sub = 0 ; sub < AMDGPU_VCN_V4_0_3_MAX_SUB_BLOCK ; sub ++ )
2035+ poison_stat +=
2036+ vcn_v4_0_3_query_poison_by_instance (adev , inst , sub );
2037+
2038+ return !!poison_stat ;
2039+ }
2040+
19842041static const struct amdgpu_ras_block_hw_ops vcn_v4_0_3_ras_hw_ops = {
19852042 .query_ras_error_count = vcn_v4_0_3_query_ras_error_count ,
19862043 .reset_ras_error_count = vcn_v4_0_3_reset_ras_error_count ,
2044+ .query_poison_status = vcn_v4_0_3_query_poison_status ,
19872045};
19882046
19892047static int vcn_v4_0_3_aca_bank_parser (struct aca_handle * handle , struct aca_bank * bank ,
@@ -2059,6 +2117,13 @@ static int vcn_v4_0_3_ras_late_init(struct amdgpu_device *adev, struct ras_commo
20592117 if (r )
20602118 return r ;
20612119
2120+ if (amdgpu_ras_is_supported (adev , ras_block -> block ) &&
2121+ adev -> vcn .inst -> ras_poison_irq .funcs ) {
2122+ r = amdgpu_irq_get (adev , & adev -> vcn .inst -> ras_poison_irq , 0 );
2123+ if (r )
2124+ goto late_fini ;
2125+ }
2126+
20622127 r = amdgpu_ras_bind_aca (adev , AMDGPU_RAS_BLOCK__VCN ,
20632128 & vcn_v4_0_3_aca_info , NULL );
20642129 if (r )
0 commit comments