On Mon, 2014-06-30 at 09:51 -0700, Rodrigo Vivi wrote:
> On Broadwell GT3 we have 2 Video Command Streamers (VCS),
> but userspace has no control when using VCS1 or VCS2. So we cannot test,
> validate or debug specific changes or workaround that might affect only
> one or another ring. So this patch introduces a mechanism to avoid the
> ping-pong selection and use one specific ring given at boot time.

Hi, rodrigo

Could you use a mechanism to specify the ring at runtime ? If so, it is
flexible for us to use VCS ?

Thanks
Haihao

> 
> Signed-off-by: Rodrigo Vivi <[email protected]>
> ---
>  drivers/gpu/drm/i915/i915_drv.h            |  1 +
>  drivers/gpu/drm/i915/i915_gem_execbuffer.c | 34 
> ++++++++++++++++++------------
>  drivers/gpu/drm/i915/i915_params.c         |  6 ++++++
>  3 files changed, 27 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 8cea596..7b6614f 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -2069,6 +2069,7 @@ struct i915_params {
>       int panel_ignore_lid;
>       unsigned int powersave;
>       int semaphores;
> +     int dual_bsd_ring;
>       unsigned int lvds_downclock;
>       int lvds_channel_mode;
>       int panel_use_ssc;
> diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c 
> b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> index d815ef5..09f350e 100644
> --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> @@ -1035,26 +1035,32 @@ static int gen8_dispatch_bsd_ring(struct drm_device 
> *dev,
>  {
>       struct drm_i915_private *dev_priv = dev->dev_private;
>       struct drm_i915_file_private *file_priv = file->driver_priv;
> +     int ring_id;
> +     int dual = i915.dual_bsd_ring;
>  
>       /* Check whether the file_priv is using one ring */
>       if (file_priv->bsd_ring)
>               return file_priv->bsd_ring->id;
> -     else {
> -             /* If no, use the ping-pong mechanism to select one ring */
> -             int ring_id;
>  
> -             mutex_lock(&dev->struct_mutex);
> -             if (dev_priv->mm.bsd_ring_dispatch_index == 0) {
> -                     ring_id = VCS;
> -                     dev_priv->mm.bsd_ring_dispatch_index = 1;
> -             } else {
> -                     ring_id = VCS2;
> -                     dev_priv->mm.bsd_ring_dispatch_index = 0;
> -             }
> -             file_priv->bsd_ring = &dev_priv->ring[ring_id];
> -             mutex_unlock(&dev->struct_mutex);
> -             return ring_id;
> +     /* If no, use the parameter defined or ping-pong mechanism
> +      * to select one ring */
> +     mutex_lock(&dev->struct_mutex);
> +
> +     if (dual == 1 || (dual != 2 &&
> +                       dev_priv->mm.bsd_ring_dispatch_index == 0)) {
> +             ring_id = VCS;
> +             dev_priv->mm.bsd_ring_dispatch_index = 1;
> +     } else {
> +             ring_id = VCS2;
> +             dev_priv->mm.bsd_ring_dispatch_index = 0;
>       }
> +
> +     file_priv->bsd_ring = &dev_priv->ring[ring_id];
> +     mutex_unlock(&dev->struct_mutex);
> +
> +     WARN(dual, "Forcibly trying to use only one bsd ring. Using: %s\n",
> +          file_priv->bsd_ring->name);
> +     return ring_id;
>  }
>  
>  static struct drm_i915_gem_object *
> diff --git a/drivers/gpu/drm/i915/i915_params.c 
> b/drivers/gpu/drm/i915/i915_params.c
> index 8145729..d4871c8 100644
> --- a/drivers/gpu/drm/i915/i915_params.c
> +++ b/drivers/gpu/drm/i915/i915_params.c
> @@ -29,6 +29,7 @@ struct i915_params i915 __read_mostly = {
>       .panel_ignore_lid = 1,
>       .powersave = 1,
>       .semaphores = -1,
> +     .dual_bsd_ring = 0,
>       .lvds_downclock = 0,
>       .lvds_channel_mode = 0,
>       .panel_use_ssc = -1,
> @@ -70,6 +71,11 @@ MODULE_PARM_DESC(semaphores,
>       "Use semaphores for inter-ring sync "
>       "(default: -1 (use per-chip defaults))");
>  
> +module_param_named(dual_bsd_ring, i915.dual_bsd_ring, int, 0600);
> +MODULE_PARM_DESC(dual_bsd_ring,
> +      "Specify bds rings for VCS when there are multiple VCSs available."
> +      "(0=All available bsd rings [default], 1=only VCS1, 2=only VCS2)");
> +
>  module_param_named(enable_rc6, i915.enable_rc6, int, 0400);
>  MODULE_PARM_DESC(enable_rc6,
>       "Enable power-saving render C-state 6. "


_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to