On Tue, 2014-07-01 at 09:26 -0600, Vivi, Rodrigo wrote: > It seems the flexibility on rings is more wanted and needed than I imagined. > Please ignore this patch here... > > I liked both execution flag or debugfs, but exec flag would cover this case > of different applications using different command streamers. > > With flags Would it be something like: > Execution without flag = ping-pong > Flag BSD1 use only VCS1 > Flag BSD2 use only VCS2 >
IMO the execution flag looks reasonable. It can cover the flexibility of different applications. In such case it can determine which ring is used to dispatch command at runtime. > Haihao, what do you think? > > With debugfs would be something like i195_dual_bsd_ring file with 3 options: > all bsd1 bsd2 > > Thanks, > Rodrigo. > > -----Original Message----- > From: Zhao, Yakui > Sent: Monday, June 30, 2014 6:37 PM > To: Vivi, Rodrigo > Cc: intel-gfx@lists.freedesktop.org > Subject: Re: [Intel-gfx] [PATCH 2/3] drm/i915: Introduce dual_bsd_ring > parameter. > > On Mon, 2014-06-30 at 10:51 -0600, 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. > > If it is mainly used for the test/validation, can we add one override flag > so that the user-space app can explicitly declare which BSD ring is used to > dispatch the corresponding BSD commands? In such case it will force to > dispatch the corresponding commands on the ring passed by user-application. > > At the same time this patch is not helpful under the following scenario. > For example: One application hopes to use the BSD Ring 0 while another > application hopes to use the BSD ring 1. > > > > > Signed-off-by: Rodrigo Vivi <rodrigo.v...@intel.com> > > --- > > 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 Intel-gfx@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/intel-gfx