diff options
| author | Monk Liu <Monk.Liu@amd.com> | 2020-02-06 23:55:58 +0800 | 
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2020-02-25 11:01:25 -0500 | 
| commit | 6325b38d892b68902e38a9953abb6d42bfd389fb (patch) | |
| tree | 6237bfe490e37e679cc3db9f47d50c4ba619b342 /drivers | |
| parent | 9cfb06920e2b4ea9ae903be640927b8da0fd5b68 (diff) | |
drm/amdgpu: fix colliding of preemption
what:
some os preemption path is messed up with world switch preemption
fix:
cleanup those logics so os preemption not mixed with world switch
this patch is a general fix for issues comes from SRIOV MCBP, but
there is still UMD side issues not resovlved yet, so this patch
cannot fix all world switch bug.
Signed-off-by: Monk Liu <Monk.Liu@amd.com>
Acked-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c | 8 | 
2 files changed, 6 insertions, 5 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c index a2ee30b16212..7854c053e85d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c @@ -70,7 +70,8 @@ uint64_t amdgpu_sdma_get_csa_mc_addr(struct amdgpu_ring *ring,  	uint32_t index = 0;  	int r; -	if (vmid == 0 || !amdgpu_mcbp) +	/* don't enable OS preemption on SDMA under SRIOV */ +	if (amdgpu_sriov_vf(adev) || vmid == 0 || !amdgpu_mcbp)  		return 0;  	r = amdgpu_sdma_get_index_from_ring(ring, &index); diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c index 22bbb36c768e..bb2f990ee070 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c @@ -4413,7 +4413,7 @@ static void gfx_v10_0_ring_emit_ib_gfx(struct amdgpu_ring *ring,  	control |= ib->length_dw | (vmid << 24); -	if (amdgpu_mcbp && (ib->flags & AMDGPU_IB_FLAG_PREEMPT)) { +	if ((amdgpu_sriov_vf(ring->adev) || amdgpu_mcbp) && (ib->flags & AMDGPU_IB_FLAG_PREEMPT)) {  		control |= INDIRECT_BUFFER_PRE_ENB(1);  		if (flags & AMDGPU_IB_PREEMPTED) @@ -4421,7 +4421,7 @@ static void gfx_v10_0_ring_emit_ib_gfx(struct amdgpu_ring *ring,  		if (!(ib->flags & AMDGPU_IB_FLAG_CE))  			gfx_v10_0_ring_emit_de_meta(ring, -				    flags & AMDGPU_IB_PREEMPTED ? true : false); +				    (!amdgpu_sriov_vf(ring->adev) && flags & AMDGPU_IB_PREEMPTED) ? true : false);  	}  	amdgpu_ring_write(ring, header); @@ -4568,9 +4568,9 @@ static void gfx_v10_0_ring_emit_cntxcntl(struct amdgpu_ring *ring, uint32_t flag  {  	uint32_t dw2 = 0; -	if (amdgpu_mcbp) +	if (amdgpu_mcbp || amdgpu_sriov_vf(ring->adev))  		gfx_v10_0_ring_emit_ce_meta(ring, -				    flags & AMDGPU_IB_PREEMPTED ? true : false); +				    (!amdgpu_sriov_vf(ring->adev) && flags & AMDGPU_IB_PREEMPTED) ? true : false);  	gfx_v10_0_ring_emit_tmz(ring, true); | 
