|
@@ -940,12 +940,6 @@ static int gfx_v8_0_sw_init(void *handle)
|
|
return r;
|
|
return r;
|
|
}
|
|
}
|
|
|
|
|
|
- r = amdgpu_wb_get(adev, &adev->gfx.ce_sync_offs);
|
|
|
|
- if (r) {
|
|
|
|
- DRM_ERROR("(%d) gfx.ce_sync_offs wb alloc failed\n", r);
|
|
|
|
- return r;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
/* set up the gfx ring */
|
|
/* set up the gfx ring */
|
|
for (i = 0; i < adev->gfx.num_gfx_rings; i++) {
|
|
for (i = 0; i < adev->gfx.num_gfx_rings; i++) {
|
|
ring = &adev->gfx.gfx_ring[i];
|
|
ring = &adev->gfx.gfx_ring[i];
|
|
@@ -1033,8 +1027,6 @@ static int gfx_v8_0_sw_fini(void *handle)
|
|
for (i = 0; i < adev->gfx.num_compute_rings; i++)
|
|
for (i = 0; i < adev->gfx.num_compute_rings; i++)
|
|
amdgpu_ring_fini(&adev->gfx.compute_ring[i]);
|
|
amdgpu_ring_fini(&adev->gfx.compute_ring[i]);
|
|
|
|
|
|
- amdgpu_wb_free(adev, adev->gfx.ce_sync_offs);
|
|
|
|
-
|
|
|
|
gfx_v8_0_mec_fini(adev);
|
|
gfx_v8_0_mec_fini(adev);
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
@@ -4006,41 +3998,6 @@ static bool gfx_v8_0_ring_emit_semaphore(struct amdgpu_ring *ring,
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
-static void gfx_v8_0_ce_sync_me(struct amdgpu_ring *ring)
|
|
|
|
-{
|
|
|
|
- struct amdgpu_device *adev = ring->adev;
|
|
|
|
- u64 gpu_addr = adev->wb.gpu_addr + adev->gfx.ce_sync_offs * 4;
|
|
|
|
-
|
|
|
|
- /* instruct DE to set a magic number */
|
|
|
|
- amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
|
|
|
|
- amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
|
|
|
|
- WRITE_DATA_DST_SEL(5)));
|
|
|
|
- amdgpu_ring_write(ring, gpu_addr & 0xfffffffc);
|
|
|
|
- amdgpu_ring_write(ring, upper_32_bits(gpu_addr) & 0xffffffff);
|
|
|
|
- amdgpu_ring_write(ring, 1);
|
|
|
|
-
|
|
|
|
- /* let CE wait till condition satisfied */
|
|
|
|
- amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));
|
|
|
|
- amdgpu_ring_write(ring, (WAIT_REG_MEM_OPERATION(0) | /* wait */
|
|
|
|
- WAIT_REG_MEM_MEM_SPACE(1) | /* memory */
|
|
|
|
- WAIT_REG_MEM_FUNCTION(3) | /* == */
|
|
|
|
- WAIT_REG_MEM_ENGINE(2))); /* ce */
|
|
|
|
- amdgpu_ring_write(ring, gpu_addr & 0xfffffffc);
|
|
|
|
- amdgpu_ring_write(ring, upper_32_bits(gpu_addr) & 0xffffffff);
|
|
|
|
- amdgpu_ring_write(ring, 1);
|
|
|
|
- amdgpu_ring_write(ring, 0xffffffff);
|
|
|
|
- amdgpu_ring_write(ring, 4); /* poll interval */
|
|
|
|
-
|
|
|
|
- /* instruct CE to reset wb of ce_sync to zero */
|
|
|
|
- amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
|
|
|
|
- amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(2) |
|
|
|
|
- WRITE_DATA_DST_SEL(5) |
|
|
|
|
- WR_CONFIRM));
|
|
|
|
- amdgpu_ring_write(ring, gpu_addr & 0xfffffffc);
|
|
|
|
- amdgpu_ring_write(ring, upper_32_bits(gpu_addr) & 0xffffffff);
|
|
|
|
- amdgpu_ring_write(ring, 0);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static void gfx_v8_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
|
|
static void gfx_v8_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
|
|
unsigned vm_id, uint64_t pd_addr)
|
|
unsigned vm_id, uint64_t pd_addr)
|
|
{
|
|
{
|
|
@@ -4057,6 +4014,14 @@ static void gfx_v8_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
|
|
amdgpu_ring_write(ring, 0xffffffff);
|
|
amdgpu_ring_write(ring, 0xffffffff);
|
|
amdgpu_ring_write(ring, 4); /* poll interval */
|
|
amdgpu_ring_write(ring, 4); /* poll interval */
|
|
|
|
|
|
|
|
+ if (usepfp) {
|
|
|
|
+ /* synce CE with ME to prevent CE fetch CEIB before context switch done */
|
|
|
|
+ amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
|
|
|
|
+ amdgpu_ring_write(ring, 0);
|
|
|
|
+ amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
|
|
|
|
+ amdgpu_ring_write(ring, 0);
|
|
|
|
+ }
|
|
|
|
+
|
|
amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
|
|
amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
|
|
amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) |
|
|
amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) |
|
|
WRITE_DATA_DST_SEL(0)) |
|
|
WRITE_DATA_DST_SEL(0)) |
|
|
@@ -4096,9 +4061,10 @@ static void gfx_v8_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
|
|
/* sync PFP to ME, otherwise we might get invalid PFP reads */
|
|
/* sync PFP to ME, otherwise we might get invalid PFP reads */
|
|
amdgpu_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
|
|
amdgpu_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
|
|
amdgpu_ring_write(ring, 0x0);
|
|
amdgpu_ring_write(ring, 0x0);
|
|
-
|
|
|
|
- /* synce CE with ME to prevent CE fetch CEIB before context switch done */
|
|
|
|
- gfx_v8_0_ce_sync_me(ring);
|
|
|
|
|
|
+ amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
|
|
|
|
+ amdgpu_ring_write(ring, 0);
|
|
|
|
+ amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
|
|
|
|
+ amdgpu_ring_write(ring, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|