@@ -1319,16 +1319,21 @@ i915_dispatch_execbuffer(struct intel_engine *ring,
static void cleanup_status_page(struct intel_engine *ring)
{
+ struct drm_i915_private *dev_priv = to_i915(ring->dev);
struct drm_i915_gem_object *obj;
obj = ring->status_page.obj;
if (obj == NULL)
return;
+ ring->status_page.obj = NULL;
kunmap(sg_page(obj->pages->sgl));
+
+ if (dev_priv->lrc_enabled)
+ return;
+
i915_gem_object_ggtt_unpin(obj);
drm_gem_object_unreference(&obj->base);
- ring->status_page.obj = NULL;
}
static int init_status_page(struct intel_engine *ring)
@@ -1455,15 +1460,22 @@ static int intel_init_ring(struct drm_device *dev,
init_waitqueue_head(&ring->irq_queue);
if (dev_priv->lrc_enabled) {
+ struct drm_i915_gem_object *obj;
+
ret = gen8_create_lr_context(ring->default_context, ring, NULL);
if (ret) {
DRM_ERROR("Create LR context for %s failed: %d\n",
ring->name, ret);
return ret;
}
- }
- if (I915_NEED_GFX_HWS(dev)) {
+ obj = ring->default_context->engine[ring->id].obj;
+ ring->status_page.gfx_addr = i915_gem_obj_ggtt_offset(obj);
+ ring->status_page.page_addr = kmap(sg_page(obj->pages->sgl));
+ if (ring->status_page.page_addr == NULL)
+ return -ENOMEM;
+ ring->status_page.obj = obj;
+ } else if (I915_NEED_GFX_HWS(dev)) {
ret = init_status_page(ring);
if (ret)
return ret;