[PATCH 2/2] guc
Chris Wilson
chris at chris-wilson.co.uk
Wed Nov 16 16:03:45 UTC 2016
---
drivers/gpu/drm/i915/i915_guc_submission.c | 43 +++++++++++++-----------------
1 file changed, 19 insertions(+), 24 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_guc_submission.c b/drivers/gpu/drm/i915/i915_guc_submission.c
index 4462112725ef..13e5500867ca 100644
--- a/drivers/gpu/drm/i915/i915_guc_submission.c
+++ b/drivers/gpu/drm/i915/i915_guc_submission.c
@@ -1482,6 +1482,7 @@ int i915_guc_submission_init(struct drm_i915_private *dev_priv)
const size_t poolsize = GUC_MAX_GPU_CONTEXTS * ctxsize;
const size_t gemsize = round_up(poolsize, PAGE_SIZE);
struct intel_guc *guc = &dev_priv->guc;
+ struct i915_guc_client *client;
struct i915_vma *vma;
/* Wipe bitmap & delete client in case of reinitialisation */
@@ -1504,6 +1505,17 @@ int i915_guc_submission_init(struct drm_i915_private *dev_priv)
guc_log_create(guc);
guc_addon_create(guc);
+ client = guc_client_alloc(dev_priv,
+ INTEL_INFO(dev_priv)->ring_mask,
+ GUC_CTX_PRIORITY_KMD_NORMAL,
+ dev_priv->kernel_context);
+ if (!client) {
+ DRM_ERROR("Failed to create normal GuC client!\n");
+ return -ENOMEM;
+ }
+
+ guc->execbuf_client = client;
+
return 0;
}
@@ -1511,22 +1523,11 @@ int i915_guc_submission_enable(struct drm_i915_private *dev_priv)
{
struct intel_guc *guc = &dev_priv->guc;
struct drm_i915_gem_request *request;
- struct i915_guc_client *client;
struct intel_engine_cs *engine;
enum intel_engine_id id;
/* client for execbuf submission */
- client = guc_client_alloc(dev_priv,
- INTEL_INFO(dev_priv)->ring_mask,
- GUC_CTX_PRIORITY_KMD_NORMAL,
- dev_priv->kernel_context);
- if (!client) {
- DRM_ERROR("Failed to create normal GuC client!\n");
- return -ENOMEM;
- }
-
- guc->execbuf_client = client;
- host2guc_sample_forcewake(guc, client);
+ host2guc_sample_forcewake(guc, guc->execbuf_client);
guc_init_doorbell_hw(guc);
/* Take over from manual control of ELSP (execlists) */
@@ -1535,12 +1536,9 @@ int i915_guc_submission_enable(struct drm_i915_private *dev_priv)
engine->schedule = NULL;
/* Replay the current set of previously submitted requests */
- list_for_each_entry(request,
- &engine->timeline->requests, link) {
- client->wq_rsvd += sizeof(struct guc_wq_item);
+ list_for_each_entry(request, &engine->timeline->requests, link)
if (i915_sw_fence_done(&request->submit))
i915_guc_submit(request);
- }
}
return 0;
@@ -1548,21 +1546,18 @@ int i915_guc_submission_enable(struct drm_i915_private *dev_priv)
void i915_guc_submission_disable(struct drm_i915_private *dev_priv)
{
- struct intel_guc *guc = &dev_priv->guc;
-
- if (!guc->execbuf_client)
- return;
-
/* Revert back to manual ELSP submission */
intel_execlists_enable_submission(dev_priv);
-
- guc_client_free(dev_priv, guc->execbuf_client);
- guc->execbuf_client = NULL;
}
void i915_guc_submission_fini(struct drm_i915_private *dev_priv)
{
struct intel_guc *guc = &dev_priv->guc;
+ struct i915_guc_client *gc;
+
+ gc = fetch_and_zero(&guc->execbuf_client);
+ if (gc)
+ guc_client_free(dev_priv, gc);
i915_vma_unpin_and_release(&guc->ads_vma);
i915_vma_unpin_and_release(&guc->log.vma);
--
2.10.2
More information about the Intel-gfx-trybot
mailing list