All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
To: yu.dai@intel.com, intel-gfx@lists.freedesktop.org
Cc: daniel.vetter@ffwll.ch
Subject: Re: [PATCH v2] drm/i915/guc: Decouple GuC engine id from ring id
Date: Mon, 25 Jan 2016 10:32:30 +0000	[thread overview]
Message-ID: <56A5F9BE.4020607@linux.intel.com> (raw)
In-Reply-To: <1453579094-29860-1-git-send-email-yu.dai@intel.com>


On 23/01/16 19:58, yu.dai@intel.com wrote:
> From: Alex Dai <yu.dai@intel.com>
>
> Previously GuC uses ring id as engine id because of same definition.
> But this is not true since this commit:
>
> commit de1add360522c876c25ef2bbbbab1c94bdb509ab
> Author: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> Date:   Fri Jan 15 15:12:50 2016 +0000
>
>      drm/i915: Decouple execbuf uAPI from internal implementation
>
> Added GuC engine id into GuC interface to decouple it from ring id used
> by driver.
>
> v2: Keep ring name print out in debugfs; using for_each_ring() where
>      possible to keep driver consistent. (Chris W.)
>
> Signed-off-by: Alex Dai <yu.dai@intel.com>
> ---
>   drivers/gpu/drm/i915/i915_debugfs.c        | 12 +++++-----
>   drivers/gpu/drm/i915/i915_guc_submission.c | 38 ++++++++++++++----------------
>   drivers/gpu/drm/i915/intel_guc.h           |  6 ++---
>   drivers/gpu/drm/i915/intel_guc_fwif.h      | 17 +++++++++----
>   drivers/gpu/drm/i915/intel_lrc.c           |  5 ++++
>   drivers/gpu/drm/i915/intel_ringbuffer.h    |  1 +
>   6 files changed, 45 insertions(+), 34 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
> index c5db235..cea1844 100644
> --- a/drivers/gpu/drm/i915/i915_debugfs.c
> +++ b/drivers/gpu/drm/i915/i915_debugfs.c
> @@ -2463,9 +2463,9 @@ static void i915_guc_client_info(struct seq_file *m,
>
>   	for_each_ring(ring, dev_priv, i) {
>   		seq_printf(m, "\tSubmissions: %llu %s\n",
> -				client->submissions[i],
> +				client->submissions[ring->guc_id],
>   				ring->name);
> -		tot += client->submissions[i];
> +		tot += client->submissions[ring->guc_id];
>   	}
>   	seq_printf(m, "\tTotal: %llu\n", tot);
>   }
> @@ -2502,10 +2502,10 @@ static int i915_guc_info(struct seq_file *m, void *data)
>
>   	seq_printf(m, "\nGuC submissions:\n");
>   	for_each_ring(ring, dev_priv, i) {
> -		seq_printf(m, "\t%-24s: %10llu, last seqno 0x%08x %9d\n",
> -			ring->name, guc.submissions[i],
> -			guc.last_seqno[i], guc.last_seqno[i]);
> -		total += guc.submissions[i];
> +		seq_printf(m, "\t%-24s: %10llu, last seqno 0x%08x\n",
> +			ring->name, guc.submissions[ring->guc_id],
> +			guc.last_seqno[ring->guc_id]);
> +		total += guc.submissions[ring->guc_id];
>   	}
>   	seq_printf(m, "\t%s: %llu\n", "Total", total);
>
> diff --git a/drivers/gpu/drm/i915/i915_guc_submission.c b/drivers/gpu/drm/i915/i915_guc_submission.c
> index 51ae5c1..b4da20f 100644
> --- a/drivers/gpu/drm/i915/i915_guc_submission.c
> +++ b/drivers/gpu/drm/i915/i915_guc_submission.c
> @@ -376,6 +376,8 @@ static void guc_init_proc_desc(struct intel_guc *guc,
>   static void guc_init_ctx_desc(struct intel_guc *guc,
>   			      struct i915_guc_client *client)
>   {
> +	struct drm_i915_private *dev_priv = guc_to_i915(guc);
> +	struct intel_engine_cs *ring;
>   	struct intel_context *ctx = client->owner;
>   	struct guc_context_desc desc;
>   	struct sg_table *sg;
> @@ -388,10 +390,8 @@ static void guc_init_ctx_desc(struct intel_guc *guc,
>   	desc.priority = client->priority;
>   	desc.db_id = client->doorbell_id;
>
> -	for (i = 0; i < I915_NUM_RINGS; i++) {
> -		struct guc_execlist_context *lrc = &desc.lrc[i];
> -		struct intel_ringbuffer *ringbuf = ctx->engine[i].ringbuf;
> -		struct intel_engine_cs *ring;
> +	for_each_ring(ring, dev_priv, i) {
> +		struct guc_execlist_context *lrc = &desc.lrc[ring->guc_id];
>   		struct drm_i915_gem_object *obj;
>   		uint64_t ctx_desc;
>
> @@ -406,7 +406,6 @@ static void guc_init_ctx_desc(struct intel_guc *guc,
>   		if (!obj)
>   			break;	/* XXX: continue? */
>
> -		ring = ringbuf->ring;
>   		ctx_desc = intel_lr_context_descriptor(ctx, ring);
>   		lrc->context_desc = (u32)ctx_desc;
>
> @@ -414,16 +413,16 @@ static void guc_init_ctx_desc(struct intel_guc *guc,
>   		lrc->ring_lcra = i915_gem_obj_ggtt_offset(obj) +
>   				LRC_STATE_PN * PAGE_SIZE;
>   		lrc->context_id = (client->ctx_index << GUC_ELC_CTXID_OFFSET) |
> -				(ring->id << GUC_ELC_ENGINE_OFFSET);
> +				(ring->guc_id << GUC_ELC_ENGINE_OFFSET);
>
> -		obj = ringbuf->obj;
> +		obj = ctx->engine[i].ringbuf->obj;
>
>   		lrc->ring_begin = i915_gem_obj_ggtt_offset(obj);
>   		lrc->ring_end = lrc->ring_begin + obj->base.size - 1;
>   		lrc->ring_next_free_location = lrc->ring_begin;
>   		lrc->ring_current_tail_pointer_value = 0;
>
> -		desc.engines_used |= (1 << ring->id);
> +		desc.engines_used |= (1 << ring->guc_id);
>   	}
>
>   	WARN_ON(desc.engines_used == 0);
> @@ -510,7 +509,6 @@ int i915_guc_wq_check_space(struct i915_guc_client *gc)
>   static int guc_add_workqueue_item(struct i915_guc_client *gc,
>   				  struct drm_i915_gem_request *rq)
>   {
> -	enum intel_ring_id ring_id = rq->ring->id;
>   	struct guc_wq_item *wqi;
>   	void *base;
>   	u32 tail, wq_len, wq_off, space;
> @@ -544,7 +542,7 @@ static int guc_add_workqueue_item(struct i915_guc_client *gc,
>   	wq_len = sizeof(struct guc_wq_item) / sizeof(u32) - 1;
>   	wqi->header = WQ_TYPE_INORDER |
>   			(wq_len << WQ_LEN_SHIFT) |
> -			(ring_id << WQ_TARGET_SHIFT) |
> +			(rq->ring->guc_id << WQ_TARGET_SHIFT) |
>   			WQ_NO_WCFLUSH_WAIT;
>
>   	/* The GuC wants only the low-order word of the context descriptor */
> @@ -594,7 +592,7 @@ int i915_guc_submit(struct i915_guc_client *client,
>   		    struct drm_i915_gem_request *rq)
>   {
>   	struct intel_guc *guc = client->guc;
> -	enum intel_ring_id ring_id = rq->ring->id;
> +	unsigned int engine_id = rq->ring->guc_id;
>   	int q_ret, b_ret;
>
>   	/* Need this because of the deferred pin ctx and ring */
> @@ -605,7 +603,7 @@ int i915_guc_submit(struct i915_guc_client *client,
>   	if (q_ret == 0)
>   		b_ret = guc_ring_doorbell(client);
>
> -	client->submissions[ring_id] += 1;
> +	client->submissions[engine_id] += 1;
>   	if (q_ret) {
>   		client->q_fail += 1;
>   		client->retcode = q_ret;
> @@ -615,8 +613,8 @@ int i915_guc_submit(struct i915_guc_client *client,
>   	} else {
>   		client->retcode = 0;
>   	}
> -	guc->submissions[ring_id] += 1;
> -	guc->last_seqno[ring_id] = rq->seqno;
> +	guc->submissions[engine_id] += 1;
> +	guc->last_seqno[engine_id] = rq->seqno;
>
>   	return q_ret;
>   }
> @@ -848,7 +846,7 @@ static void init_guc_policies(struct guc_policies *policies)
>   	policies->max_num_work_items = POLICY_MAX_NUM_WI;
>
>   	for (p = 0; p < GUC_CTX_PRIORITY_NUM; p++) {
> -		for (i = 0; i < I915_NUM_RINGS; i++) {
> +		for (i = GUC_RENDER_ENGINE; i < GUC_MAX_ENGINES_NUM; i++) {
>   			policy = &policies->policy[p][i];
>
>   			policy->execution_quantum = 1000000;
> @@ -900,7 +898,7 @@ static void guc_create_ads(struct intel_guc *guc)
>   	ads->golden_context_lrca = ring->status_page.gfx_addr;
>
>   	for_each_ring(ring, dev_priv, i)
> -		ads->eng_state_size[i] = intel_lr_context_size(ring);
> +		ads->eng_state_size[ring->guc_id] = intel_lr_context_size(ring);
>
>   	/* GuC scheduling policies */
>   	policies = (void *)ads + sizeof(struct guc_ads);
> @@ -912,12 +910,12 @@ static void guc_create_ads(struct intel_guc *guc)
>   	/* MMIO reg state */
>   	reg_state = (void *)policies + sizeof(struct guc_policies);
>
> -	for (i = 0; i < I915_NUM_RINGS; i++) {
> -		reg_state->mmio_white_list[i].mmio_start =
> -			dev_priv->ring[i].mmio_base + GUC_MMIO_WHITE_LIST_START;
> +	for_each_ring(ring, dev_priv, i) {
> +		reg_state->mmio_white_list[ring->guc_id].mmio_start =
> +			ring->mmio_base + GUC_MMIO_WHITE_LIST_START;
>
>   		/* Nothing to be saved or restored for now. */
> -		reg_state->mmio_white_list[i].count = 0;
> +		reg_state->mmio_white_list[ring->guc_id].count = 0;
>   	}
>
>   	ads->reg_state_addr = ads->scheduler_policies +
> diff --git a/drivers/gpu/drm/i915/intel_guc.h b/drivers/gpu/drm/i915/intel_guc.h
> index 045b149..73002e9 100644
> --- a/drivers/gpu/drm/i915/intel_guc.h
> +++ b/drivers/gpu/drm/i915/intel_guc.h
> @@ -46,7 +46,7 @@ struct i915_guc_client {
>   	uint32_t wq_head;
>
>   	/* GuC submission statistics & status */
> -	uint64_t submissions[I915_NUM_RINGS];
> +	uint64_t submissions[GUC_MAX_ENGINES_NUM];
>   	uint32_t q_fail;
>   	uint32_t b_fail;
>   	int retcode;
> @@ -106,8 +106,8 @@ struct intel_guc {
>   	uint32_t action_fail;		/* Total number of failures	*/
>   	int32_t action_err;		/* Last error code		*/
>
> -	uint64_t submissions[I915_NUM_RINGS];
> -	uint32_t last_seqno[I915_NUM_RINGS];
> +	uint64_t submissions[GUC_MAX_ENGINES_NUM];
> +	uint32_t last_seqno[GUC_MAX_ENGINES_NUM];
>   };
>
>   /* intel_guc_loader.c */
> diff --git a/drivers/gpu/drm/i915/intel_guc_fwif.h b/drivers/gpu/drm/i915/intel_guc_fwif.h
> index 1856a47..2de57ff 100644
> --- a/drivers/gpu/drm/i915/intel_guc_fwif.h
> +++ b/drivers/gpu/drm/i915/intel_guc_fwif.h
> @@ -44,6 +44,13 @@
>   #define GUC_MAX_GPU_CONTEXTS		1024
>   #define	GUC_INVALID_CTX_ID		GUC_MAX_GPU_CONTEXTS
>
> +#define GUC_RENDER_ENGINE		0
> +#define GUC_VIDEO_ENGINE		1
> +#define GUC_BLITTER_ENGINE		2
> +#define GUC_VIDEOENHANCE_ENGINE		3
> +#define GUC_VIDEO_ENGINE2		4
> +#define GUC_MAX_ENGINES_NUM		(GUC_VIDEO_ENGINE2 + 1)
> +
>   /* Work queue item header definitions */
>   #define WQ_STATUS_ACTIVE		1
>   #define WQ_STATUS_SUSPENDED		2
> @@ -285,7 +292,7 @@ struct guc_context_desc {
>   	u64 db_trigger_phy;
>   	u16 db_id;
>
> -	struct guc_execlist_context lrc[I915_NUM_RINGS];
> +	struct guc_execlist_context lrc[GUC_MAX_ENGINES_NUM];
>
>   	u8 attribute;
>
> @@ -344,7 +351,7 @@ struct guc_policy {
>   } __packed;
>
>   struct guc_policies {
> -	struct guc_policy policy[GUC_CTX_PRIORITY_NUM][I915_NUM_RINGS];
> +	struct guc_policy policy[GUC_CTX_PRIORITY_NUM][GUC_MAX_ENGINES_NUM];
>
>   	/* In micro seconds. How much time to allow before DPC processing is
>   	 * called back via interrupt (to prevent DPC queue drain starving).
> @@ -388,14 +395,14 @@ struct guc_mmio_regset {
>
>   struct guc_mmio_reg_state {
>   	struct guc_mmio_regset global_reg;
> -	struct guc_mmio_regset engine_reg[I915_NUM_RINGS];
> +	struct guc_mmio_regset engine_reg[GUC_MAX_ENGINES_NUM];
>
>   	/* MMIO registers that are set as non privileged */
>   	struct __packed {
>   		u32 mmio_start;
>   		u32 offsets[GUC_MMIO_WHITE_LIST_MAX];
>   		u32 count;
> -	} mmio_white_list[I915_NUM_RINGS];
> +	} mmio_white_list[GUC_MAX_ENGINES_NUM];
>   } __packed;
>
>   /* GuC Additional Data Struct */
> @@ -406,7 +413,7 @@ struct guc_ads {
>   	u32 golden_context_lrca;
>   	u32 scheduler_policies;
>   	u32 reserved0[3];
> -	u32 eng_state_size[I915_NUM_RINGS];
> +	u32 eng_state_size[GUC_MAX_ENGINES_NUM];
>   	u32 reserved2[4];
>   } __packed;
>
> diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
> index 73d4347..efb91ad 100644
> --- a/drivers/gpu/drm/i915/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/intel_lrc.c
> @@ -2086,6 +2086,7 @@ static int logical_render_ring_init(struct drm_device *dev)
>   	ring->name = "render ring";
>   	ring->id = RCS;
>   	ring->exec_id = I915_EXEC_RENDER;
> +	ring->guc_id = GUC_RENDER_ENGINE;
>   	ring->mmio_base = RENDER_RING_BASE;
>
>   	logical_ring_default_irqs(ring, GEN8_RCS_IRQ_SHIFT);
> @@ -2137,6 +2138,7 @@ static int logical_bsd_ring_init(struct drm_device *dev)
>   	ring->name = "bsd ring";
>   	ring->id = VCS;
>   	ring->exec_id = I915_EXEC_BSD;
> +	ring->guc_id = GUC_VIDEO_ENGINE;
>   	ring->mmio_base = GEN6_BSD_RING_BASE;
>
>   	logical_ring_default_irqs(ring, GEN8_VCS1_IRQ_SHIFT);
> @@ -2153,6 +2155,7 @@ static int logical_bsd2_ring_init(struct drm_device *dev)
>   	ring->name = "bsd2 ring";
>   	ring->id = VCS2;
>   	ring->exec_id = I915_EXEC_BSD;
> +	ring->guc_id = GUC_VIDEO_ENGINE2;
>   	ring->mmio_base = GEN8_BSD2_RING_BASE;
>
>   	logical_ring_default_irqs(ring, GEN8_VCS2_IRQ_SHIFT);
> @@ -2169,6 +2172,7 @@ static int logical_blt_ring_init(struct drm_device *dev)
>   	ring->name = "blitter ring";
>   	ring->id = BCS;
>   	ring->exec_id = I915_EXEC_BLT;
> +	ring->guc_id = GUC_BLITTER_ENGINE;
>   	ring->mmio_base = BLT_RING_BASE;
>
>   	logical_ring_default_irqs(ring, GEN8_BCS_IRQ_SHIFT);
> @@ -2185,6 +2189,7 @@ static int logical_vebox_ring_init(struct drm_device *dev)
>   	ring->name = "video enhancement ring";
>   	ring->id = VECS;
>   	ring->exec_id = I915_EXEC_VEBOX;
> +	ring->guc_id = GUC_VIDEOENHANCE_ENGINE;
>   	ring->mmio_base = VEBOX_RING_BASE;
>
>   	logical_ring_default_irqs(ring, GEN8_VECS_IRQ_SHIFT);
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
> index b12f2aa..566b0ae 100644
> --- a/drivers/gpu/drm/i915/intel_ringbuffer.h
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
> @@ -158,6 +158,7 @@ struct  intel_engine_cs {
>   #define I915_NUM_RINGS 5
>   #define _VCS(n) (VCS + (n))
>   	unsigned int exec_id;
> +	unsigned int guc_id;
>   	u32		mmio_base;
>   	struct		drm_device *dev;
>   	struct intel_ringbuffer *buffer;
>

Looks OK to me, with a caveat that I don't know much about GuC. But 
obviously is needed to fix the fallout from my decoupling. And it sounds 
good to explicitly document this GuC dependency so:

Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>

Regards,

Tvrtko
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2016-01-25 10:32 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-22 23:06 [PATCH] drm/i915/guc: Decouple GuC engine id from ring id yu.dai
2016-01-23  8:14 ` ✓ Fi.CI.BAT: success for " Patchwork
2016-01-23 18:25 ` [PATCH] " Chris Wilson
2016-01-23 18:51   ` Yu Dai
2016-01-23 19:58 ` [PATCH v2] " yu.dai
2016-01-25 10:32   ` Tvrtko Ursulin [this message]
2016-01-24  7:43 ` ✗ Fi.CI.BAT: warning for drm/i915/guc: Decouple GuC engine id from ring id (rev2) Patchwork
2016-01-25 11:03   ` Tvrtko Ursulin
2016-01-25 12:11 ` ✓ Fi.CI.BAT: success " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=56A5F9BE.4020607@linux.intel.com \
    --to=tvrtko.ursulin@linux.intel.com \
    --cc=daniel.vetter@ffwll.ch \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=yu.dai@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.