Re: [Intel-gfx] [PATCH 27/43] drm/i915/bdw: Render state init for Execlists
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
> -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
> -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
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
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
> -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
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
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