[PATCH] Revert "drm/amdgpu: use polling mem to set SDMA3 wptr for VF"

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi all,
     Please ignore this patch, the root cause about the sdma hang introduced by sdma wptr polling
has been found, will submit another patch.

Best Wishes,
Emily Deng

> -----Original Message-----
> From: Deng, Emily
> Sent: Tuesday, March 06, 2018 9:50 AM
> To: Deng, Emily <Emily.Deng at amd.com>; amd-gfx at lists.freedesktop.org
> Subject: RE: [PATCH] Revert "drm/amdgpu: use polling mem to set SDMA3
> wptr for VF"
> 
> Ping....
> Hi all,
>     Please help review this, the regression introduced by the commit
> 2ffe31deb27579e2f2c9444e01f4d8abf385d145 is gating the sriov sanity test.
> 
> Best Wishes,
> Emily Deng
> 
> 
> > -----Original Message-----
> > From: Emily Deng [mailto:Emily.Deng at amd.com]
> > Sent: Friday, March 02, 2018 11:32 AM
> > To: amd-gfx at lists.freedesktop.org
> > Cc: Deng, Emily <Emily.Deng at amd.com>
> > Subject: [PATCH] Revert "drm/amdgpu: use polling mem to set SDMA3 wptr
> > for VF"
> >
> > This reverts commit 2ffe31deb27579e2f2c9444e01f4d8abf385d145.
> > The sdma wptr poll memomy doesn't have the same efficiency as
> > doorbell, and it will make sdma hang when running tests.
> >
> > Change-Id: I6e334430b309b0c21aa18a08764320c7ff51e353
> > Signed-off-by: Emily Deng <Emily.Deng at amd.com>
> > ---
> >  drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h |  1 -
> >  drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c   | 27 ++++++++----------------
> ---
> >  2 files changed, 8 insertions(+), 20 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
> > b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
> > index 102dad3..5dcf98b 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
> > @@ -186,7 +186,6 @@ struct amdgpu_ring {
> >  	uint64_t                eop_gpu_addr;
> >  	u32			doorbell_index;
> >  	bool			use_doorbell;
> > -	bool			use_pollmem;
> >  	unsigned		wptr_offs;
> >  	unsigned		fence_offs;
> >  	uint64_t		current_ctx;
> > diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
> > b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
> > index 521978c..d3fb3ca 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
> > @@ -355,7 +355,7 @@ static uint64_t sdma_v3_0_ring_get_wptr(struct
> > amdgpu_ring *ring)
> >  	struct amdgpu_device *adev = ring->adev;
> >  	u32 wptr;
> >
> > -	if (ring->use_doorbell || ring->use_pollmem) {
> > +	if (ring->use_doorbell) {
> >  		/* XXX check if swapping is necessary on BE */
> >  		wptr = ring->adev->wb.wb[ring->wptr_offs] >> 2;
> >  	} else {
> > @@ -380,13 +380,10 @@ static void sdma_v3_0_ring_set_wptr(struct
> > amdgpu_ring *ring)
> >
> >  	if (ring->use_doorbell) {
> >  		u32 *wb = (u32 *)&adev->wb.wb[ring->wptr_offs];
> > +
> >  		/* XXX check if swapping is necessary on BE */
> >  		WRITE_ONCE(*wb, (lower_32_bits(ring->wptr) << 2));
> >  		WDOORBELL32(ring->doorbell_index, lower_32_bits(ring-
> > >wptr) << 2);
> > -	} else if (ring->use_pollmem) {
> > -		u32 *wb = (u32 *)&adev->wb.wb[ring->wptr_offs];
> > -
> > -		WRITE_ONCE(*wb, (lower_32_bits(ring->wptr) << 2));
> >  	} else {
> >  		int me = (ring == &ring->adev->sdma.instance[0].ring) ? 0 : 1;
> >
> > @@ -719,14 +716,10 @@ static int sdma_v3_0_gfx_resume(struct
> > amdgpu_device *adev)
> >  		WREG32(mmSDMA0_GFX_RB_WPTR_POLL_ADDR_HI +
> sdma_offsets[i],
> >  		       upper_32_bits(wptr_gpu_addr));
> >  		wptr_poll_cntl =
> > RREG32(mmSDMA0_GFX_RB_WPTR_POLL_CNTL + sdma_offsets[i]);
> > -		if (ring->use_pollmem)
> > -			wptr_poll_cntl = REG_SET_FIELD(wptr_poll_cntl,
> > -
> > SDMA0_GFX_RB_WPTR_POLL_CNTL,
> > -						       ENABLE, 1);
> > +		if (amdgpu_sriov_vf(adev))
> > +			wptr_poll_cntl = REG_SET_FIELD(wptr_poll_cntl,
> > +SDMA0_GFX_RB_WPTR_POLL_CNTL, F32_POLL_ENABLE, 1);
> >  		else
> > -			wptr_poll_cntl = REG_SET_FIELD(wptr_poll_cntl,
> > -
> > SDMA0_GFX_RB_WPTR_POLL_CNTL,
> > -						       ENABLE, 0);
> > +			wptr_poll_cntl = REG_SET_FIELD(wptr_poll_cntl,
> > +SDMA0_GFX_RB_WPTR_POLL_CNTL, F32_POLL_ENABLE, 0);
> >  		WREG32(mmSDMA0_GFX_RB_WPTR_POLL_CNTL +
> sdma_offsets[i],
> > wptr_poll_cntl);
> >
> >  		/* enable DMA RB */
> > @@ -1208,13 +1201,9 @@ static int sdma_v3_0_sw_init(void *handle)
> >  	for (i = 0; i < adev->sdma.num_instances; i++) {
> >  		ring = &adev->sdma.instance[i].ring;
> >  		ring->ring_obj = NULL;
> > -		if (!amdgpu_sriov_vf(adev)) {
> > -			ring->use_doorbell = true;
> > -			ring->doorbell_index = (i == 0) ?
> > -				AMDGPU_DOORBELL_sDMA_ENGINE0 :
> > AMDGPU_DOORBELL_sDMA_ENGINE1;
> > -		} else {
> > -			ring->use_pollmem = true;
> > -		}
> > +		ring->use_doorbell = true;
> > +		ring->doorbell_index = (i == 0) ?
> > +			AMDGPU_DOORBELL_sDMA_ENGINE0 :
> > AMDGPU_DOORBELL_sDMA_ENGINE1;
> >
> >  		sprintf(ring->name, "sdma%d", i);
> >  		r = amdgpu_ring_init(adev, ring, 1024,
> > --
> > 2.7.4



[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux