* [PATCH] drm/amdgpu:impl vgt_flush for VI @ 2016-11-11 10:32 Monk Liu [not found] ` <1478860333-14270-1-git-send-email-Monk.Liu-5C7GfCeVMHo@public.gmane.org> 0 siblings, 1 reply; 7+ messages in thread From: Monk Liu @ 2016-11-11 10:32 UTC (permalink / raw) To: amd-gfx-CC+yJ3UmIYqDUpFQwHEjaQ; +Cc: Monk Liu when hardware shadowing enabled, tesselation will trigger vm fault, the root cause is because VGT_FLUSH not introduced in kmd. this could fix tesselation crash issue. Change-Id: I77d87d93ce6580e559e734fb41d97ee8c59d245b Signed-off-by: Monk Liu <Monk.Liu@amd.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 + drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | 5 ++++- drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h | 1 + drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 13 +++++++++++++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 15015bc..f46e96b 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -1630,6 +1630,7 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring) #define amdgpu_ring_emit_fence(r, addr, seq, flags) (r)->funcs->emit_fence((r), (addr), (seq), (flags)) #define amdgpu_ring_emit_gds_switch(r, v, db, ds, wb, ws, ab, as) (r)->funcs->emit_gds_switch((r), (v), (db), (ds), (wb), (ws), (ab), (as)) #define amdgpu_ring_emit_hdp_flush(r) (r)->funcs->emit_hdp_flush((r)) +#define amdgpu_ring_emit_vgt_flush(r) (r)->funcs->emit_vgt_flush((r)) #define amdgpu_ring_emit_hdp_invalidate(r) (r)->funcs->emit_hdp_invalidate((r)) #define amdgpu_ring_emit_switch_buffer(r) (r)->funcs->emit_switch_buffer((r)) #define amdgpu_ring_emit_cntxcntl(r, d) (r)->funcs->emit_cntxcntl((r), (d)) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c index acf48de..c039890 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c @@ -175,11 +175,14 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs, if (ring->funcs->emit_hdp_flush) amdgpu_ring_emit_hdp_flush(ring); + need_ctx_switch = ring->current_ctx != fence_ctx; + if (ring->funcs->emit_vgt_flush && need_ctx_switch) + amdgpu_ring_emit_vgt_flush(ring); + /* always set cond_exec_polling to CONTINUE */ *ring->cond_exe_cpu_addr = 1; skip_preamble = ring->current_ctx == fence_ctx; - need_ctx_switch = ring->current_ctx != fence_ctx; if (job && ring->funcs->emit_cntxcntl) { if (need_ctx_switch) status |= AMDGPU_HAVE_CTX_SWITCH; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h index 92bc89b..c3a7329 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h @@ -116,6 +116,7 @@ struct amdgpu_ring_funcs { void (*emit_vm_flush)(struct amdgpu_ring *ring, unsigned vm_id, uint64_t pd_addr); void (*emit_hdp_flush)(struct amdgpu_ring *ring); + void (*emit_vgt_flush)(struct amdgpu_ring *ring); void (*emit_hdp_invalidate)(struct amdgpu_ring *ring); void (*emit_gds_switch)(struct amdgpu_ring *ring, uint32_t vmid, uint32_t gds_base, uint32_t gds_size, diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c index 9017803..1d407d76 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c @@ -6187,6 +6187,18 @@ static void gfx_v8_0_ring_emit_hdp_flush(struct amdgpu_ring *ring) amdgpu_ring_write(ring, 0x20); /* poll interval */ } +static void gfx_v8_0_ring_emit_vgt_flush(struct amdgpu_ring *ring) +{ + amdgpu_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE, 0)); + amdgpu_ring_write(ring, EVENT_TYPE(VS_PARTIAL_FLUSH) | + EVENT_INDEX(4)); + + amdgpu_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE, 0)); + amdgpu_ring_write(ring, EVENT_TYPE(VGT_FLUSH) | + EVENT_INDEX(0)); +} + + static void gfx_v8_0_ring_emit_hdp_invalidate(struct amdgpu_ring *ring) { amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); @@ -6590,6 +6602,7 @@ static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_gfx = { .pad_ib = amdgpu_ring_generic_pad_ib, .emit_switch_buffer = gfx_v8_ring_emit_sb, .emit_cntxcntl = gfx_v8_ring_emit_cntxcntl, + .emit_vgt_flush = gfx_v8_0_ring_emit_vgt_flush, }; static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_compute = { -- 1.9.1 _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply related [flat|nested] 7+ messages in thread
[parent not found: <1478860333-14270-1-git-send-email-Monk.Liu-5C7GfCeVMHo@public.gmane.org>]
* 答复: [PATCH] drm/amdgpu:impl vgt_flush for VI [not found] ` <1478860333-14270-1-git-send-email-Monk.Liu-5C7GfCeVMHo@public.gmane.org> @ 2016-11-14 3:17 ` Liu, Monk [not found] ` <DM5PR12MB1355340239F3F20F50B3093E84BC0-2J9CzHegvk+AJwmwFrlwrgdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org> 0 siblings, 1 reply; 7+ messages in thread From: Liu, Monk @ 2016-11-14 3:17 UTC (permalink / raw) To: amd-gfx-CC+yJ3UmIYqDUpFQwHEjaQ Anyone review this patch ? This patch could fix tessellation bug when shadowing enabled, we should always insert vgt_flush when there is a context switch BR Monk -----邮件原件----- 发件人: Monk Liu [mailto:Monk.Liu@amd.com] 发送时间: Friday, November 11, 2016 6:32 PM 收件人: amd-gfx@freedesktop.org 抄送: Liu, Monk 主题: [PATCH] drm/amdgpu:impl vgt_flush for VI when hardware shadowing enabled, tesselation will trigger vm fault, the root cause is because VGT_FLUSH not introduced in kmd. this could fix tesselation crash issue. Change-Id: I77d87d93ce6580e559e734fb41d97ee8c59d245b Signed-off-by: Monk Liu <Monk.Liu@amd.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 + drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | 5 ++++- drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h | 1 + drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 13 +++++++++++++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 15015bc..f46e96b 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -1630,6 +1630,7 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring) #define amdgpu_ring_emit_fence(r, addr, seq, flags) (r)->funcs->emit_fence((r), (addr), (seq), (flags)) #define amdgpu_ring_emit_gds_switch(r, v, db, ds, wb, ws, ab, as) (r)->funcs->emit_gds_switch((r), (v), (db), (ds), (wb), (ws), (ab), (as)) #define amdgpu_ring_emit_hdp_flush(r) (r)->funcs->emit_hdp_flush((r)) +#define amdgpu_ring_emit_vgt_flush(r) (r)->funcs->emit_vgt_flush((r)) #define amdgpu_ring_emit_hdp_invalidate(r) (r)->funcs->emit_hdp_invalidate((r)) #define amdgpu_ring_emit_switch_buffer(r) (r)->funcs->emit_switch_buffer((r)) #define amdgpu_ring_emit_cntxcntl(r, d) (r)->funcs->emit_cntxcntl((r), (d)) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c index acf48de..c039890 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c @@ -175,11 +175,14 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs, if (ring->funcs->emit_hdp_flush) amdgpu_ring_emit_hdp_flush(ring); + need_ctx_switch = ring->current_ctx != fence_ctx; + if (ring->funcs->emit_vgt_flush && need_ctx_switch) + amdgpu_ring_emit_vgt_flush(ring); + /* always set cond_exec_polling to CONTINUE */ *ring->cond_exe_cpu_addr = 1; skip_preamble = ring->current_ctx == fence_ctx; - need_ctx_switch = ring->current_ctx != fence_ctx; if (job && ring->funcs->emit_cntxcntl) { if (need_ctx_switch) status |= AMDGPU_HAVE_CTX_SWITCH; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h index 92bc89b..c3a7329 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h @@ -116,6 +116,7 @@ struct amdgpu_ring_funcs { void (*emit_vm_flush)(struct amdgpu_ring *ring, unsigned vm_id, uint64_t pd_addr); void (*emit_hdp_flush)(struct amdgpu_ring *ring); + void (*emit_vgt_flush)(struct amdgpu_ring *ring); void (*emit_hdp_invalidate)(struct amdgpu_ring *ring); void (*emit_gds_switch)(struct amdgpu_ring *ring, uint32_t vmid, uint32_t gds_base, uint32_t gds_size, diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c index 9017803..1d407d76 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c @@ -6187,6 +6187,18 @@ static void gfx_v8_0_ring_emit_hdp_flush(struct amdgpu_ring *ring) amdgpu_ring_write(ring, 0x20); /* poll interval */ } +static void gfx_v8_0_ring_emit_vgt_flush(struct amdgpu_ring *ring) { + amdgpu_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE, 0)); + amdgpu_ring_write(ring, EVENT_TYPE(VS_PARTIAL_FLUSH) | + EVENT_INDEX(4)); + + amdgpu_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE, 0)); + amdgpu_ring_write(ring, EVENT_TYPE(VGT_FLUSH) | + EVENT_INDEX(0)); +} + + static void gfx_v8_0_ring_emit_hdp_invalidate(struct amdgpu_ring *ring) { amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); @@ -6590,6 +6602,7 @@ static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_gfx = { .pad_ib = amdgpu_ring_generic_pad_ib, .emit_switch_buffer = gfx_v8_ring_emit_sb, .emit_cntxcntl = gfx_v8_ring_emit_cntxcntl, + .emit_vgt_flush = gfx_v8_0_ring_emit_vgt_flush, }; static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_compute = { -- 1.9.1 _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply related [flat|nested] 7+ messages in thread
[parent not found: <DM5PR12MB1355340239F3F20F50B3093E84BC0-2J9CzHegvk+AJwmwFrlwrgdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>]
* Re: 答复: [PATCH] drm/amdgpu:impl vgt_flush for VI [not found] ` <DM5PR12MB1355340239F3F20F50B3093E84BC0-2J9CzHegvk+AJwmwFrlwrgdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org> @ 2016-11-14 9:45 ` Christian König [not found] ` <32010a55-aa4d-7aff-5f42-4a6081f96b56-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org> 0 siblings, 1 reply; 7+ messages in thread From: Christian König @ 2016-11-14 9:45 UTC (permalink / raw) To: Liu, Monk, amd-gfx-CC+yJ3UmIYqDUpFQwHEjaQ Am 14.11.2016 um 04:17 schrieb Liu, Monk: > Anyone review this patch ? Looks good in general, but is there any reason not to put it into the existing emit_cntxcntl callback? Regards, Christian. > > This patch could fix tessellation bug when shadowing enabled, we should always insert vgt_flush when there is a context switch > > BR Monk > > -----邮件原件----- > 发件人: Monk Liu [mailto:Monk.Liu@amd.com] > 发送时间: Friday, November 11, 2016 6:32 PM > 收件人: amd-gfx@freedesktop.org > 抄送: Liu, Monk > 主题: [PATCH] drm/amdgpu:impl vgt_flush for VI > > when hardware shadowing enabled, tesselation will trigger vm fault, the root cause is because VGT_FLUSH not introduced in kmd. this could fix tesselation crash issue. > > Change-Id: I77d87d93ce6580e559e734fb41d97ee8c59d245b > Signed-off-by: Monk Liu <Monk.Liu@amd.com> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 + > drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | 5 ++++- > drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h | 1 + > drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 13 +++++++++++++ > 4 files changed, 19 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > index 15015bc..f46e96b 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > @@ -1630,6 +1630,7 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring) #define amdgpu_ring_emit_fence(r, addr, seq, flags) (r)->funcs->emit_fence((r), (addr), (seq), (flags)) #define amdgpu_ring_emit_gds_switch(r, v, db, ds, wb, ws, ab, as) (r)->funcs->emit_gds_switch((r), (v), (db), (ds), (wb), (ws), (ab), (as)) #define amdgpu_ring_emit_hdp_flush(r) (r)->funcs->emit_hdp_flush((r)) > +#define amdgpu_ring_emit_vgt_flush(r) (r)->funcs->emit_vgt_flush((r)) > #define amdgpu_ring_emit_hdp_invalidate(r) (r)->funcs->emit_hdp_invalidate((r)) > #define amdgpu_ring_emit_switch_buffer(r) (r)->funcs->emit_switch_buffer((r)) > #define amdgpu_ring_emit_cntxcntl(r, d) (r)->funcs->emit_cntxcntl((r), (d)) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c > index acf48de..c039890 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c > @@ -175,11 +175,14 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs, > if (ring->funcs->emit_hdp_flush) > amdgpu_ring_emit_hdp_flush(ring); > > + need_ctx_switch = ring->current_ctx != fence_ctx; > + if (ring->funcs->emit_vgt_flush && need_ctx_switch) > + amdgpu_ring_emit_vgt_flush(ring); > + > /* always set cond_exec_polling to CONTINUE */ > *ring->cond_exe_cpu_addr = 1; > > skip_preamble = ring->current_ctx == fence_ctx; > - need_ctx_switch = ring->current_ctx != fence_ctx; > if (job && ring->funcs->emit_cntxcntl) { > if (need_ctx_switch) > status |= AMDGPU_HAVE_CTX_SWITCH; > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h > index 92bc89b..c3a7329 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h > @@ -116,6 +116,7 @@ struct amdgpu_ring_funcs { > void (*emit_vm_flush)(struct amdgpu_ring *ring, unsigned vm_id, > uint64_t pd_addr); > void (*emit_hdp_flush)(struct amdgpu_ring *ring); > + void (*emit_vgt_flush)(struct amdgpu_ring *ring); > void (*emit_hdp_invalidate)(struct amdgpu_ring *ring); > void (*emit_gds_switch)(struct amdgpu_ring *ring, uint32_t vmid, > uint32_t gds_base, uint32_t gds_size, diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c > index 9017803..1d407d76 100644 > --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c > +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c > @@ -6187,6 +6187,18 @@ static void gfx_v8_0_ring_emit_hdp_flush(struct amdgpu_ring *ring) > amdgpu_ring_write(ring, 0x20); /* poll interval */ } > > +static void gfx_v8_0_ring_emit_vgt_flush(struct amdgpu_ring *ring) { > + amdgpu_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE, 0)); > + amdgpu_ring_write(ring, EVENT_TYPE(VS_PARTIAL_FLUSH) | > + EVENT_INDEX(4)); > + > + amdgpu_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE, 0)); > + amdgpu_ring_write(ring, EVENT_TYPE(VGT_FLUSH) | > + EVENT_INDEX(0)); > +} > + > + > static void gfx_v8_0_ring_emit_hdp_invalidate(struct amdgpu_ring *ring) { > amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); @@ -6590,6 +6602,7 @@ static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_gfx = { > .pad_ib = amdgpu_ring_generic_pad_ib, > .emit_switch_buffer = gfx_v8_ring_emit_sb, > .emit_cntxcntl = gfx_v8_ring_emit_cntxcntl, > + .emit_vgt_flush = gfx_v8_0_ring_emit_vgt_flush, > }; > > static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_compute = { > -- > 1.9.1 > > _______________________________________________ > amd-gfx mailing list > amd-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply [flat|nested] 7+ messages in thread
[parent not found: <32010a55-aa4d-7aff-5f42-4a6081f96b56-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>]
* 答复: 答复: [PATCH] drm/amdgpu:impl vgt_flush for VI [not found] ` <32010a55-aa4d-7aff-5f42-4a6081f96b56-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org> @ 2016-11-14 10:01 ` Liu, Monk [not found] ` <DM5PR12MB1355412B041FD1D0B40E16FA84BC0-2J9CzHegvk+AJwmwFrlwrgdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org> 0 siblings, 1 reply; 7+ messages in thread From: Liu, Monk @ 2016-11-14 10:01 UTC (permalink / raw) To: Christian König, amd-gfx-CC+yJ3UmIYqDUpFQwHEjaQ Although the effect is equal, but cntxcntl uses CONTEXT_CONTROL only, while vgt-flush uses EVENT_WRITE on vgt_flush and vs_partial_flush only, And vgt flush only operate on tessellation category registers, I'd prefer it not mixed with CONTEXT_CONTROL package ... I think Put them together seems not grace ... BR Monk -----邮件原件----- 发件人: Christian König [mailto:deathsimple@vodafone.de] 发送时间: Monday, November 14, 2016 5:46 PM 收件人: Liu, Monk; amd-gfx@freedesktop.org 主题: Re: 答复: [PATCH] drm/amdgpu:impl vgt_flush for VI Am 14.11.2016 um 04:17 schrieb Liu, Monk: > Anyone review this patch ? Looks good in general, but is there any reason not to put it into the existing emit_cntxcntl callback? Regards, Christian. > > This patch could fix tessellation bug when shadowing enabled, we > should always insert vgt_flush when there is a context switch > > BR Monk > > -----邮件原件----- > 发件人: Monk Liu [mailto:Monk.Liu@amd.com] > 发送时间: Friday, November 11, 2016 6:32 PM > 收件人: amd-gfx@freedesktop.org > 抄送: Liu, Monk > 主题: [PATCH] drm/amdgpu:impl vgt_flush for VI > > when hardware shadowing enabled, tesselation will trigger vm fault, the root cause is because VGT_FLUSH not introduced in kmd. this could fix tesselation crash issue. > > Change-Id: I77d87d93ce6580e559e734fb41d97ee8c59d245b > Signed-off-by: Monk Liu <Monk.Liu@amd.com> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 + > drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | 5 ++++- > drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h | 1 + > drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 13 +++++++++++++ > 4 files changed, 19 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h > b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > index 15015bc..f46e96b 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > @@ -1630,6 +1630,7 @@ amdgpu_get_sdma_instance(struct amdgpu_ring > *ring) #define amdgpu_ring_emit_fence(r, addr, seq, flags) > (r)->funcs->emit_fence((r), (addr), (seq), (flags)) #define > amdgpu_ring_emit_gds_switch(r, v, db, ds, wb, ws, ab, as) > (r)->funcs->emit_gds_switch((r), (v), (db), (ds), (wb), (ws), (ab), > (as)) #define amdgpu_ring_emit_hdp_flush(r) > (r)->funcs->emit_hdp_flush((r)) > +#define amdgpu_ring_emit_vgt_flush(r) (r)->funcs->emit_vgt_flush((r)) > #define amdgpu_ring_emit_hdp_invalidate(r) (r)->funcs->emit_hdp_invalidate((r)) > #define amdgpu_ring_emit_switch_buffer(r) (r)->funcs->emit_switch_buffer((r)) > #define amdgpu_ring_emit_cntxcntl(r, d) > (r)->funcs->emit_cntxcntl((r), (d)) diff --git > a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c > b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c > index acf48de..c039890 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c > @@ -175,11 +175,14 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs, > if (ring->funcs->emit_hdp_flush) > amdgpu_ring_emit_hdp_flush(ring); > > + need_ctx_switch = ring->current_ctx != fence_ctx; > + if (ring->funcs->emit_vgt_flush && need_ctx_switch) > + amdgpu_ring_emit_vgt_flush(ring); > + > /* always set cond_exec_polling to CONTINUE */ > *ring->cond_exe_cpu_addr = 1; > > skip_preamble = ring->current_ctx == fence_ctx; > - need_ctx_switch = ring->current_ctx != fence_ctx; > if (job && ring->funcs->emit_cntxcntl) { > if (need_ctx_switch) > status |= AMDGPU_HAVE_CTX_SWITCH; diff --git > a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h > b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h > index 92bc89b..c3a7329 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h > @@ -116,6 +116,7 @@ struct amdgpu_ring_funcs { > void (*emit_vm_flush)(struct amdgpu_ring *ring, unsigned vm_id, > uint64_t pd_addr); > void (*emit_hdp_flush)(struct amdgpu_ring *ring); > + void (*emit_vgt_flush)(struct amdgpu_ring *ring); > void (*emit_hdp_invalidate)(struct amdgpu_ring *ring); > void (*emit_gds_switch)(struct amdgpu_ring *ring, uint32_t vmid, > uint32_t gds_base, uint32_t gds_size, diff --git > a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c > b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c > index 9017803..1d407d76 100644 > --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c > +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c > @@ -6187,6 +6187,18 @@ static void gfx_v8_0_ring_emit_hdp_flush(struct amdgpu_ring *ring) > amdgpu_ring_write(ring, 0x20); /* poll interval */ } > > +static void gfx_v8_0_ring_emit_vgt_flush(struct amdgpu_ring *ring) { > + amdgpu_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE, 0)); > + amdgpu_ring_write(ring, EVENT_TYPE(VS_PARTIAL_FLUSH) | > + EVENT_INDEX(4)); > + > + amdgpu_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE, 0)); > + amdgpu_ring_write(ring, EVENT_TYPE(VGT_FLUSH) | > + EVENT_INDEX(0)); > +} > + > + > static void gfx_v8_0_ring_emit_hdp_invalidate(struct amdgpu_ring *ring) { > amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); @@ -6590,6 +6602,7 @@ static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_gfx = { > .pad_ib = amdgpu_ring_generic_pad_ib, > .emit_switch_buffer = gfx_v8_ring_emit_sb, > .emit_cntxcntl = gfx_v8_ring_emit_cntxcntl, > + .emit_vgt_flush = gfx_v8_0_ring_emit_vgt_flush, > }; > > static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_compute = > { > -- > 1.9.1 > > _______________________________________________ > amd-gfx mailing list > amd-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply [flat|nested] 7+ messages in thread
[parent not found: <DM5PR12MB1355412B041FD1D0B40E16FA84BC0-2J9CzHegvk+AJwmwFrlwrgdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>]
* Re: 答复: 答复: [PATCH] drm/amdgpu:impl vgt_flush for VI [not found] ` <DM5PR12MB1355412B041FD1D0B40E16FA84BC0-2J9CzHegvk+AJwmwFrlwrgdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org> @ 2016-11-14 11:33 ` Christian König [not found] ` <ddae0dc9-7b1a-6092-b11a-f66e760afe19-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org> 0 siblings, 1 reply; 7+ messages in thread From: Christian König @ 2016-11-14 11:33 UTC (permalink / raw) To: Liu, Monk, amd-gfx-CC+yJ3UmIYqDUpFQwHEjaQ The callbacks are use case driven, so it doesn't matter what packets they use. I would really prefer not to add to many of them. Maybe rename the emit_cntxcntl callback to just emit_context_preamble or something like this to make it more clear what that is good for. Regards, Christian. Am 14.11.2016 um 11:01 schrieb Liu, Monk: > Although the effect is equal, but cntxcntl uses CONTEXT_CONTROL only, while vgt-flush uses EVENT_WRITE on vgt_flush and vs_partial_flush only, > And vgt flush only operate on tessellation category registers, I'd prefer it not mixed with CONTEXT_CONTROL package ... > I think Put them together seems not grace ... > > BR Monk > > -----邮件原件----- > 发件人: Christian König [mailto:deathsimple@vodafone.de] > 发送时间: Monday, November 14, 2016 5:46 PM > 收件人: Liu, Monk; amd-gfx@freedesktop.org > 主题: Re: 答复: [PATCH] drm/amdgpu:impl vgt_flush for VI > > Am 14.11.2016 um 04:17 schrieb Liu, Monk: >> Anyone review this patch ? > Looks good in general, but is there any reason not to put it into the existing emit_cntxcntl callback? > > Regards, > Christian. > >> This patch could fix tessellation bug when shadowing enabled, we >> should always insert vgt_flush when there is a context switch >> >> BR Monk >> >> -----邮件原件----- >> 发件人: Monk Liu [mailto:Monk.Liu@amd.com] >> 发送时间: Friday, November 11, 2016 6:32 PM >> 收件人: amd-gfx@freedesktop.org >> 抄送: Liu, Monk >> 主题: [PATCH] drm/amdgpu:impl vgt_flush for VI >> >> when hardware shadowing enabled, tesselation will trigger vm fault, the root cause is because VGT_FLUSH not introduced in kmd. this could fix tesselation crash issue. >> >> Change-Id: I77d87d93ce6580e559e734fb41d97ee8c59d245b >> Signed-off-by: Monk Liu <Monk.Liu@amd.com> >> --- >> drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 + >> drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | 5 ++++- >> drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h | 1 + >> drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 13 +++++++++++++ >> 4 files changed, 19 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h >> b/drivers/gpu/drm/amd/amdgpu/amdgpu.h >> index 15015bc..f46e96b 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h >> @@ -1630,6 +1630,7 @@ amdgpu_get_sdma_instance(struct amdgpu_ring >> *ring) #define amdgpu_ring_emit_fence(r, addr, seq, flags) >> (r)->funcs->emit_fence((r), (addr), (seq), (flags)) #define >> amdgpu_ring_emit_gds_switch(r, v, db, ds, wb, ws, ab, as) >> (r)->funcs->emit_gds_switch((r), (v), (db), (ds), (wb), (ws), (ab), >> (as)) #define amdgpu_ring_emit_hdp_flush(r) >> (r)->funcs->emit_hdp_flush((r)) >> +#define amdgpu_ring_emit_vgt_flush(r) (r)->funcs->emit_vgt_flush((r)) >> #define amdgpu_ring_emit_hdp_invalidate(r) (r)->funcs->emit_hdp_invalidate((r)) >> #define amdgpu_ring_emit_switch_buffer(r) (r)->funcs->emit_switch_buffer((r)) >> #define amdgpu_ring_emit_cntxcntl(r, d) >> (r)->funcs->emit_cntxcntl((r), (d)) diff --git >> a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c >> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c >> index acf48de..c039890 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c >> @@ -175,11 +175,14 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs, >> if (ring->funcs->emit_hdp_flush) >> amdgpu_ring_emit_hdp_flush(ring); >> >> + need_ctx_switch = ring->current_ctx != fence_ctx; >> + if (ring->funcs->emit_vgt_flush && need_ctx_switch) >> + amdgpu_ring_emit_vgt_flush(ring); >> + >> /* always set cond_exec_polling to CONTINUE */ >> *ring->cond_exe_cpu_addr = 1; >> >> skip_preamble = ring->current_ctx == fence_ctx; >> - need_ctx_switch = ring->current_ctx != fence_ctx; >> if (job && ring->funcs->emit_cntxcntl) { >> if (need_ctx_switch) >> status |= AMDGPU_HAVE_CTX_SWITCH; diff --git >> a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h >> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h >> index 92bc89b..c3a7329 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h >> @@ -116,6 +116,7 @@ struct amdgpu_ring_funcs { >> void (*emit_vm_flush)(struct amdgpu_ring *ring, unsigned vm_id, >> uint64_t pd_addr); >> void (*emit_hdp_flush)(struct amdgpu_ring *ring); >> + void (*emit_vgt_flush)(struct amdgpu_ring *ring); >> void (*emit_hdp_invalidate)(struct amdgpu_ring *ring); >> void (*emit_gds_switch)(struct amdgpu_ring *ring, uint32_t vmid, >> uint32_t gds_base, uint32_t gds_size, diff --git >> a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c >> b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c >> index 9017803..1d407d76 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c >> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c >> @@ -6187,6 +6187,18 @@ static void gfx_v8_0_ring_emit_hdp_flush(struct amdgpu_ring *ring) >> amdgpu_ring_write(ring, 0x20); /* poll interval */ } >> >> +static void gfx_v8_0_ring_emit_vgt_flush(struct amdgpu_ring *ring) { >> + amdgpu_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE, 0)); >> + amdgpu_ring_write(ring, EVENT_TYPE(VS_PARTIAL_FLUSH) | >> + EVENT_INDEX(4)); >> + >> + amdgpu_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE, 0)); >> + amdgpu_ring_write(ring, EVENT_TYPE(VGT_FLUSH) | >> + EVENT_INDEX(0)); >> +} >> + >> + >> static void gfx_v8_0_ring_emit_hdp_invalidate(struct amdgpu_ring *ring) { >> amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); @@ -6590,6 +6602,7 @@ static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_gfx = { >> .pad_ib = amdgpu_ring_generic_pad_ib, >> .emit_switch_buffer = gfx_v8_ring_emit_sb, >> .emit_cntxcntl = gfx_v8_ring_emit_cntxcntl, >> + .emit_vgt_flush = gfx_v8_0_ring_emit_vgt_flush, >> }; >> >> static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_compute = >> { >> -- >> 1.9.1 >> >> _______________________________________________ >> amd-gfx mailing list >> amd-gfx@lists.freedesktop.org >> https://lists.freedesktop.org/mailman/listinfo/amd-gfx > _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply [flat|nested] 7+ messages in thread
[parent not found: <ddae0dc9-7b1a-6092-b11a-f66e760afe19-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>]
* 答复: 答复: 答复: [PATCH] drm/amdgpu:impl vgt_flush for VI [not found] ` <ddae0dc9-7b1a-6092-b11a-f66e760afe19-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org> @ 2016-11-14 11:39 ` Liu, Monk [not found] ` <DM5PR12MB13554FD685656621B92C043184BC0-2J9CzHegvk+AJwmwFrlwrgdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org> 0 siblings, 1 reply; 7+ messages in thread From: Liu, Monk @ 2016-11-14 11:39 UTC (permalink / raw) To: Christian König, amd-gfx-CC+yJ3UmIYqDUpFQwHEjaQ I have no strong opinion, I checked windows kmd and they separate vgt-flush and cntx-ctrl as well, Fine with your suggestion BR Monk -----邮件原件----- 发件人: Christian König [mailto:deathsimple@vodafone.de] 发送时间: Monday, November 14, 2016 7:33 PM 收件人: Liu, Monk; amd-gfx@freedesktop.org 主题: Re: 答复: 答复: [PATCH] drm/amdgpu:impl vgt_flush for VI The callbacks are use case driven, so it doesn't matter what packets they use. I would really prefer not to add to many of them. Maybe rename the emit_cntxcntl callback to just emit_context_preamble or something like this to make it more clear what that is good for. Regards, Christian. Am 14.11.2016 um 11:01 schrieb Liu, Monk: > Although the effect is equal, but cntxcntl uses CONTEXT_CONTROL only, > while vgt-flush uses EVENT_WRITE on vgt_flush and vs_partial_flush only, And vgt flush only operate on tessellation category registers, I'd prefer it not mixed with CONTEXT_CONTROL package ... > I think Put them together seems not grace ... > > BR Monk > > -----邮件原件----- > 发件人: Christian König [mailto:deathsimple@vodafone.de] > 发送时间: Monday, November 14, 2016 5:46 PM > 收件人: Liu, Monk; amd-gfx@freedesktop.org > 主题: Re: 答复: [PATCH] drm/amdgpu:impl vgt_flush for VI > > Am 14.11.2016 um 04:17 schrieb Liu, Monk: >> Anyone review this patch ? > Looks good in general, but is there any reason not to put it into the existing emit_cntxcntl callback? > > Regards, > Christian. > >> This patch could fix tessellation bug when shadowing enabled, we >> should always insert vgt_flush when there is a context switch >> >> BR Monk >> >> -----邮件原件----- >> 发件人: Monk Liu [mailto:Monk.Liu@amd.com] >> 发送时间: Friday, November 11, 2016 6:32 PM >> 收件人: amd-gfx@freedesktop.org >> 抄送: Liu, Monk >> 主题: [PATCH] drm/amdgpu:impl vgt_flush for VI >> >> when hardware shadowing enabled, tesselation will trigger vm fault, the root cause is because VGT_FLUSH not introduced in kmd. this could fix tesselation crash issue. >> >> Change-Id: I77d87d93ce6580e559e734fb41d97ee8c59d245b >> Signed-off-by: Monk Liu <Monk.Liu@amd.com> >> --- >> drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 + >> drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | 5 ++++- >> drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h | 1 + >> drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 13 +++++++++++++ >> 4 files changed, 19 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h >> b/drivers/gpu/drm/amd/amdgpu/amdgpu.h >> index 15015bc..f46e96b 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h >> @@ -1630,6 +1630,7 @@ amdgpu_get_sdma_instance(struct amdgpu_ring >> *ring) #define amdgpu_ring_emit_fence(r, addr, seq, flags) >> (r)->funcs->emit_fence((r), (addr), (seq), (flags)) #define >> amdgpu_ring_emit_gds_switch(r, v, db, ds, wb, ws, ab, as) >> (r)->funcs->emit_gds_switch((r), (v), (db), (ds), (wb), (ws), (ab), >> (as)) #define amdgpu_ring_emit_hdp_flush(r) >> (r)->funcs->emit_hdp_flush((r)) >> +#define amdgpu_ring_emit_vgt_flush(r) >> +(r)->funcs->emit_vgt_flush((r)) >> #define amdgpu_ring_emit_hdp_invalidate(r) (r)->funcs->emit_hdp_invalidate((r)) >> #define amdgpu_ring_emit_switch_buffer(r) (r)->funcs->emit_switch_buffer((r)) >> #define amdgpu_ring_emit_cntxcntl(r, d) >> (r)->funcs->emit_cntxcntl((r), (d)) diff --git >> a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c >> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c >> index acf48de..c039890 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c >> @@ -175,11 +175,14 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs, >> if (ring->funcs->emit_hdp_flush) >> amdgpu_ring_emit_hdp_flush(ring); >> >> + need_ctx_switch = ring->current_ctx != fence_ctx; >> + if (ring->funcs->emit_vgt_flush && need_ctx_switch) >> + amdgpu_ring_emit_vgt_flush(ring); >> + >> /* always set cond_exec_polling to CONTINUE */ >> *ring->cond_exe_cpu_addr = 1; >> >> skip_preamble = ring->current_ctx == fence_ctx; >> - need_ctx_switch = ring->current_ctx != fence_ctx; >> if (job && ring->funcs->emit_cntxcntl) { >> if (need_ctx_switch) >> status |= AMDGPU_HAVE_CTX_SWITCH; diff --git >> a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h >> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h >> index 92bc89b..c3a7329 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h >> @@ -116,6 +116,7 @@ struct amdgpu_ring_funcs { >> void (*emit_vm_flush)(struct amdgpu_ring *ring, unsigned vm_id, >> uint64_t pd_addr); >> void (*emit_hdp_flush)(struct amdgpu_ring *ring); >> + void (*emit_vgt_flush)(struct amdgpu_ring *ring); >> void (*emit_hdp_invalidate)(struct amdgpu_ring *ring); >> void (*emit_gds_switch)(struct amdgpu_ring *ring, uint32_t vmid, >> uint32_t gds_base, uint32_t gds_size, diff --git >> a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c >> b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c >> index 9017803..1d407d76 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c >> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c >> @@ -6187,6 +6187,18 @@ static void gfx_v8_0_ring_emit_hdp_flush(struct amdgpu_ring *ring) >> amdgpu_ring_write(ring, 0x20); /* poll interval */ } >> >> +static void gfx_v8_0_ring_emit_vgt_flush(struct amdgpu_ring *ring) { >> + amdgpu_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE, 0)); >> + amdgpu_ring_write(ring, EVENT_TYPE(VS_PARTIAL_FLUSH) | >> + EVENT_INDEX(4)); >> + >> + amdgpu_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE, 0)); >> + amdgpu_ring_write(ring, EVENT_TYPE(VGT_FLUSH) | >> + EVENT_INDEX(0)); >> +} >> + >> + >> static void gfx_v8_0_ring_emit_hdp_invalidate(struct amdgpu_ring *ring) { >> amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); @@ -6590,6 +6602,7 @@ static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_gfx = { >> .pad_ib = amdgpu_ring_generic_pad_ib, >> .emit_switch_buffer = gfx_v8_ring_emit_sb, >> .emit_cntxcntl = gfx_v8_ring_emit_cntxcntl, >> + .emit_vgt_flush = gfx_v8_0_ring_emit_vgt_flush, >> }; >> >> static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_compute >> = { >> -- >> 1.9.1 >> >> _______________________________________________ >> amd-gfx mailing list >> amd-gfx@lists.freedesktop.org >> https://lists.freedesktop.org/mailman/listinfo/amd-gfx > _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply [flat|nested] 7+ messages in thread
[parent not found: <DM5PR12MB13554FD685656621B92C043184BC0-2J9CzHegvk+AJwmwFrlwrgdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>]
* RE: 答复: 答复: [PATCH] drm/amdgpu:impl vgt_flush for VI [not found] ` <DM5PR12MB13554FD685656621B92C043184BC0-2J9CzHegvk+AJwmwFrlwrgdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org> @ 2016-11-14 15:28 ` Deucher, Alexander 0 siblings, 0 replies; 7+ messages in thread From: Deucher, Alexander @ 2016-11-14 15:28 UTC (permalink / raw) To: Liu, Monk, Christian König, amd-gfx-CC+yJ3UmIYqDUpFQwHEjaQ > -----Original Message----- > From: amd-gfx [mailto:amd-gfx-bounces@lists.freedesktop.org] On Behalf > Of Liu, Monk > Sent: Monday, November 14, 2016 6:40 AM > To: Christian König; amd-gfx@freedesktop.org > Subject: 答复: 答复: 答复: [PATCH] drm/amdgpu:impl vgt_flush for VI > > I have no strong opinion, I checked windows kmd and they separate vgt- > flush and cntx-ctrl as well, > Fine with your suggestion Please also make sure you update the packet counts in the ring structure. Alex > > BR Monk > > -----邮件原件----- > 发件人: Christian König [mailto:deathsimple@vodafone.de] > 发送时间: Monday, November 14, 2016 7:33 PM > 收件人: Liu, Monk; amd-gfx@freedesktop.org > 主题: Re: 答复: 答复: [PATCH] drm/amdgpu:impl vgt_flush for VI > > The callbacks are use case driven, so it doesn't matter what packets they use. > I would really prefer not to add to many of them. > > Maybe rename the emit_cntxcntl callback to just emit_context_preamble or > something like this to make it more clear what that is good for. > > Regards, > Christian. > > Am 14.11.2016 um 11:01 schrieb Liu, Monk: > > Although the effect is equal, but cntxcntl uses CONTEXT_CONTROL only, > > while vgt-flush uses EVENT_WRITE on vgt_flush and vs_partial_flush only, > And vgt flush only operate on tessellation category registers, I'd prefer it not > mixed with CONTEXT_CONTROL package ... > > I think Put them together seems not grace ... > > > > BR Monk > > > > -----邮件原件----- > > 发件人: Christian König [mailto:deathsimple@vodafone.de] > > 发送时间: Monday, November 14, 2016 5:46 PM > > 收件人: Liu, Monk; amd-gfx@freedesktop.org > > 主题: Re: 答复: [PATCH] drm/amdgpu:impl vgt_flush for VI > > > > Am 14.11.2016 um 04:17 schrieb Liu, Monk: > >> Anyone review this patch ? > > Looks good in general, but is there any reason not to put it into the existing > emit_cntxcntl callback? > > > > Regards, > > Christian. > > > >> This patch could fix tessellation bug when shadowing enabled, we > >> should always insert vgt_flush when there is a context switch > >> > >> BR Monk > >> > >> -----邮件原件----- > >> 发件人: Monk Liu [mailto:Monk.Liu@amd.com] > >> 发送时间: Friday, November 11, 2016 6:32 PM > >> 收件人: amd-gfx@freedesktop.org > >> 抄送: Liu, Monk > >> 主题: [PATCH] drm/amdgpu:impl vgt_flush for VI > >> > >> when hardware shadowing enabled, tesselation will trigger vm fault, the > root cause is because VGT_FLUSH not introduced in kmd. this could fix > tesselation crash issue. > >> > >> Change-Id: I77d87d93ce6580e559e734fb41d97ee8c59d245b > >> Signed-off-by: Monk Liu <Monk.Liu@amd.com> > >> --- > >> drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 + > >> drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | 5 ++++- > >> drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h | 1 + > >> drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 13 +++++++++++++ > >> 4 files changed, 19 insertions(+), 1 deletion(-) > >> > >> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h > >> b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > >> index 15015bc..f46e96b 100644 > >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h > >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > >> @@ -1630,6 +1630,7 @@ amdgpu_get_sdma_instance(struct > amdgpu_ring > >> *ring) #define amdgpu_ring_emit_fence(r, addr, seq, flags) > >> (r)->funcs->emit_fence((r), (addr), (seq), (flags)) #define > >> amdgpu_ring_emit_gds_switch(r, v, db, ds, wb, ws, ab, as) > >> (r)->funcs->emit_gds_switch((r), (v), (db), (ds), (wb), (ws), (ab), > >> (as)) #define amdgpu_ring_emit_hdp_flush(r) > >> (r)->funcs->emit_hdp_flush((r)) > >> +#define amdgpu_ring_emit_vgt_flush(r) > >> +(r)->funcs->emit_vgt_flush((r)) > >> #define amdgpu_ring_emit_hdp_invalidate(r) (r)->funcs- > >emit_hdp_invalidate((r)) > >> #define amdgpu_ring_emit_switch_buffer(r) (r)->funcs- > >emit_switch_buffer((r)) > >> #define amdgpu_ring_emit_cntxcntl(r, d) > >> (r)->funcs->emit_cntxcntl((r), (d)) diff --git > >> a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c > >> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c > >> index acf48de..c039890 100644 > >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c > >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c > >> @@ -175,11 +175,14 @@ int amdgpu_ib_schedule(struct amdgpu_ring > *ring, unsigned num_ibs, > >> if (ring->funcs->emit_hdp_flush) > >> amdgpu_ring_emit_hdp_flush(ring); > >> > >> + need_ctx_switch = ring->current_ctx != fence_ctx; > >> + if (ring->funcs->emit_vgt_flush && need_ctx_switch) > >> + amdgpu_ring_emit_vgt_flush(ring); > >> + > >> /* always set cond_exec_polling to CONTINUE */ > >> *ring->cond_exe_cpu_addr = 1; > >> > >> skip_preamble = ring->current_ctx == fence_ctx; > >> - need_ctx_switch = ring->current_ctx != fence_ctx; > >> if (job && ring->funcs->emit_cntxcntl) { > >> if (need_ctx_switch) > >> status |= AMDGPU_HAVE_CTX_SWITCH; diff --git > >> a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h > >> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h > >> index 92bc89b..c3a7329 100644 > >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h > >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h > >> @@ -116,6 +116,7 @@ struct amdgpu_ring_funcs { > >> void (*emit_vm_flush)(struct amdgpu_ring *ring, unsigned vm_id, > >> uint64_t pd_addr); > >> void (*emit_hdp_flush)(struct amdgpu_ring *ring); > >> + void (*emit_vgt_flush)(struct amdgpu_ring *ring); > >> void (*emit_hdp_invalidate)(struct amdgpu_ring *ring); > >> void (*emit_gds_switch)(struct amdgpu_ring *ring, uint32_t vmid, > >> uint32_t gds_base, uint32_t gds_size, diff -- > git > >> a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c > >> b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c > >> index 9017803..1d407d76 100644 > >> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c > >> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c > >> @@ -6187,6 +6187,18 @@ static void > gfx_v8_0_ring_emit_hdp_flush(struct amdgpu_ring *ring) > >> amdgpu_ring_write(ring, 0x20); /* poll interval */ } > >> > >> +static void gfx_v8_0_ring_emit_vgt_flush(struct amdgpu_ring *ring) { > >> + amdgpu_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE, 0)); > >> + amdgpu_ring_write(ring, EVENT_TYPE(VS_PARTIAL_FLUSH) | > >> + EVENT_INDEX(4)); > >> + > >> + amdgpu_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE, 0)); > >> + amdgpu_ring_write(ring, EVENT_TYPE(VGT_FLUSH) | > >> + EVENT_INDEX(0)); > >> +} > >> + > >> + > >> static void gfx_v8_0_ring_emit_hdp_invalidate(struct amdgpu_ring > *ring) { > >> amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); @@ > -6590,6 +6602,7 @@ static const struct amdgpu_ring_funcs > gfx_v8_0_ring_funcs_gfx = { > >> .pad_ib = amdgpu_ring_generic_pad_ib, > >> .emit_switch_buffer = gfx_v8_ring_emit_sb, > >> .emit_cntxcntl = gfx_v8_ring_emit_cntxcntl, > >> + .emit_vgt_flush = gfx_v8_0_ring_emit_vgt_flush, > >> }; > >> > >> static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_compute > >> = { > >> -- > >> 1.9.1 > >> > >> _______________________________________________ > >> amd-gfx mailing list > >> amd-gfx@lists.freedesktop.org > >> https://lists.freedesktop.org/mailman/listinfo/amd-gfx > > > > _______________________________________________ > amd-gfx mailing list > amd-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2016-11-14 15:28 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2016-11-11 10:32 [PATCH] drm/amdgpu:impl vgt_flush for VI Monk Liu [not found] ` <1478860333-14270-1-git-send-email-Monk.Liu-5C7GfCeVMHo@public.gmane.org> 2016-11-14 3:17 ` 答复: " Liu, Monk [not found] ` <DM5PR12MB1355340239F3F20F50B3093E84BC0-2J9CzHegvk+AJwmwFrlwrgdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org> 2016-11-14 9:45 ` Christian König [not found] ` <32010a55-aa4d-7aff-5f42-4a6081f96b56-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org> 2016-11-14 10:01 ` 答复: " Liu, Monk [not found] ` <DM5PR12MB1355412B041FD1D0B40E16FA84BC0-2J9CzHegvk+AJwmwFrlwrgdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org> 2016-11-14 11:33 ` Christian König [not found] ` <ddae0dc9-7b1a-6092-b11a-f66e760afe19-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org> 2016-11-14 11:39 ` 答复: " Liu, Monk [not found] ` <DM5PR12MB13554FD685656621B92C043184BC0-2J9CzHegvk+AJwmwFrlwrgdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org> 2016-11-14 15:28 ` Deucher, Alexander
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.