All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mika Kuoppala <mika.kuoppala@linux.intel.com>
To: Chris Wilson <chris@chris-wilson.co.uk>, intel-gfx@lists.freedesktop.org
Cc: drm-intel-fixes@lists.freedesktop.org
Subject: Re: [PATCH 1/7] drm/i915: Don't use MI_STORE_DWORD_IMM on	Sandybridge/vcs
Date: Fri, 18 Aug 2017 14:07:20 +0300	[thread overview]
Message-ID: <87pobtqglz.fsf@gaia.fi.intel.com> (raw)
In-Reply-To: <20170816085210.4199-1-chris@chris-wilson.co.uk>

Chris Wilson <chris@chris-wilson.co.uk> writes:

> MI_STORE_DWORD_IMM just doesn't work on the video decode engine under
> Sandybridge, so refrain from using it. Then switch the selftests over to
> using the now common test prior to using MI_STORE_DWORD_IMM.
>
> Fixes: 7dd4f6729f92 ("drm/i915: Async GPU relocation processing")
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
> Cc: <drm-intel-fixes@lists.freedesktop.org> # v4.13-rc1+
> ---
>  drivers/gpu/drm/i915/i915_drv.h                     |  7 +++++++
>  drivers/gpu/drm/i915/i915_gem_execbuffer.c          |  8 ++++----
>  drivers/gpu/drm/i915/i915_selftest.h                |  2 --
>  drivers/gpu/drm/i915/intel_ringbuffer.h             | 12 ++++++++++++
>  drivers/gpu/drm/i915/selftests/i915_gem_coherency.c |  2 +-
>  drivers/gpu/drm/i915/selftests/i915_gem_context.c   |  6 ++++--
>  drivers/gpu/drm/i915/selftests/intel_hangcheck.c    | 18 ++++++++++++------
>  7 files changed, 40 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 6c25c8520c87..620e53bd705a 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -4327,4 +4327,11 @@ int remap_io_mapping(struct vm_area_struct *vma,
>  		     unsigned long addr, unsigned long pfn, unsigned long size,
>  		     struct io_mapping *iomap);
>  
> +static inline bool
> +intel_engine_can_store_dword(struct intel_engine_cs *engine)
> +{
> +	return __intel_engine_can_store_dword(INTEL_GEN(engine->i915),
> +					      engine->class);
> +}
> +
>  #endif
> diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> index 8e8bc7aefd9c..359d5dc6d8df 100644
> --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> @@ -1268,7 +1268,9 @@ relocate_entry(struct i915_vma *vma,
>  
>  	if (!eb->reloc_cache.vaddr &&
>  	    (DBG_FORCE_RELOC == FORCE_GPU_RELOC ||
> -	     !reservation_object_test_signaled_rcu(vma->resv, true))) {
> +	     !reservation_object_test_signaled_rcu(vma->resv, true)) &&
> +	    __intel_engine_can_store_dword(eb->reloc_cache.gen,
> +					   eb->engine->class)) {
>  		const unsigned int gen = eb->reloc_cache.gen;

If you lift this to upper scope, you can make the check little
shorter. But incase you are avoiding the assignment to the latest,
i am not insisting.

There is engine in the eb so could you elaborate that
do we get by not doig intel_engine_can_store_dword(eb->engine)?

-Mika

>  		unsigned int len;
>  		u32 *batch;
> @@ -1278,10 +1280,8 @@ relocate_entry(struct i915_vma *vma,
>  			len = offset & 7 ? 8 : 5;
>  		else if (gen >= 4)
>  			len = 4;
> -		else if (gen >= 3)
> +		else
>  			len = 3;
> -		else /* On gen2 MI_STORE_DWORD_IMM uses a physical address */
> -			goto repeat;
>  
>  		batch = reloc_gpu(eb, vma, len);
>  		if (IS_ERR(batch))
> diff --git a/drivers/gpu/drm/i915/i915_selftest.h b/drivers/gpu/drm/i915/i915_selftest.h
> index 9d7d86f1733d..78e1a1b168ff 100644
> --- a/drivers/gpu/drm/i915/i915_selftest.h
> +++ b/drivers/gpu/drm/i915/i915_selftest.h
> @@ -101,6 +101,4 @@ bool __igt_timeout(unsigned long timeout, const char *fmt, ...);
>  #define igt_timeout(t, fmt, ...) \
>  	__igt_timeout((t), KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__)
>  
> -#define igt_can_mi_store_dword_imm(D) (INTEL_GEN(D) > 2)
> -
>  #endif /* !__I915_SELFTEST_H__ */
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
> index d33c93444c0d..02d8974bf9ab 100644
> --- a/drivers/gpu/drm/i915/intel_ringbuffer.h
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
> @@ -735,4 +735,16 @@ bool intel_engines_are_idle(struct drm_i915_private *dev_priv);
>  void intel_engines_mark_idle(struct drm_i915_private *i915);
>  void intel_engines_reset_default_submission(struct drm_i915_private *i915);
>  
> +static inline bool
> +__intel_engine_can_store_dword(unsigned int gen, unsigned int class)
> +{
> +	if (gen <= 2)
> +		return false; /* uses physical not virtual addresses */
> +
> +	if (gen == 6 && class == VIDEO_DECODE_CLASS)
> +		return false; /* b0rked */
> +
> +	return true;
> +}
> +
>  #endif /* _INTEL_RINGBUFFER_H_ */
> diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c b/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c
> index 95d4aebc0181..35d778d70626 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c
> @@ -241,7 +241,7 @@ static bool always_valid(struct drm_i915_private *i915)
>  
>  static bool needs_mi_store_dword(struct drm_i915_private *i915)
>  {
> -	return igt_can_mi_store_dword_imm(i915);
> +	return intel_engine_can_store_dword(i915->engine[RCS]);
>  }
>  
>  static const struct igt_coherency_mode {
> diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_context.c b/drivers/gpu/drm/i915/selftests/i915_gem_context.c
> index 12b85b3278cd..fb0a58fc8348 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_gem_context.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_gem_context.c
> @@ -38,8 +38,6 @@ gpu_fill_dw(struct i915_vma *vma, u64 offset, unsigned long count, u32 value)
>  	u32 *cmd;
>  	int err;
>  
> -	GEM_BUG_ON(!igt_can_mi_store_dword_imm(vma->vm->i915));
> -
>  	size = (4 * count + 1) * sizeof(u32);
>  	size = round_up(size, PAGE_SIZE);
>  	obj = i915_gem_object_create_internal(vma->vm->i915, size);
> @@ -123,6 +121,7 @@ static int gpu_fill(struct drm_i915_gem_object *obj,
>  	int err;
>  
>  	GEM_BUG_ON(obj->base.size > vm->total);
> +	GEM_BUG_ON(!intel_engine_can_store_dword(engine));
>  
>  	vma = i915_vma_instance(obj, vm, NULL);
>  	if (IS_ERR(vma))
> @@ -359,6 +358,9 @@ static int igt_ctx_exec(void *arg)
>  		}
>  
>  		for_each_engine(engine, i915, id) {
> +			if (!intel_engine_can_store_dword(engine))
> +				continue;
> +
>  			if (!obj) {
>  				obj = create_test_object(ctx, file, &objects);
>  				if (IS_ERR(obj)) {
> diff --git a/drivers/gpu/drm/i915/selftests/intel_hangcheck.c b/drivers/gpu/drm/i915/selftests/intel_hangcheck.c
> index 208b34e864fb..02e52a146ed8 100644
> --- a/drivers/gpu/drm/i915/selftests/intel_hangcheck.c
> +++ b/drivers/gpu/drm/i915/selftests/intel_hangcheck.c
> @@ -253,9 +253,6 @@ static int igt_hang_sanitycheck(void *arg)
>  
>  	/* Basic check that we can execute our hanging batch */
>  
> -	if (!igt_can_mi_store_dword_imm(i915))
> -		return 0;
> -
>  	mutex_lock(&i915->drm.struct_mutex);
>  	err = hang_init(&h, i915);
>  	if (err)
> @@ -264,6 +261,9 @@ static int igt_hang_sanitycheck(void *arg)
>  	for_each_engine(engine, i915, id) {
>  		long timeout;
>  
> +		if (!intel_engine_can_store_dword(engine))
> +			continue;
> +
>  		rq = hang_create_request(&h, engine, i915->kernel_context);
>  		if (IS_ERR(rq)) {
>  			err = PTR_ERR(rq);
> @@ -599,6 +599,9 @@ static int igt_wait_reset(void *arg)
>  	long timeout;
>  	int err;
>  
> +	if (!intel_engine_can_store_dword(i915->engine[RCS]))
> +		return 0;
> +
>  	/* Check that we detect a stuck waiter and issue a reset */
>  
>  	global_reset_lock(i915);
> @@ -664,9 +667,6 @@ static int igt_reset_queue(void *arg)
>  
>  	/* Check that we replay pending requests following a hang */
>  
> -	if (!igt_can_mi_store_dword_imm(i915))
> -		return 0;
> -
>  	global_reset_lock(i915);
>  
>  	mutex_lock(&i915->drm.struct_mutex);
> @@ -679,6 +679,9 @@ static int igt_reset_queue(void *arg)
>  		IGT_TIMEOUT(end_time);
>  		unsigned int count;
>  
> +		if (!intel_engine_can_store_dword(engine))
> +			continue;
> +
>  		prev = hang_create_request(&h, engine, i915->kernel_context);
>  		if (IS_ERR(prev)) {
>  			err = PTR_ERR(prev);
> @@ -784,6 +787,9 @@ static int igt_handle_error(void *arg)
>  	if (!intel_has_reset_engine(i915))
>  		return 0;
>  
> +	if (!intel_engine_can_store_dword(i915->engine[RCS]))
> +		return 0;
> +
>  	mutex_lock(&i915->drm.struct_mutex);
>  
>  	err = hang_init(&h, i915);
> -- 
> 2.13.3
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

  parent reply	other threads:[~2017-08-18 11:07 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-16  8:52 [PATCH 1/7] drm/i915: Don't use MI_STORE_DWORD_IMM on Sandybridge/vcs Chris Wilson
2017-08-16  8:52 ` [PATCH 2/7] drm/i915: Check context status before looking up our obj/vma Chris Wilson
2017-08-17 14:10   ` Mika Kuoppala
2017-08-17 15:43     ` Chris Wilson
2017-08-16  8:52 ` [PATCH 3/7] drm/i915: Convert execbuf to use struct-of-array packing for critical fields Chris Wilson
2017-08-16  8:52 ` [PATCH 4/7] drm/i915: Simplify eb_lookup_vmas() Chris Wilson
2017-08-16  8:52 ` [PATCH 5/7] drm/i915: Replace execbuf vma ht with an idr Chris Wilson
2017-08-16  8:52 ` [PATCH 6/7] drm/i915: Trivial grammar fix s/opt of/opt out of/ in comment Chris Wilson
2017-08-17 13:38   ` Joonas Lahtinen
2017-08-16  8:52 ` [PATCH 7/7] drm/i915: Mark the GT as busy before idling the previous request Chris Wilson
2017-08-17 13:38   ` Joonas Lahtinen
2017-08-17 14:47     ` [PATCH v2] " Chris Wilson
2017-08-18  9:11       ` Joonas Lahtinen
2017-08-16  9:10 ` ✓ Fi.CI.BAT: success for series starting with [1/7] drm/i915: Don't use MI_STORE_DWORD_IMM on Sandybridge/vcs Patchwork
2017-08-17 15:36 ` ✓ Fi.CI.BAT: success for series starting with [1/7] drm/i915: Don't use MI_STORE_DWORD_IMM on Sandybridge/vcs (rev2) Patchwork
2017-08-18 11:40   ` Chris Wilson
2017-08-18 11:07 ` Mika Kuoppala [this message]
2017-08-18 11:17   ` [PATCH 1/7] drm/i915: Don't use MI_STORE_DWORD_IMM on Sandybridge/vcs Chris Wilson
2017-08-18 11:23     ` Mika Kuoppala

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=87pobtqglz.fsf@gaia.fi.intel.com \
    --to=mika.kuoppala@linux.intel.com \
    --cc=chris@chris-wilson.co.uk \
    --cc=drm-intel-fixes@lists.freedesktop.org \
    --cc=intel-gfx@lists.freedesktop.org \
    /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.