Chris Wilson <[email protected]> writes:

> Repeat the reset a couple of times if at first we do not succeed.
>
> Signed-off-by: Chris Wilson <[email protected]>
> Link:
> http://patchwork.freedesktop.org/patch/msgid/[email protected]

Seems that this is already merged but FWIW.

Reviewed-by: Mika Kuoppala <[email protected]>

> ---
>  drivers/gpu/drm/i915/intel_uncore.c | 44 
> +++++++++++++++++++++----------------
>  1 file changed, 25 insertions(+), 19 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_uncore.c 
> b/drivers/gpu/drm/i915/intel_uncore.c
> index 71b9b387ad04..fc3da0a6fdbb 100644
> --- a/drivers/gpu/drm/i915/intel_uncore.c
> +++ b/drivers/gpu/drm/i915/intel_uncore.c
> @@ -1463,9 +1463,10 @@ int i915_reg_read_ioctl(struct drm_device *dev,
>       return ret;
>  }
>  
> -static int i915_reset_complete(struct pci_dev *pdev)
> +static bool i915_reset_complete(struct pci_dev *pdev)
>  {
>       u8 gdrst;
> +
>       pci_read_config_byte(pdev, I915_GDRST, &gdrst);
>       return (gdrst & GRDOM_RESET_STATUS) == 0;
>  }
> @@ -1476,15 +1477,16 @@ static int i915_do_reset(struct drm_i915_private 
> *dev_priv, unsigned engine_mask
>  
>       /* assert reset for at least 20 usec */
>       pci_write_config_byte(pdev, I915_GDRST, GRDOM_RESET_ENABLE);
> -     udelay(20);
> +     usleep_range(50, 200);
>       pci_write_config_byte(pdev, I915_GDRST, 0);
>  
>       return wait_for(i915_reset_complete(pdev), 500);
>  }
>  
> -static int g4x_reset_complete(struct pci_dev *pdev)
> +static bool g4x_reset_complete(struct pci_dev *pdev)
>  {
>       u8 gdrst;
> +
>       pci_read_config_byte(pdev, I915_GDRST, &gdrst);
>       return (gdrst & GRDOM_RESET_ENABLE) == 0;
>  }
> @@ -1492,6 +1494,7 @@ static int g4x_reset_complete(struct pci_dev *pdev)
>  static int g33_do_reset(struct drm_i915_private *dev_priv, unsigned 
> engine_mask)
>  {
>       struct pci_dev *pdev = dev_priv->drm.pdev;
> +
>       pci_write_config_byte(pdev, I915_GDRST, GRDOM_RESET_ENABLE);
>       return wait_for(g4x_reset_complete(pdev), 500);
>  }
> @@ -1505,7 +1508,7 @@ static int g4x_do_reset(struct drm_i915_private 
> *dev_priv, unsigned engine_mask)
>                             GRDOM_RENDER | GRDOM_RESET_ENABLE);
>       ret =  wait_for(g4x_reset_complete(pdev), 500);
>       if (ret)
> -             return ret;
> +             goto out;
>  
>       /* WaVcpClkGateDisableForMediaReset:ctg,elk */
>       I915_WRITE(VDECCLK_GATE_D, I915_READ(VDECCLK_GATE_D) | 
> VCP_UNIT_CLOCK_GATE_DISABLE);
> @@ -1514,16 +1517,14 @@ static int g4x_do_reset(struct drm_i915_private 
> *dev_priv, unsigned engine_mask)
>       pci_write_config_byte(pdev, I915_GDRST,
>                             GRDOM_MEDIA | GRDOM_RESET_ENABLE);
>       ret =  wait_for(g4x_reset_complete(pdev), 500);
> -     if (ret)
> -             return ret;
>  
>       /* WaVcpClkGateDisableForMediaReset:ctg,elk */
>       I915_WRITE(VDECCLK_GATE_D, I915_READ(VDECCLK_GATE_D) & 
> ~VCP_UNIT_CLOCK_GATE_DISABLE);
>       POSTING_READ(VDECCLK_GATE_D);
>  
> +out:
>       pci_write_config_byte(pdev, I915_GDRST, 0);
> -
> -     return 0;
> +     return ret;
>  }
>  
>  static int ironlake_do_reset(struct drm_i915_private *dev_priv,
> @@ -1531,25 +1532,21 @@ static int ironlake_do_reset(struct drm_i915_private 
> *dev_priv,
>  {
>       int ret;
>  
> -     I915_WRITE(ILK_GDSR,
> -                ILK_GRDOM_RENDER | ILK_GRDOM_RESET_ENABLE);
> +     I915_WRITE(ILK_GDSR, ILK_GRDOM_RENDER | ILK_GRDOM_RESET_ENABLE);
>       ret = intel_wait_for_register(dev_priv,
>                                     ILK_GDSR, ILK_GRDOM_RESET_ENABLE, 0,
>                                     500);
>       if (ret)
> -             return ret;
> +             goto out;
>  
> -     I915_WRITE(ILK_GDSR,
> -                ILK_GRDOM_MEDIA | ILK_GRDOM_RESET_ENABLE);
> +     I915_WRITE(ILK_GDSR, ILK_GRDOM_MEDIA | ILK_GRDOM_RESET_ENABLE);
>       ret = intel_wait_for_register(dev_priv,
>                                     ILK_GDSR, ILK_GRDOM_RESET_ENABLE, 0,
>                                     500);
> -     if (ret)
> -             return ret;
> -
> +out:
>       I915_WRITE(ILK_GDSR, 0);
> -
> -     return 0;
> +     POSTING_READ(ILK_GDSR);
> +     return ret;
>  }
>  
>  /* Reset the hardware domains (GENX_GRDOM_*) specified by mask */
> @@ -1758,8 +1755,11 @@ static reset_func intel_get_gpu_reset(struct 
> drm_i915_private *dev_priv)
>  int intel_gpu_reset(struct drm_i915_private *dev_priv, unsigned engine_mask)
>  {
>       reset_func reset;
> +     int retry;
>       int ret;
>  
> +     might_sleep();
> +
>       reset = intel_get_gpu_reset(dev_priv);
>       if (reset == NULL)
>               return -ENODEV;
> @@ -1768,7 +1768,13 @@ int intel_gpu_reset(struct drm_i915_private *dev_priv, 
> unsigned engine_mask)
>        * request may be dropped and never completes (causing -EIO).
>        */
>       intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL);
> -     ret = reset(dev_priv, engine_mask);
> +     for (retry = 0; retry < 3; retry++) {
> +             ret = reset(dev_priv, engine_mask);
> +             if (ret != -ETIMEDOUT)
> +                     break;
> +
> +             cond_resched();
> +     }
>       intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
>  
>       return ret;
> -- 
> 2.11.0
>
> _______________________________________________
> Intel-gfx mailing list
> [email protected]
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to