From b565cd211f6c3925db7c9361788ec6a6bce028ba Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Thu, 27 Mar 2014 09:55:23 +0000 Subject: [PATCH] pnv-fake-ctx --- drivers/gpu/drm/i915/i915_gem_context.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c index 021e21223c9c..ccac3173144b 100644 --- a/drivers/gpu/drm/i915/i915_gem_context.c +++ b/drivers/gpu/drm/i915/i915_gem_context.c @@ -417,24 +417,22 @@ int i915_gem_context_init(struct drm_device *dev) struct intel_ring_buffer *ring; int i; - if (!HAS_HW_CONTEXTS(dev)) - return 0; - /* Init should only be called once per module load. Eventually the * restriction on the context_disabled check can be loosened. */ if (WARN_ON(dev_priv->ring[RCS].default_context)) return 0; - dev_priv->hw_context_size = round_up(get_context_size(dev), 4096); + if (HAS_HW_CONTEXTS(dev)) { + dev_priv->hw_context_size = round_up(get_context_size(dev), 4096); - if (dev_priv->hw_context_size > (1<<20)) { - DRM_DEBUG_DRIVER("Disabling HW Contexts; invalid size\n"); - return -E2BIG; + if (dev_priv->hw_context_size > (1<<20)) { + DRM_DEBUG_DRIVER("Disabling HW Contexts; invalid size\n"); + return -E2BIG; + } } dev_priv->ring[RCS].default_context = i915_gem_create_context(dev, NULL, USES_PPGTT(dev)); - if (IS_ERR_OR_NULL(dev_priv->ring[RCS].default_context)) { DRM_DEBUG_DRIVER("Disabling HW Contexts; create failed %ld\n", PTR_ERR(dev_priv->ring[RCS].default_context)); @@ -451,7 +449,7 @@ int i915_gem_context_init(struct drm_device *dev) ring->default_context = dev_priv->ring[RCS].default_context; } - DRM_DEBUG_DRIVER("HW context support initialized\n"); + DRM_DEBUG_DRIVER("%s context support initialized\n", HAS_HW_CONTEXTS(dev) ? "HW" : "hangstats"); return 0; } @@ -506,9 +504,6 @@ int i915_gem_context_enable(struct drm_i915_private *dev_priv) struct intel_ring_buffer *ring; int ret, i; - if (!HAS_HW_CONTEXTS(dev_priv->dev)) - return 0; - /* This is the only place the aliasing PPGTT gets enabled, which means * it has to happen before we bail on reset */ if (dev_priv->mm.aliasing_ppgtt) { @@ -833,7 +828,13 @@ int i915_switch_context(struct intel_ring_buffer *ring, /* We have the fake context */ if (!HAS_HW_CONTEXTS(ring->dev)) { - ring->last_context = to; + if (to != ring->last_context) { + if (to) + i915_gem_context_reference(to); + if (ring->last_context) + i915_gem_context_unreference(ring->last_context); + ring->last_context = to; + } return 0; } -- 1.9.1