Commit cdc7893f authored by Christian König's avatar Christian König Committed by Alex Deucher

drm/amdgpu: use job and ib structures directly in CS parsers

Instead of providing the ib index provide the job and ib pointers directly to
the patch and parse functions for UVD and VCE.

Also move the set/get functions for IB values to the IB declerations.
Signed-off-by: default avatarChristian König <christian.koenig@amd.com>
Acked-by: default avatarAndrey Grodzovsky <andrey.grodzovsky@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent a190f8dc
...@@ -783,12 +783,15 @@ static int amdgpu_cs_vm_handling(struct amdgpu_cs_parser *p) ...@@ -783,12 +783,15 @@ static int amdgpu_cs_vm_handling(struct amdgpu_cs_parser *p)
memcpy(ib->ptr, kptr, chunk_ib->ib_bytes); memcpy(ib->ptr, kptr, chunk_ib->ib_bytes);
amdgpu_bo_kunmap(aobj); amdgpu_bo_kunmap(aobj);
r = amdgpu_ring_parse_cs(ring, p, j); r = amdgpu_ring_parse_cs(ring, p, p->job,
&p->job->ibs[i]);
if (r) if (r)
return r; return r;
} else { } else {
ib->ptr = (uint32_t *)kptr; ib->ptr = (uint32_t *)kptr;
r = amdgpu_ring_patch_cs_in_place(ring, p, j); r = amdgpu_ring_patch_cs_in_place(ring, p,
p->job,
&p->job->ibs[i]);
amdgpu_bo_kunmap(aobj); amdgpu_bo_kunmap(aobj);
if (r) if (r)
return r; return r;
......
...@@ -73,19 +73,6 @@ struct amdgpu_cs_parser { ...@@ -73,19 +73,6 @@ struct amdgpu_cs_parser {
struct amdgpu_cs_post_dep *post_deps; struct amdgpu_cs_post_dep *post_deps;
}; };
static inline u32 amdgpu_get_ib_value(struct amdgpu_cs_parser *p,
uint32_t ib_idx, int idx)
{
return p->job->ibs[ib_idx].ptr[idx];
}
static inline void amdgpu_set_ib_value(struct amdgpu_cs_parser *p,
uint32_t ib_idx, int idx,
uint32_t value)
{
p->job->ibs[ib_idx].ptr[idx] = value;
}
int amdgpu_cs_find_mapping(struct amdgpu_cs_parser *parser, int amdgpu_cs_find_mapping(struct amdgpu_cs_parser *parser,
uint64_t addr, struct amdgpu_bo **bo, uint64_t addr, struct amdgpu_bo **bo,
struct amdgpu_bo_va_mapping **mapping); struct amdgpu_bo_va_mapping **mapping);
......
...@@ -163,8 +163,12 @@ struct amdgpu_ring_funcs { ...@@ -163,8 +163,12 @@ struct amdgpu_ring_funcs {
u64 (*get_wptr)(struct amdgpu_ring *ring); u64 (*get_wptr)(struct amdgpu_ring *ring);
void (*set_wptr)(struct amdgpu_ring *ring); void (*set_wptr)(struct amdgpu_ring *ring);
/* validating and patching of IBs */ /* validating and patching of IBs */
int (*parse_cs)(struct amdgpu_cs_parser *p, uint32_t ib_idx); int (*parse_cs)(struct amdgpu_cs_parser *p,
int (*patch_cs_in_place)(struct amdgpu_cs_parser *p, uint32_t ib_idx); struct amdgpu_job *job,
struct amdgpu_ib *ib);
int (*patch_cs_in_place)(struct amdgpu_cs_parser *p,
struct amdgpu_job *job,
struct amdgpu_ib *ib);
/* constants to calculate how many DW are needed for an emit */ /* constants to calculate how many DW are needed for an emit */
unsigned emit_frame_size; unsigned emit_frame_size;
unsigned emit_ib_size; unsigned emit_ib_size;
...@@ -264,8 +268,8 @@ struct amdgpu_ring { ...@@ -264,8 +268,8 @@ struct amdgpu_ring {
atomic_t *sched_score; atomic_t *sched_score;
}; };
#define amdgpu_ring_parse_cs(r, p, ib) ((r)->funcs->parse_cs((p), (ib))) #define amdgpu_ring_parse_cs(r, p, job, ib) ((r)->funcs->parse_cs((p), (job), (ib)))
#define amdgpu_ring_patch_cs_in_place(r, p, ib) ((r)->funcs->patch_cs_in_place((p), (ib))) #define amdgpu_ring_patch_cs_in_place(r, p, job, ib) ((r)->funcs->patch_cs_in_place((p), (job), (ib)))
#define amdgpu_ring_test_ring(r) (r)->funcs->test_ring((r)) #define amdgpu_ring_test_ring(r) (r)->funcs->test_ring((r))
#define amdgpu_ring_test_ib(r, t) (r)->funcs->test_ib((r), (t)) #define amdgpu_ring_test_ib(r, t) (r)->funcs->test_ib((r), (t))
#define amdgpu_ring_get_rptr(r) (r)->funcs->get_rptr((r)) #define amdgpu_ring_get_rptr(r) (r)->funcs->get_rptr((r))
...@@ -364,6 +368,17 @@ int amdgpu_ring_test_helper(struct amdgpu_ring *ring); ...@@ -364,6 +368,17 @@ int amdgpu_ring_test_helper(struct amdgpu_ring *ring);
void amdgpu_debugfs_ring_init(struct amdgpu_device *adev, void amdgpu_debugfs_ring_init(struct amdgpu_device *adev,
struct amdgpu_ring *ring); struct amdgpu_ring *ring);
static inline u32 amdgpu_ib_get_value(struct amdgpu_ib *ib, int idx)
{
return ib->ptr[idx];
}
static inline void amdgpu_ib_set_value(struct amdgpu_ib *ib, int idx,
uint32_t value)
{
ib->ptr[idx] = value;
}
int amdgpu_ib_get(struct amdgpu_device *adev, struct amdgpu_vm *vm, int amdgpu_ib_get(struct amdgpu_device *adev, struct amdgpu_vm *vm,
unsigned size, unsigned size,
enum amdgpu_ib_pool_type pool, enum amdgpu_ib_pool_type pool,
......
...@@ -99,7 +99,7 @@ struct amdgpu_uvd_cs_ctx { ...@@ -99,7 +99,7 @@ struct amdgpu_uvd_cs_ctx {
unsigned reg, count; unsigned reg, count;
unsigned data0, data1; unsigned data0, data1;
unsigned idx; unsigned idx;
unsigned ib_idx; struct amdgpu_ib *ib;
/* does the IB has a msg command */ /* does the IB has a msg command */
bool has_msg_cmd; bool has_msg_cmd;
...@@ -558,8 +558,8 @@ static u64 amdgpu_uvd_get_addr_from_ctx(struct amdgpu_uvd_cs_ctx *ctx) ...@@ -558,8 +558,8 @@ static u64 amdgpu_uvd_get_addr_from_ctx(struct amdgpu_uvd_cs_ctx *ctx)
uint32_t lo, hi; uint32_t lo, hi;
uint64_t addr; uint64_t addr;
lo = amdgpu_get_ib_value(ctx->parser, ctx->ib_idx, ctx->data0); lo = amdgpu_ib_get_value(ctx->ib, ctx->data0);
hi = amdgpu_get_ib_value(ctx->parser, ctx->ib_idx, ctx->data1); hi = amdgpu_ib_get_value(ctx->ib, ctx->data1);
addr = ((uint64_t)lo) | (((uint64_t)hi) << 32); addr = ((uint64_t)lo) | (((uint64_t)hi) << 32);
return addr; return addr;
...@@ -590,7 +590,7 @@ static int amdgpu_uvd_cs_pass1(struct amdgpu_uvd_cs_ctx *ctx) ...@@ -590,7 +590,7 @@ static int amdgpu_uvd_cs_pass1(struct amdgpu_uvd_cs_ctx *ctx)
if (!ctx->parser->adev->uvd.address_64_bit) { if (!ctx->parser->adev->uvd.address_64_bit) {
/* check if it's a message or feedback command */ /* check if it's a message or feedback command */
cmd = amdgpu_get_ib_value(ctx->parser, ctx->ib_idx, ctx->idx) >> 1; cmd = amdgpu_ib_get_value(ctx->ib, ctx->idx) >> 1;
if (cmd == 0x0 || cmd == 0x3) { if (cmd == 0x0 || cmd == 0x3) {
/* yes, force it into VRAM */ /* yes, force it into VRAM */
uint32_t domain = AMDGPU_GEM_DOMAIN_VRAM; uint32_t domain = AMDGPU_GEM_DOMAIN_VRAM;
...@@ -928,12 +928,10 @@ static int amdgpu_uvd_cs_pass2(struct amdgpu_uvd_cs_ctx *ctx) ...@@ -928,12 +928,10 @@ static int amdgpu_uvd_cs_pass2(struct amdgpu_uvd_cs_ctx *ctx)
addr -= mapping->start * AMDGPU_GPU_PAGE_SIZE; addr -= mapping->start * AMDGPU_GPU_PAGE_SIZE;
start += addr; start += addr;
amdgpu_set_ib_value(ctx->parser, ctx->ib_idx, ctx->data0, amdgpu_ib_set_value(ctx->ib, ctx->data0, lower_32_bits(start));
lower_32_bits(start)); amdgpu_ib_set_value(ctx->ib, ctx->data1, upper_32_bits(start));
amdgpu_set_ib_value(ctx->parser, ctx->ib_idx, ctx->data1,
upper_32_bits(start));
cmd = amdgpu_get_ib_value(ctx->parser, ctx->ib_idx, ctx->idx) >> 1; cmd = amdgpu_ib_get_value(ctx->ib, ctx->idx) >> 1;
if (cmd < 0x4) { if (cmd < 0x4) {
if ((end - start) < ctx->buf_sizes[cmd]) { if ((end - start) < ctx->buf_sizes[cmd]) {
DRM_ERROR("buffer (%d) to small (%d / %d)!\n", cmd, DRM_ERROR("buffer (%d) to small (%d / %d)!\n", cmd,
...@@ -993,14 +991,13 @@ static int amdgpu_uvd_cs_pass2(struct amdgpu_uvd_cs_ctx *ctx) ...@@ -993,14 +991,13 @@ static int amdgpu_uvd_cs_pass2(struct amdgpu_uvd_cs_ctx *ctx)
static int amdgpu_uvd_cs_reg(struct amdgpu_uvd_cs_ctx *ctx, static int amdgpu_uvd_cs_reg(struct amdgpu_uvd_cs_ctx *ctx,
int (*cb)(struct amdgpu_uvd_cs_ctx *ctx)) int (*cb)(struct amdgpu_uvd_cs_ctx *ctx))
{ {
struct amdgpu_ib *ib = &ctx->parser->job->ibs[ctx->ib_idx];
int i, r; int i, r;
ctx->idx++; ctx->idx++;
for (i = 0; i <= ctx->count; ++i) { for (i = 0; i <= ctx->count; ++i) {
unsigned reg = ctx->reg + i; unsigned reg = ctx->reg + i;
if (ctx->idx >= ib->length_dw) { if (ctx->idx >= ctx->ib->length_dw) {
DRM_ERROR("Register command after end of CS!\n"); DRM_ERROR("Register command after end of CS!\n");
return -EINVAL; return -EINVAL;
} }
...@@ -1040,11 +1037,10 @@ static int amdgpu_uvd_cs_reg(struct amdgpu_uvd_cs_ctx *ctx, ...@@ -1040,11 +1037,10 @@ static int amdgpu_uvd_cs_reg(struct amdgpu_uvd_cs_ctx *ctx,
static int amdgpu_uvd_cs_packets(struct amdgpu_uvd_cs_ctx *ctx, static int amdgpu_uvd_cs_packets(struct amdgpu_uvd_cs_ctx *ctx,
int (*cb)(struct amdgpu_uvd_cs_ctx *ctx)) int (*cb)(struct amdgpu_uvd_cs_ctx *ctx))
{ {
struct amdgpu_ib *ib = &ctx->parser->job->ibs[ctx->ib_idx];
int r; int r;
for (ctx->idx = 0 ; ctx->idx < ib->length_dw; ) { for (ctx->idx = 0 ; ctx->idx < ctx->ib->length_dw; ) {
uint32_t cmd = amdgpu_get_ib_value(ctx->parser, ctx->ib_idx, ctx->idx); uint32_t cmd = amdgpu_ib_get_value(ctx->ib, ctx->idx);
unsigned type = CP_PACKET_GET_TYPE(cmd); unsigned type = CP_PACKET_GET_TYPE(cmd);
switch (type) { switch (type) {
case PACKET_TYPE0: case PACKET_TYPE0:
...@@ -1069,11 +1065,14 @@ static int amdgpu_uvd_cs_packets(struct amdgpu_uvd_cs_ctx *ctx, ...@@ -1069,11 +1065,14 @@ static int amdgpu_uvd_cs_packets(struct amdgpu_uvd_cs_ctx *ctx,
* amdgpu_uvd_ring_parse_cs - UVD command submission parser * amdgpu_uvd_ring_parse_cs - UVD command submission parser
* *
* @parser: Command submission parser context * @parser: Command submission parser context
* @ib_idx: Which indirect buffer to use * @job: the job to parse
* @ib: the IB to patch
* *
* Parse the command stream, patch in addresses as necessary. * Parse the command stream, patch in addresses as necessary.
*/ */
int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser *parser, uint32_t ib_idx) int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser *parser,
struct amdgpu_job *job,
struct amdgpu_ib *ib)
{ {
struct amdgpu_uvd_cs_ctx ctx = {}; struct amdgpu_uvd_cs_ctx ctx = {};
unsigned buf_sizes[] = { unsigned buf_sizes[] = {
...@@ -1083,10 +1082,9 @@ int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser *parser, uint32_t ib_idx) ...@@ -1083,10 +1082,9 @@ int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser *parser, uint32_t ib_idx)
[0x00000003] = 2048, [0x00000003] = 2048,
[0x00000004] = 0xFFFFFFFF, [0x00000004] = 0xFFFFFFFF,
}; };
struct amdgpu_ib *ib = &parser->job->ibs[ib_idx];
int r; int r;
parser->job->vm = NULL; job->vm = NULL;
ib->gpu_addr = amdgpu_sa_bo_gpu_addr(ib->sa_bo); ib->gpu_addr = amdgpu_sa_bo_gpu_addr(ib->sa_bo);
if (ib->length_dw % 16) { if (ib->length_dw % 16) {
...@@ -1097,7 +1095,7 @@ int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser *parser, uint32_t ib_idx) ...@@ -1097,7 +1095,7 @@ int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser *parser, uint32_t ib_idx)
ctx.parser = parser; ctx.parser = parser;
ctx.buf_sizes = buf_sizes; ctx.buf_sizes = buf_sizes;
ctx.ib_idx = ib_idx; ctx.ib = ib;
/* first round only required on chips without UVD 64 bit address support */ /* first round only required on chips without UVD 64 bit address support */
if (!parser->adev->uvd.address_64_bit) { if (!parser->adev->uvd.address_64_bit) {
......
...@@ -82,7 +82,9 @@ int amdgpu_uvd_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle, ...@@ -82,7 +82,9 @@ int amdgpu_uvd_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle,
bool direct, struct dma_fence **fence); bool direct, struct dma_fence **fence);
void amdgpu_uvd_free_handles(struct amdgpu_device *adev, void amdgpu_uvd_free_handles(struct amdgpu_device *adev,
struct drm_file *filp); struct drm_file *filp);
int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser *parser, uint32_t ib_idx); int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser *parser,
struct amdgpu_job *job,
struct amdgpu_ib *ib);
void amdgpu_uvd_ring_begin_use(struct amdgpu_ring *ring); void amdgpu_uvd_ring_begin_use(struct amdgpu_ring *ring);
void amdgpu_uvd_ring_end_use(struct amdgpu_ring *ring); void amdgpu_uvd_ring_end_use(struct amdgpu_ring *ring);
int amdgpu_uvd_ring_test_ib(struct amdgpu_ring *ring, long timeout); int amdgpu_uvd_ring_test_ib(struct amdgpu_ring *ring, long timeout);
......
...@@ -588,8 +588,7 @@ static int amdgpu_vce_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle, ...@@ -588,8 +588,7 @@ static int amdgpu_vce_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle,
/** /**
* amdgpu_vce_validate_bo - make sure not to cross 4GB boundary * amdgpu_vce_validate_bo - make sure not to cross 4GB boundary
* *
* @p: parser context * @ib: indirect buffer to use
* @ib_idx: indirect buffer to use
* @lo: address of lower dword * @lo: address of lower dword
* @hi: address of higher dword * @hi: address of higher dword
* @size: minimum size * @size: minimum size
...@@ -597,8 +596,9 @@ static int amdgpu_vce_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle, ...@@ -597,8 +596,9 @@ static int amdgpu_vce_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle,
* *
* Make sure that no BO cross a 4GB boundary. * Make sure that no BO cross a 4GB boundary.
*/ */
static int amdgpu_vce_validate_bo(struct amdgpu_cs_parser *p, uint32_t ib_idx, static int amdgpu_vce_validate_bo(struct amdgpu_cs_parser *p,
int lo, int hi, unsigned size, int32_t index) struct amdgpu_ib *ib, int lo, int hi,
unsigned size, int32_t index)
{ {
int64_t offset = ((uint64_t)size) * ((int64_t)index); int64_t offset = ((uint64_t)size) * ((int64_t)index);
struct ttm_operation_ctx ctx = { false, false }; struct ttm_operation_ctx ctx = { false, false };
...@@ -608,8 +608,8 @@ static int amdgpu_vce_validate_bo(struct amdgpu_cs_parser *p, uint32_t ib_idx, ...@@ -608,8 +608,8 @@ static int amdgpu_vce_validate_bo(struct amdgpu_cs_parser *p, uint32_t ib_idx,
uint64_t addr; uint64_t addr;
int r; int r;
addr = ((uint64_t)amdgpu_get_ib_value(p, ib_idx, lo)) | addr = ((uint64_t)amdgpu_ib_get_value(ib, lo)) |
((uint64_t)amdgpu_get_ib_value(p, ib_idx, hi)) << 32; ((uint64_t)amdgpu_ib_get_value(ib, hi)) << 32;
if (index >= 0) { if (index >= 0) {
addr += offset; addr += offset;
fpfn = PAGE_ALIGN(offset) >> PAGE_SHIFT; fpfn = PAGE_ALIGN(offset) >> PAGE_SHIFT;
...@@ -639,7 +639,7 @@ static int amdgpu_vce_validate_bo(struct amdgpu_cs_parser *p, uint32_t ib_idx, ...@@ -639,7 +639,7 @@ static int amdgpu_vce_validate_bo(struct amdgpu_cs_parser *p, uint32_t ib_idx,
* amdgpu_vce_cs_reloc - command submission relocation * amdgpu_vce_cs_reloc - command submission relocation
* *
* @p: parser context * @p: parser context
* @ib_idx: indirect buffer to use * @ib: indirect buffer to use
* @lo: address of lower dword * @lo: address of lower dword
* @hi: address of higher dword * @hi: address of higher dword
* @size: minimum size * @size: minimum size
...@@ -647,7 +647,7 @@ static int amdgpu_vce_validate_bo(struct amdgpu_cs_parser *p, uint32_t ib_idx, ...@@ -647,7 +647,7 @@ static int amdgpu_vce_validate_bo(struct amdgpu_cs_parser *p, uint32_t ib_idx,
* *
* Patch relocation inside command stream with real buffer address * Patch relocation inside command stream with real buffer address
*/ */
static int amdgpu_vce_cs_reloc(struct amdgpu_cs_parser *p, uint32_t ib_idx, static int amdgpu_vce_cs_reloc(struct amdgpu_cs_parser *p, struct amdgpu_ib *ib,
int lo, int hi, unsigned size, uint32_t index) int lo, int hi, unsigned size, uint32_t index)
{ {
struct amdgpu_bo_va_mapping *mapping; struct amdgpu_bo_va_mapping *mapping;
...@@ -658,8 +658,8 @@ static int amdgpu_vce_cs_reloc(struct amdgpu_cs_parser *p, uint32_t ib_idx, ...@@ -658,8 +658,8 @@ static int amdgpu_vce_cs_reloc(struct amdgpu_cs_parser *p, uint32_t ib_idx,
if (index == 0xffffffff) if (index == 0xffffffff)
index = 0; index = 0;
addr = ((uint64_t)amdgpu_get_ib_value(p, ib_idx, lo)) | addr = ((uint64_t)amdgpu_ib_get_value(ib, lo)) |
((uint64_t)amdgpu_get_ib_value(p, ib_idx, hi)) << 32; ((uint64_t)amdgpu_ib_get_value(ib, hi)) << 32;
addr += ((uint64_t)size) * ((uint64_t)index); addr += ((uint64_t)size) * ((uint64_t)index);
r = amdgpu_cs_find_mapping(p, addr, &bo, &mapping); r = amdgpu_cs_find_mapping(p, addr, &bo, &mapping);
...@@ -680,8 +680,8 @@ static int amdgpu_vce_cs_reloc(struct amdgpu_cs_parser *p, uint32_t ib_idx, ...@@ -680,8 +680,8 @@ static int amdgpu_vce_cs_reloc(struct amdgpu_cs_parser *p, uint32_t ib_idx,
addr += amdgpu_bo_gpu_offset(bo); addr += amdgpu_bo_gpu_offset(bo);
addr -= ((uint64_t)size) * ((uint64_t)index); addr -= ((uint64_t)size) * ((uint64_t)index);
amdgpu_set_ib_value(p, ib_idx, lo, lower_32_bits(addr)); amdgpu_ib_set_value(ib, lo, lower_32_bits(addr));
amdgpu_set_ib_value(p, ib_idx, hi, upper_32_bits(addr)); amdgpu_ib_set_value(ib, hi, upper_32_bits(addr));
return 0; return 0;
} }
...@@ -730,11 +730,13 @@ static int amdgpu_vce_validate_handle(struct amdgpu_cs_parser *p, ...@@ -730,11 +730,13 @@ static int amdgpu_vce_validate_handle(struct amdgpu_cs_parser *p,
* amdgpu_vce_ring_parse_cs - parse and validate the command stream * amdgpu_vce_ring_parse_cs - parse and validate the command stream
* *
* @p: parser context * @p: parser context
* @ib_idx: indirect buffer to use * @job: the job to parse
* @ib: the IB to patch
*/ */
int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx) int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p,
struct amdgpu_job *job,
struct amdgpu_ib *ib)
{ {
struct amdgpu_ib *ib = &p->job->ibs[ib_idx];
unsigned fb_idx = 0, bs_idx = 0; unsigned fb_idx = 0, bs_idx = 0;
int session_idx = -1; int session_idx = -1;
uint32_t destroyed = 0; uint32_t destroyed = 0;
...@@ -745,12 +747,12 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx) ...@@ -745,12 +747,12 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx)
unsigned idx; unsigned idx;
int i, r = 0; int i, r = 0;
p->job->vm = NULL; job->vm = NULL;
ib->gpu_addr = amdgpu_sa_bo_gpu_addr(ib->sa_bo); ib->gpu_addr = amdgpu_sa_bo_gpu_addr(ib->sa_bo);
for (idx = 0; idx < ib->length_dw;) { for (idx = 0; idx < ib->length_dw;) {
uint32_t len = amdgpu_get_ib_value(p, ib_idx, idx); uint32_t len = amdgpu_ib_get_value(ib, idx);
uint32_t cmd = amdgpu_get_ib_value(p, ib_idx, idx + 1); uint32_t cmd = amdgpu_ib_get_value(ib, idx + 1);
if ((len < 8) || (len & 3)) { if ((len < 8) || (len & 3)) {
DRM_ERROR("invalid VCE command length (%d)!\n", len); DRM_ERROR("invalid VCE command length (%d)!\n", len);
...@@ -760,52 +762,52 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx) ...@@ -760,52 +762,52 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx)
switch (cmd) { switch (cmd) {
case 0x00000002: /* task info */ case 0x00000002: /* task info */
fb_idx = amdgpu_get_ib_value(p, ib_idx, idx + 6); fb_idx = amdgpu_ib_get_value(ib, idx + 6);
bs_idx = amdgpu_get_ib_value(p, ib_idx, idx + 7); bs_idx = amdgpu_ib_get_value(ib, idx + 7);
break; break;
case 0x03000001: /* encode */ case 0x03000001: /* encode */
r = amdgpu_vce_validate_bo(p, ib_idx, idx + 10, r = amdgpu_vce_validate_bo(p, ib, idx + 10, idx + 9,
idx + 9, 0, 0); 0, 0);
if (r) if (r)
goto out; goto out;
r = amdgpu_vce_validate_bo(p, ib_idx, idx + 12, r = amdgpu_vce_validate_bo(p, ib, idx + 12, idx + 11,
idx + 11, 0, 0); 0, 0);
if (r) if (r)
goto out; goto out;
break; break;
case 0x05000001: /* context buffer */ case 0x05000001: /* context buffer */
r = amdgpu_vce_validate_bo(p, ib_idx, idx + 3, r = amdgpu_vce_validate_bo(p, ib, idx + 3, idx + 2,
idx + 2, 0, 0); 0, 0);
if (r) if (r)
goto out; goto out;
break; break;
case 0x05000004: /* video bitstream buffer */ case 0x05000004: /* video bitstream buffer */
tmp = amdgpu_get_ib_value(p, ib_idx, idx + 4); tmp = amdgpu_ib_get_value(ib, idx + 4);
r = amdgpu_vce_validate_bo(p, ib_idx, idx + 3, idx + 2, r = amdgpu_vce_validate_bo(p, ib, idx + 3, idx + 2,
tmp, bs_idx); tmp, bs_idx);
if (r) if (r)
goto out; goto out;
break; break;
case 0x05000005: /* feedback buffer */ case 0x05000005: /* feedback buffer */
r = amdgpu_vce_validate_bo(p, ib_idx, idx + 3, idx + 2, r = amdgpu_vce_validate_bo(p, ib, idx + 3, idx + 2,
4096, fb_idx); 4096, fb_idx);
if (r) if (r)
goto out; goto out;
break; break;
case 0x0500000d: /* MV buffer */ case 0x0500000d: /* MV buffer */
r = amdgpu_vce_validate_bo(p, ib_idx, idx + 3, r = amdgpu_vce_validate_bo(p, ib, idx + 3, idx + 2,
idx + 2, 0, 0); 0, 0);
if (r) if (r)
goto out; goto out;
r = amdgpu_vce_validate_bo(p, ib_idx, idx + 8, r = amdgpu_vce_validate_bo(p, ib, idx + 8, idx + 7,
idx + 7, 0, 0); 0, 0);
if (r) if (r)
goto out; goto out;
break; break;
...@@ -815,12 +817,12 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx) ...@@ -815,12 +817,12 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx)
} }
for (idx = 0; idx < ib->length_dw;) { for (idx = 0; idx < ib->length_dw;) {
uint32_t len = amdgpu_get_ib_value(p, ib_idx, idx); uint32_t len = amdgpu_ib_get_value(ib, idx);
uint32_t cmd = amdgpu_get_ib_value(p, ib_idx, idx + 1); uint32_t cmd = amdgpu_ib_get_value(ib, idx + 1);
switch (cmd) { switch (cmd) {
case 0x00000001: /* session */ case 0x00000001: /* session */
handle = amdgpu_get_ib_value(p, ib_idx, idx + 2); handle = amdgpu_ib_get_value(ib, idx + 2);
session_idx = amdgpu_vce_validate_handle(p, handle, session_idx = amdgpu_vce_validate_handle(p, handle,
&allocated); &allocated);
if (session_idx < 0) { if (session_idx < 0) {
...@@ -831,8 +833,8 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx) ...@@ -831,8 +833,8 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx)
break; break;
case 0x00000002: /* task info */ case 0x00000002: /* task info */
fb_idx = amdgpu_get_ib_value(p, ib_idx, idx + 6); fb_idx = amdgpu_ib_get_value(ib, idx + 6);
bs_idx = amdgpu_get_ib_value(p, ib_idx, idx + 7); bs_idx = amdgpu_ib_get_value(ib, idx + 7);
break; break;
case 0x01000001: /* create */ case 0x01000001: /* create */
...@@ -847,8 +849,8 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx) ...@@ -847,8 +849,8 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx)
goto out; goto out;
} }
*size = amdgpu_get_ib_value(p, ib_idx, idx + 8) * *size = amdgpu_ib_get_value(ib, idx + 8) *
amdgpu_get_ib_value(p, ib_idx, idx + 10) * amdgpu_ib_get_value(ib, idx + 10) *
8 * 3 / 2; 8 * 3 / 2;
break; break;
...@@ -877,12 +879,12 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx) ...@@ -877,12 +879,12 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx)
break; break;
case 0x03000001: /* encode */ case 0x03000001: /* encode */
r = amdgpu_vce_cs_reloc(p, ib_idx, idx + 10, idx + 9, r = amdgpu_vce_cs_reloc(p, ib, idx + 10, idx + 9,
*size, 0); *size, 0);
if (r) if (r)
goto out; goto out;
r = amdgpu_vce_cs_reloc(p, ib_idx, idx + 12, idx + 11, r = amdgpu_vce_cs_reloc(p, ib, idx + 12, idx + 11,
*size / 3, 0); *size / 3, 0);
if (r) if (r)
goto out; goto out;
...@@ -893,35 +895,35 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx) ...@@ -893,35 +895,35 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx)
break; break;
case 0x05000001: /* context buffer */ case 0x05000001: /* context buffer */
r = amdgpu_vce_cs_reloc(p, ib_idx, idx + 3, idx + 2, r = amdgpu_vce_cs_reloc(p, ib, idx + 3, idx + 2,
*size * 2, 0); *size * 2, 0);
if (r) if (r)
goto out; goto out;
break; break;
case 0x05000004: /* video bitstream buffer */ case 0x05000004: /* video bitstream buffer */
tmp = amdgpu_get_ib_value(p, ib_idx, idx + 4); tmp = amdgpu_ib_get_value(ib, idx + 4);
r = amdgpu_vce_cs_reloc(p, ib_idx, idx + 3, idx + 2, r = amdgpu_vce_cs_reloc(p, ib, idx + 3, idx + 2,
tmp, bs_idx); tmp, bs_idx);
if (r) if (r)
goto out; goto out;
break; break;
case 0x05000005: /* feedback buffer */ case 0x05000005: /* feedback buffer */
r = amdgpu_vce_cs_reloc(p, ib_idx, idx + 3, idx + 2, r = amdgpu_vce_cs_reloc(p, ib, idx + 3, idx + 2,
4096, fb_idx); 4096, fb_idx);
if (r) if (r)
goto out; goto out;
break; break;
case 0x0500000d: /* MV buffer */ case 0x0500000d: /* MV buffer */
r = amdgpu_vce_cs_reloc(p, ib_idx, idx + 3, r = amdgpu_vce_cs_reloc(p, ib, idx + 3,
idx + 2, *size, 0); idx + 2, *size, 0);
if (r) if (r)
goto out; goto out;
r = amdgpu_vce_cs_reloc(p, ib_idx, idx + 8, r = amdgpu_vce_cs_reloc(p, ib, idx + 8,
idx + 7, *size / 12, 0); idx + 7, *size / 12, 0);
if (r) if (r)
goto out; goto out;
break; break;
...@@ -966,11 +968,13 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx) ...@@ -966,11 +968,13 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx)
* amdgpu_vce_ring_parse_cs_vm - parse the command stream in VM mode * amdgpu_vce_ring_parse_cs_vm - parse the command stream in VM mode
* *
* @p: parser context * @p: parser context
* @ib_idx: indirect buffer to use * @job: the job to parse
* @ib: the IB to patch
*/ */
int amdgpu_vce_ring_parse_cs_vm(struct amdgpu_cs_parser *p, uint32_t ib_idx) int amdgpu_vce_ring_parse_cs_vm(struct amdgpu_cs_parser *p,
struct amdgpu_job *job,
struct amdgpu_ib *ib)
{ {
struct amdgpu_ib *ib = &p->job->ibs[ib_idx];
int session_idx = -1; int session_idx = -1;
uint32_t destroyed = 0; uint32_t destroyed = 0;
uint32_t created = 0; uint32_t created = 0;
...@@ -979,8 +983,8 @@ int amdgpu_vce_ring_parse_cs_vm(struct amdgpu_cs_parser *p, uint32_t ib_idx) ...@@ -979,8 +983,8 @@ int amdgpu_vce_ring_parse_cs_vm(struct amdgpu_cs_parser *p, uint32_t ib_idx)
int i, r = 0, idx = 0; int i, r = 0, idx = 0;
while (idx < ib->length_dw) { while (idx < ib->length_dw) {
uint32_t len = amdgpu_get_ib_value(p, ib_idx, idx); uint32_t len = amdgpu_ib_get_value(ib, idx);
uint32_t cmd = amdgpu_get_ib_value(p, ib_idx, idx + 1); uint32_t cmd = amdgpu_ib_get_value(ib, idx + 1);
if ((len < 8) || (len & 3)) { if ((len < 8) || (len & 3)) {
DRM_ERROR("invalid VCE command length (%d)!\n", len); DRM_ERROR("invalid VCE command length (%d)!\n", len);
...@@ -990,7 +994,7 @@ int amdgpu_vce_ring_parse_cs_vm(struct amdgpu_cs_parser *p, uint32_t ib_idx) ...@@ -990,7 +994,7 @@ int amdgpu_vce_ring_parse_cs_vm(struct amdgpu_cs_parser *p, uint32_t ib_idx)
switch (cmd) { switch (cmd) {
case 0x00000001: /* session */ case 0x00000001: /* session */
handle = amdgpu_get_ib_value(p, ib_idx, idx + 2); handle = amdgpu_ib_get_value(ib, idx + 2);
session_idx = amdgpu_vce_validate_handle(p, handle, session_idx = amdgpu_vce_validate_handle(p, handle,
&allocated); &allocated);
if (session_idx < 0) { if (session_idx < 0) {
......
...@@ -59,8 +59,11 @@ int amdgpu_vce_entity_init(struct amdgpu_device *adev); ...@@ -59,8 +59,11 @@ int amdgpu_vce_entity_init(struct amdgpu_device *adev);
int amdgpu_vce_suspend(struct amdgpu_device *adev); int amdgpu_vce_suspend(struct amdgpu_device *adev);
int amdgpu_vce_resume(struct amdgpu_device *adev); int amdgpu_vce_resume(struct amdgpu_device *adev);
void amdgpu_vce_free_handles(struct amdgpu_device *adev, struct drm_file *filp); 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(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
int amdgpu_vce_ring_parse_cs_vm(struct amdgpu_cs_parser *p, uint32_t ib_idx); struct amdgpu_ib *ib);
int amdgpu_vce_ring_parse_cs_vm(struct amdgpu_cs_parser *p,
struct amdgpu_job *job,
struct amdgpu_ib *ib);
void amdgpu_vce_ring_emit_ib(struct amdgpu_ring *ring, struct amdgpu_job *job, void amdgpu_vce_ring_emit_ib(struct amdgpu_ring *ring, struct amdgpu_job *job,
struct amdgpu_ib *ib, uint32_t flags); struct amdgpu_ib *ib, uint32_t flags);
void amdgpu_vce_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq, void amdgpu_vce_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq,
......
...@@ -1276,14 +1276,15 @@ static int uvd_v7_0_ring_test_ring(struct amdgpu_ring *ring) ...@@ -1276,14 +1276,15 @@ static int uvd_v7_0_ring_test_ring(struct amdgpu_ring *ring)
* uvd_v7_0_ring_patch_cs_in_place - Patch the IB for command submission. * uvd_v7_0_ring_patch_cs_in_place - Patch the IB for command submission.
* *
* @p: the CS parser with the IBs * @p: the CS parser with the IBs
* @ib_idx: which IB to patch * @job: which job this ib is in
* @ib: which IB to patch
* *
*/ */
static int uvd_v7_0_ring_patch_cs_in_place(struct amdgpu_cs_parser *p, static int uvd_v7_0_ring_patch_cs_in_place(struct amdgpu_cs_parser *p,
uint32_t ib_idx) struct amdgpu_job *job,
struct amdgpu_ib *ib)
{ {
struct amdgpu_ring *ring = to_amdgpu_ring(p->entity->rq->sched); struct amdgpu_ring *ring = to_amdgpu_ring(job->base.sched);
struct amdgpu_ib *ib = &p->job->ibs[ib_idx];
unsigned i; unsigned i;
/* No patching necessary for the first instance */ /* No patching necessary for the first instance */
...@@ -1291,12 +1292,12 @@ static int uvd_v7_0_ring_patch_cs_in_place(struct amdgpu_cs_parser *p, ...@@ -1291,12 +1292,12 @@ static int uvd_v7_0_ring_patch_cs_in_place(struct amdgpu_cs_parser *p,
return 0; return 0;
for (i = 0; i < ib->length_dw; i += 2) { for (i = 0; i < ib->length_dw; i += 2) {
uint32_t reg = amdgpu_get_ib_value(p, ib_idx, i); uint32_t reg = amdgpu_ib_get_value(ib, i);
reg -= p->adev->reg_offset[UVD_HWIP][0][1]; reg -= p->adev->reg_offset[UVD_HWIP][0][1];
reg += p->adev->reg_offset[UVD_HWIP][1][1]; reg += p->adev->reg_offset[UVD_HWIP][1][1];
amdgpu_set_ib_value(p, ib_idx, i, reg); amdgpu_ib_set_value(ib, i, reg);
} }
return 0; return 0;
} }
......
...@@ -1812,21 +1812,23 @@ static const struct amdgpu_ring_funcs vcn_v3_0_dec_sw_ring_vm_funcs = { ...@@ -1812,21 +1812,23 @@ static const struct amdgpu_ring_funcs vcn_v3_0_dec_sw_ring_vm_funcs = {
.emit_reg_write_reg_wait = amdgpu_ring_emit_reg_write_reg_wait_helper, .emit_reg_write_reg_wait = amdgpu_ring_emit_reg_write_reg_wait_helper,
}; };
static int vcn_v3_0_limit_sched(struct amdgpu_cs_parser *p) static int vcn_v3_0_limit_sched(struct amdgpu_cs_parser *p,
struct amdgpu_job *job)
{ {
struct drm_gpu_scheduler **scheds; struct drm_gpu_scheduler **scheds;
/* The create msg must be in the first IB submitted */ /* The create msg must be in the first IB submitted */
if (atomic_read(&p->entity->fence_seq)) if (atomic_read(&job->base.entity->fence_seq))
return -EINVAL; return -EINVAL;
scheds = p->adev->gpu_sched[AMDGPU_HW_IP_VCN_DEC] scheds = p->adev->gpu_sched[AMDGPU_HW_IP_VCN_DEC]
[AMDGPU_RING_PRIO_DEFAULT].sched; [AMDGPU_RING_PRIO_DEFAULT].sched;
drm_sched_entity_modify_sched(p->entity, scheds, 1); drm_sched_entity_modify_sched(job->base.entity, scheds, 1);
return 0; return 0;
} }
static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, uint64_t addr) static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, struct amdgpu_job *job,
uint64_t addr)
{ {
struct ttm_operation_ctx ctx = { false, false }; struct ttm_operation_ctx ctx = { false, false };
struct amdgpu_bo_va_mapping *map; struct amdgpu_bo_va_mapping *map;
...@@ -1897,7 +1899,7 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, uint64_t addr) ...@@ -1897,7 +1899,7 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, uint64_t addr)
if (create[0] == 0x7 || create[0] == 0x10 || create[0] == 0x11) if (create[0] == 0x7 || create[0] == 0x10 || create[0] == 0x11)
continue; continue;
r = vcn_v3_0_limit_sched(p); r = vcn_v3_0_limit_sched(p, job);
if (r) if (r)
goto out; goto out;
} }
...@@ -1908,10 +1910,10 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, uint64_t addr) ...@@ -1908,10 +1910,10 @@ static int vcn_v3_0_dec_msg(struct amdgpu_cs_parser *p, uint64_t addr)
} }
static int vcn_v3_0_ring_patch_cs_in_place(struct amdgpu_cs_parser *p, static int vcn_v3_0_ring_patch_cs_in_place(struct amdgpu_cs_parser *p,
uint32_t ib_idx) struct amdgpu_job *job,
struct amdgpu_ib *ib)
{ {
struct amdgpu_ring *ring = to_amdgpu_ring(p->entity->rq->sched); struct amdgpu_ring *ring = to_amdgpu_ring(job->base.sched);
struct amdgpu_ib *ib = &p->job->ibs[ib_idx];
uint32_t msg_lo = 0, msg_hi = 0; uint32_t msg_lo = 0, msg_hi = 0;
unsigned i; unsigned i;
int r; int r;
...@@ -1921,8 +1923,8 @@ static int vcn_v3_0_ring_patch_cs_in_place(struct amdgpu_cs_parser *p, ...@@ -1921,8 +1923,8 @@ static int vcn_v3_0_ring_patch_cs_in_place(struct amdgpu_cs_parser *p,
return 0; return 0;
for (i = 0; i < ib->length_dw; i += 2) { for (i = 0; i < ib->length_dw; i += 2) {
uint32_t reg = amdgpu_get_ib_value(p, ib_idx, i); uint32_t reg = amdgpu_ib_get_value(ib, i);
uint32_t val = amdgpu_get_ib_value(p, ib_idx, i + 1); uint32_t val = amdgpu_ib_get_value(ib, i + 1);
if (reg == PACKET0(p->adev->vcn.internal.data0, 0)) { if (reg == PACKET0(p->adev->vcn.internal.data0, 0)) {
msg_lo = val; msg_lo = val;
...@@ -1930,7 +1932,8 @@ static int vcn_v3_0_ring_patch_cs_in_place(struct amdgpu_cs_parser *p, ...@@ -1930,7 +1932,8 @@ static int vcn_v3_0_ring_patch_cs_in_place(struct amdgpu_cs_parser *p,
msg_hi = val; msg_hi = val;
} else if (reg == PACKET0(p->adev->vcn.internal.cmd, 0) && } else if (reg == PACKET0(p->adev->vcn.internal.cmd, 0) &&
val == 0) { val == 0) {
r = vcn_v3_0_dec_msg(p, ((u64)msg_hi) << 32 | msg_lo); r = vcn_v3_0_dec_msg(p, job,
((u64)msg_hi) << 32 | msg_lo);
if (r) if (r)
return r; return r;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment