@@ -149,6 +149,18 @@ static int jpeg_v4_0_3_sw_init(struct amdgpu_ip_block *ip_block)
149149 return r ;
150150 }
151151
152+ /* JPEG DJPEG POISON EVENT */
153+ r = amdgpu_irq_add_id (adev , SOC15_IH_CLIENTID_VCN ,
154+ VCN_4_0__SRCID_DJPEG0_POISON , & adev -> jpeg .inst -> ras_poison_irq );
155+ if (r )
156+ return r ;
157+
158+ /* JPEG EJPEG POISON EVENT */
159+ r = amdgpu_irq_add_id (adev , SOC15_IH_CLIENTID_VCN ,
160+ VCN_4_0__SRCID_EJPEG0_POISON , & adev -> jpeg .inst -> ras_poison_irq );
161+ if (r )
162+ return r ;
163+
152164 r = amdgpu_jpeg_sw_init (adev );
153165 if (r )
154166 return r ;
@@ -434,6 +446,9 @@ static int jpeg_v4_0_3_hw_fini(struct amdgpu_ip_block *ip_block)
434446 ret = jpeg_v4_0_3_set_powergating_state (ip_block , AMD_PG_STATE_GATE );
435447 }
436448
449+ if (amdgpu_ras_is_supported (adev , AMDGPU_RAS_BLOCK__JPEG ))
450+ amdgpu_irq_put (adev , & adev -> jpeg .inst -> ras_poison_irq , 0 );
451+
437452 return ret ;
438453}
439454
@@ -1041,6 +1056,14 @@ static int jpeg_v4_0_3_set_interrupt_state(struct amdgpu_device *adev,
10411056 return 0 ;
10421057}
10431058
1059+ static int jpeg_v4_0_3_set_ras_interrupt_state (struct amdgpu_device * adev ,
1060+ struct amdgpu_irq_src * source ,
1061+ unsigned int type ,
1062+ enum amdgpu_interrupt_state state )
1063+ {
1064+ return 0 ;
1065+ }
1066+
10441067static int jpeg_v4_0_3_process_interrupt (struct amdgpu_device * adev ,
10451068 struct amdgpu_irq_src * source ,
10461069 struct amdgpu_iv_entry * entry )
@@ -1200,6 +1223,11 @@ static const struct amdgpu_irq_src_funcs jpeg_v4_0_3_irq_funcs = {
12001223 .process = jpeg_v4_0_3_process_interrupt ,
12011224};
12021225
1226+ static const struct amdgpu_irq_src_funcs jpeg_v4_0_3_ras_irq_funcs = {
1227+ .set = jpeg_v4_0_3_set_ras_interrupt_state ,
1228+ .process = amdgpu_jpeg_process_poison_irq ,
1229+ };
1230+
12031231static void jpeg_v4_0_3_set_irq_funcs (struct amdgpu_device * adev )
12041232{
12051233 int i ;
@@ -1208,6 +1236,9 @@ static void jpeg_v4_0_3_set_irq_funcs(struct amdgpu_device *adev)
12081236 adev -> jpeg .inst -> irq .num_types += adev -> jpeg .num_jpeg_rings ;
12091237 }
12101238 adev -> jpeg .inst -> irq .funcs = & jpeg_v4_0_3_irq_funcs ;
1239+
1240+ adev -> jpeg .inst -> ras_poison_irq .num_types = 1 ;
1241+ adev -> jpeg .inst -> ras_poison_irq .funcs = & jpeg_v4_0_3_ras_irq_funcs ;
12111242}
12121243
12131244const struct amdgpu_ip_block_version jpeg_v4_0_3_ip_block = {
@@ -1304,9 +1335,47 @@ static void jpeg_v4_0_3_reset_ras_error_count(struct amdgpu_device *adev)
13041335 jpeg_v4_0_3_inst_reset_ras_error_count (adev , i );
13051336}
13061337
1338+ static uint32_t jpeg_v4_0_3_query_poison_by_instance (struct amdgpu_device * adev ,
1339+ uint32_t instance , uint32_t sub_block )
1340+ {
1341+ uint32_t poison_stat = 0 , reg_value = 0 ;
1342+
1343+ switch (sub_block ) {
1344+ case AMDGPU_JPEG_V4_0_3_JPEG0 :
1345+ reg_value = RREG32_SOC15 (JPEG , instance , regUVD_RAS_JPEG0_STATUS );
1346+ poison_stat = REG_GET_FIELD (reg_value , UVD_RAS_JPEG0_STATUS , POISONED_PF );
1347+ break ;
1348+ case AMDGPU_JPEG_V4_0_3_JPEG1 :
1349+ reg_value = RREG32_SOC15 (JPEG , instance , regUVD_RAS_JPEG1_STATUS );
1350+ poison_stat = REG_GET_FIELD (reg_value , UVD_RAS_JPEG1_STATUS , POISONED_PF );
1351+ break ;
1352+ default :
1353+ break ;
1354+ }
1355+
1356+ if (poison_stat )
1357+ dev_info (adev -> dev , "Poison detected in JPEG%d sub_block%d\n" ,
1358+ instance , sub_block );
1359+
1360+ return poison_stat ;
1361+ }
1362+
1363+ static bool jpeg_v4_0_3_query_ras_poison_status (struct amdgpu_device * adev )
1364+ {
1365+ uint32_t inst = 0 , sub = 0 , poison_stat = 0 ;
1366+
1367+ for (inst = 0 ; inst < adev -> jpeg .num_jpeg_inst ; inst ++ )
1368+ for (sub = 0 ; sub < AMDGPU_JPEG_V4_0_3_MAX_SUB_BLOCK ; sub ++ )
1369+ poison_stat +=
1370+ jpeg_v4_0_3_query_poison_by_instance (adev , inst , sub );
1371+
1372+ return !!poison_stat ;
1373+ }
1374+
13071375static const struct amdgpu_ras_block_hw_ops jpeg_v4_0_3_ras_hw_ops = {
13081376 .query_ras_error_count = jpeg_v4_0_3_query_ras_error_count ,
13091377 .reset_ras_error_count = jpeg_v4_0_3_reset_ras_error_count ,
1378+ .query_poison_status = jpeg_v4_0_3_query_ras_poison_status ,
13101379};
13111380
13121381static int jpeg_v4_0_3_aca_bank_parser (struct aca_handle * handle , struct aca_bank * bank ,
@@ -1383,6 +1452,13 @@ static int jpeg_v4_0_3_ras_late_init(struct amdgpu_device *adev, struct ras_comm
13831452 if (r )
13841453 return r ;
13851454
1455+ if (amdgpu_ras_is_supported (adev , ras_block -> block ) &&
1456+ adev -> jpeg .inst -> ras_poison_irq .funcs ) {
1457+ r = amdgpu_irq_get (adev , & adev -> jpeg .inst -> ras_poison_irq , 0 );
1458+ if (r )
1459+ goto late_fini ;
1460+ }
1461+
13861462 r = amdgpu_ras_bind_aca (adev , AMDGPU_RAS_BLOCK__JPEG ,
13871463 & jpeg_v4_0_3_aca_info , NULL );
13881464 if (r )
0 commit comments