[Intel-gfx] [RFC] drm/i915: Add GuC timeout config options to Kconfig.debug

Kelvin Gardiner kelvin.gardiner at intel.com
Fri Jul 14 20:57:33 UTC 2017



On 28/06/17 01:54, Tvrtko Ursulin wrote:
>
> On 14/06/2017 00:19, Kelvin Gardiner wrote:
>> It is sometimes useful for debug purposes to be able to set GuC timeout
>> lengths.
>>
>> This patch adds GuC load and request timeouts values to Kconfig.debug,
>> which can then be optionally set as required for debug cases. A default
>> value equal to the current hard-coded values are provided.
>>
>> In the case when a Kconfig option has not been set, a default value is
>> provide using a define.
>>
>> Signed-off-by: Kelvin Gardiner <kelvin.gardiner at intel.com>
>> ---
>>   drivers/gpu/drm/i915/Kconfig.debug      | 40
>> +++++++++++++++++++++++++++++++++
>>   drivers/gpu/drm/i915/i915_drv.h         | 13 +++++++++++
>>   drivers/gpu/drm/i915/intel_guc_loader.c |  3 ++-
>>   drivers/gpu/drm/i915/intel_uc.c         |  5 ++++-
>>   4 files changed, 59 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/Kconfig.debug
>> b/drivers/gpu/drm/i915/Kconfig.debug
>> index 78c5c04..6a0767d 100644
>> --- a/drivers/gpu/drm/i915/Kconfig.debug
>> +++ b/drivers/gpu/drm/i915/Kconfig.debug
>> @@ -112,3 +112,43 @@ config DRM_I915_DEBUG_VBLANK_EVADE
>>         the vblank.
>>           If in doubt, say "N".
>> +
>> +config DRM_I915_OVERRIDE_TIMEOUTS
>> +    bool "Enable timeout overrides"
>> +        depends on DRM_I915
>> +        default n
>> +        help
>> +          Enable this option to allow overriding of selected timeouts
>> in the
>> +      driver i915.
>> +
>> +      Timeouts should only be overridden for debug and not in normal
>> use.
>> +
>> +      If in doubt, say "N".
>
> If you drop this config...
>
>> +
>> +config DRM_I915_TIMEOUT_GUC_LOAD
>> +    int "Set the value of the GuC load timeout"
>> +        depends on DRM_I915_OVERRIDE_TIMEOUTS
>
> ... and this depends line...
>
>> +        default 100
>> +        range 0 10000
>> +        help
>> +      Set this option to select the value of the timeout in ms for
>> how long
>> +      the GuC FW load should take.
>> +
>> +      The valid range is 0 to 10000
>> +
>> +      The default timeout will work in normal use. This option is
>> provided
>> +      for debug.
>> +
>> +config DRM_I915_TIMEOUT_GUC_REQUEST
>> +    int "Set the value of the GuC request timeout"
>> +        depends on DRM_I915_OVERRIDE_TIMEOUTS
>
> ... and this one...
>
>> +    default 10
>> +    range 0 1000
>> +    help
>> +          Set this option to select the value of the timeout in ms
>> for how long
>> +      a request to the GuC should take.
>> +
>> +      The valid range is 0 to 1000
>> +
>> +      The default timeout will work in normal use. This option is
>> provided
>> +      for debug.
>> diff --git a/drivers/gpu/drm/i915/i915_drv.h
>> b/drivers/gpu/drm/i915/i915_drv.h
>> index 38ef734..efc56d2 100644
>> --- a/drivers/gpu/drm/i915/i915_drv.h
>> +++ b/drivers/gpu/drm/i915/i915_drv.h
>> @@ -1488,6 +1488,19 @@ struct drm_i915_error_state_buf {
>>   #define I915_ENGINE_DEAD_TIMEOUT  (4 * HZ)  /* Seqno, head and
>> subunits dead */
>>   #define I915_SEQNO_DEAD_TIMEOUT   (12 * HZ) /* Seqno dead with
>> active head */
>>   +#ifndef CONFIG_DRM_I915_TIMEOUT_GUC_LOAD
>> +#define DRM_I915_TIMEOUT_GUC_LOAD 100
>> +#else
>> +#define DRM_I915_TIMEOUT_GUC_LOAD CONFIG_DRM_I915_TIMEOUT_GUC_LOAD
>> +#endif
>> +
>> +#ifndef CONFIG_DRM_I915_TIMEOUT_GUC_REQUEST
>> +#define DRM_I915_TIMEOUT_GUC_REQUEST 10
>> +#else
>> +#define DRM_I915_TIMEOUT_GUC_REQUEST CONFIG_DRM_I915_TIMEOUT_GUC_REQUEST
>> +#endif
>> +
>> +
>
> ... and this whole block ...
>
>>   struct i915_gpu_error {
>>       /* For hangcheck timer */
>>   #define DRM_I915_HANGCHECK_PERIOD 1500 /* in ms */
>> diff --git a/drivers/gpu/drm/i915/intel_guc_loader.c
>> b/drivers/gpu/drm/i915/intel_guc_loader.c
>> index 8b0ae7f..0d7abad 100644
>> --- a/drivers/gpu/drm/i915/intel_guc_loader.c
>> +++ b/drivers/gpu/drm/i915/intel_guc_loader.c
>> @@ -235,7 +235,8 @@ static int guc_ucode_xfer_dma(struct
>> drm_i915_private *dev_priv,
>>        * (Higher levels of the driver will attempt to fall back to
>>        * execlist mode if this happens.)
>>        */
>> -    ret = wait_for(guc_ucode_response(dev_priv, &status), 100);
>> +    ret = wait_for(guc_ucode_response(dev_priv, &status),
>> +            DRM_I915_TIMEOUT_GUC_LOAD);
>
> ... and use CONFIG_DRM_I915_TIMEOUT_GUC_LOAD directly here ...
>
>>         DRM_DEBUG_DRIVER("DMA status 0x%x, GuC status 0x%x\n",
>>               I915_READ(DMA_CTRL), status);
>> diff --git a/drivers/gpu/drm/i915/intel_uc.c
>> b/drivers/gpu/drm/i915/intel_uc.c
>> index 27e072c..de34119 100644
>> --- a/drivers/gpu/drm/i915/intel_uc.c
>> +++ b/drivers/gpu/drm/i915/intel_uc.c
>> @@ -501,7 +501,10 @@ int intel_guc_send_mmio(struct intel_guc *guc,
>> const u32 *action, u32 len)
>>                          guc_send_reg(guc, 0),
>>                          INTEL_GUC_RECV_MASK,
>>                          INTEL_GUC_RECV_MASK,
>> -                       10, 10, &status);
>> +                       10,
>> +                       DRM_I915_TIMEOUT_GUC_REQUEST,
>
> ... and the same here respectively, then the patch becomes somewhat
> shorter.

Agreed. I went with this implementation after some discussion with others.
I'll send a version with the changes you suggest, and we can see which 
seems cleaner.

> Question is whether that would be worth it, or having an explicit master
> toggle is more desirable?
>
> Since both timeout options provide defaults, and they are under the
> debug submenu already, I thought we could get away with less. Especially
> the #ifdef block in i915_drv.h I think is desirable to avoid if we can.
>
> Regards,
>
> Tvrtko
>
>> +                       &status);
>> +
>>       if (status != INTEL_GUC_STATUS_SUCCESS) {
>>           /*
>>            * Either the GuC explicitly returned an error (which
>>


More information about the Intel-gfx mailing list