[PATCH 08/10] ce-active
Chris Wilson
chris at chris-wilson.co.uk
Tue Sep 4 18:22:04 UTC 2018
---
drivers/gpu/drm/i915/i915_gem_context.c | 41 +++++++++++--------------
drivers/gpu/drm/i915/i915_gem_context.h | 2 ++
2 files changed, 20 insertions(+), 23 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
index b1e0c008bfa0..2f2e4b2509c4 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -265,6 +265,14 @@ static u32 default_desc_template(const struct drm_i915_private *i915,
return desc;
}
+static void intel_context_retire(struct i915_gem_active *active,
+ struct i915_request *rq)
+{
+ struct intel_context *ce = container_of(active, typeof(*ce), active);
+
+ intel_context_unpin(ce);
+}
+
static struct i915_gem_context *
__create_hw_context(struct drm_i915_private *dev_priv,
struct drm_i915_file_private *file_priv)
@@ -294,6 +302,8 @@ __create_hw_context(struct drm_i915_private *dev_priv,
ce->gem_context = ctx;
/* Use the whole device by default */
ce->sseu = intel_device_default_sseu(dev_priv);
+
+ init_request_active(&ce->active, intel_context_retire);
}
INIT_RADIX_TREE(&ctx->handles_vma, GFP_KERNEL);
@@ -874,42 +884,21 @@ static int gen8_emit_rpcs_config(struct i915_request *rq,
struct intel_context *ce,
struct intel_sseu sseu)
{
- struct drm_i915_private *i915 = rq->i915;
- struct i915_vma *vma;
u64 offset;
u32 *cs;
- int err;
-
- vma = i915_vma_instance(ce->state->obj, &i915->ggtt.vm, NULL);
- if (IS_ERR(vma))
- return PTR_ERR(vma);
-
- err = i915_vma_pin(vma, 0, 0, PIN_GLOBAL);
- if (err) {
- i915_vma_close(vma);
- return err;
- }
-
- err = i915_vma_move_to_active(vma, rq, EXEC_OBJECT_WRITE);
- if (unlikely(err)) {
- i915_vma_close(vma);
- return err;
- }
-
- i915_vma_unpin(vma);
cs = intel_ring_begin(rq, 4);
if (IS_ERR(cs))
return PTR_ERR(cs);
- offset = vma->node.start +
+ offset = ce->state->node.start +
LRC_STATE_PN * PAGE_SIZE +
(CTX_R_PWR_CLK_STATE + 1) * 4;
*cs++ = MI_STORE_DWORD_IMM_GEN4 | MI_USE_GGTT;
*cs++ = lower_32_bits(offset);
*cs++ = upper_32_bits(offset);
- *cs++ = gen8_make_rpcs(i915, &sseu);
+ *cs++ = gen8_make_rpcs(rq->i915, &sseu);
intel_ring_advance(rq, cs);
@@ -930,6 +919,8 @@ gen8_modify_rpcs_gpu(struct intel_context *ce,
/* Submitting requests etc needs the hw awake. */
intel_runtime_pm_get(i915);
+ __intel_context_pin(ce);
+
rq = i915_request_alloc(engine, i915->kernel_context);
if (IS_ERR(rq)) {
ret = PTR_ERR(rq);
@@ -951,6 +942,10 @@ gen8_modify_rpcs_gpu(struct intel_context *ce,
/* Order all following requests to be after. */
i915_timeline_set_barrier(ce->ring->timeline, rq);
+ if (i915_gem_active_isset(&ce->active))
+ intel_context_unpin(ce);
+ i915_gem_active_set(&ce->active, rq);
+
out_add:
i915_request_add(rq);
out_put:
diff --git a/drivers/gpu/drm/i915/i915_gem_context.h b/drivers/gpu/drm/i915/i915_gem_context.h
index 1e51c2a46644..a9662d7c7ad4 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.h
+++ b/drivers/gpu/drm/i915/i915_gem_context.h
@@ -157,6 +157,8 @@ struct i915_gem_context {
u64 lrc_desc;
int pin_count;
+ struct i915_gem_active active;
+
const struct intel_context_ops *ops;
/** sseu: Control eu/slice partitioning */
--
2.19.0.rc1
More information about the Intel-gfx-trybot
mailing list