mirror of
https://github.com/torvalds/linux.git
synced 2026-06-04 04:23:35 +02:00
drm/i915/bdw: Don't execute context reset and switch with Execlists
These two functions make no sense in an Logical Ring Context & Execlists world. v2: We got rid of lrc_enabled and centralized everything in the sanitized i915.enable_execlists instead. Signed-off-by: Oscar Mateo <oscar.mateo@intel.com> v3: Rebased. Corrected a typo in comment for i915_switch_context and added a comment that it should not be called in execlist mode. Added WARN_ON if i915_switch_context is called in execlist mode. Moved check for execlist mode out of i915_switch_context and into callers. Added comment in context_reset explaining why nothing is done in execlist mode. Signed-off-by: Thomas Daniel <thomas.daniel@intel.com> [danvet: Simplify the patch subject so I can understand it.] Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
9a2d2d8708
commit
ecdb5fd861
|
|
@ -2985,9 +2985,11 @@ int i915_gpu_idle(struct drm_device *dev)
|
||||||
|
|
||||||
/* Flush everything onto the inactive list. */
|
/* Flush everything onto the inactive list. */
|
||||||
for_each_ring(ring, dev_priv, i) {
|
for_each_ring(ring, dev_priv, i) {
|
||||||
ret = i915_switch_context(ring, ring->default_context);
|
if (!i915.enable_execlists) {
|
||||||
if (ret)
|
ret = i915_switch_context(ring, ring->default_context);
|
||||||
return ret;
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
ret = intel_ring_idle(ring);
|
ret = intel_ring_idle(ring);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|
|
||||||
|
|
@ -289,6 +289,12 @@ void i915_gem_context_reset(struct drm_device *dev)
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
/* In execlists mode we will unreference the context when the execlist
|
||||||
|
* queue is cleared and the requests destroyed.
|
||||||
|
*/
|
||||||
|
if (i915.enable_execlists)
|
||||||
|
return;
|
||||||
|
|
||||||
for (i = 0; i < I915_NUM_RINGS; i++) {
|
for (i = 0; i < I915_NUM_RINGS; i++) {
|
||||||
struct intel_engine_cs *ring = &dev_priv->ring[i];
|
struct intel_engine_cs *ring = &dev_priv->ring[i];
|
||||||
struct intel_context *lctx = ring->last_context;
|
struct intel_context *lctx = ring->last_context;
|
||||||
|
|
@ -397,6 +403,9 @@ int i915_gem_context_enable(struct drm_i915_private *dev_priv)
|
||||||
|
|
||||||
BUG_ON(!dev_priv->ring[RCS].default_context);
|
BUG_ON(!dev_priv->ring[RCS].default_context);
|
||||||
|
|
||||||
|
if (i915.enable_execlists)
|
||||||
|
return 0;
|
||||||
|
|
||||||
for_each_ring(ring, dev_priv, i) {
|
for_each_ring(ring, dev_priv, i) {
|
||||||
ret = i915_switch_context(ring, ring->default_context);
|
ret = i915_switch_context(ring, ring->default_context);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|
@ -639,14 +648,19 @@ static int do_switch(struct intel_engine_cs *ring,
|
||||||
*
|
*
|
||||||
* The context life cycle is simple. The context refcount is incremented and
|
* The context life cycle is simple. The context refcount is incremented and
|
||||||
* decremented by 1 and create and destroy. If the context is in use by the GPU,
|
* decremented by 1 and create and destroy. If the context is in use by the GPU,
|
||||||
* it will have a refoucnt > 1. This allows us to destroy the context abstract
|
* it will have a refcount > 1. This allows us to destroy the context abstract
|
||||||
* object while letting the normal object tracking destroy the backing BO.
|
* object while letting the normal object tracking destroy the backing BO.
|
||||||
|
*
|
||||||
|
* This function should not be used in execlists mode. Instead the context is
|
||||||
|
* switched by writing to the ELSP and requests keep a reference to their
|
||||||
|
* context.
|
||||||
*/
|
*/
|
||||||
int i915_switch_context(struct intel_engine_cs *ring,
|
int i915_switch_context(struct intel_engine_cs *ring,
|
||||||
struct intel_context *to)
|
struct intel_context *to)
|
||||||
{
|
{
|
||||||
struct drm_i915_private *dev_priv = ring->dev->dev_private;
|
struct drm_i915_private *dev_priv = ring->dev->dev_private;
|
||||||
|
|
||||||
|
WARN_ON(i915.enable_execlists);
|
||||||
WARN_ON(!mutex_is_locked(&dev_priv->dev->struct_mutex));
|
WARN_ON(!mutex_is_locked(&dev_priv->dev->struct_mutex));
|
||||||
|
|
||||||
if (to->legacy_hw_ctx.rcs_state == NULL) { /* We have the fake context */
|
if (to->legacy_hw_ctx.rcs_state == NULL) { /* We have the fake context */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user