drm/amdgpu: split pipeline sync and vm flush
This allows us to use the pipeline sync for other tasks as well. Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Reviewed-by: Chunming Zhou <david1.zhou@amd.com>
This commit is contained in:
parent
971fe9a941
commit
b8c7b39ec1
@ -326,6 +326,7 @@ struct amdgpu_ring_funcs {
|
|||||||
struct amdgpu_ib *ib);
|
struct amdgpu_ib *ib);
|
||||||
void (*emit_fence)(struct amdgpu_ring *ring, uint64_t addr,
|
void (*emit_fence)(struct amdgpu_ring *ring, uint64_t addr,
|
||||||
uint64_t seq, unsigned flags);
|
uint64_t seq, unsigned flags);
|
||||||
|
void (*emit_pipeline_sync)(struct amdgpu_ring *ring);
|
||||||
void (*emit_vm_flush)(struct amdgpu_ring *ring, unsigned vm_id,
|
void (*emit_vm_flush)(struct amdgpu_ring *ring, unsigned vm_id,
|
||||||
uint64_t pd_addr);
|
uint64_t pd_addr);
|
||||||
void (*emit_hdp_flush)(struct amdgpu_ring *ring);
|
void (*emit_hdp_flush)(struct amdgpu_ring *ring);
|
||||||
@ -2234,6 +2235,7 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)
|
|||||||
#define amdgpu_ring_get_wptr(r) (r)->funcs->get_wptr((r))
|
#define amdgpu_ring_get_wptr(r) (r)->funcs->get_wptr((r))
|
||||||
#define amdgpu_ring_set_wptr(r) (r)->funcs->set_wptr((r))
|
#define amdgpu_ring_set_wptr(r) (r)->funcs->set_wptr((r))
|
||||||
#define amdgpu_ring_emit_ib(r, ib) (r)->funcs->emit_ib((r), (ib))
|
#define amdgpu_ring_emit_ib(r, ib) (r)->funcs->emit_ib((r), (ib))
|
||||||
|
#define amdgpu_ring_emit_pipeline_sync(r) (r)->funcs->emit_pipeline_sync((r))
|
||||||
#define amdgpu_ring_emit_vm_flush(r, vmid, addr) (r)->funcs->emit_vm_flush((r), (vmid), (addr))
|
#define amdgpu_ring_emit_vm_flush(r, vmid, addr) (r)->funcs->emit_vm_flush((r), (vmid), (addr))
|
||||||
#define amdgpu_ring_emit_fence(r, addr, seq, flags) (r)->funcs->emit_fence((r), (addr), (seq), (flags))
|
#define amdgpu_ring_emit_fence(r, addr, seq, flags) (r)->funcs->emit_fence((r), (addr), (seq), (flags))
|
||||||
#define amdgpu_ring_emit_gds_switch(r, v, db, ds, wb, ws, ab, as) (r)->funcs->emit_gds_switch((r), (v), (db), (ds), (wb), (ws), (ab), (as))
|
#define amdgpu_ring_emit_gds_switch(r, v, db, ds, wb, ws, ab, as) (r)->funcs->emit_gds_switch((r), (v), (db), (ds), (wb), (ws), (ab), (as))
|
||||||
|
@ -257,6 +257,8 @@ void amdgpu_vm_flush(struct amdgpu_ring *ring,
|
|||||||
|
|
||||||
if (pd_addr != AMDGPU_VM_NO_FLUSH) {
|
if (pd_addr != AMDGPU_VM_NO_FLUSH) {
|
||||||
trace_amdgpu_vm_flush(pd_addr, ring->idx, vm_id);
|
trace_amdgpu_vm_flush(pd_addr, ring->idx, vm_id);
|
||||||
|
if (ring->funcs->emit_pipeline_sync)
|
||||||
|
amdgpu_ring_emit_pipeline_sync(ring);
|
||||||
amdgpu_ring_emit_vm_flush(ring, vm_id, pd_addr);
|
amdgpu_ring_emit_vm_flush(ring, vm_id, pd_addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3041,6 +3041,26 @@ static int gfx_v7_0_cp_resume(struct amdgpu_device *adev)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gfx_v7_0_ring_emit_vm_flush - cik vm flush using the CP
|
||||||
|
*
|
||||||
|
* @ring: the ring to emmit the commands to
|
||||||
|
*
|
||||||
|
* Sync the command pipeline with the PFP. E.g. wait for everything
|
||||||
|
* to be completed.
|
||||||
|
*/
|
||||||
|
static void gfx_v7_0_ring_emit_pipeline_sync(struct amdgpu_ring *ring)
|
||||||
|
{
|
||||||
|
int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX);
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* vm
|
* vm
|
||||||
* VMID 0 is the physical GPU addresses as used by the kernel.
|
* VMID 0 is the physical GPU addresses as used by the kernel.
|
||||||
@ -3059,13 +3079,6 @@ static void gfx_v7_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
|
|||||||
unsigned vm_id, uint64_t pd_addr)
|
unsigned vm_id, uint64_t pd_addr)
|
||||||
{
|
{
|
||||||
int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX);
|
int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX);
|
||||||
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) |
|
||||||
@ -5147,6 +5160,7 @@ static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_gfx = {
|
|||||||
.parse_cs = NULL,
|
.parse_cs = NULL,
|
||||||
.emit_ib = gfx_v7_0_ring_emit_ib_gfx,
|
.emit_ib = gfx_v7_0_ring_emit_ib_gfx,
|
||||||
.emit_fence = gfx_v7_0_ring_emit_fence_gfx,
|
.emit_fence = gfx_v7_0_ring_emit_fence_gfx,
|
||||||
|
.emit_pipeline_sync = gfx_v7_0_ring_emit_pipeline_sync,
|
||||||
.emit_vm_flush = gfx_v7_0_ring_emit_vm_flush,
|
.emit_vm_flush = gfx_v7_0_ring_emit_vm_flush,
|
||||||
.emit_gds_switch = gfx_v7_0_ring_emit_gds_switch,
|
.emit_gds_switch = gfx_v7_0_ring_emit_gds_switch,
|
||||||
.emit_hdp_flush = gfx_v7_0_ring_emit_hdp_flush,
|
.emit_hdp_flush = gfx_v7_0_ring_emit_hdp_flush,
|
||||||
@ -5164,6 +5178,7 @@ static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_compute = {
|
|||||||
.parse_cs = NULL,
|
.parse_cs = NULL,
|
||||||
.emit_ib = gfx_v7_0_ring_emit_ib_compute,
|
.emit_ib = gfx_v7_0_ring_emit_ib_compute,
|
||||||
.emit_fence = gfx_v7_0_ring_emit_fence_compute,
|
.emit_fence = gfx_v7_0_ring_emit_fence_compute,
|
||||||
|
.emit_pipeline_sync = gfx_v7_0_ring_emit_pipeline_sync,
|
||||||
.emit_vm_flush = gfx_v7_0_ring_emit_vm_flush,
|
.emit_vm_flush = gfx_v7_0_ring_emit_vm_flush,
|
||||||
.emit_gds_switch = gfx_v7_0_ring_emit_gds_switch,
|
.emit_gds_switch = gfx_v7_0_ring_emit_gds_switch,
|
||||||
.emit_hdp_flush = gfx_v7_0_ring_emit_hdp_flush,
|
.emit_hdp_flush = gfx_v7_0_ring_emit_hdp_flush,
|
||||||
|
@ -4692,8 +4692,7 @@ static void gfx_v8_0_ring_emit_fence_gfx(struct amdgpu_ring *ring, u64 addr,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gfx_v8_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
|
static void gfx_v8_0_ring_emit_pipeline_sync(struct amdgpu_ring *ring)
|
||||||
unsigned vm_id, uint64_t pd_addr)
|
|
||||||
{
|
{
|
||||||
int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX);
|
int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX);
|
||||||
uint32_t seq = ring->fence_drv.sync_seq;
|
uint32_t seq = ring->fence_drv.sync_seq;
|
||||||
@ -4715,6 +4714,12 @@ static void gfx_v8_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
|
|||||||
amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
|
amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
|
||||||
amdgpu_ring_write(ring, 0);
|
amdgpu_ring_write(ring, 0);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gfx_v8_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
|
||||||
|
unsigned vm_id, uint64_t pd_addr)
|
||||||
|
{
|
||||||
|
int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX);
|
||||||
|
|
||||||
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) |
|
||||||
@ -5037,6 +5042,7 @@ static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_gfx = {
|
|||||||
.parse_cs = NULL,
|
.parse_cs = NULL,
|
||||||
.emit_ib = gfx_v8_0_ring_emit_ib_gfx,
|
.emit_ib = gfx_v8_0_ring_emit_ib_gfx,
|
||||||
.emit_fence = gfx_v8_0_ring_emit_fence_gfx,
|
.emit_fence = gfx_v8_0_ring_emit_fence_gfx,
|
||||||
|
.emit_pipeline_sync = gfx_v8_0_ring_emit_pipeline_sync,
|
||||||
.emit_vm_flush = gfx_v8_0_ring_emit_vm_flush,
|
.emit_vm_flush = gfx_v8_0_ring_emit_vm_flush,
|
||||||
.emit_gds_switch = gfx_v8_0_ring_emit_gds_switch,
|
.emit_gds_switch = gfx_v8_0_ring_emit_gds_switch,
|
||||||
.emit_hdp_flush = gfx_v8_0_ring_emit_hdp_flush,
|
.emit_hdp_flush = gfx_v8_0_ring_emit_hdp_flush,
|
||||||
@ -5054,6 +5060,7 @@ static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_compute = {
|
|||||||
.parse_cs = NULL,
|
.parse_cs = NULL,
|
||||||
.emit_ib = gfx_v8_0_ring_emit_ib_compute,
|
.emit_ib = gfx_v8_0_ring_emit_ib_compute,
|
||||||
.emit_fence = gfx_v8_0_ring_emit_fence_compute,
|
.emit_fence = gfx_v8_0_ring_emit_fence_compute,
|
||||||
|
.emit_pipeline_sync = gfx_v8_0_ring_emit_pipeline_sync,
|
||||||
.emit_vm_flush = gfx_v8_0_ring_emit_vm_flush,
|
.emit_vm_flush = gfx_v8_0_ring_emit_vm_flush,
|
||||||
.emit_gds_switch = gfx_v8_0_ring_emit_gds_switch,
|
.emit_gds_switch = gfx_v8_0_ring_emit_gds_switch,
|
||||||
.emit_hdp_flush = gfx_v8_0_ring_emit_hdp_flush,
|
.emit_hdp_flush = gfx_v8_0_ring_emit_hdp_flush,
|
||||||
|
Loading…
Reference in New Issue
Block a user