mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-04-18 11:33:36 -04:00
drm/amdgpu: cleanup conditional execution
First of all calculating the number of dw to patch into a conditional execution is not something HW generation specific. This is just standard ring buffer calculations. While at it also reduce the BUG_ON() into WARN_ON(). Then instead of a random bit pattern use 0 as default value for the number of dw skipped, this way it's not mandatory any more to patch the conditional execution. And last make the address to check a parameter of the conditional execution instead of getting this from the ring. Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
committed by
Alex Deucher
parent
86e14a7386
commit
c68cbbfd54
@@ -209,8 +209,7 @@ struct amdgpu_ring_funcs {
|
||||
void (*insert_end)(struct amdgpu_ring *ring);
|
||||
/* pad the indirect buffer to the necessary number of dw */
|
||||
void (*pad_ib)(struct amdgpu_ring *ring, struct amdgpu_ib *ib);
|
||||
unsigned (*init_cond_exec)(struct amdgpu_ring *ring);
|
||||
void (*patch_cond_exec)(struct amdgpu_ring *ring, unsigned offset);
|
||||
unsigned (*init_cond_exec)(struct amdgpu_ring *ring, uint64_t addr);
|
||||
/* note usage for clock and power gating */
|
||||
void (*begin_use)(struct amdgpu_ring *ring);
|
||||
void (*end_use)(struct amdgpu_ring *ring);
|
||||
@@ -327,8 +326,7 @@ struct amdgpu_ring {
|
||||
#define amdgpu_ring_emit_reg_write_reg_wait(r, d0, d1, v, m) (r)->funcs->emit_reg_write_reg_wait((r), (d0), (d1), (v), (m))
|
||||
#define amdgpu_ring_emit_frame_cntl(r, b, s) (r)->funcs->emit_frame_cntl((r), (b), (s))
|
||||
#define amdgpu_ring_pad_ib(r, ib) ((r)->funcs->pad_ib((r), (ib)))
|
||||
#define amdgpu_ring_init_cond_exec(r) (r)->funcs->init_cond_exec((r))
|
||||
#define amdgpu_ring_patch_cond_exec(r,o) (r)->funcs->patch_cond_exec((r),(o))
|
||||
#define amdgpu_ring_init_cond_exec(r, a) (r)->funcs->init_cond_exec((r), (a))
|
||||
#define amdgpu_ring_preempt_ib(r) (r)->funcs->preempt_ib(r)
|
||||
#define amdgpu_ring_patch_cntl(r, o) ((r)->funcs->patch_cntl((r), (o)))
|
||||
#define amdgpu_ring_patch_ce(r, o) ((r)->funcs->patch_ce((r), (o)))
|
||||
@@ -411,6 +409,30 @@ static inline void amdgpu_ring_write_multiple(struct amdgpu_ring *ring,
|
||||
ring->count_dw -= count_dw;
|
||||
}
|
||||
|
||||
/**
|
||||
* amdgpu_ring_patch_cond_exec - patch dw count of conditional execute
|
||||
* @ring: amdgpu_ring structure
|
||||
* @offset: offset returned by amdgpu_ring_init_cond_exec
|
||||
*
|
||||
* Calculate the dw count and patch it into a cond_exec command.
|
||||
*/
|
||||
static inline void amdgpu_ring_patch_cond_exec(struct amdgpu_ring *ring,
|
||||
unsigned int offset)
|
||||
{
|
||||
unsigned cur;
|
||||
|
||||
if (!ring->funcs->init_cond_exec)
|
||||
return;
|
||||
|
||||
WARN_ON(offset > ring->buf_mask);
|
||||
WARN_ON(ring->ring[offset] != 0);
|
||||
|
||||
cur = (ring->wptr - 1) & ring->buf_mask;
|
||||
if (cur < offset)
|
||||
cur += ring->ring_size >> 2;
|
||||
ring->ring[offset] = cur - offset;
|
||||
}
|
||||
|
||||
#define amdgpu_mes_ctx_get_offs_gpu_addr(ring, offset) \
|
||||
(ring->is_mes_queue && ring->mes_ctx ? \
|
||||
(ring->mes_ctx->meta_data_gpu_addr + offset) : 0)
|
||||
|
||||
Reference in New Issue
Block a user