aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd
diff options
context:
space:
mode:
authorChunming Zhou <David1.Zhou@amd.com>2016-05-09 05:29:39 -0400
committerAlex Deucher <alexander.deucher@amd.com>2016-05-11 13:30:29 -0400
commit914f9e18c859d9413058c3632aba54d348a6527e (patch)
tree1db7eccbe8ecfac0d503367c1f8bd7cdd0266c76 /drivers/gpu/drm/amd
parent8e008dd70e0cf5b0fd7a5a29e00f613370e5ca74 (diff)
drm/amdgpu/gfx7: fix pipeline sync
Need to wait on the fence as well. Signed-off-by: Chunming Zhou <David1.Zhou@amd.com> Reviewed-by: Monk Liu <monk.liu@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c25
1 files changed, 13 insertions, 12 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
index 92d8061efaf4..f4068f753fbe 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
@@ -3054,6 +3054,19 @@ static int gfx_v7_0_cp_resume(struct amdgpu_device *adev)
3054static void gfx_v7_0_ring_emit_pipeline_sync(struct amdgpu_ring *ring) 3054static void gfx_v7_0_ring_emit_pipeline_sync(struct amdgpu_ring *ring)
3055{ 3055{
3056 int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX); 3056 int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX);
3057 uint32_t seq = ring->fence_drv.sync_seq;
3058 uint64_t addr = ring->fence_drv.gpu_addr;
3059
3060 amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));
3061 amdgpu_ring_write(ring, (WAIT_REG_MEM_MEM_SPACE(1) | /* memory */
3062 WAIT_REG_MEM_FUNCTION(3) | /* equal */
3063 WAIT_REG_MEM_ENGINE(usepfp))); /* pfp or me */
3064 amdgpu_ring_write(ring, addr & 0xfffffffc);
3065 amdgpu_ring_write(ring, upper_32_bits(addr) & 0xffffffff);
3066 amdgpu_ring_write(ring, seq);
3067 amdgpu_ring_write(ring, 0xffffffff);
3068 amdgpu_ring_write(ring, 4); /* poll interval */
3069
3057 if (usepfp) { 3070 if (usepfp) {
3058 /* synce CE with ME to prevent CE fetch CEIB before context switch done */ 3071 /* synce CE with ME to prevent CE fetch CEIB before context switch done */
3059 amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); 3072 amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
@@ -3081,18 +3094,6 @@ static void gfx_v7_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
3081 unsigned vm_id, uint64_t pd_addr) 3094 unsigned vm_id, uint64_t pd_addr)
3082{ 3095{
3083 int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX); 3096 int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX);
3084 uint32_t seq = ring->fence_drv.sync_seq;
3085 uint64_t addr = ring->fence_drv.gpu_addr;
3086
3087 amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));
3088 amdgpu_ring_write(ring, (WAIT_REG_MEM_MEM_SPACE(1) | /* memory */
3089 WAIT_REG_MEM_FUNCTION(3) | /* equal */
3090 WAIT_REG_MEM_ENGINE(usepfp))); /* pfp or me */
3091 amdgpu_ring_write(ring, addr & 0xfffffffc);
3092 amdgpu_ring_write(ring, upper_32_bits(addr) & 0xffffffff);
3093 amdgpu_ring_write(ring, seq);
3094 amdgpu_ring_write(ring, 0xffffffff);
3095 amdgpu_ring_write(ring, 4); /* poll interval */
3096 3097
3097 amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); 3098 amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
3098 amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) | 3099 amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) |