Re: [Intel-gfx] [PATCH 27/43] drm/i915/bdw: Render state init for Execlists

2014-08-25 Thread Daniel Vetter
On Wed, Aug 20, 2014 at 03:55:42PM +, Daniel, Thomas wrote:
> 
> 
> > -Original Message-
> > From: Daniel, Thomas
> > Sent: Friday, August 15, 2014 9:44 AM
> > To: 'Daniel Vetter'
> > Cc: intel-gfx@lists.freedesktop.org
> > Subject: RE: [Intel-gfx] [PATCH 27/43] drm/i915/bdw: Render state init for
> > Execlists
> > 
> > 
> > 
> > > -Original Message-
> > > From: Daniel Vetter [mailto:daniel.vet...@ffwll.ch] On Behalf Of
> > > Daniel Vetter
> > > Sent: Thursday, August 14, 2014 9:00 PM
> > > To: Daniel, Thomas
> > > Cc: Daniel Vetter; intel-gfx@lists.freedesktop.org
> > > Subject: Re: [Intel-gfx] [PATCH 27/43] drm/i915/bdw: Render state init
> > > for Execlists
> > >
> > > On Wed, Aug 13, 2014 at 05:30:07PM +0200, Daniel Vetter wrote:
> > > > On Wed, Aug 13, 2014 at 03:07:29PM +, Daniel, Thomas wrote:
> > > > > > -Original Message-
> > > > > > From: Daniel Vetter [mailto:daniel.vet...@ffwll.ch] On Behalf Of
> > > > > > Daniel Vetter
> > > > > > Sent: Monday, August 11, 2014 10:25 PM
> > > > > > To: Daniel, Thomas
> > > > > > Cc: intel-gfx@lists.freedesktop.org
> > > > > > Subject: Re: [Intel-gfx] [PATCH 27/43] drm/i915/bdw: Render
> > > > > > state init for Execlists
> > > > > >
> > > > > > On Thu, Jul 24, 2014 at 05:04:35PM +0100, Thomas Daniel wrote:
> > > > > > > From: Oscar Mateo 
> > > >  > > index 9085ff1..0dc6992 100644
> > > > > > > --- a/drivers/gpu/drm/i915/i915_gem_context.c
> > > > > > > +++ b/drivers/gpu/drm/i915/i915_gem_context.c
> > > > > > > @@ -513,8 +513,23 @@ int i915_gem_context_enable(struct
> > > > > > drm_i915_private *dev_priv)
> > > > > > >   ppgtt->enable(ppgtt);
> > > > > > >   }
> > > > > > >
> > > > > > > - if (i915.enable_execlists)
> > > > > > > + if (i915.enable_execlists) {
> > > > > > > + struct intel_context *dctx;
> > > > > > > +
> > > > > > > + ring = &dev_priv->ring[RCS];
> > > > > > > + dctx = ring->default_context;
> > > > > > > +
> > > > > > > + if (!dctx->rcs_initialized) {
> > > > > > > + ret = intel_lr_context_render_state_init(ring,
> > > dctx);
> > > > > > > + if (ret) {
> > > > > > > + DRM_ERROR("Init render state failed:
> > > %d\n",
> > > > > > ret);
> > > > > > > + return ret;
> > > > > > > + }
> > > > > > > + dctx->rcs_initialized = true;
> > > > > > > + }
> > > > > > > +
> > > > > > >   return 0;
> > > > > > > + }
> > > > > >
> > > > > > This looks very much like the wrong place. We should init the
> > > > > > render state when we create the context, or when we switch to it
> > > > > > for
> > > the first time.
> > > > > > The later is what the legacy contexts currently do in do_switch.
> > > > > >
> > > > > > But ctx_enable should do the switch to the default context and
> > > > > > that's about
> > > > > Well, a side-effect of switching to the default context in legacy
> > > > > mode is that the render state gets initialized.  I could move the
> > > > > lr render state init call into an enable_execlists branch in
> > > > > i915_switch_context() but that doen't seem like the right place.
> > > > >
> > > > > How about in i915_gem_init() after calling i915_gem_init_hw()?
> > > > >
> > > > > > it. If there's some depency then I guess we should stall the
> > > > > > creation of the default context a bit, maybe.
> > > > > >
> > > > > > In any case someone needs to explain this better and if there's
> > > > > > not other wey this at least needs a bit comment. So I'll punt for 
> > > > > > now.
> > &

Re: [Intel-gfx] [PATCH 27/43] drm/i915/bdw: Render state init for Execlists

2014-08-20 Thread Daniel, Thomas


> -Original Message-
> From: Daniel, Thomas
> Sent: Friday, August 15, 2014 9:44 AM
> To: 'Daniel Vetter'
> Cc: intel-gfx@lists.freedesktop.org
> Subject: RE: [Intel-gfx] [PATCH 27/43] drm/i915/bdw: Render state init for
> Execlists
> 
> 
> 
> > -Original Message-
> > From: Daniel Vetter [mailto:daniel.vet...@ffwll.ch] On Behalf Of
> > Daniel Vetter
> > Sent: Thursday, August 14, 2014 9:00 PM
> > To: Daniel, Thomas
> > Cc: Daniel Vetter; intel-gfx@lists.freedesktop.org
> > Subject: Re: [Intel-gfx] [PATCH 27/43] drm/i915/bdw: Render state init
> > for Execlists
> >
> > On Wed, Aug 13, 2014 at 05:30:07PM +0200, Daniel Vetter wrote:
> > > On Wed, Aug 13, 2014 at 03:07:29PM +, Daniel, Thomas wrote:
> > > > > -Original Message-
> > > > > From: Daniel Vetter [mailto:daniel.vet...@ffwll.ch] On Behalf Of
> > > > > Daniel Vetter
> > > > > Sent: Monday, August 11, 2014 10:25 PM
> > > > > To: Daniel, Thomas
> > > > > Cc: intel-gfx@lists.freedesktop.org
> > > > > Subject: Re: [Intel-gfx] [PATCH 27/43] drm/i915/bdw: Render
> > > > > state init for Execlists
> > > > >
> > > > > On Thu, Jul 24, 2014 at 05:04:35PM +0100, Thomas Daniel wrote:
> > > > > > From: Oscar Mateo 
> > >  > > index 9085ff1..0dc6992 100644
> > > > > > --- a/drivers/gpu/drm/i915/i915_gem_context.c
> > > > > > +++ b/drivers/gpu/drm/i915/i915_gem_context.c
> > > > > > @@ -513,8 +513,23 @@ int i915_gem_context_enable(struct
> > > > > drm_i915_private *dev_priv)
> > > > > > ppgtt->enable(ppgtt);
> > > > > > }
> > > > > >
> > > > > > -   if (i915.enable_execlists)
> > > > > > +   if (i915.enable_execlists) {
> > > > > > +   struct intel_context *dctx;
> > > > > > +
> > > > > > +   ring = &dev_priv->ring[RCS];
> > > > > > +   dctx = ring->default_context;
> > > > > > +
> > > > > > +   if (!dctx->rcs_initialized) {
> > > > > > +   ret = intel_lr_context_render_state_init(ring,
> > dctx);
> > > > > > +   if (ret) {
> > > > > > +   DRM_ERROR("Init render state failed:
> > %d\n",
> > > > > ret);
> > > > > > +   return ret;
> > > > > > +   }
> > > > > > +   dctx->rcs_initialized = true;
> > > > > > +   }
> > > > > > +
> > > > > > return 0;
> > > > > > +   }
> > > > >
> > > > > This looks very much like the wrong place. We should init the
> > > > > render state when we create the context, or when we switch to it
> > > > > for
> > the first time.
> > > > > The later is what the legacy contexts currently do in do_switch.
> > > > >
> > > > > But ctx_enable should do the switch to the default context and
> > > > > that's about
> > > > Well, a side-effect of switching to the default context in legacy
> > > > mode is that the render state gets initialized.  I could move the
> > > > lr render state init call into an enable_execlists branch in
> > > > i915_switch_context() but that doen't seem like the right place.
> > > >
> > > > How about in i915_gem_init() after calling i915_gem_init_hw()?
> > > >
> > > > > it. If there's some depency then I guess we should stall the
> > > > > creation of the default context a bit, maybe.
> > > > >
> > > > > In any case someone needs to explain this better and if there's
> > > > > not other wey this at least needs a bit comment. So I'll punt for now.
> > > > When the default context is created the driver is not ready to
> > > > execute a batch.  That is why the render state init can't be done then.
> > >
> > > That sounds like the default context is created too early.
> > > Essentially I want to avoid needless divergence between the default
> > > context and normal contexts, because sooner or later that will means
> > > someone will creep in with a _really_ subtle bug.

Re: [Intel-gfx] [PATCH 27/43] drm/i915/bdw: Render state init for Execlists

2014-08-15 Thread Daniel, Thomas


> -Original Message-
> From: Daniel Vetter [mailto:daniel.vet...@ffwll.ch] On Behalf Of Daniel
> Vetter
> Sent: Thursday, August 14, 2014 9:00 PM
> To: Daniel, Thomas
> Cc: Daniel Vetter; intel-gfx@lists.freedesktop.org
> Subject: Re: [Intel-gfx] [PATCH 27/43] drm/i915/bdw: Render state init for
> Execlists
> 
> On Wed, Aug 13, 2014 at 05:30:07PM +0200, Daniel Vetter wrote:
> > On Wed, Aug 13, 2014 at 03:07:29PM +, Daniel, Thomas wrote:
> > > > -Original Message-
> > > > From: Daniel Vetter [mailto:daniel.vet...@ffwll.ch] On Behalf Of
> > > > Daniel Vetter
> > > > Sent: Monday, August 11, 2014 10:25 PM
> > > > To: Daniel, Thomas
> > > > Cc: intel-gfx@lists.freedesktop.org
> > > > Subject: Re: [Intel-gfx] [PATCH 27/43] drm/i915/bdw: Render state
> > > > init for Execlists
> > > >
> > > > On Thu, Jul 24, 2014 at 05:04:35PM +0100, Thomas Daniel wrote:
> > > > > From: Oscar Mateo 
> >  > > index 9085ff1..0dc6992 100644
> > > > > --- a/drivers/gpu/drm/i915/i915_gem_context.c
> > > > > +++ b/drivers/gpu/drm/i915/i915_gem_context.c
> > > > > @@ -513,8 +513,23 @@ int i915_gem_context_enable(struct
> > > > drm_i915_private *dev_priv)
> > > > >   ppgtt->enable(ppgtt);
> > > > >   }
> > > > >
> > > > > - if (i915.enable_execlists)
> > > > > + if (i915.enable_execlists) {
> > > > > + struct intel_context *dctx;
> > > > > +
> > > > > + ring = &dev_priv->ring[RCS];
> > > > > + dctx = ring->default_context;
> > > > > +
> > > > > + if (!dctx->rcs_initialized) {
> > > > > + ret = intel_lr_context_render_state_init(ring,
> dctx);
> > > > > + if (ret) {
> > > > > + DRM_ERROR("Init render state failed:
> %d\n",
> > > > ret);
> > > > > + return ret;
> > > > > + }
> > > > > + dctx->rcs_initialized = true;
> > > > > + }
> > > > > +
> > > > >   return 0;
> > > > > + }
> > > >
> > > > This looks very much like the wrong place. We should init the
> > > > render state when we create the context, or when we switch to it for
> the first time.
> > > > The later is what the legacy contexts currently do in do_switch.
> > > >
> > > > But ctx_enable should do the switch to the default context and
> > > > that's about
> > > Well, a side-effect of switching to the default context in legacy
> > > mode is that the render state gets initialized.  I could move the lr
> > > render state init call into an enable_execlists branch in
> > > i915_switch_context() but that doen't seem like the right place.
> > >
> > > How about in i915_gem_init() after calling i915_gem_init_hw()?
> > >
> > > > it. If there's some depency then I guess we should stall the
> > > > creation of the default context a bit, maybe.
> > > >
> > > > In any case someone needs to explain this better and if there's
> > > > not other wey this at least needs a bit comment. So I'll punt for now.
> > > When the default context is created the driver is not ready to
> > > execute a batch.  That is why the render state init can't be done then.
> >
> > That sounds like the default context is created too early. Essentially
> > I want to avoid needless divergence between the default context and
> > normal contexts, because sooner or later that will means someone will
> > creep in with a _really_ subtle bug.
> >
> > What about:
> > - We create the default lrc contexs in context_init, but like with a
> >   normal context we don't do any of the deferred setup.
> > - In context_enable (which since yesterday properly propagates errors to
> >   callers) we force the deferred lrc ctx setup for the default contexts on
> >   all engines.
> > - The render state init is done as part of the deferred ctx setup for the
> >   render engine in all cases.
> >
> > Totally off the track or do you see a workable solution somewhere in
> > that direction?
> 
> I'd like to discuss this first a bit more, so will punt on this patch for now.
> -Daniel
I think that your proposal will work.  I've been having some trouble
with my RVP board so haven't had a chance to test it out yet.

Thomas.
> --
> Daniel Vetter
> Software Engineer, Intel Corporation
> +41 (0) 79 365 57 48 - http://blog.ffwll.ch
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH 27/43] drm/i915/bdw: Render state init for Execlists

2014-08-14 Thread Daniel Vetter
On Wed, Aug 13, 2014 at 05:30:07PM +0200, Daniel Vetter wrote:
> On Wed, Aug 13, 2014 at 03:07:29PM +, Daniel, Thomas wrote:
> > > -Original Message-
> > > From: Daniel Vetter [mailto:daniel.vet...@ffwll.ch] On Behalf Of Daniel
> > > Vetter
> > > Sent: Monday, August 11, 2014 10:25 PM
> > > To: Daniel, Thomas
> > > Cc: intel-gfx@lists.freedesktop.org
> > > Subject: Re: [Intel-gfx] [PATCH 27/43] drm/i915/bdw: Render state init for
> > > Execlists
> > > 
> > > On Thu, Jul 24, 2014 at 05:04:35PM +0100, Thomas Daniel wrote:
> > > > From: Oscar Mateo 
>  > > index 9085ff1..0dc6992 100644
> > > > --- a/drivers/gpu/drm/i915/i915_gem_context.c
> > > > +++ b/drivers/gpu/drm/i915/i915_gem_context.c
> > > > @@ -513,8 +513,23 @@ int i915_gem_context_enable(struct
> > > drm_i915_private *dev_priv)
> > > > ppgtt->enable(ppgtt);
> > > > }
> > > >
> > > > -   if (i915.enable_execlists)
> > > > +   if (i915.enable_execlists) {
> > > > +   struct intel_context *dctx;
> > > > +
> > > > +   ring = &dev_priv->ring[RCS];
> > > > +   dctx = ring->default_context;
> > > > +
> > > > +   if (!dctx->rcs_initialized) {
> > > > +   ret = intel_lr_context_render_state_init(ring, 
> > > > dctx);
> > > > +   if (ret) {
> > > > +   DRM_ERROR("Init render state failed: 
> > > > %d\n",
> > > ret);
> > > > +   return ret;
> > > > +   }
> > > > +   dctx->rcs_initialized = true;
> > > > +   }
> > > > +
> > > > return 0;
> > > > +   }
> > > 
> > > This looks very much like the wrong place. We should init the render state
> > > when we create the context, or when we switch to it for the first time.
> > > The later is what the legacy contexts currently do in do_switch.
> > > 
> > > But ctx_enable should do the switch to the default context and that's 
> > > about
> > Well, a side-effect of switching to the default context in legacy mode is 
> > that
> > the render state gets initialized.  I could move the lr render state init 
> > call
> > into an enable_execlists branch in i915_switch_context() but that doen't
> > seem like the right place.
> > 
> > How about in i915_gem_init() after calling i915_gem_init_hw()?
> > 
> > > it. If there's some depency then I guess we should stall the creation of 
> > > the
> > > default context a bit, maybe.
> > > 
> > > In any case someone needs to explain this better and if there's not other
> > > wey this at least needs a bit comment. So I'll punt for now.
> > When the default context is created the driver is not ready to execute a
> > batch.  That is why the render state init can't be done then.
> 
> That sounds like the default context is created too early. Essentially I
> want to avoid needless divergence between the default context and normal
> contexts, because sooner or later that will means someone will creep in
> with a _really_ subtle bug.
> 
> What about:
> - We create the default lrc contexs in context_init, but like with a
>   normal context we don't do any of the deferred setup.
> - In context_enable (which since yesterday properly propagates errors to
>   callers) we force the deferred lrc ctx setup for the default contexts on
>   all engines.
> - The render state init is done as part of the deferred ctx setup for the
>   render engine in all cases.
> 
> Totally off the track or do you see a workable solution somewhere in that
> direction?

I'd like to discuss this first a bit more, so will punt on this patch for
now.
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH 27/43] drm/i915/bdw: Render state init for Execlists

2014-08-13 Thread Daniel Vetter
On Wed, Aug 13, 2014 at 03:07:29PM +, Daniel, Thomas wrote:
> > -Original Message-
> > From: Daniel Vetter [mailto:daniel.vet...@ffwll.ch] On Behalf Of Daniel
> > Vetter
> > Sent: Monday, August 11, 2014 10:25 PM
> > To: Daniel, Thomas
> > Cc: intel-gfx@lists.freedesktop.org
> > Subject: Re: [Intel-gfx] [PATCH 27/43] drm/i915/bdw: Render state init for
> > Execlists
> > 
> > On Thu, Jul 24, 2014 at 05:04:35PM +0100, Thomas Daniel wrote:
> > > From: Oscar Mateo 
 > > index 9085ff1..0dc6992 100644
> > > --- a/drivers/gpu/drm/i915/i915_gem_context.c
> > > +++ b/drivers/gpu/drm/i915/i915_gem_context.c
> > > @@ -513,8 +513,23 @@ int i915_gem_context_enable(struct
> > drm_i915_private *dev_priv)
> > >   ppgtt->enable(ppgtt);
> > >   }
> > >
> > > - if (i915.enable_execlists)
> > > + if (i915.enable_execlists) {
> > > + struct intel_context *dctx;
> > > +
> > > + ring = &dev_priv->ring[RCS];
> > > + dctx = ring->default_context;
> > > +
> > > + if (!dctx->rcs_initialized) {
> > > + ret = intel_lr_context_render_state_init(ring, dctx);
> > > + if (ret) {
> > > + DRM_ERROR("Init render state failed: %d\n",
> > ret);
> > > + return ret;
> > > + }
> > > + dctx->rcs_initialized = true;
> > > + }
> > > +
> > >   return 0;
> > > + }
> > 
> > This looks very much like the wrong place. We should init the render state
> > when we create the context, or when we switch to it for the first time.
> > The later is what the legacy contexts currently do in do_switch.
> > 
> > But ctx_enable should do the switch to the default context and that's about
> Well, a side-effect of switching to the default context in legacy mode is that
> the render state gets initialized.  I could move the lr render state init call
> into an enable_execlists branch in i915_switch_context() but that doen't
> seem like the right place.
> 
> How about in i915_gem_init() after calling i915_gem_init_hw()?
> 
> > it. If there's some depency then I guess we should stall the creation of the
> > default context a bit, maybe.
> > 
> > In any case someone needs to explain this better and if there's not other
> > wey this at least needs a bit comment. So I'll punt for now.
> When the default context is created the driver is not ready to execute a
> batch.  That is why the render state init can't be done then.

That sounds like the default context is created too early. Essentially I
want to avoid needless divergence between the default context and normal
contexts, because sooner or later that will means someone will creep in
with a _really_ subtle bug.

What about:
- We create the default lrc contexs in context_init, but like with a
  normal context we don't do any of the deferred setup.
- In context_enable (which since yesterday properly propagates errors to
  callers) we force the deferred lrc ctx setup for the default contexts on
  all engines.
- The render state init is done as part of the deferred ctx setup for the
  render engine in all cases.

Totally off the track or do you see a workable solution somewhere in that
direction?

Cheers, Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH 27/43] drm/i915/bdw: Render state init for Execlists

2014-08-13 Thread Daniel, Thomas


> -Original Message-
> From: Daniel Vetter [mailto:daniel.vet...@ffwll.ch] On Behalf Of Daniel
> Vetter
> Sent: Monday, August 11, 2014 10:25 PM
> To: Daniel, Thomas
> Cc: intel-gfx@lists.freedesktop.org
> Subject: Re: [Intel-gfx] [PATCH 27/43] drm/i915/bdw: Render state init for
> Execlists
> 
> On Thu, Jul 24, 2014 at 05:04:35PM +0100, Thomas Daniel wrote:
> > From: Oscar Mateo 
> >
> > The batchbuffer that sets the render context state is submitted in a
> > different way, and from different places.
> >
> > We needed to make both the render state preparation and free functions
> > outside accesible, and namespace accordingly. This mess is so that all
> > LR, LRC and Execlists functionality can go together in intel_lrc.c: we
> > can fix all of this later on, once the interfaces are clear.
> >
> > v2: Create a separate ctx->rcs_initialized for the Execlists case, as
> > suggested by Chris Wilson.
> >
> > Signed-off-by: Oscar Mateo 
> > ---
> >  drivers/gpu/drm/i915/i915_drv.h  |4 +--
> >  drivers/gpu/drm/i915/i915_gem_context.c  |   17 +-
> >  drivers/gpu/drm/i915/i915_gem_render_state.c |   40 ++--
> --
> >  drivers/gpu/drm/i915/i915_gem_render_state.h |   47
> ++
> >  drivers/gpu/drm/i915/intel_lrc.c |   46
> +
> >  drivers/gpu/drm/i915/intel_lrc.h |2 ++
> >  drivers/gpu/drm/i915/intel_renderstate.h |8 +
> >  7 files changed, 139 insertions(+), 25 deletions(-)  create mode
> > 100644 drivers/gpu/drm/i915/i915_gem_render_state.h
> >
> > diff --git a/drivers/gpu/drm/i915/i915_drv.h
> > b/drivers/gpu/drm/i915/i915_drv.h index 4303e2c..b7cf0ec 100644
> > --- a/drivers/gpu/drm/i915/i915_drv.h
> > +++ b/drivers/gpu/drm/i915/i915_drv.h
> > @@ -37,6 +37,7 @@
> >  #include "intel_ringbuffer.h"
> >  #include "intel_lrc.h"
> >  #include "i915_gem_gtt.h"
> > +#include "i915_gem_render_state.h"
> >  #include 
> >  #include 
> >  #include 
> > @@ -623,6 +624,7 @@ struct intel_context {
> > } legacy_hw_ctx;
> >
> > /* Execlists */
> > +   bool rcs_initialized;
> > struct {
> > struct drm_i915_gem_object *state;
> > struct intel_ringbuffer *ringbuf;
> > @@ -2553,8 +2555,6 @@ int i915_gem_context_create_ioctl(struct
> > drm_device *dev, void *data,  int i915_gem_context_destroy_ioctl(struct
> drm_device *dev, void *data,
> >struct drm_file *file);
> >
> > -/* i915_gem_render_state.c */
> > -int i915_gem_render_state_init(struct intel_engine_cs *ring);
> >  /* i915_gem_evict.c */
> >  int __must_check i915_gem_evict_something(struct drm_device *dev,
> >   struct i915_address_space *vm, diff
> --git
> > a/drivers/gpu/drm/i915/i915_gem_context.c
> > b/drivers/gpu/drm/i915/i915_gem_context.c
> > index 9085ff1..0dc6992 100644
> > --- a/drivers/gpu/drm/i915/i915_gem_context.c
> > +++ b/drivers/gpu/drm/i915/i915_gem_context.c
> > @@ -513,8 +513,23 @@ int i915_gem_context_enable(struct
> drm_i915_private *dev_priv)
> > ppgtt->enable(ppgtt);
> > }
> >
> > -   if (i915.enable_execlists)
> > +   if (i915.enable_execlists) {
> > +   struct intel_context *dctx;
> > +
> > +   ring = &dev_priv->ring[RCS];
> > +   dctx = ring->default_context;
> > +
> > +   if (!dctx->rcs_initialized) {
> > +   ret = intel_lr_context_render_state_init(ring, dctx);
> > +   if (ret) {
> > +   DRM_ERROR("Init render state failed: %d\n",
> ret);
> > +   return ret;
> > +   }
> > +   dctx->rcs_initialized = true;
> > +   }
> > +
> > return 0;
> > +   }
> 
> This looks very much like the wrong place. We should init the render state
> when we create the context, or when we switch to it for the first time.
> The later is what the legacy contexts currently do in do_switch.
> 
> But ctx_enable should do the switch to the default context and that's about
Well, a side-effect of switching to the default context in legacy mode is that
the render state gets initialized.  I could move the lr render state init call
into an enable_execlists branch in i915_switch_context() but that doen't
seem like the right place.

Re: [Intel-gfx] [PATCH 27/43] drm/i915/bdw: Render state init for Execlists

2014-08-11 Thread Daniel Vetter
On Thu, Jul 24, 2014 at 05:04:35PM +0100, Thomas Daniel wrote:
> From: Oscar Mateo 
> 
> The batchbuffer that sets the render context state is submitted
> in a different way, and from different places.
> 
> We needed to make both the render state preparation and free functions
> outside accesible, and namespace accordingly. This mess is so that all
> LR, LRC and Execlists functionality can go together in intel_lrc.c: we
> can fix all of this later on, once the interfaces are clear.
> 
> v2: Create a separate ctx->rcs_initialized for the Execlists case, as
> suggested by Chris Wilson.
> 
> Signed-off-by: Oscar Mateo 
> ---
>  drivers/gpu/drm/i915/i915_drv.h  |4 +--
>  drivers/gpu/drm/i915/i915_gem_context.c  |   17 +-
>  drivers/gpu/drm/i915/i915_gem_render_state.c |   40 ++
>  drivers/gpu/drm/i915/i915_gem_render_state.h |   47 
> ++
>  drivers/gpu/drm/i915/intel_lrc.c |   46 +
>  drivers/gpu/drm/i915/intel_lrc.h |2 ++
>  drivers/gpu/drm/i915/intel_renderstate.h |8 +
>  7 files changed, 139 insertions(+), 25 deletions(-)
>  create mode 100644 drivers/gpu/drm/i915/i915_gem_render_state.h
> 
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 4303e2c..b7cf0ec 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -37,6 +37,7 @@
>  #include "intel_ringbuffer.h"
>  #include "intel_lrc.h"
>  #include "i915_gem_gtt.h"
> +#include "i915_gem_render_state.h"
>  #include 
>  #include 
>  #include 
> @@ -623,6 +624,7 @@ struct intel_context {
>   } legacy_hw_ctx;
>  
>   /* Execlists */
> + bool rcs_initialized;
>   struct {
>   struct drm_i915_gem_object *state;
>   struct intel_ringbuffer *ringbuf;
> @@ -2553,8 +2555,6 @@ int i915_gem_context_create_ioctl(struct drm_device 
> *dev, void *data,
>  int i915_gem_context_destroy_ioctl(struct drm_device *dev, void *data,
>  struct drm_file *file);
>  
> -/* i915_gem_render_state.c */
> -int i915_gem_render_state_init(struct intel_engine_cs *ring);
>  /* i915_gem_evict.c */
>  int __must_check i915_gem_evict_something(struct drm_device *dev,
> struct i915_address_space *vm,
> diff --git a/drivers/gpu/drm/i915/i915_gem_context.c 
> b/drivers/gpu/drm/i915/i915_gem_context.c
> index 9085ff1..0dc6992 100644
> --- a/drivers/gpu/drm/i915/i915_gem_context.c
> +++ b/drivers/gpu/drm/i915/i915_gem_context.c
> @@ -513,8 +513,23 @@ int i915_gem_context_enable(struct drm_i915_private 
> *dev_priv)
>   ppgtt->enable(ppgtt);
>   }
>  
> - if (i915.enable_execlists)
> + if (i915.enable_execlists) {
> + struct intel_context *dctx;
> +
> + ring = &dev_priv->ring[RCS];
> + dctx = ring->default_context;
> +
> + if (!dctx->rcs_initialized) {
> + ret = intel_lr_context_render_state_init(ring, dctx);
> + if (ret) {
> + DRM_ERROR("Init render state failed: %d\n", 
> ret);
> + return ret;
> + }
> + dctx->rcs_initialized = true;
> + }
> +
>   return 0;
> + }

This looks very much like the wrong place. We should init the render state
when we create the context, or when we switch to it for the first time.
The later is what the legacy contexts currently do in do_switch.

But ctx_enable should do the switch to the default context and that's
about it. If there's some depency then I guess we should stall the
creation of the default context a bit, maybe.

In any case someone needs to explain this better and if there's not other
wey this at least needs a bit comment. So I'll punt for now.
-Daniel
 
>  
>   /* FIXME: We should make this work, even in reset */
>   if (i915_reset_in_progress(&dev_priv->gpu_error))
> diff --git a/drivers/gpu/drm/i915/i915_gem_render_state.c 
> b/drivers/gpu/drm/i915/i915_gem_render_state.c
> index e60be3f..a9a62d7 100644
> --- a/drivers/gpu/drm/i915/i915_gem_render_state.c
> +++ b/drivers/gpu/drm/i915/i915_gem_render_state.c
> @@ -28,13 +28,6 @@
>  #include "i915_drv.h"
>  #include "intel_renderstate.h"
>  
> -struct render_state {
> - const struct intel_renderstate_rodata *rodata;
> - struct drm_i915_gem_object *obj;
> - u64 ggtt_offset;
> - int gen;
> -};
> -
>  static const struct intel_renderstate_rodata *
>  render_state_get_rodata(struct drm_device *dev, const int gen)
>  {
> @@ -127,30 +120,47 @@ static int render_state_setup(struct render_state *so)
>   return 0;
>  }
>  
> -static void render_state_fini(struct render_state *so)
> +void i915_gem_render_state_fini(struct render_state *so)
>  {
>   i915_gem_object_ggtt_unpin(so->obj);
>   drm_gem_object_unreference(&so->obj->base);
>  }

[Intel-gfx] [PATCH 27/43] drm/i915/bdw: Render state init for Execlists

2014-07-24 Thread Thomas Daniel
From: Oscar Mateo 

The batchbuffer that sets the render context state is submitted
in a different way, and from different places.

We needed to make both the render state preparation and free functions
outside accesible, and namespace accordingly. This mess is so that all
LR, LRC and Execlists functionality can go together in intel_lrc.c: we
can fix all of this later on, once the interfaces are clear.

v2: Create a separate ctx->rcs_initialized for the Execlists case, as
suggested by Chris Wilson.

Signed-off-by: Oscar Mateo 
---
 drivers/gpu/drm/i915/i915_drv.h  |4 +--
 drivers/gpu/drm/i915/i915_gem_context.c  |   17 +-
 drivers/gpu/drm/i915/i915_gem_render_state.c |   40 ++
 drivers/gpu/drm/i915/i915_gem_render_state.h |   47 ++
 drivers/gpu/drm/i915/intel_lrc.c |   46 +
 drivers/gpu/drm/i915/intel_lrc.h |2 ++
 drivers/gpu/drm/i915/intel_renderstate.h |8 +
 7 files changed, 139 insertions(+), 25 deletions(-)
 create mode 100644 drivers/gpu/drm/i915/i915_gem_render_state.h

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 4303e2c..b7cf0ec 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -37,6 +37,7 @@
 #include "intel_ringbuffer.h"
 #include "intel_lrc.h"
 #include "i915_gem_gtt.h"
+#include "i915_gem_render_state.h"
 #include 
 #include 
 #include 
@@ -623,6 +624,7 @@ struct intel_context {
} legacy_hw_ctx;
 
/* Execlists */
+   bool rcs_initialized;
struct {
struct drm_i915_gem_object *state;
struct intel_ringbuffer *ringbuf;
@@ -2553,8 +2555,6 @@ int i915_gem_context_create_ioctl(struct drm_device *dev, 
void *data,
 int i915_gem_context_destroy_ioctl(struct drm_device *dev, void *data,
   struct drm_file *file);
 
-/* i915_gem_render_state.c */
-int i915_gem_render_state_init(struct intel_engine_cs *ring);
 /* i915_gem_evict.c */
 int __must_check i915_gem_evict_something(struct drm_device *dev,
  struct i915_address_space *vm,
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c 
b/drivers/gpu/drm/i915/i915_gem_context.c
index 9085ff1..0dc6992 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -513,8 +513,23 @@ int i915_gem_context_enable(struct drm_i915_private 
*dev_priv)
ppgtt->enable(ppgtt);
}
 
-   if (i915.enable_execlists)
+   if (i915.enable_execlists) {
+   struct intel_context *dctx;
+
+   ring = &dev_priv->ring[RCS];
+   dctx = ring->default_context;
+
+   if (!dctx->rcs_initialized) {
+   ret = intel_lr_context_render_state_init(ring, dctx);
+   if (ret) {
+   DRM_ERROR("Init render state failed: %d\n", 
ret);
+   return ret;
+   }
+   dctx->rcs_initialized = true;
+   }
+
return 0;
+   }
 
/* FIXME: We should make this work, even in reset */
if (i915_reset_in_progress(&dev_priv->gpu_error))
diff --git a/drivers/gpu/drm/i915/i915_gem_render_state.c 
b/drivers/gpu/drm/i915/i915_gem_render_state.c
index e60be3f..a9a62d7 100644
--- a/drivers/gpu/drm/i915/i915_gem_render_state.c
+++ b/drivers/gpu/drm/i915/i915_gem_render_state.c
@@ -28,13 +28,6 @@
 #include "i915_drv.h"
 #include "intel_renderstate.h"
 
-struct render_state {
-   const struct intel_renderstate_rodata *rodata;
-   struct drm_i915_gem_object *obj;
-   u64 ggtt_offset;
-   int gen;
-};
-
 static const struct intel_renderstate_rodata *
 render_state_get_rodata(struct drm_device *dev, const int gen)
 {
@@ -127,30 +120,47 @@ static int render_state_setup(struct render_state *so)
return 0;
 }
 
-static void render_state_fini(struct render_state *so)
+void i915_gem_render_state_fini(struct render_state *so)
 {
i915_gem_object_ggtt_unpin(so->obj);
drm_gem_object_unreference(&so->obj->base);
 }
 
-int i915_gem_render_state_init(struct intel_engine_cs *ring)
+int i915_gem_render_state_prepare(struct intel_engine_cs *ring,
+ struct render_state *so)
 {
-   struct render_state so;
int ret;
 
if (WARN_ON(ring->id != RCS))
return -ENOENT;
 
-   ret = render_state_init(&so, ring->dev);
+   ret = render_state_init(so, ring->dev);
if (ret)
return ret;
 
-   if (so.rodata == NULL)
+   if (so->rodata == NULL)
return 0;
 
-   ret = render_state_setup(&so);
+   ret = render_state_setup(so);
+   if (ret) {
+   i915_gem_render_state_fini(so);
+   return ret;
+   }
+
+   return 0;
+}
+
+int i915_gem_re