forked from Minki/linux
drm/amdgpu: add insert_nop ring func and default implementation
The insert_nop function is added to amdgpu_ring_funcs structure as well as the default implementation Signed-off-by: Jammy Zhou <Jammy.Zhou@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
4b2f7e2ca9
commit
edff0e2826
@ -343,6 +343,8 @@ struct amdgpu_ring_funcs {
|
|||||||
int (*test_ring)(struct amdgpu_ring *ring);
|
int (*test_ring)(struct amdgpu_ring *ring);
|
||||||
int (*test_ib)(struct amdgpu_ring *ring);
|
int (*test_ib)(struct amdgpu_ring *ring);
|
||||||
bool (*is_lockup)(struct amdgpu_ring *ring);
|
bool (*is_lockup)(struct amdgpu_ring *ring);
|
||||||
|
/* insert NOP packets */
|
||||||
|
void (*insert_nop)(struct amdgpu_ring *ring, uint32_t count);
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1217,6 +1219,7 @@ int amdgpu_ib_ring_tests(struct amdgpu_device *adev);
|
|||||||
void amdgpu_ring_free_size(struct amdgpu_ring *ring);
|
void amdgpu_ring_free_size(struct amdgpu_ring *ring);
|
||||||
int amdgpu_ring_alloc(struct amdgpu_ring *ring, unsigned ndw);
|
int amdgpu_ring_alloc(struct amdgpu_ring *ring, unsigned ndw);
|
||||||
int amdgpu_ring_lock(struct amdgpu_ring *ring, unsigned ndw);
|
int amdgpu_ring_lock(struct amdgpu_ring *ring, unsigned ndw);
|
||||||
|
void amdgpu_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count);
|
||||||
void amdgpu_ring_commit(struct amdgpu_ring *ring);
|
void amdgpu_ring_commit(struct amdgpu_ring *ring);
|
||||||
void amdgpu_ring_unlock_commit(struct amdgpu_ring *ring);
|
void amdgpu_ring_unlock_commit(struct amdgpu_ring *ring);
|
||||||
void amdgpu_ring_undo(struct amdgpu_ring *ring);
|
void amdgpu_ring_undo(struct amdgpu_ring *ring);
|
||||||
|
@ -131,6 +131,21 @@ int amdgpu_ring_lock(struct amdgpu_ring *ring, unsigned ndw)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** amdgpu_ring_insert_nop - insert NOP packets
|
||||||
|
*
|
||||||
|
* @ring: amdgpu_ring structure holding ring information
|
||||||
|
* @count: the number of NOP packets to insert
|
||||||
|
*
|
||||||
|
* This is the generic insert_nop function for rings except SDMA
|
||||||
|
*/
|
||||||
|
void amdgpu_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
|
amdgpu_ring_write(ring, ring->nop);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* amdgpu_ring_commit - tell the GPU to execute the new
|
* amdgpu_ring_commit - tell the GPU to execute the new
|
||||||
* commands on the ring buffer
|
* commands on the ring buffer
|
||||||
@ -143,10 +158,13 @@ int amdgpu_ring_lock(struct amdgpu_ring *ring, unsigned ndw)
|
|||||||
*/
|
*/
|
||||||
void amdgpu_ring_commit(struct amdgpu_ring *ring)
|
void amdgpu_ring_commit(struct amdgpu_ring *ring)
|
||||||
{
|
{
|
||||||
|
uint32_t count;
|
||||||
|
|
||||||
/* We pad to match fetch size */
|
/* We pad to match fetch size */
|
||||||
while (ring->wptr & ring->align_mask) {
|
count = ring->align_mask + 1 - (ring->wptr & ring->align_mask);
|
||||||
amdgpu_ring_write(ring, ring->nop);
|
count %= ring->align_mask + 1;
|
||||||
}
|
ring->funcs->insert_nop(ring, count);
|
||||||
|
|
||||||
mb();
|
mb();
|
||||||
amdgpu_ring_set_wptr(ring);
|
amdgpu_ring_set_wptr(ring);
|
||||||
}
|
}
|
||||||
|
@ -1305,6 +1305,7 @@ static const struct amdgpu_ring_funcs cik_sdma_ring_funcs = {
|
|||||||
.test_ring = cik_sdma_ring_test_ring,
|
.test_ring = cik_sdma_ring_test_ring,
|
||||||
.test_ib = cik_sdma_ring_test_ib,
|
.test_ib = cik_sdma_ring_test_ib,
|
||||||
.is_lockup = cik_sdma_ring_is_lockup,
|
.is_lockup = cik_sdma_ring_is_lockup,
|
||||||
|
.insert_nop = amdgpu_ring_insert_nop,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void cik_sdma_set_ring_funcs(struct amdgpu_device *adev)
|
static void cik_sdma_set_ring_funcs(struct amdgpu_device *adev)
|
||||||
|
@ -5598,6 +5598,7 @@ static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_gfx = {
|
|||||||
.test_ring = gfx_v7_0_ring_test_ring,
|
.test_ring = gfx_v7_0_ring_test_ring,
|
||||||
.test_ib = gfx_v7_0_ring_test_ib,
|
.test_ib = gfx_v7_0_ring_test_ib,
|
||||||
.is_lockup = gfx_v7_0_ring_is_lockup,
|
.is_lockup = gfx_v7_0_ring_is_lockup,
|
||||||
|
.insert_nop = amdgpu_ring_insert_nop,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_compute = {
|
static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_compute = {
|
||||||
@ -5614,6 +5615,7 @@ static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_compute = {
|
|||||||
.test_ring = gfx_v7_0_ring_test_ring,
|
.test_ring = gfx_v7_0_ring_test_ring,
|
||||||
.test_ib = gfx_v7_0_ring_test_ib,
|
.test_ib = gfx_v7_0_ring_test_ib,
|
||||||
.is_lockup = gfx_v7_0_ring_is_lockup,
|
.is_lockup = gfx_v7_0_ring_is_lockup,
|
||||||
|
.insert_nop = amdgpu_ring_insert_nop,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void gfx_v7_0_set_ring_funcs(struct amdgpu_device *adev)
|
static void gfx_v7_0_set_ring_funcs(struct amdgpu_device *adev)
|
||||||
|
@ -4378,6 +4378,7 @@ static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_gfx = {
|
|||||||
.test_ring = gfx_v8_0_ring_test_ring,
|
.test_ring = gfx_v8_0_ring_test_ring,
|
||||||
.test_ib = gfx_v8_0_ring_test_ib,
|
.test_ib = gfx_v8_0_ring_test_ib,
|
||||||
.is_lockup = gfx_v8_0_ring_is_lockup,
|
.is_lockup = gfx_v8_0_ring_is_lockup,
|
||||||
|
.insert_nop = amdgpu_ring_insert_nop,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_compute = {
|
static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_compute = {
|
||||||
@ -4394,6 +4395,7 @@ static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_compute = {
|
|||||||
.test_ring = gfx_v8_0_ring_test_ring,
|
.test_ring = gfx_v8_0_ring_test_ring,
|
||||||
.test_ib = gfx_v8_0_ring_test_ib,
|
.test_ib = gfx_v8_0_ring_test_ib,
|
||||||
.is_lockup = gfx_v8_0_ring_is_lockup,
|
.is_lockup = gfx_v8_0_ring_is_lockup,
|
||||||
|
.insert_nop = amdgpu_ring_insert_nop,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void gfx_v8_0_set_ring_funcs(struct amdgpu_device *adev)
|
static void gfx_v8_0_set_ring_funcs(struct amdgpu_device *adev)
|
||||||
|
@ -1316,6 +1316,7 @@ static const struct amdgpu_ring_funcs sdma_v2_4_ring_funcs = {
|
|||||||
.test_ring = sdma_v2_4_ring_test_ring,
|
.test_ring = sdma_v2_4_ring_test_ring,
|
||||||
.test_ib = sdma_v2_4_ring_test_ib,
|
.test_ib = sdma_v2_4_ring_test_ib,
|
||||||
.is_lockup = sdma_v2_4_ring_is_lockup,
|
.is_lockup = sdma_v2_4_ring_is_lockup,
|
||||||
|
.insert_nop = amdgpu_ring_insert_nop,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void sdma_v2_4_set_ring_funcs(struct amdgpu_device *adev)
|
static void sdma_v2_4_set_ring_funcs(struct amdgpu_device *adev)
|
||||||
|
@ -1440,6 +1440,7 @@ static const struct amdgpu_ring_funcs sdma_v3_0_ring_funcs = {
|
|||||||
.test_ring = sdma_v3_0_ring_test_ring,
|
.test_ring = sdma_v3_0_ring_test_ring,
|
||||||
.test_ib = sdma_v3_0_ring_test_ib,
|
.test_ib = sdma_v3_0_ring_test_ib,
|
||||||
.is_lockup = sdma_v3_0_ring_is_lockup,
|
.is_lockup = sdma_v3_0_ring_is_lockup,
|
||||||
|
.insert_nop = amdgpu_ring_insert_nop,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void sdma_v3_0_set_ring_funcs(struct amdgpu_device *adev)
|
static void sdma_v3_0_set_ring_funcs(struct amdgpu_device *adev)
|
||||||
|
@ -886,6 +886,7 @@ static const struct amdgpu_ring_funcs uvd_v4_2_ring_funcs = {
|
|||||||
.test_ring = uvd_v4_2_ring_test_ring,
|
.test_ring = uvd_v4_2_ring_test_ring,
|
||||||
.test_ib = uvd_v4_2_ring_test_ib,
|
.test_ib = uvd_v4_2_ring_test_ib,
|
||||||
.is_lockup = amdgpu_ring_test_lockup,
|
.is_lockup = amdgpu_ring_test_lockup,
|
||||||
|
.insert_nop = amdgpu_ring_insert_nop,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void uvd_v4_2_set_ring_funcs(struct amdgpu_device *adev)
|
static void uvd_v4_2_set_ring_funcs(struct amdgpu_device *adev)
|
||||||
|
@ -825,6 +825,7 @@ static const struct amdgpu_ring_funcs uvd_v5_0_ring_funcs = {
|
|||||||
.test_ring = uvd_v5_0_ring_test_ring,
|
.test_ring = uvd_v5_0_ring_test_ring,
|
||||||
.test_ib = uvd_v5_0_ring_test_ib,
|
.test_ib = uvd_v5_0_ring_test_ib,
|
||||||
.is_lockup = amdgpu_ring_test_lockup,
|
.is_lockup = amdgpu_ring_test_lockup,
|
||||||
|
.insert_nop = amdgpu_ring_insert_nop,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void uvd_v5_0_set_ring_funcs(struct amdgpu_device *adev)
|
static void uvd_v5_0_set_ring_funcs(struct amdgpu_device *adev)
|
||||||
|
@ -805,6 +805,7 @@ static const struct amdgpu_ring_funcs uvd_v6_0_ring_funcs = {
|
|||||||
.test_ring = uvd_v6_0_ring_test_ring,
|
.test_ring = uvd_v6_0_ring_test_ring,
|
||||||
.test_ib = uvd_v6_0_ring_test_ib,
|
.test_ib = uvd_v6_0_ring_test_ib,
|
||||||
.is_lockup = amdgpu_ring_test_lockup,
|
.is_lockup = amdgpu_ring_test_lockup,
|
||||||
|
.insert_nop = amdgpu_ring_insert_nop,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void uvd_v6_0_set_ring_funcs(struct amdgpu_device *adev)
|
static void uvd_v6_0_set_ring_funcs(struct amdgpu_device *adev)
|
||||||
|
@ -643,6 +643,7 @@ static const struct amdgpu_ring_funcs vce_v2_0_ring_funcs = {
|
|||||||
.test_ring = amdgpu_vce_ring_test_ring,
|
.test_ring = amdgpu_vce_ring_test_ring,
|
||||||
.test_ib = amdgpu_vce_ring_test_ib,
|
.test_ib = amdgpu_vce_ring_test_ib,
|
||||||
.is_lockup = amdgpu_ring_test_lockup,
|
.is_lockup = amdgpu_ring_test_lockup,
|
||||||
|
.insert_nop = amdgpu_ring_insert_nop,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void vce_v2_0_set_ring_funcs(struct amdgpu_device *adev)
|
static void vce_v2_0_set_ring_funcs(struct amdgpu_device *adev)
|
||||||
|
@ -608,6 +608,7 @@ static const struct amdgpu_ring_funcs vce_v3_0_ring_funcs = {
|
|||||||
.test_ring = amdgpu_vce_ring_test_ring,
|
.test_ring = amdgpu_vce_ring_test_ring,
|
||||||
.test_ib = amdgpu_vce_ring_test_ib,
|
.test_ib = amdgpu_vce_ring_test_ib,
|
||||||
.is_lockup = amdgpu_ring_test_lockup,
|
.is_lockup = amdgpu_ring_test_lockup,
|
||||||
|
.insert_nop = amdgpu_ring_insert_nop,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void vce_v3_0_set_ring_funcs(struct amdgpu_device *adev)
|
static void vce_v3_0_set_ring_funcs(struct amdgpu_device *adev)
|
||||||
|
Loading…
Reference in New Issue
Block a user