[PATCH 4/6] drm/amdgpu: Add sdma ib preempt clear when emit fence
Rex Zhu
Rex.Zhu at amd.com
Wed Oct 31 12:25:34 UTC 2018
need to clear ib preempt in a proper time
Signed-off-by: Rex Zhu <Rex.Zhu at amd.com>
---
drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c | 13 +++++++++++++
drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | 12 ++++++++++++
2 files changed, 25 insertions(+)
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
index e321d9d..de280d4 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
@@ -484,7 +484,11 @@ static void sdma_v3_0_ring_emit_hdp_flush(struct amdgpu_ring *ring)
static void sdma_v3_0_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq,
unsigned flags)
{
+ struct amdgpu_device *adev = ring->adev;
bool write64bit = flags & AMDGPU_FENCE_FLAG_64BIT;
+ bool clear_preempt = flags & AMDGPU_FENCE_FLAG_CLEAR_PREEMPT;
+ u32 index = 0;
+
/* write the fence */
amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_FENCE));
amdgpu_ring_write(ring, lower_32_bits(addr));
@@ -500,6 +504,15 @@ static void sdma_v3_0_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 se
amdgpu_ring_write(ring, upper_32_bits(seq));
}
+ if (!amdgpu_sriov_vf(adev) && adev->gpu_preemption && clear_preempt) {
+ if (!amdgpu_get_sdma_index(ring, &index)) {
+ amdgpu_ring_alloc(ring, 4);
+ amdgpu_ring_emit_wreg(ring, index == 0 ?
+ mmSDMA0_GFX_PREEMPT :
+ mmSDMA1_GFX_PREEMPT, 0);
+ }
+ }
+
/* generate an interrupt */
amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_TRAP));
amdgpu_ring_write(ring, SDMA_PKT_TRAP_INT_CONTEXT_INT_CONTEXT(0));
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
index 3eeac44..33bdeeb 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
@@ -591,7 +591,10 @@ static void sdma_v4_0_ring_emit_hdp_flush(struct amdgpu_ring *ring)
static void sdma_v4_0_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq,
unsigned flags)
{
+ struct amdgpu_device *adev = ring->adev;
bool write64bit = flags & AMDGPU_FENCE_FLAG_64BIT;
+ bool clear_preempt = flags & AMDGPU_FENCE_FLAG_CLEAR_PREEMPT;
+ u32 index = 0;
/* write the fence */
amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_FENCE));
/* zero in first two bits */
@@ -611,6 +614,15 @@ static void sdma_v4_0_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 se
amdgpu_ring_write(ring, upper_32_bits(seq));
}
+ if (!amdgpu_sriov_vf(adev) && adev->gpu_preemption && clear_preempt) {
+ if (!amdgpu_get_sdma_index(ring, &index)) {
+ amdgpu_ring_alloc(ring, 4);
+ amdgpu_ring_emit_wreg(ring, index == 0 ?
+ mmSDMA0_GFX_PREEMPT :
+ mmSDMA1_GFX_PREEMPT, 0);
+ }
+ }
+
/* generate an interrupt */
amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_TRAP));
amdgpu_ring_write(ring, SDMA_PKT_TRAP_INT_CONTEXT_INT_CONTEXT(0));
--
1.9.1
More information about the amd-gfx
mailing list