From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Xiang, Haihao" Subject: Re: [PATCH 2/3] drm/i915: Introduce dual_bsd_ring parameter. Date: Tue, 01 Jul 2014 09:23:18 +0800 Message-ID: <1404177798.10782.28.camel@xhh-u64> References: <1404147071-2911-1-git-send-email-rodrigo.vivi@intel.com> <1404147071-2911-2-git-send-email-rodrigo.vivi@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mga03.intel.com (mga03.intel.com [143.182.124.21]) by gabe.freedesktop.org (Postfix) with ESMTP id 92CF26E0C0 for ; Mon, 30 Jun 2014 18:28:12 -0700 (PDT) In-Reply-To: <1404147071-2911-2-git-send-email-rodrigo.vivi@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Rodrigo Vivi Cc: intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org 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 > --- > 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. "