On 6/12/26 21:37, Timur Kristóf wrote:
> On Friday, June 12, 2026 11:26:54 AM Central European Summer Time Jiqian Chen 
> wrote:
>> For Renior APU with gfx9, in some test scenarios with disabling
>> ring_reset, like accessing an unmapped invalid address, it can
>> trigger a gpu job timeout event, then driver uses Mode2 reset
>> to reset GPU, but after Mode2 compute Ring test and IB test fail
>> randomly. It because the HQDs of MECs are always active before or
>> after Mode2, that causes MECs use stale HQDs when MECs are unhalted
>> before driver restore MQDs, and causes CPC and CPF are still stuck
>> after Mode2, then causes compute Ring and IB tests fail.
>>
>> So, add sequences to deactivate HQDs of MECs in suspend IP function
>> of the resetting process.
>>
>> v2: Move all sequences into a new function gfx_v9_0_cp_mode2_clear_state
>> (Ray Huang) To check reset Mode2 method in the if condition (Ray Huang)
>> v3: Move all sequences before Mode2 instead of after Mode2 (Timur Kristóf)
>>
>> Signed-off-by: Jiqian Chen <[email protected]>
> 
> Looks good, thank you!
> 
> Reviewed-by: Timur Kristóf <[email protected]>
Thank you very much!

> 
>> ---
>> v2->v3 changes:
>> * Move all sequencess before Mode2 instead of after Mode2, and add a new
>>   function gfx_v9_0_deactivate_kcq_hqd to do the disable compute HQDs
>>   sequences.
>>   Then the resetting CPC and CPF are not needed since we have already
>>   move all sequences before Mode2 and they are not stuck
>>
>> v1->v2 changes:
>> * Move my sequences into a new function gfx_v9_0_cp_mode2_clear_state
>> * Add reset Mode2 method check to the if condition that call my sequences
>>
>> v1:
>> Hi all,
>>
>> My board is Renior APU with gfx9, smu12. I run a testcase that
>> accesses an invalid address to trigger a amdgpu_job_timedout()
>> with disabling ring_reset, so that driver will call mode2 reset
>> directly. After mode2 reset I found compute Ring tests and compute
>> IB tests fail randomly on random compute ring.
>>
>> We checked the scan dump of GPU, we can see the CPC and CPF are
>> still stuck, that caused Compute Ring tests fail.
>>
>> I added printings in driver codes (gfx_v9_0_cp_resume), and found
>> the HQDs of MECs are still active, that may cause MECs use stale
>> HQDs when MECs are unhalted before mapping compute queues (restoring
>> MQDs to HQDs).
>>
>> So, I send this patch to fix above problems.
>> There are two main changes of my patch:
>> One is to reset CPC and CPF before resuming KCQ.
>> Another is to disable HQDs beofre unhalting MECs.
>> ---
>>  drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 37 +++++++++++++++++++++++++++
>>  1 file changed, 37 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
>> b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c index 90bbddb45730..0c01701488e7
>> 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
>> @@ -4071,6 +4071,39 @@ static int gfx_v9_0_hw_init(struct amdgpu_ip_block
>> *ip_block) return r;
>>  }
>>
>> +static void gfx_v9_0_deactivate_kcq_hqd(struct amdgpu_device *adev)
>> +{
>> +    for (int i = 0; i < adev->gfx.num_compute_rings; i++) {
>> +            u32 tmp;
>> +            struct amdgpu_ring *ring = &adev->gfx.compute_ring[i];
>> +
>> +            mutex_lock(&adev->srbm_mutex);
>> +            soc15_grbm_select(adev, ring->me, ring->pipe, ring-
>> queue, 0, 0);
>> +            tmp = RREG32_SOC15(GC, 0, mmCP_HQD_ACTIVE);
>> +            /* disable the queue if it's active */
>> +            if (tmp & CP_HQD_ACTIVE__ACTIVE_MASK) {
>> +                    int j;
>> +
>> +                    WREG32_SOC15(GC, 0, mmCP_HQD_DEQUEUE_REQUEST, 
> 1);
>> +                    for (j = 0; j < adev->usec_timeout; j++) {
>> +                            tmp = RREG32_SOC15(GC, 0, 
> mmCP_HQD_ACTIVE);
>> +                            if (!(tmp & 
> CP_HQD_ACTIVE__ACTIVE_MASK))
>> +                                    break;
>> +                            udelay(1);
>> +                    }
>> +                    if (j == AMDGPU_MAX_USEC_TIMEOUT) {
>> +                            DRM_DEBUG("comp_%u_%u_%u dequeue 
> request failed.\n",
>> +                                                    
> ring->me, ring->pipe, ring->queue);
>> +                            /* Manual disable if dequeue 
> request times out */
>> +                            WREG32_SOC15(GC, 0, 
> mmCP_HQD_ACTIVE, 0);
>> +                    }
>> +                    WREG32_SOC15(GC, 0, mmCP_HQD_DEQUEUE_REQUEST, 
> 0);
>> +            }
>> +            soc15_grbm_select(adev, 0, 0, 0, 0, 0);
>> +            mutex_unlock(&adev->srbm_mutex);
>> +    }
>> +}
>> +
>>  static int gfx_v9_0_hw_fini(struct amdgpu_ip_block *ip_block)
>>  {
>>      struct amdgpu_device *adev = ip_block->adev;
>> @@ -4095,6 +4128,10 @@ static int gfx_v9_0_hw_fini(struct amdgpu_ip_block
>> *ip_block) return 0;
>>      }
>>
>> +    if ((adev->flags & AMD_IS_APU) && amdgpu_in_reset(adev) &&
>> +            amdgpu_asic_reset_method(adev) == 
> AMD_RESET_METHOD_MODE2)
>> +            gfx_v9_0_deactivate_kcq_hqd(adev);
>> +
>>      /* Use deinitialize sequence from CAIL when unbinding device from 
> driver,
>>       * otherwise KIQ is hanging when binding back
>>       */
> 
> 
> 
> 

-- 
Best regards,
Jiqian Chen.

Reply via email to