3838#define mmIH_CHICKEN_ALDEBARAN 0x18d
3939#define mmIH_CHICKEN_ALDEBARAN_BASE_IDX 0
4040
41+ #define mmIH_RETRY_INT_CAM_CNTL_ALDEBARAN 0x00ea
42+ #define mmIH_RETRY_INT_CAM_CNTL_ALDEBARAN_BASE_IDX 0
43+ #define IH_RETRY_INT_CAM_CNTL_ALDEBARAN__ENABLE__SHIFT 0x10
44+ #define IH_RETRY_INT_CAM_CNTL_ALDEBARAN__ENABLE_MASK 0x00010000L
45+
4146static void vega20_ih_set_interrupt_funcs (struct amdgpu_device * adev );
4247
4348/**
@@ -251,36 +256,14 @@ static int vega20_ih_enable_ring(struct amdgpu_device *adev,
251256 return 0 ;
252257}
253258
254- /**
255- * vega20_ih_reroute_ih - reroute VMC/UTCL2 ih to an ih ring
256- *
257- * @adev: amdgpu_device pointer
258- *
259- * Reroute VMC and UMC interrupts on primary ih ring to
260- * ih ring 1 so they won't lose when bunches of page faults
261- * interrupts overwhelms the interrupt handler(VEGA20)
262- */
263- static void vega20_ih_reroute_ih (struct amdgpu_device * adev )
259+ static uint32_t vega20_setup_retry_doorbell (u32 doorbell_index )
264260{
265- uint32_t tmp ;
261+ u32 val = 0 ;
266262
267- /* vega20 ih reroute will go through psp this
268- * function is used for newer asics starting arcturus
269- */
270- if (adev -> ip_versions [OSSSYS_HWIP ][0 ] >= IP_VERSION (4 , 2 , 1 )) {
271- /* Reroute to IH ring 1 for VMC */
272- WREG32_SOC15 (OSSSYS , 0 , mmIH_CLIENT_CFG_INDEX , 0x12 );
273- tmp = RREG32_SOC15 (OSSSYS , 0 , mmIH_CLIENT_CFG_DATA );
274- tmp = REG_SET_FIELD (tmp , IH_CLIENT_CFG_DATA , CLIENT_TYPE , 1 );
275- tmp = REG_SET_FIELD (tmp , IH_CLIENT_CFG_DATA , RING_ID , 1 );
276- WREG32_SOC15 (OSSSYS , 0 , mmIH_CLIENT_CFG_DATA , tmp );
277-
278- /* Reroute IH ring 1 for UTCL2 */
279- WREG32_SOC15 (OSSSYS , 0 , mmIH_CLIENT_CFG_INDEX , 0x1B );
280- tmp = RREG32_SOC15 (OSSSYS , 0 , mmIH_CLIENT_CFG_DATA );
281- tmp = REG_SET_FIELD (tmp , IH_CLIENT_CFG_DATA , RING_ID , 1 );
282- WREG32_SOC15 (OSSSYS , 0 , mmIH_CLIENT_CFG_DATA , tmp );
283- }
263+ val = REG_SET_FIELD (val , IH_DOORBELL_RPTR , OFFSET , doorbell_index );
264+ val = REG_SET_FIELD (val , IH_DOORBELL_RPTR , ENABLE , 1 );
265+
266+ return val ;
284267}
285268
286269/**
@@ -333,8 +316,6 @@ static int vega20_ih_irq_init(struct amdgpu_device *adev)
333316
334317 for (i = 0 ; i < ARRAY_SIZE (ih ); i ++ ) {
335318 if (ih [i ]-> ring_size ) {
336- if (i == 1 )
337- vega20_ih_reroute_ih (adev );
338319 ret = vega20_ih_enable_ring (adev , ih [i ]);
339320 if (ret )
340321 return ret ;
@@ -347,6 +328,20 @@ static int vega20_ih_irq_init(struct amdgpu_device *adev)
347328
348329 pci_set_master (adev -> pdev );
349330
331+ /* Allocate the doorbell for IH Retry CAM */
332+ adev -> irq .retry_cam_doorbell_index = (adev -> doorbell_index .ih + 3 ) << 1 ;
333+ WREG32_SOC15 (OSSSYS , 0 , mmIH_DOORBELL_RETRY_CAM ,
334+ vega20_setup_retry_doorbell (adev -> irq .retry_cam_doorbell_index ));
335+
336+ /* Enable IH Retry CAM */
337+ if (adev -> ip_versions [OSSSYS_HWIP ][0 ] == IP_VERSION (4 , 4 , 0 ))
338+ WREG32_FIELD15 (OSSSYS , 0 , IH_RETRY_INT_CAM_CNTL_ALDEBARAN ,
339+ ENABLE , 1 );
340+ else
341+ WREG32_FIELD15 (OSSSYS , 0 , IH_RETRY_INT_CAM_CNTL , ENABLE , 1 );
342+
343+ adev -> irq .retry_cam_enabled = true;
344+
350345 /* enable interrupts */
351346 ret = vega20_ih_toggle_interrupts (adev , true);
352347 if (ret )
0 commit comments