Re: 答复: SPAM //答复: [v2] drm/amdgpu: S3 resume fail on Polaris10

Christian König deathsimple at vodafone.de
Tue Jul 19 07:15:04 UTC 2016


No, problem. It's only the coding style anyway.

It's just horrible annoying when we run into a ping/pong situation where 
AMD developers break the coding style and community patches are fixing 
it again.

Regards,
Christian.

Am 19.07.2016 um 04:52 schrieb Qu, Jim:
>
> Hi Christian:
>
>
> Sorry, I have pushed the patch. anyway, I could push a new patch to 
> correct them.
>
>
> Thanks
>
> JimQu
>
> ------------------------------------------------------------------------
> *发件人:* Christian König <deathsimple at vodafone.de>
> *发送时间:* 2016年7月18日 22:09:16
> *收件人:* Wang, Qingqing; Qu, Jim; amd-gfx at lists.freedesktop.org
> *主题:* Re: SPAM //答复: [v2] drm/amdgpu: S3 resume fail on Polaris10
> Am 18.07.2016 um 16:07 schrieb Christian König:
>> Am 15.07.2016 um 10:59 schrieb Wang, Qingqing:
>>>
>>> +static int vce_v3_0_firmware_loaded(struct amdgpu_device *adev)
>>> +{
>>> +       int i, j;
>>> +
>>> +       for (i = 0; i < 10; ++i) {
>>> +               uint32_t status;
>>>
>>>
>>> Please move the definition of status to the start of the function 
>>> and give it an intial value.
>>>
>>
>> NAK, that is exactly what we should *NOT* do here.
>>
>> "status" is just a temporary variable for the register content and as 
>> such should only be declared where needed.
>>
>> Additional to that please stop initializing variables when that isn't 
>> necessary, we are already getting patches to remove that cruft from 
>> all over the code.
>>
>> What you should clearly do on the other hand is sending the patches 
>> as text, not HTML mail. We can really review them this way.
>
> Typo that should have read "can't really review them".
>
> Sorry for that,
> Christian.
>
>>
>> Regards,
>> Christian.
>>
>>> With that fixed.
>>>
>>> Reviewed-by: Ken Wang <Qingqing.Wang at amd.com>
>>>
>>> ------------------------------------------------------------------------
>>> *发件人:* amd-gfx <amd-gfx-bounces at lists.freedesktop.org> 代表 Qu, 
>>> Jim <Jim.Qu at amd.com>
>>> *发送时间:* 2016年7月15日 10:45:07
>>> *收件人:* amd-gfx at lists.freedesktop.org
>>> *主题:* 答复: [v2] drm/amdgpu: S3 resume fail on Polaris10
>>>
>>> Hi:
>>>
>>>
>>> Patch has updated, Please review.
>>>
>>>
>>> Thanks
>>>
>>> JimQu
>>>
>>> ------------------------------------------------------------------------
>>> *发件人:* jimqu <Jim.Qu at amd.com>
>>> *发送时间:* 2016年7月15日 10:33:56
>>> *收件人:* amd-gfx at lists.freedesktop.org
>>> *抄送:* Qu, Jim
>>> *主题:* [v2] drm/amdgpu: S3 resume fail on Polaris10
>>> Sometimes, driver can not return from fence waiting when doing VCE ring
>>> ib test. The issue is a asic special and random issue. so adjust VCE 
>>> suspend
>>> and resume sequence.
>>>
>>> Change-Id: If9e2006521ff17e55c33b18b1500126b9e7f2874
>>> Signed-off-by: JimQu <Jim.Qu at amd.com>
>>> ---
>>>  drivers/gpu/drm/amd/amdgpu/vce_v3_0.c | 143 
>>> +++++++++++++++++++++++-----------
>>>  1 file changed, 97 insertions(+), 46 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c 
>>> b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
>>> index 30e8099..885b625 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
>>> @@ -43,6 +43,7 @@
>>>  #define mmVCE_LMI_VCPU_CACHE_40BIT_BAR0 0x8616
>>>  #define mmVCE_LMI_VCPU_CACHE_40BIT_BAR1 0x8617
>>>  #define mmVCE_LMI_VCPU_CACHE_40BIT_BAR2 0x8618
>>> +#define VCE_STATUS_VCPU_REPORT_FW_LOADED_MASK  0x02
>>>
>>>  #define VCE_V3_0_FW_SIZE        (384 * 1024)
>>>  #define VCE_V3_0_STACK_SIZE     (64 * 1024)
>>> @@ -51,6 +52,7 @@
>>>  static void vce_v3_0_mc_resume(struct amdgpu_device *adev, int idx);
>>>  static void vce_v3_0_set_ring_funcs(struct amdgpu_device *adev);
>>>  static void vce_v3_0_set_irq_funcs(struct amdgpu_device *adev);
>>> +static int vce_v3_0_wait_for_idle(void *handle);
>>>
>>>  /**
>>>   * vce_v3_0_ring_get_rptr - get read pointer
>>> @@ -205,6 +207,32 @@ static void 
>>> vce_v3_0_set_vce_sw_clock_gating(struct amdgpu_device *adev,
>>>          vce_v3_0_override_vce_clock_gating(adev, false);
>>>  }
>>>
>>> +static int vce_v3_0_firmware_loaded(struct amdgpu_device *adev)
>>> +{
>>> +       int i, j;
>>> +
>>> +       for (i = 0; i < 10; ++i) {
>>> +               uint32_t status;
>>> +               for (j = 0; j < 100; ++j) {
>>> +                       status = RREG32(mmVCE_STATUS);
>>> +                       if (status & 
>>> VCE_STATUS_VCPU_REPORT_FW_LOADED_MASK)
>>> +                               return 0;
>>> +                       mdelay(10);
>>> +               }
>>> +
>>> +               DRM_ERROR("VCE not responding, trying to reset the 
>>> ECPU!!!\n");
>>> +               WREG32_P(mmVCE_SOFT_RESET,
>>> + VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK,
>>> + ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
>>> +               mdelay(10);
>>> +               WREG32_P(mmVCE_SOFT_RESET, 0,
>>> + ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
>>> +               mdelay(10);
>>> +       }
>>> +
>>> +       return -ETIMEDOUT;
>>> +}
>>> +
>>>  /**
>>>   * vce_v3_0_start - start VCE block
>>>   *
>>> @@ -215,11 +243,24 @@ static void 
>>> vce_v3_0_set_vce_sw_clock_gating(struct amdgpu_device *adev,
>>>  static int vce_v3_0_start(struct amdgpu_device *adev)
>>>  {
>>>          struct amdgpu_ring *ring;
>>> -       int idx, i, j, r;
>>> +       int idx, r;
>>> +
>>> +       ring = &adev->vce.ring[0];
>>> +       WREG32(mmVCE_RB_RPTR, ring->wptr);
>>> +       WREG32(mmVCE_RB_WPTR, ring->wptr);
>>> +       WREG32(mmVCE_RB_BASE_LO, ring->gpu_addr);
>>> +       WREG32(mmVCE_RB_BASE_HI, upper_32_bits(ring->gpu_addr));
>>> +       WREG32(mmVCE_RB_SIZE, ring->ring_size / 4);
>>> +
>>> +       ring = &adev->vce.ring[1];
>>> +       WREG32(mmVCE_RB_RPTR2, ring->wptr);
>>> +       WREG32(mmVCE_RB_WPTR2, ring->wptr);
>>> +       WREG32(mmVCE_RB_BASE_LO2, ring->gpu_addr);
>>> +       WREG32(mmVCE_RB_BASE_HI2, upper_32_bits(ring->gpu_addr));
>>> +       WREG32(mmVCE_RB_SIZE2, ring->ring_size / 4);
>>>
>>>          mutex_lock(&adev->grbm_idx_mutex);
>>>          for (idx = 0; idx < 2; ++idx) {
>>> -
>>>                  if (adev->vce.harvest_config & (1 << idx))
>>>                          continue;
>>>
>>> @@ -233,48 +274,24 @@ static int vce_v3_0_start(struct amdgpu_device 
>>> *adev)
>>>
>>>                  vce_v3_0_mc_resume(adev, idx);
>>>
>>> -               /* set BUSY flag */
>>> -               WREG32_P(mmVCE_STATUS, 1, ~1);
>>> +               WREG32_P(mmVCE_STATUS, VCE_STATUS__JOB_BUSY_MASK,
>>> +                        ~VCE_STATUS__JOB_BUSY_MASK);
>>> +
>>>                  if (adev->asic_type >= CHIP_STONEY)
>>>                          WREG32_P(mmVCE_VCPU_CNTL, 1, ~0x200001);
>>>                  else
>>>                          WREG32_P(mmVCE_VCPU_CNTL, 
>>> VCE_VCPU_CNTL__CLK_EN_MASK,
>>> ~VCE_VCPU_CNTL__CLK_EN_MASK);
>>>
>>> -               WREG32_P(mmVCE_SOFT_RESET,
>>> - VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK,
>>> - ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
>>> -
>>> -               mdelay(100);
>>> -
>>>                  WREG32_P(mmVCE_SOFT_RESET, 0,
>>> ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
>>>
>>> -               for (i = 0; i < 10; ++i) {
>>> -                       uint32_t status;
>>> -                       for (j = 0; j < 100; ++j) {
>>> -                               status = RREG32(mmVCE_STATUS);
>>> -                               if (status & 2)
>>> -                                       break;
>>> -                               mdelay(10);
>>> -                       }
>>> -                       r = 0;
>>> -                       if (status & 2)
>>> -                               break;
>>> -
>>> -                       DRM_ERROR("VCE not responding, trying to 
>>> reset the ECPU!!!\n");
>>> -                       WREG32_P(mmVCE_SOFT_RESET,
>>> - VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK,
>>> - ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
>>> -                       mdelay(10);
>>> -                       WREG32_P(mmVCE_SOFT_RESET, 0,
>>> - ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
>>> -                       mdelay(10);
>>> -                       r = -1;
>>> -               }
>>> +               mdelay(100);
>>> +
>>> +               r = vce_v3_0_firmware_loaded(adev);
>>>
>>>                  /* clear BUSY flag */
>>> -               WREG32_P(mmVCE_STATUS, 0, ~1);
>>> +               WREG32_P(mmVCE_STATUS, 0, ~VCE_STATUS__JOB_BUSY_MASK);
>>>
>>>                  /* Set Clock-Gating off */
>>>                  if (adev->cg_flags & AMD_CG_SUPPORT_VCE_MGCG)
>>> @@ -290,19 +307,46 @@ static int vce_v3_0_start(struct amdgpu_device 
>>> *adev)
>>>          WREG32_P(mmGRBM_GFX_INDEX, 0, 
>>> ~GRBM_GFX_INDEX__VCE_INSTANCE_MASK);
>>>          mutex_unlock(&adev->grbm_idx_mutex);
>>>
>>> -       ring = &adev->vce.ring[0];
>>> -       WREG32(mmVCE_RB_RPTR, ring->wptr);
>>> -       WREG32(mmVCE_RB_WPTR, ring->wptr);
>>> -       WREG32(mmVCE_RB_BASE_LO, ring->gpu_addr);
>>> -       WREG32(mmVCE_RB_BASE_HI, upper_32_bits(ring->gpu_addr));
>>> -       WREG32(mmVCE_RB_SIZE, ring->ring_size / 4);
>>> +       return 0;
>>> +}
>>>
>>> -       ring = &adev->vce.ring[1];
>>> -       WREG32(mmVCE_RB_RPTR2, ring->wptr);
>>> -       WREG32(mmVCE_RB_WPTR2, ring->wptr);
>>> -       WREG32(mmVCE_RB_BASE_LO2, ring->gpu_addr);
>>> -       WREG32(mmVCE_RB_BASE_HI2, upper_32_bits(ring->gpu_addr));
>>> -       WREG32(mmVCE_RB_SIZE2, ring->ring_size / 4);
>>> +static int vce_v3_0_stop(struct amdgpu_device *adev)
>>> +{
>>> +       int idx;
>>> +
>>> +       mutex_lock(&adev->grbm_idx_mutex);
>>> +       for (idx = 0; idx < 2; ++idx) {
>>> +               if (adev->vce.harvest_config & (1 << idx))
>>> +                       continue;
>>> +
>>> +               if (idx == 0)
>>> +                       WREG32_P(mmGRBM_GFX_INDEX, 0,
>>> + ~GRBM_GFX_INDEX__VCE_INSTANCE_MASK);
>>> +               else
>>> +                       WREG32_P(mmGRBM_GFX_INDEX,
>>> + GRBM_GFX_INDEX__VCE_INSTANCE_MASK,
>>> + ~GRBM_GFX_INDEX__VCE_INSTANCE_MASK);
>>> +
>>> +               if (adev->asic_type >= CHIP_STONEY)
>>> +                       WREG32_P(mmVCE_VCPU_CNTL, 0, ~0x200001);
>>> +               else
>>> +                       WREG32_P(mmVCE_VCPU_CNTL, 0,
>>> + ~VCE_VCPU_CNTL__CLK_EN_MASK);
>>> +               /* hold on ECPU */
>>> +               WREG32_P(mmVCE_SOFT_RESET,
>>> + VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK,
>>> + ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
>>> +
>>> +               /* clear BUSY flag */
>>> +               WREG32_P(mmVCE_STATUS, 0, ~VCE_STATUS__JOB_BUSY_MASK);
>>> +
>>> +               /* Set Clock-Gating off */
>>> +               if (adev->cg_flags & AMD_CG_SUPPORT_VCE_MGCG)
>>> + vce_v3_0_set_vce_sw_clock_gating(adev, false);
>>> +       }
>>> +
>>> +       WREG32_P(mmGRBM_GFX_INDEX, 0, 
>>> ~GRBM_GFX_INDEX__VCE_INSTANCE_MASK);
>>> +       mutex_unlock(&adev->grbm_idx_mutex);
>>>
>>>          return 0;
>>>  }
>>> @@ -441,7 +485,14 @@ static int vce_v3_0_hw_init(void *handle)
>>>
>>>  static int vce_v3_0_hw_fini(void *handle)
>>>  {
>>> -       return 0;
>>> +       int r;
>>> +       struct amdgpu_device *adev = (struct amdgpu_device *)handle;
>>> +
>>> +       r = vce_v3_0_wait_for_idle(handle);
>>> +       if (r)
>>> +               return r;
>>> +
>>> +       return vce_v3_0_stop(adev);
>>>  }
>>>
>>>  static int vce_v3_0_suspend(void *handle)
>>> -- 
>>> 1.9.1
>>>
>>>
>>>
>>> _______________________________________________
>>> amd-gfx mailing list
>>> amd-gfx at lists.freedesktop.org
>>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
>>
>>
>>
>> _______________________________________________
>> amd-gfx mailing list
>> amd-gfx at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/amd-gfx/attachments/20160719/a83b4fdd/attachment-0001.html>


More information about the amd-gfx mailing list