diff options
author | Chunming Zhou <David1.Zhou@amd.com> | 2016-05-09 05:29:39 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2016-05-11 13:30:29 -0400 |
commit | 914f9e18c859d9413058c3632aba54d348a6527e (patch) | |
tree | 1db7eccbe8ecfac0d503367c1f8bd7cdd0266c76 /drivers/gpu | |
parent | 8e008dd70e0cf5b0fd7a5a29e00f613370e5ca74 (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')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c | 25 |
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) | |||
3054 | static void gfx_v7_0_ring_emit_pipeline_sync(struct amdgpu_ring *ring) | 3054 | static 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) | |