Commit 7470bfcf authored by Hawking Zhang's avatar Hawking Zhang Committed by Alex Deucher

drm/amdgpu: add helper function for gfx queue/bitmap transition

Similar to what we do for compute already.
Signed-off-by: default avatarHawking Zhang <Hawking.Zhang@amd.com>
Reviewed-by: default avatarJack Xiao <jack.xiao@amd.com>
Reviewed-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Acked-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent e537c994
...@@ -159,7 +159,7 @@ void amdgpu_amdkfd_device_init(struct amdgpu_device *adev) ...@@ -159,7 +159,7 @@ void amdgpu_amdkfd_device_init(struct amdgpu_device *adev)
/* remove the KIQ bit as well */ /* remove the KIQ bit as well */
if (adev->gfx.kiq.ring.sched.ready) if (adev->gfx.kiq.ring.sched.ready)
clear_bit(amdgpu_gfx_queue_to_bit(adev, clear_bit(amdgpu_gfx_mec_queue_to_bit(adev,
adev->gfx.kiq.ring.me - 1, adev->gfx.kiq.ring.me - 1,
adev->gfx.kiq.ring.pipe, adev->gfx.kiq.ring.pipe,
adev->gfx.kiq.ring.queue), adev->gfx.kiq.ring.queue),
......
...@@ -34,8 +34,8 @@ ...@@ -34,8 +34,8 @@
* GPU GFX IP block helpers function. * GPU GFX IP block helpers function.
*/ */
int amdgpu_gfx_queue_to_bit(struct amdgpu_device *adev, int mec, int amdgpu_gfx_mec_queue_to_bit(struct amdgpu_device *adev, int mec,
int pipe, int queue) int pipe, int queue)
{ {
int bit = 0; int bit = 0;
...@@ -47,8 +47,8 @@ int amdgpu_gfx_queue_to_bit(struct amdgpu_device *adev, int mec, ...@@ -47,8 +47,8 @@ int amdgpu_gfx_queue_to_bit(struct amdgpu_device *adev, int mec,
return bit; return bit;
} }
void amdgpu_gfx_bit_to_queue(struct amdgpu_device *adev, int bit, void amdgpu_gfx_bit_to_mec_queue(struct amdgpu_device *adev, int bit,
int *mec, int *pipe, int *queue) int *mec, int *pipe, int *queue)
{ {
*queue = bit % adev->gfx.mec.num_queue_per_pipe; *queue = bit % adev->gfx.mec.num_queue_per_pipe;
*pipe = (bit / adev->gfx.mec.num_queue_per_pipe) *pipe = (bit / adev->gfx.mec.num_queue_per_pipe)
...@@ -61,10 +61,40 @@ void amdgpu_gfx_bit_to_queue(struct amdgpu_device *adev, int bit, ...@@ -61,10 +61,40 @@ void amdgpu_gfx_bit_to_queue(struct amdgpu_device *adev, int bit,
bool amdgpu_gfx_is_mec_queue_enabled(struct amdgpu_device *adev, bool amdgpu_gfx_is_mec_queue_enabled(struct amdgpu_device *adev,
int mec, int pipe, int queue) int mec, int pipe, int queue)
{ {
return test_bit(amdgpu_gfx_queue_to_bit(adev, mec, pipe, queue), return test_bit(amdgpu_gfx_mec_queue_to_bit(adev, mec, pipe, queue),
adev->gfx.mec.queue_bitmap); adev->gfx.mec.queue_bitmap);
} }
int amdgpu_gfx_me_queue_to_bit(struct amdgpu_device *adev,
int me, int pipe, int queue)
{
int bit = 0;
bit += me * adev->gfx.me.num_pipe_per_me
* adev->gfx.me.num_queue_per_pipe;
bit += pipe * adev->gfx.me.num_queue_per_pipe;
bit += queue;
return bit;
}
void amdgpu_gfx_bit_to_me_queue(struct amdgpu_device *adev, int bit,
int *me, int *pipe, int *queue)
{
*queue = bit % adev->gfx.me.num_queue_per_pipe;
*pipe = (bit / adev->gfx.me.num_queue_per_pipe)
% adev->gfx.me.num_pipe_per_me;
*me = (bit / adev->gfx.me.num_queue_per_pipe)
/ adev->gfx.me.num_pipe_per_me;
}
bool amdgpu_gfx_is_me_queue_enabled(struct amdgpu_device *adev,
int me, int pipe, int queue)
{
return test_bit(amdgpu_gfx_me_queue_to_bit(adev, me, pipe, queue),
adev->gfx.me.queue_bitmap);
}
/** /**
* amdgpu_gfx_scratch_get - Allocate a scratch register * amdgpu_gfx_scratch_get - Allocate a scratch register
* *
...@@ -237,7 +267,7 @@ static int amdgpu_gfx_kiq_acquire(struct amdgpu_device *adev, ...@@ -237,7 +267,7 @@ static int amdgpu_gfx_kiq_acquire(struct amdgpu_device *adev,
if (test_bit(queue_bit, adev->gfx.mec.queue_bitmap)) if (test_bit(queue_bit, adev->gfx.mec.queue_bitmap))
continue; continue;
amdgpu_gfx_bit_to_queue(adev, queue_bit, &mec, &pipe, &queue); amdgpu_gfx_bit_to_mec_queue(adev, queue_bit, &mec, &pipe, &queue);
/* /*
* 1. Using pipes 2/3 from MEC 2 seems cause problems. * 1. Using pipes 2/3 from MEC 2 seems cause problems.
......
...@@ -337,12 +337,18 @@ void amdgpu_gfx_compute_mqd_sw_fini(struct amdgpu_device *adev); ...@@ -337,12 +337,18 @@ void amdgpu_gfx_compute_mqd_sw_fini(struct amdgpu_device *adev);
void amdgpu_gfx_compute_queue_acquire(struct amdgpu_device *adev); void amdgpu_gfx_compute_queue_acquire(struct amdgpu_device *adev);
void amdgpu_gfx_graphics_queue_acquire(struct amdgpu_device *adev); void amdgpu_gfx_graphics_queue_acquire(struct amdgpu_device *adev);
int amdgpu_gfx_queue_to_bit(struct amdgpu_device *adev, int mec, int amdgpu_gfx_mec_queue_to_bit(struct amdgpu_device *adev, int mec,
int pipe, int queue); int pipe, int queue);
void amdgpu_gfx_bit_to_queue(struct amdgpu_device *adev, int bit, void amdgpu_gfx_bit_to_mec_queue(struct amdgpu_device *adev, int bit,
int *mec, int *pipe, int *queue); int *mec, int *pipe, int *queue);
bool amdgpu_gfx_is_mec_queue_enabled(struct amdgpu_device *adev, int mec, bool amdgpu_gfx_is_mec_queue_enabled(struct amdgpu_device *adev, int mec,
int pipe, int queue); int pipe, int queue);
int amdgpu_gfx_me_queue_to_bit(struct amdgpu_device *adev, int me,
int pipe, int queue);
void amdgpu_gfx_bit_to_me_queue(struct amdgpu_device *adev, int bit,
int *me, int *pipe, int *queue);
bool amdgpu_gfx_is_me_queue_enabled(struct amdgpu_device *adev, int me,
int pipe, int queue);
void amdgpu_gfx_off_ctrl(struct amdgpu_device *adev, bool enable); void amdgpu_gfx_off_ctrl(struct amdgpu_device *adev, bool enable);
#endif #endif
...@@ -6213,7 +6213,7 @@ static void gfx_v8_0_pipe_reserve_resources(struct amdgpu_device *adev, ...@@ -6213,7 +6213,7 @@ static void gfx_v8_0_pipe_reserve_resources(struct amdgpu_device *adev,
struct amdgpu_ring *iring; struct amdgpu_ring *iring;
mutex_lock(&adev->gfx.pipe_reserve_mutex); mutex_lock(&adev->gfx.pipe_reserve_mutex);
pipe = amdgpu_gfx_queue_to_bit(adev, ring->me, ring->pipe, 0); pipe = amdgpu_gfx_mec_queue_to_bit(adev, ring->me, ring->pipe, 0);
if (acquire) if (acquire)
set_bit(pipe, adev->gfx.pipe_reserve_bitmap); set_bit(pipe, adev->gfx.pipe_reserve_bitmap);
else else
...@@ -6232,20 +6232,20 @@ static void gfx_v8_0_pipe_reserve_resources(struct amdgpu_device *adev, ...@@ -6232,20 +6232,20 @@ static void gfx_v8_0_pipe_reserve_resources(struct amdgpu_device *adev,
/* Lower all pipes without a current reservation */ /* Lower all pipes without a current reservation */
for (i = 0; i < adev->gfx.num_gfx_rings; ++i) { for (i = 0; i < adev->gfx.num_gfx_rings; ++i) {
iring = &adev->gfx.gfx_ring[i]; iring = &adev->gfx.gfx_ring[i];
pipe = amdgpu_gfx_queue_to_bit(adev, pipe = amdgpu_gfx_mec_queue_to_bit(adev,
iring->me, iring->me,
iring->pipe, iring->pipe,
0); 0);
reserve = test_bit(pipe, adev->gfx.pipe_reserve_bitmap); reserve = test_bit(pipe, adev->gfx.pipe_reserve_bitmap);
gfx_v8_0_ring_set_pipe_percent(iring, reserve); gfx_v8_0_ring_set_pipe_percent(iring, reserve);
} }
for (i = 0; i < adev->gfx.num_compute_rings; ++i) { for (i = 0; i < adev->gfx.num_compute_rings; ++i) {
iring = &adev->gfx.compute_ring[i]; iring = &adev->gfx.compute_ring[i];
pipe = amdgpu_gfx_queue_to_bit(adev, pipe = amdgpu_gfx_mec_queue_to_bit(adev,
iring->me, iring->me,
iring->pipe, iring->pipe,
0); 0);
reserve = test_bit(pipe, adev->gfx.pipe_reserve_bitmap); reserve = test_bit(pipe, adev->gfx.pipe_reserve_bitmap);
gfx_v8_0_ring_set_pipe_percent(iring, reserve); gfx_v8_0_ring_set_pipe_percent(iring, reserve);
} }
......
...@@ -4578,7 +4578,7 @@ static void gfx_v9_0_pipe_reserve_resources(struct amdgpu_device *adev, ...@@ -4578,7 +4578,7 @@ static void gfx_v9_0_pipe_reserve_resources(struct amdgpu_device *adev,
struct amdgpu_ring *iring; struct amdgpu_ring *iring;
mutex_lock(&adev->gfx.pipe_reserve_mutex); mutex_lock(&adev->gfx.pipe_reserve_mutex);
pipe = amdgpu_gfx_queue_to_bit(adev, ring->me, ring->pipe, 0); pipe = amdgpu_gfx_mec_queue_to_bit(adev, ring->me, ring->pipe, 0);
if (acquire) if (acquire)
set_bit(pipe, adev->gfx.pipe_reserve_bitmap); set_bit(pipe, adev->gfx.pipe_reserve_bitmap);
else else
...@@ -4597,20 +4597,20 @@ static void gfx_v9_0_pipe_reserve_resources(struct amdgpu_device *adev, ...@@ -4597,20 +4597,20 @@ static void gfx_v9_0_pipe_reserve_resources(struct amdgpu_device *adev,
/* Lower all pipes without a current reservation */ /* Lower all pipes without a current reservation */
for (i = 0; i < adev->gfx.num_gfx_rings; ++i) { for (i = 0; i < adev->gfx.num_gfx_rings; ++i) {
iring = &adev->gfx.gfx_ring[i]; iring = &adev->gfx.gfx_ring[i];
pipe = amdgpu_gfx_queue_to_bit(adev, pipe = amdgpu_gfx_mec_queue_to_bit(adev,
iring->me, iring->me,
iring->pipe, iring->pipe,
0); 0);
reserve = test_bit(pipe, adev->gfx.pipe_reserve_bitmap); reserve = test_bit(pipe, adev->gfx.pipe_reserve_bitmap);
gfx_v9_0_ring_set_pipe_percent(iring, reserve); gfx_v9_0_ring_set_pipe_percent(iring, reserve);
} }
for (i = 0; i < adev->gfx.num_compute_rings; ++i) { for (i = 0; i < adev->gfx.num_compute_rings; ++i) {
iring = &adev->gfx.compute_ring[i]; iring = &adev->gfx.compute_ring[i];
pipe = amdgpu_gfx_queue_to_bit(adev, pipe = amdgpu_gfx_mec_queue_to_bit(adev,
iring->me, iring->me,
iring->pipe, iring->pipe,
0); 0);
reserve = test_bit(pipe, adev->gfx.pipe_reserve_bitmap); reserve = test_bit(pipe, adev->gfx.pipe_reserve_bitmap);
gfx_v9_0_ring_set_pipe_percent(iring, reserve); gfx_v9_0_ring_set_pipe_percent(iring, reserve);
} }
......
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