* [PATCH 1/2] drm/amdgpu: improve parse_cs handling a bit
@ 2016-10-10 13:40 Christian König
[not found] ` <1476106808-2192-1-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
0 siblings, 1 reply; 6+ messages in thread
From: Christian König @ 2016-10-10 13:40 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
From: Christian König <christian.koenig@amd.com>
This way we can use parse_cs and still keep VM mode enabled.
Signed-off-by: Christian König <christian.koenig@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 9 +++++----
drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 3 +++
drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | 3 +++
3 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index 04b7aaf..cf03f9f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -822,13 +822,14 @@ static int amdgpu_cs_ib_vm_chunk(struct amdgpu_device *adev,
/* Only for UVD/VCE VM emulation */
if (ring->funcs->parse_cs) {
- p->job->vm = NULL;
for (i = 0; i < p->job->num_ibs; i++) {
r = amdgpu_ring_parse_cs(ring, p, i);
if (r)
return r;
}
- } else {
+ }
+
+ if (p->job->vm) {
p->job->vm_pd_addr = amdgpu_bo_gpu_offset(vm->page_directory);
r = amdgpu_bo_vm_update_pte(p, vm);
@@ -917,7 +918,7 @@ static int amdgpu_cs_ib_fill(struct amdgpu_device *adev,
offset = ((uint64_t)m->it.start) * AMDGPU_GPU_PAGE_SIZE;
kptr += chunk_ib->va_start - offset;
- r = amdgpu_ib_get(adev, NULL, chunk_ib->ib_bytes, ib);
+ r = amdgpu_ib_get(adev, vm, chunk_ib->ib_bytes, ib);
if (r) {
DRM_ERROR("Failed to get ib !\n");
return r;
@@ -932,9 +933,9 @@ static int amdgpu_cs_ib_fill(struct amdgpu_device *adev,
return r;
}
- ib->gpu_addr = chunk_ib->va_start;
}
+ ib->gpu_addr = chunk_ib->va_start;
ib->length_dw = chunk_ib->ib_bytes / 4;
ib->flags = chunk_ib->flags;
j++;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
index d67eada..1b54cc2 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
@@ -876,6 +876,9 @@ int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser *parser, uint32_t ib_idx)
struct amdgpu_ib *ib = &parser->job->ibs[ib_idx];
int r;
+ parser->job->vm = NULL;
+ ib->gpu_addr = amdgpu_sa_bo_gpu_addr(ib->sa_bo);
+
if (ib->length_dw % 16) {
DRM_ERROR("UVD IB length (%d) not 16 dwords aligned!\n",
ib->length_dw);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
index 2fb469a..05a1ea9 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
@@ -642,6 +642,9 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx)
uint32_t *size = &tmp;
int i, r, idx = 0;
+ p->job->vm = NULL;
+ ib->gpu_addr = amdgpu_sa_bo_gpu_addr(ib->sa_bo);
+
r = amdgpu_cs_sysvm_access_required(p);
if (r)
return r;
--
2.5.0
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 6+ messages in thread[parent not found: <1476106808-2192-1-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>]
* [PATCH 2/2] drm/amdgpu: add VCE VM session tracking [not found] ` <1476106808-2192-1-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org> @ 2016-10-10 13:40 ` Christian König [not found] ` <1476106808-2192-2-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org> 0 siblings, 1 reply; 6+ messages in thread From: Christian König @ 2016-10-10 13:40 UTC (permalink / raw) To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW From: Christian König <christian.koenig@amd.com> Only compile tested, but should fix the problems with killing VCE sessions in VM mode. Signed-off-by: Christian König <christian.koenig@amd.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | 90 +++++++++++++++++++++++++++++++++ drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h | 1 + drivers/gpu/drm/amd/amdgpu/vce_v3_0.c | 1 + 3 files changed, 92 insertions(+) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c index 05a1ea9..3d6f86c 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c @@ -792,6 +792,96 @@ out: } /** + * amdgpu_vce_cs_parse_vm - parse the command stream in VM mode + * + * @p: parser context + * + */ +int amdgpu_vce_ring_parse_cs_vm(struct amdgpu_cs_parser *p, uint32_t ib_idx) +{ + struct amdgpu_ib *ib = &p->job->ibs[ib_idx]; + int session_idx = -1; + uint32_t destroyed = 0; + uint32_t created = 0; + uint32_t allocated = 0; + uint32_t tmp, handle = 0; + int i, r = 0, idx = 0; + + while (idx < ib->length_dw) { + uint32_t len = amdgpu_get_ib_value(p, ib_idx, idx); + uint32_t cmd = amdgpu_get_ib_value(p, ib_idx, idx + 1); + + if ((len < 8) || (len & 3)) { + DRM_ERROR("invalid VCE command length (%d)!\n", len); + r = -EINVAL; + goto out; + } + + switch (cmd) { + case 0x00000001: /* session */ + handle = amdgpu_get_ib_value(p, ib_idx, idx + 2); + session_idx = amdgpu_vce_validate_handle(p, handle, + &allocated); + if (session_idx < 0) { + r = session_idx; + goto out; + } + break; + + case 0x01000001: /* create */ + created |= 1 << session_idx; + if (destroyed & (1 << session_idx)) { + destroyed &= ~(1 << session_idx); + allocated |= 1 << session_idx; + + } else if (!(allocated & (1 << session_idx))) { + DRM_ERROR("Handle already in use!\n"); + r = -EINVAL; + goto out; + } + + break; + + case 0x02000001: /* destroy */ + destroyed |= 1 << session_idx; + break; + + default: + break; + } + + if (session_idx == -1) { + DRM_ERROR("no session command at start of IB\n"); + r = -EINVAL; + goto out; + } + + idx += len / 4; + } + + if (allocated & ~created) { + DRM_ERROR("New session without create command!\n"); + r = -ENOENT; + } + +out: + if (!r) { + /* No error, free all destroyed handle slots */ + tmp = destroyed; + amdgpu_ib_free(p->adev, ib, NULL); + } else { + /* Error during parsing, free all allocated handle slots */ + tmp = allocated; + } + + for (i = 0; i < AMDGPU_MAX_VCE_HANDLES; ++i) + if (tmp & (1 << i)) + atomic_set(&p->adev->vce.handles[i], 0); + + return r; +} + +/** * amdgpu_vce_ring_emit_ib - execute indirect buffer * * @ring: engine to use diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h index 12729d2..44d49b5 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h @@ -34,6 +34,7 @@ int amdgpu_vce_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle, bool direct, struct fence **fence); void amdgpu_vce_free_handles(struct amdgpu_device *adev, struct drm_file *filp); int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx); +int amdgpu_vce_ring_parse_cs_vm(struct amdgpu_cs_parser *p, uint32_t ib_idx); void amdgpu_vce_ring_emit_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib, unsigned vm_id, bool ctx_switch); void amdgpu_vce_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq, diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c index f7dbd0d..2abf5bd 100644 --- a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c @@ -854,6 +854,7 @@ static const struct amdgpu_ring_funcs vce_v3_0_ring_vm_funcs = { .get_rptr = vce_v3_0_ring_get_rptr, .get_wptr = vce_v3_0_ring_get_wptr, .set_wptr = vce_v3_0_ring_set_wptr, + .parse_cs = amdgpu_vce_ring_parse_cs_vm, .emit_frame_size = 6 + /* vce_v3_0_emit_vm_flush */ 4 + /* vce_v3_0_emit_pipeline_sync */ -- 2.5.0 _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply related [flat|nested] 6+ messages in thread
[parent not found: <1476106808-2192-2-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>]
* Re: [PATCH 2/2] drm/amdgpu: add VCE VM session tracking [not found] ` <1476106808-2192-2-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org> @ 2016-10-10 16:45 ` Alex Deucher [not found] ` <CADnq5_MOTCFmRLhv+u+Usi2-uA5ajYffrRmPKqDpy8s4Q2JOaQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 0 siblings, 1 reply; 6+ messages in thread From: Alex Deucher @ 2016-10-10 16:45 UTC (permalink / raw) To: Christian König; +Cc: amd-gfx list On Mon, Oct 10, 2016 at 9:40 AM, Christian König <deathsimple@vodafone.de> wrote: > From: Christian König <christian.koenig@amd.com> > > Only compile tested, but should fix the problems with killing > VCE sessions in VM mode. > > Signed-off-by: Christian König <christian.koenig@amd.com> Series is: Reviewed-by: Alex Deucher <alexander.deucher@amd.com> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | 90 +++++++++++++++++++++++++++++++++ > drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h | 1 + > drivers/gpu/drm/amd/amdgpu/vce_v3_0.c | 1 + > 3 files changed, 92 insertions(+) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c > index 05a1ea9..3d6f86c 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c > @@ -792,6 +792,96 @@ out: > } > > /** > + * amdgpu_vce_cs_parse_vm - parse the command stream in VM mode > + * > + * @p: parser context > + * > + */ > +int amdgpu_vce_ring_parse_cs_vm(struct amdgpu_cs_parser *p, uint32_t ib_idx) > +{ > + struct amdgpu_ib *ib = &p->job->ibs[ib_idx]; > + int session_idx = -1; > + uint32_t destroyed = 0; > + uint32_t created = 0; > + uint32_t allocated = 0; > + uint32_t tmp, handle = 0; > + int i, r = 0, idx = 0; > + > + while (idx < ib->length_dw) { > + uint32_t len = amdgpu_get_ib_value(p, ib_idx, idx); > + uint32_t cmd = amdgpu_get_ib_value(p, ib_idx, idx + 1); > + > + if ((len < 8) || (len & 3)) { > + DRM_ERROR("invalid VCE command length (%d)!\n", len); > + r = -EINVAL; > + goto out; > + } > + > + switch (cmd) { > + case 0x00000001: /* session */ > + handle = amdgpu_get_ib_value(p, ib_idx, idx + 2); > + session_idx = amdgpu_vce_validate_handle(p, handle, > + &allocated); > + if (session_idx < 0) { > + r = session_idx; > + goto out; > + } > + break; > + > + case 0x01000001: /* create */ > + created |= 1 << session_idx; > + if (destroyed & (1 << session_idx)) { > + destroyed &= ~(1 << session_idx); > + allocated |= 1 << session_idx; > + > + } else if (!(allocated & (1 << session_idx))) { > + DRM_ERROR("Handle already in use!\n"); > + r = -EINVAL; > + goto out; > + } > + > + break; > + > + case 0x02000001: /* destroy */ > + destroyed |= 1 << session_idx; > + break; > + > + default: > + break; > + } > + > + if (session_idx == -1) { > + DRM_ERROR("no session command at start of IB\n"); > + r = -EINVAL; > + goto out; > + } > + > + idx += len / 4; > + } > + > + if (allocated & ~created) { > + DRM_ERROR("New session without create command!\n"); > + r = -ENOENT; > + } > + > +out: > + if (!r) { > + /* No error, free all destroyed handle slots */ > + tmp = destroyed; > + amdgpu_ib_free(p->adev, ib, NULL); > + } else { > + /* Error during parsing, free all allocated handle slots */ > + tmp = allocated; > + } > + > + for (i = 0; i < AMDGPU_MAX_VCE_HANDLES; ++i) > + if (tmp & (1 << i)) > + atomic_set(&p->adev->vce.handles[i], 0); > + > + return r; > +} > + > +/** > * amdgpu_vce_ring_emit_ib - execute indirect buffer > * > * @ring: engine to use > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h > index 12729d2..44d49b5 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h > @@ -34,6 +34,7 @@ int amdgpu_vce_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle, > bool direct, struct fence **fence); > void amdgpu_vce_free_handles(struct amdgpu_device *adev, struct drm_file *filp); > int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx); > +int amdgpu_vce_ring_parse_cs_vm(struct amdgpu_cs_parser *p, uint32_t ib_idx); > void amdgpu_vce_ring_emit_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib, > unsigned vm_id, bool ctx_switch); > void amdgpu_vce_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq, > diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c > index f7dbd0d..2abf5bd 100644 > --- a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c > +++ b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c > @@ -854,6 +854,7 @@ static const struct amdgpu_ring_funcs vce_v3_0_ring_vm_funcs = { > .get_rptr = vce_v3_0_ring_get_rptr, > .get_wptr = vce_v3_0_ring_get_wptr, > .set_wptr = vce_v3_0_ring_set_wptr, > + .parse_cs = amdgpu_vce_ring_parse_cs_vm, > .emit_frame_size = > 6 + /* vce_v3_0_emit_vm_flush */ > 4 + /* vce_v3_0_emit_pipeline_sync */ > -- > 2.5.0 > > _______________________________________________ > 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] 6+ messages in thread
[parent not found: <CADnq5_MOTCFmRLhv+u+Usi2-uA5ajYffrRmPKqDpy8s4Q2JOaQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>]
* Re: [PATCH 2/2] drm/amdgpu: add VCE VM session tracking [not found] ` <CADnq5_MOTCFmRLhv+u+Usi2-uA5ajYffrRmPKqDpy8s4Q2JOaQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> @ 2016-10-12 11:05 ` Christian König [not found] ` <bbf01ee4-b771-cb84-0a35-c8d098097d91-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org> 0 siblings, 1 reply; 6+ messages in thread From: Christian König @ 2016-10-12 11:05 UTC (permalink / raw) To: Alex Deucher; +Cc: Andy Furniss, Liu, Leo, amd-gfx list Andy & Leo could you give that a brief testing? I currently don't have a setup for encoding/transcoding clips. Regards, Christian. Am 10.10.2016 um 18:45 schrieb Alex Deucher: > On Mon, Oct 10, 2016 at 9:40 AM, Christian König > <deathsimple@vodafone.de> wrote: >> From: Christian König <christian.koenig@amd.com> >> >> Only compile tested, but should fix the problems with killing >> VCE sessions in VM mode. >> >> Signed-off-by: Christian König <christian.koenig@amd.com> > Series is: > Reviewed-by: Alex Deucher <alexander.deucher@amd.com> > >> --- >> drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | 90 +++++++++++++++++++++++++++++++++ >> drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h | 1 + >> drivers/gpu/drm/amd/amdgpu/vce_v3_0.c | 1 + >> 3 files changed, 92 insertions(+) >> >> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c >> index 05a1ea9..3d6f86c 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c >> @@ -792,6 +792,96 @@ out: >> } >> >> /** >> + * amdgpu_vce_cs_parse_vm - parse the command stream in VM mode >> + * >> + * @p: parser context >> + * >> + */ >> +int amdgpu_vce_ring_parse_cs_vm(struct amdgpu_cs_parser *p, uint32_t ib_idx) >> +{ >> + struct amdgpu_ib *ib = &p->job->ibs[ib_idx]; >> + int session_idx = -1; >> + uint32_t destroyed = 0; >> + uint32_t created = 0; >> + uint32_t allocated = 0; >> + uint32_t tmp, handle = 0; >> + int i, r = 0, idx = 0; >> + >> + while (idx < ib->length_dw) { >> + uint32_t len = amdgpu_get_ib_value(p, ib_idx, idx); >> + uint32_t cmd = amdgpu_get_ib_value(p, ib_idx, idx + 1); >> + >> + if ((len < 8) || (len & 3)) { >> + DRM_ERROR("invalid VCE command length (%d)!\n", len); >> + r = -EINVAL; >> + goto out; >> + } >> + >> + switch (cmd) { >> + case 0x00000001: /* session */ >> + handle = amdgpu_get_ib_value(p, ib_idx, idx + 2); >> + session_idx = amdgpu_vce_validate_handle(p, handle, >> + &allocated); >> + if (session_idx < 0) { >> + r = session_idx; >> + goto out; >> + } >> + break; >> + >> + case 0x01000001: /* create */ >> + created |= 1 << session_idx; >> + if (destroyed & (1 << session_idx)) { >> + destroyed &= ~(1 << session_idx); >> + allocated |= 1 << session_idx; >> + >> + } else if (!(allocated & (1 << session_idx))) { >> + DRM_ERROR("Handle already in use!\n"); >> + r = -EINVAL; >> + goto out; >> + } >> + >> + break; >> + >> + case 0x02000001: /* destroy */ >> + destroyed |= 1 << session_idx; >> + break; >> + >> + default: >> + break; >> + } >> + >> + if (session_idx == -1) { >> + DRM_ERROR("no session command at start of IB\n"); >> + r = -EINVAL; >> + goto out; >> + } >> + >> + idx += len / 4; >> + } >> + >> + if (allocated & ~created) { >> + DRM_ERROR("New session without create command!\n"); >> + r = -ENOENT; >> + } >> + >> +out: >> + if (!r) { >> + /* No error, free all destroyed handle slots */ >> + tmp = destroyed; >> + amdgpu_ib_free(p->adev, ib, NULL); >> + } else { >> + /* Error during parsing, free all allocated handle slots */ >> + tmp = allocated; >> + } >> + >> + for (i = 0; i < AMDGPU_MAX_VCE_HANDLES; ++i) >> + if (tmp & (1 << i)) >> + atomic_set(&p->adev->vce.handles[i], 0); >> + >> + return r; >> +} >> + >> +/** >> * amdgpu_vce_ring_emit_ib - execute indirect buffer >> * >> * @ring: engine to use >> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h >> index 12729d2..44d49b5 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h >> @@ -34,6 +34,7 @@ int amdgpu_vce_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle, >> bool direct, struct fence **fence); >> void amdgpu_vce_free_handles(struct amdgpu_device *adev, struct drm_file *filp); >> int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx); >> +int amdgpu_vce_ring_parse_cs_vm(struct amdgpu_cs_parser *p, uint32_t ib_idx); >> void amdgpu_vce_ring_emit_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib, >> unsigned vm_id, bool ctx_switch); >> void amdgpu_vce_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq, >> diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c >> index f7dbd0d..2abf5bd 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c >> +++ b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c >> @@ -854,6 +854,7 @@ static const struct amdgpu_ring_funcs vce_v3_0_ring_vm_funcs = { >> .get_rptr = vce_v3_0_ring_get_rptr, >> .get_wptr = vce_v3_0_ring_get_wptr, >> .set_wptr = vce_v3_0_ring_set_wptr, >> + .parse_cs = amdgpu_vce_ring_parse_cs_vm, >> .emit_frame_size = >> 6 + /* vce_v3_0_emit_vm_flush */ >> 4 + /* vce_v3_0_emit_pipeline_sync */ >> -- >> 2.5.0 >> >> _______________________________________________ >> 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] 6+ messages in thread
[parent not found: <bbf01ee4-b771-cb84-0a35-c8d098097d91-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>]
* Re: [PATCH 2/2] drm/amdgpu: add VCE VM session tracking [not found] ` <bbf01ee4-b771-cb84-0a35-c8d098097d91-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org> @ 2016-10-12 14:47 ` Andy Furniss 2016-10-12 15:38 ` Leo Liu 1 sibling, 0 replies; 6+ messages in thread From: Andy Furniss @ 2016-10-12 14:47 UTC (permalink / raw) To: Christian König, Alex Deucher; +Cc: Liu, Leo, amd-gfx list Christian König wrote: > Andy & Leo could you give that a brief testing? Seems to be OK for me. > > I currently don't have a setup for encoding/transcoding clips. > > Regards, > Christian. > > Am 10.10.2016 um 18:45 schrieb Alex Deucher: >> On Mon, Oct 10, 2016 at 9:40 AM, Christian König >> <deathsimple@vodafone.de> wrote: >>> From: Christian König <christian.koenig@amd.com> >>> >>> Only compile tested, but should fix the problems with killing >>> VCE sessions in VM mode. >>> >>> Signed-off-by: Christian König <christian.koenig@amd.com> >> Series is: >> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> >> >>> --- >>> drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | 90 >>> +++++++++++++++++++++++++++++++++ >>> drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h | 1 + >>> drivers/gpu/drm/amd/amdgpu/vce_v3_0.c | 1 + >>> 3 files changed, 92 insertions(+) >>> >>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c >>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c >>> index 05a1ea9..3d6f86c 100644 >>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c >>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c >>> @@ -792,6 +792,96 @@ out: >>> } >>> >>> /** >>> + * amdgpu_vce_cs_parse_vm - parse the command stream in VM mode >>> + * >>> + * @p: parser context >>> + * >>> + */ >>> +int amdgpu_vce_ring_parse_cs_vm(struct amdgpu_cs_parser *p, uint32_t >>> ib_idx) >>> +{ >>> + struct amdgpu_ib *ib = &p->job->ibs[ib_idx]; >>> + int session_idx = -1; >>> + uint32_t destroyed = 0; >>> + uint32_t created = 0; >>> + uint32_t allocated = 0; >>> + uint32_t tmp, handle = 0; >>> + int i, r = 0, idx = 0; >>> + >>> + while (idx < ib->length_dw) { >>> + uint32_t len = amdgpu_get_ib_value(p, ib_idx, idx); >>> + uint32_t cmd = amdgpu_get_ib_value(p, ib_idx, idx + 1); >>> + >>> + if ((len < 8) || (len & 3)) { >>> + DRM_ERROR("invalid VCE command length >>> (%d)!\n", len); >>> + r = -EINVAL; >>> + goto out; >>> + } >>> + >>> + switch (cmd) { >>> + case 0x00000001: /* session */ >>> + handle = amdgpu_get_ib_value(p, ib_idx, idx + >>> 2); >>> + session_idx = amdgpu_vce_validate_handle(p, >>> handle, >>> + >>> &allocated); >>> + if (session_idx < 0) { >>> + r = session_idx; >>> + goto out; >>> + } >>> + break; >>> + >>> + case 0x01000001: /* create */ >>> + created |= 1 << session_idx; >>> + if (destroyed & (1 << session_idx)) { >>> + destroyed &= ~(1 << session_idx); >>> + allocated |= 1 << session_idx; >>> + >>> + } else if (!(allocated & (1 << session_idx))) { >>> + DRM_ERROR("Handle already in use!\n"); >>> + r = -EINVAL; >>> + goto out; >>> + } >>> + >>> + break; >>> + >>> + case 0x02000001: /* destroy */ >>> + destroyed |= 1 << session_idx; >>> + break; >>> + >>> + default: >>> + break; >>> + } >>> + >>> + if (session_idx == -1) { >>> + DRM_ERROR("no session command at start of >>> IB\n"); >>> + r = -EINVAL; >>> + goto out; >>> + } >>> + >>> + idx += len / 4; >>> + } >>> + >>> + if (allocated & ~created) { >>> + DRM_ERROR("New session without create command!\n"); >>> + r = -ENOENT; >>> + } >>> + >>> +out: >>> + if (!r) { >>> + /* No error, free all destroyed handle slots */ >>> + tmp = destroyed; >>> + amdgpu_ib_free(p->adev, ib, NULL); >>> + } else { >>> + /* Error during parsing, free all allocated handle >>> slots */ >>> + tmp = allocated; >>> + } >>> + >>> + for (i = 0; i < AMDGPU_MAX_VCE_HANDLES; ++i) >>> + if (tmp & (1 << i)) >>> + atomic_set(&p->adev->vce.handles[i], 0); >>> + >>> + return r; >>> +} >>> + >>> +/** >>> * amdgpu_vce_ring_emit_ib - execute indirect buffer >>> * >>> * @ring: engine to use >>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h >>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h >>> index 12729d2..44d49b5 100644 >>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h >>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h >>> @@ -34,6 +34,7 @@ int amdgpu_vce_get_destroy_msg(struct amdgpu_ring >>> *ring, uint32_t handle, >>> bool direct, struct fence **fence); >>> void amdgpu_vce_free_handles(struct amdgpu_device *adev, struct >>> drm_file *filp); >>> int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t >>> ib_idx); >>> +int amdgpu_vce_ring_parse_cs_vm(struct amdgpu_cs_parser *p, uint32_t >>> ib_idx); >>> void amdgpu_vce_ring_emit_ib(struct amdgpu_ring *ring, struct >>> amdgpu_ib *ib, >>> unsigned vm_id, bool ctx_switch); >>> void amdgpu_vce_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, >>> u64 seq, >>> diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c >>> b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c >>> index f7dbd0d..2abf5bd 100644 >>> --- a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c >>> +++ b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c >>> @@ -854,6 +854,7 @@ static const struct amdgpu_ring_funcs >>> vce_v3_0_ring_vm_funcs = { >>> .get_rptr = vce_v3_0_ring_get_rptr, >>> .get_wptr = vce_v3_0_ring_get_wptr, >>> .set_wptr = vce_v3_0_ring_set_wptr, >>> + .parse_cs = amdgpu_vce_ring_parse_cs_vm, >>> .emit_frame_size = >>> 6 + /* vce_v3_0_emit_vm_flush */ >>> 4 + /* vce_v3_0_emit_pipeline_sync */ >>> -- >>> 2.5.0 >>> >>> _______________________________________________ >>> 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] 6+ messages in thread
* Re: [PATCH 2/2] drm/amdgpu: add VCE VM session tracking [not found] ` <bbf01ee4-b771-cb84-0a35-c8d098097d91-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org> 2016-10-12 14:47 ` Andy Furniss @ 2016-10-12 15:38 ` Leo Liu 1 sibling, 0 replies; 6+ messages in thread From: Leo Liu @ 2016-10-12 15:38 UTC (permalink / raw) To: Christian König, Alex Deucher; +Cc: Andy Furniss, amd-gfx list On 10/12/2016 07:05 AM, Christian König wrote: > Andy & Leo could you give that a brief testing? run `kill -9' over 30 times, no issue. Patch is: Reviewed-and-Tested by: Leo Liu <leo.liu@amd.com> > I currently don't have a setup for encoding/transcoding clips. > > Regards, > Christian. > > Am 10.10.2016 um 18:45 schrieb Alex Deucher: >> On Mon, Oct 10, 2016 at 9:40 AM, Christian König >> <deathsimple@vodafone.de> wrote: >>> From: Christian König <christian.koenig@amd.com> >>> >>> Only compile tested, but should fix the problems with killing >>> VCE sessions in VM mode. >>> >>> Signed-off-by: Christian König <christian.koenig@amd.com> >> Series is: >> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> >> >>> --- >>> drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | 90 >>> +++++++++++++++++++++++++++++++++ >>> drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h | 1 + >>> drivers/gpu/drm/amd/amdgpu/vce_v3_0.c | 1 + >>> 3 files changed, 92 insertions(+) >>> >>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c >>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c >>> index 05a1ea9..3d6f86c 100644 >>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c >>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c >>> @@ -792,6 +792,96 @@ out: >>> } >>> >>> /** >>> + * amdgpu_vce_cs_parse_vm - parse the command stream in VM mode >>> + * >>> + * @p: parser context >>> + * >>> + */ >>> +int amdgpu_vce_ring_parse_cs_vm(struct amdgpu_cs_parser *p, >>> uint32_t ib_idx) >>> +{ >>> + struct amdgpu_ib *ib = &p->job->ibs[ib_idx]; >>> + int session_idx = -1; >>> + uint32_t destroyed = 0; >>> + uint32_t created = 0; >>> + uint32_t allocated = 0; >>> + uint32_t tmp, handle = 0; >>> + int i, r = 0, idx = 0; >>> + >>> + while (idx < ib->length_dw) { >>> + uint32_t len = amdgpu_get_ib_value(p, ib_idx, idx); >>> + uint32_t cmd = amdgpu_get_ib_value(p, ib_idx, idx + 1); >>> + >>> + if ((len < 8) || (len & 3)) { >>> + DRM_ERROR("invalid VCE command length >>> (%d)!\n", len); >>> + r = -EINVAL; >>> + goto out; >>> + } >>> + >>> + switch (cmd) { >>> + case 0x00000001: /* session */ >>> + handle = amdgpu_get_ib_value(p, ib_idx, idx >>> + 2); >>> + session_idx = amdgpu_vce_validate_handle(p, >>> handle, >>> + &allocated); >>> + if (session_idx < 0) { >>> + r = session_idx; >>> + goto out; >>> + } >>> + break; >>> + >>> + case 0x01000001: /* create */ >>> + created |= 1 << session_idx; >>> + if (destroyed & (1 << session_idx)) { >>> + destroyed &= ~(1 << session_idx); >>> + allocated |= 1 << session_idx; >>> + >>> + } else if (!(allocated & (1 << session_idx))) { >>> + DRM_ERROR("Handle already in use!\n"); >>> + r = -EINVAL; >>> + goto out; >>> + } >>> + >>> + break; >>> + >>> + case 0x02000001: /* destroy */ >>> + destroyed |= 1 << session_idx; >>> + break; >>> + >>> + default: >>> + break; >>> + } >>> + >>> + if (session_idx == -1) { >>> + DRM_ERROR("no session command at start of >>> IB\n"); >>> + r = -EINVAL; >>> + goto out; >>> + } >>> + >>> + idx += len / 4; >>> + } >>> + >>> + if (allocated & ~created) { >>> + DRM_ERROR("New session without create command!\n"); >>> + r = -ENOENT; >>> + } >>> + >>> +out: >>> + if (!r) { >>> + /* No error, free all destroyed handle slots */ >>> + tmp = destroyed; >>> + amdgpu_ib_free(p->adev, ib, NULL); >>> + } else { >>> + /* Error during parsing, free all allocated handle >>> slots */ >>> + tmp = allocated; >>> + } >>> + >>> + for (i = 0; i < AMDGPU_MAX_VCE_HANDLES; ++i) >>> + if (tmp & (1 << i)) >>> + atomic_set(&p->adev->vce.handles[i], 0); >>> + >>> + return r; >>> +} >>> + >>> +/** >>> * amdgpu_vce_ring_emit_ib - execute indirect buffer >>> * >>> * @ring: engine to use >>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h >>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h >>> index 12729d2..44d49b5 100644 >>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h >>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h >>> @@ -34,6 +34,7 @@ int amdgpu_vce_get_destroy_msg(struct amdgpu_ring >>> *ring, uint32_t handle, >>> bool direct, struct fence **fence); >>> void amdgpu_vce_free_handles(struct amdgpu_device *adev, struct >>> drm_file *filp); >>> int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t >>> ib_idx); >>> +int amdgpu_vce_ring_parse_cs_vm(struct amdgpu_cs_parser *p, >>> uint32_t ib_idx); >>> void amdgpu_vce_ring_emit_ib(struct amdgpu_ring *ring, struct >>> amdgpu_ib *ib, >>> unsigned vm_id, bool ctx_switch); >>> void amdgpu_vce_ring_emit_fence(struct amdgpu_ring *ring, u64 >>> addr, u64 seq, >>> diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c >>> b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c >>> index f7dbd0d..2abf5bd 100644 >>> --- a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c >>> +++ b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c >>> @@ -854,6 +854,7 @@ static const struct amdgpu_ring_funcs >>> vce_v3_0_ring_vm_funcs = { >>> .get_rptr = vce_v3_0_ring_get_rptr, >>> .get_wptr = vce_v3_0_ring_get_wptr, >>> .set_wptr = vce_v3_0_ring_set_wptr, >>> + .parse_cs = amdgpu_vce_ring_parse_cs_vm, >>> .emit_frame_size = >>> 6 + /* vce_v3_0_emit_vm_flush */ >>> 4 + /* vce_v3_0_emit_pipeline_sync */ >>> -- >>> 2.5.0 >>> >>> _______________________________________________ >>> 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] 6+ messages in thread
end of thread, other threads:[~2016-10-12 15:38 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-10-10 13:40 [PATCH 1/2] drm/amdgpu: improve parse_cs handling a bit Christian König
[not found] ` <1476106808-2192-1-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
2016-10-10 13:40 ` [PATCH 2/2] drm/amdgpu: add VCE VM session tracking Christian König
[not found] ` <1476106808-2192-2-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
2016-10-10 16:45 ` Alex Deucher
[not found] ` <CADnq5_MOTCFmRLhv+u+Usi2-uA5ajYffrRmPKqDpy8s4Q2JOaQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-10-12 11:05 ` Christian König
[not found] ` <bbf01ee4-b771-cb84-0a35-c8d098097d91-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
2016-10-12 14:47 ` Andy Furniss
2016-10-12 15:38 ` Leo Liu
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.