[PATCH 8/9] drm/amdgpu: simplify IH programming

Huang, Ray Ray.Huang at amd.com
Wed Sep 26 08:48:19 UTC 2018


> -----Original Message-----
> From: amd-gfx [mailto:amd-gfx-bounces at lists.freedesktop.org] On Behalf
> Of Christian K?nig
> Sent: Monday, September 24, 2018 8:38 PM
> To: amd-gfx at lists.freedesktop.org
> Subject: [PATCH 8/9] drm/amdgpu: simplify IH programming
> 
> Calculate all the addresses and pointers in amdgpu_ih.c
> 
> Signed-off-by: Christian König <christian.koenig at amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c  | 34
> +++++++++++++++++++++----------
> drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h  | 23 ++++++++++++---------
>  drivers/gpu/drm/amd/amdgpu/cik_ih.c     |  9 ++++-----
>  drivers/gpu/drm/amd/amdgpu/cz_ih.c      | 11 +++++-----
>  drivers/gpu/drm/amd/amdgpu/iceland_ih.c |  9 ++++-----
>  drivers/gpu/drm/amd/amdgpu/si_ih.c      |  9 ++++-----
>  drivers/gpu/drm/amd/amdgpu/tonga_ih.c   | 27 +++++++------------------
>  drivers/gpu/drm/amd/amdgpu/vega10_ih.c  | 36 +++++++++++---------------
> -------
>  8 files changed, 73 insertions(+), 85 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c
> index fb8dd6179926..d0a5db777b6d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c
> @@ -52,6 +52,8 @@ int amdgpu_ih_ring_init(struct amdgpu_device *adev,
> struct amdgpu_ih_ring *ih,
>  	ih->use_bus_addr = use_bus_addr;
> 
>  	if (use_bus_addr) {
> +		dma_addr_t dma_addr;
> +
>  		if (ih->ring)
>  			return 0;
> 
> @@ -59,21 +61,26 @@ int amdgpu_ih_ring_init(struct amdgpu_device *adev,
> struct amdgpu_ih_ring *ih,
>  		 * add them to the end of the ring allocation.
>  		 */
>  		ih->ring = dma_alloc_coherent(adev->dev, ih->ring_size + 8,
> -					      &ih->rb_dma_addr, GFP_KERNEL);
> +					      &dma_addr, GFP_KERNEL);
>  		if (ih->ring == NULL)
>  			return -ENOMEM;
> 
>  		memset((void *)ih->ring, 0, ih->ring_size + 8);
> -		ih->wptr_offs = (ih->ring_size / 4) + 0;
> -		ih->rptr_offs = (ih->ring_size / 4) + 1;
> +		ih->gpu_addr = dma_addr;

I am thinking if program the dma_addr as the member of gpu_addr, it might cause confusion.
I know it can avoid the checking when we program the mmIH_RB_BASE. How about use another name for this member?

Thanks,
Ray

> +		ih->wptr_addr = dma_addr + ih->ring_size;
> +		ih->wptr_cpu = &ih->ring[ih->ring_size / 4];
> +		ih->rptr_addr = dma_addr + ih->ring_size + 4;
> +		ih->rptr_cpu = &ih->ring[(ih->ring_size / 4) + 1];
>  	} else {
> -		r = amdgpu_device_wb_get(adev, &ih->wptr_offs);
> +		unsigned wptr_offs, rptr_offs;
> +
> +		r = amdgpu_device_wb_get(adev, &wptr_offs);
>  		if (r)
>  			return r;
> 
> -		r = amdgpu_device_wb_get(adev, &ih->rptr_offs);
> +		r = amdgpu_device_wb_get(adev, &rptr_offs);
>  		if (r) {
> -			amdgpu_device_wb_free(adev, ih->wptr_offs);
> +			amdgpu_device_wb_free(adev, wptr_offs);
>  			return r;
>  		}
> 
> @@ -82,10 +89,15 @@ int amdgpu_ih_ring_init(struct amdgpu_device *adev,
> struct amdgpu_ih_ring *ih,
>  					    &ih->ring_obj, &ih->gpu_addr,
>  					    (void **)&ih->ring);
>  		if (r) {
> -			amdgpu_device_wb_free(adev, ih->rptr_offs);
> -			amdgpu_device_wb_free(adev, ih->wptr_offs);
> +			amdgpu_device_wb_free(adev, rptr_offs);
> +			amdgpu_device_wb_free(adev, wptr_offs);
>  			return r;
>  		}
> +
> +		ih->wptr_addr = adev->wb.gpu_addr + wptr_offs * 4;
> +		ih->wptr_cpu = &adev->wb.wb[wptr_offs];
> +		ih->rptr_addr = adev->wb.gpu_addr + rptr_offs * 4;
> +		ih->rptr_cpu = &adev->wb.wb[rptr_offs];
>  	}
>  	return 0;
>  }
> @@ -109,13 +121,13 @@ void amdgpu_ih_ring_fini(struct amdgpu_device
> *adev, struct amdgpu_ih_ring *ih)
>  		 * add them to the end of the ring allocation.
>  		 */
>  		dma_free_coherent(adev->dev, ih->ring_size + 8,
> -				  (void *)ih->ring, ih->rb_dma_addr);
> +				  (void *)ih->ring, ih->gpu_addr);
>  		ih->ring = NULL;
>  	} else {
>  		amdgpu_bo_free_kernel(&ih->ring_obj, &ih->gpu_addr,
>  				      (void **)&ih->ring);
> -		amdgpu_device_wb_free(adev, ih->wptr_offs);
> -		amdgpu_device_wb_free(adev, ih->rptr_offs);
> +		amdgpu_device_wb_free(adev, (ih->wptr_addr - ih-
> >gpu_addr) / 4);
> +		amdgpu_device_wb_free(adev, (ih->rptr_addr - ih-
> >gpu_addr) / 4);
>  	}
>  }
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h
> index 61967e7b64a7..6af047b64cf0 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h
> @@ -31,20 +31,25 @@ struct amdgpu_iv_entry;
>   * R6xx+ IH ring
>   */
>  struct amdgpu_ih_ring {
> -	struct amdgpu_bo	*ring_obj;
> -	volatile uint32_t	*ring;
> -	unsigned		rptr;
>  	unsigned		ring_size;
> -	uint64_t		gpu_addr;
>  	uint32_t		ptr_mask;
> -	atomic_t		lock;
> -	bool                    enabled;
> -	unsigned		wptr_offs;
> -	unsigned		rptr_offs;
>  	u32			doorbell_index;
>  	bool			use_doorbell;
>  	bool			use_bus_addr;
> -	dma_addr_t		rb_dma_addr; /* only used when
> use_bus_addr = true */
> +
> +	struct amdgpu_bo	*ring_obj;
> +	volatile uint32_t	*ring;
> +	uint64_t		gpu_addr;
> +
> +	uint64_t		wptr_addr;
> +	volatile uint32_t	*wptr_cpu;
> +
> +	uint64_t		rptr_addr;
> +	volatile uint32_t	*rptr_cpu;
> +
> +	bool                    enabled;
> +	unsigned		rptr;
> +	atomic_t		lock;
> 
>  	const struct amdgpu_ih_funcs	*funcs;
>  };
> diff --git a/drivers/gpu/drm/amd/amdgpu/cik_ih.c
> b/drivers/gpu/drm/amd/amdgpu/cik_ih.c
> index 341092768809..2358ab32c16c 100644
> --- a/drivers/gpu/drm/amd/amdgpu/cik_ih.c
> +++ b/drivers/gpu/drm/amd/amdgpu/cik_ih.c
> @@ -103,9 +103,9 @@ static void cik_ih_disable_interrupts(struct
> amdgpu_device *adev)
>   */
>  static int cik_ih_irq_init(struct amdgpu_device *adev)  {
> +	struct amdgpu_ih_ring *ih = &adev->irq.ih;
>  	int rb_bufsz;
>  	u32 interrupt_cntl, ih_cntl, ih_rb_cntl;
> -	u64 wptr_off;
> 
>  	/* disable irqs */
>  	cik_ih_disable_interrupts(adev);
> @@ -131,9 +131,8 @@ static int cik_ih_irq_init(struct amdgpu_device *adev)
>  	ih_rb_cntl |= IH_RB_CNTL__WPTR_WRITEBACK_ENABLE_MASK;
> 
>  	/* set the writeback address whether it's enabled or not */
> -	wptr_off = adev->wb.gpu_addr + (adev->irq.ih.wptr_offs * 4);
> -	WREG32(mmIH_RB_WPTR_ADDR_LO, lower_32_bits(wptr_off));
> -	WREG32(mmIH_RB_WPTR_ADDR_HI, upper_32_bits(wptr_off) &
> 0xFF);
> +	WREG32(mmIH_RB_WPTR_ADDR_LO, lower_32_bits(ih-
> >wptr_addr));
> +	WREG32(mmIH_RB_WPTR_ADDR_HI, upper_32_bits(ih->wptr_addr)
> & 0xFF);
> 
>  	WREG32(mmIH_RB_CNTL, ih_rb_cntl);
> 
> @@ -188,7 +187,7 @@ static u32 cik_ih_get_wptr(struct amdgpu_device
> *adev,  {
>  	u32 wptr, tmp;
> 
> -	wptr = le32_to_cpu(adev->wb.wb[ih->wptr_offs]);
> +	wptr = le32_to_cpu(*ih->wptr_cpu);
> 
>  	if (wptr & IH_RB_WPTR__RB_OVERFLOW_MASK) {
>  		wptr &= ~IH_RB_WPTR__RB_OVERFLOW_MASK; diff --git
> a/drivers/gpu/drm/amd/amdgpu/cz_ih.c
> b/drivers/gpu/drm/amd/amdgpu/cz_ih.c
> index 6ed750187ad7..2d2029cd15e4 100644
> --- a/drivers/gpu/drm/amd/amdgpu/cz_ih.c
> +++ b/drivers/gpu/drm/amd/amdgpu/cz_ih.c
> @@ -103,9 +103,9 @@ static void cz_ih_disable_interrupts(struct
> amdgpu_device *adev)
>   */
>  static int cz_ih_irq_init(struct amdgpu_device *adev)  {
> -	int rb_bufsz;
> +	struct amdgpu_ih_ring *ih = &adev->irq.ih;
>  	u32 interrupt_cntl, ih_cntl, ih_rb_cntl;
> -	u64 wptr_off;
> +	int rb_bufsz;
> 
>  	/* disable irqs */
>  	cz_ih_disable_interrupts(adev);
> @@ -133,9 +133,8 @@ static int cz_ih_irq_init(struct amdgpu_device *adev)
>  	ih_rb_cntl = REG_SET_FIELD(ih_rb_cntl, IH_RB_CNTL,
> WPTR_WRITEBACK_ENABLE, 1);
> 
>  	/* set the writeback address whether it's enabled or not */
> -	wptr_off = adev->wb.gpu_addr + (adev->irq.ih.wptr_offs * 4);
> -	WREG32(mmIH_RB_WPTR_ADDR_LO, lower_32_bits(wptr_off));
> -	WREG32(mmIH_RB_WPTR_ADDR_HI, upper_32_bits(wptr_off) &
> 0xFF);
> +	WREG32(mmIH_RB_WPTR_ADDR_LO, lower_32_bits(ih-
> >wptr_addr));
> +	WREG32(mmIH_RB_WPTR_ADDR_HI, upper_32_bits(ih->wptr_addr)
> & 0xFF);
> 
>  	WREG32(mmIH_RB_CNTL, ih_rb_cntl);
> 
> @@ -190,7 +189,7 @@ static u32 cz_ih_get_wptr(struct amdgpu_device
> *adev,  {
>  	u32 wptr, tmp;
> 
> -	wptr = le32_to_cpu(adev->wb.wb[ih->wptr_offs]);
> +	wptr = le32_to_cpu(*ih->wptr_cpu);
> 
>  	if (REG_GET_FIELD(wptr, IH_RB_WPTR, RB_OVERFLOW)) {
>  		wptr = REG_SET_FIELD(wptr, IH_RB_WPTR, RB_OVERFLOW,
> 0); diff --git a/drivers/gpu/drm/amd/amdgpu/iceland_ih.c
> b/drivers/gpu/drm/amd/amdgpu/iceland_ih.c
> index c779d708c306..337fc38c6bca 100644
> --- a/drivers/gpu/drm/amd/amdgpu/iceland_ih.c
> +++ b/drivers/gpu/drm/amd/amdgpu/iceland_ih.c
> @@ -103,9 +103,9 @@ static void iceland_ih_disable_interrupts(struct
> amdgpu_device *adev)
>   */
>  static int iceland_ih_irq_init(struct amdgpu_device *adev)  {
> +	struct amdgpu_ih_ring *ih = &adev->irq.ih;
>  	int rb_bufsz;
>  	u32 interrupt_cntl, ih_cntl, ih_rb_cntl;
> -	u64 wptr_off;
> 
>  	/* disable irqs */
>  	iceland_ih_disable_interrupts(adev);
> @@ -133,9 +133,8 @@ static int iceland_ih_irq_init(struct amdgpu_device
> *adev)
>  	ih_rb_cntl = REG_SET_FIELD(ih_rb_cntl, IH_RB_CNTL,
> WPTR_WRITEBACK_ENABLE, 1);
> 
>  	/* set the writeback address whether it's enabled or not */
> -	wptr_off = adev->wb.gpu_addr + (adev->irq.ih.wptr_offs * 4);
> -	WREG32(mmIH_RB_WPTR_ADDR_LO, lower_32_bits(wptr_off));
> -	WREG32(mmIH_RB_WPTR_ADDR_HI, upper_32_bits(wptr_off) &
> 0xFF);
> +	WREG32(mmIH_RB_WPTR_ADDR_LO, lower_32_bits(ih-
> >wptr_addr));
> +	WREG32(mmIH_RB_WPTR_ADDR_HI, upper_32_bits(ih->wptr_addr)
> & 0xFF);
> 
>  	WREG32(mmIH_RB_CNTL, ih_rb_cntl);
> 
> @@ -190,7 +189,7 @@ static u32 iceland_ih_get_wptr(struct amdgpu_device
> *adev,  {
>  	u32 wptr, tmp;
> 
> -	wptr = le32_to_cpu(adev->wb.wb[ih->wptr_offs]);
> +	wptr = le32_to_cpu(*ih->wptr_cpu);
> 
>  	if (REG_GET_FIELD(wptr, IH_RB_WPTR, RB_OVERFLOW)) {
>  		wptr = REG_SET_FIELD(wptr, IH_RB_WPTR, RB_OVERFLOW,
> 0); diff --git a/drivers/gpu/drm/amd/amdgpu/si_ih.c
> b/drivers/gpu/drm/amd/amdgpu/si_ih.c
> index a005824d8b9a..574efa2a4f0c 100644
> --- a/drivers/gpu/drm/amd/amdgpu/si_ih.c
> +++ b/drivers/gpu/drm/amd/amdgpu/si_ih.c
> @@ -57,9 +57,9 @@ static void si_ih_disable_interrupts(struct
> amdgpu_device *adev)
> 
>  static int si_ih_irq_init(struct amdgpu_device *adev)  {
> +	struct amdgpu_ih_ring *ih = &adev->irq.ih;
>  	int rb_bufsz;
>  	u32 interrupt_cntl, ih_cntl, ih_rb_cntl;
> -	u64 wptr_off;
> 
>  	si_ih_disable_interrupts(adev);
>  	WREG32(INTERRUPT_CNTL2, adev->irq.ih.gpu_addr >> 8); @@ -76,9
> +76,8 @@ static int si_ih_irq_init(struct amdgpu_device *adev)
>  		     (rb_bufsz << 1) |
>  		     IH_WPTR_WRITEBACK_ENABLE;
> 
> -	wptr_off = adev->wb.gpu_addr + (adev->irq.ih.wptr_offs * 4);
> -	WREG32(IH_RB_WPTR_ADDR_LO, lower_32_bits(wptr_off));
> -	WREG32(IH_RB_WPTR_ADDR_HI, upper_32_bits(wptr_off) & 0xFF);
> +	WREG32(IH_RB_WPTR_ADDR_LO, lower_32_bits(ih->wptr_addr));
> +	WREG32(IH_RB_WPTR_ADDR_HI, upper_32_bits(ih->wptr_addr) &
> 0xFF);
>  	WREG32(IH_RB_CNTL, ih_rb_cntl);
>  	WREG32(IH_RB_RPTR, 0);
>  	WREG32(IH_RB_WPTR, 0);
> @@ -105,7 +104,7 @@ static u32 si_ih_get_wptr(struct amdgpu_device
> *adev,  {
>  	u32 wptr, tmp;
> 
> -	wptr = le32_to_cpu(adev->wb.wb[ih->wptr_offs]);
> +	wptr = le32_to_cpu(*ih->wptr_cpu);
> 
>  	if (wptr & IH_RB_WPTR__RB_OVERFLOW_MASK) {
>  		wptr &= ~IH_RB_WPTR__RB_OVERFLOW_MASK; diff --git
> a/drivers/gpu/drm/amd/amdgpu/tonga_ih.c
> b/drivers/gpu/drm/amd/amdgpu/tonga_ih.c
> index 3618dc0c6804..966c0782f743 100644
> --- a/drivers/gpu/drm/amd/amdgpu/tonga_ih.c
> +++ b/drivers/gpu/drm/amd/amdgpu/tonga_ih.c
> @@ -99,9 +99,9 @@ static void tonga_ih_disable_interrupts(struct
> amdgpu_device *adev)
>   */
>  static int tonga_ih_irq_init(struct amdgpu_device *adev)  {
> -	int rb_bufsz;
>  	u32 interrupt_cntl, ih_rb_cntl, ih_doorbell_rtpr;
> -	u64 wptr_off;
> +	struct amdgpu_ih_ring *ih = &adev->irq.ih;
> +	int rb_bufsz;
> 
>  	/* disable irqs */
>  	tonga_ih_disable_interrupts(adev);
> @@ -118,10 +118,7 @@ static int tonga_ih_irq_init(struct amdgpu_device
> *adev)
>  	WREG32(mmINTERRUPT_CNTL, interrupt_cntl);
> 
>  	/* Ring Buffer base. [39:8] of 40-bit address of the beginning of the
> ring buffer*/
> -	if (adev->irq.ih.use_bus_addr)
> -		WREG32(mmIH_RB_BASE, adev->irq.ih.rb_dma_addr >> 8);
> -	else
> -		WREG32(mmIH_RB_BASE, adev->irq.ih.gpu_addr >> 8);
> +	WREG32(mmIH_RB_BASE, ih->gpu_addr >> 8);
> 
>  	rb_bufsz = order_base_2(adev->irq.ih.ring_size / 4);
>  	ih_rb_cntl = REG_SET_FIELD(0, IH_RB_CNTL,
> WPTR_OVERFLOW_CLEAR, 1); @@ -136,12 +133,8 @@ static int
> tonga_ih_irq_init(struct amdgpu_device *adev)
>  	WREG32(mmIH_RB_CNTL, ih_rb_cntl);
> 
>  	/* set the writeback address whether it's enabled or not */
> -	if (adev->irq.ih.use_bus_addr)
> -		wptr_off = adev->irq.ih.rb_dma_addr + (adev-
> >irq.ih.wptr_offs * 4);
> -	else
> -		wptr_off = adev->wb.gpu_addr + (adev->irq.ih.wptr_offs *
> 4);
> -	WREG32(mmIH_RB_WPTR_ADDR_LO, lower_32_bits(wptr_off));
> -	WREG32(mmIH_RB_WPTR_ADDR_HI, upper_32_bits(wptr_off) &
> 0xFF);
> +	WREG32(mmIH_RB_WPTR_ADDR_LO, lower_32_bits(ih-
> >wptr_addr));
> +	WREG32(mmIH_RB_WPTR_ADDR_HI, upper_32_bits(ih->wptr_addr)
> & 0xFF);
> 
>  	/* set rptr, wptr to 0 */
>  	WREG32(mmIH_RB_RPTR, 0);
> @@ -198,10 +191,7 @@ static u32 tonga_ih_get_wptr(struct amdgpu_device
> *adev,  {
>  	u32 wptr, tmp;
> 
> -	if (adev->irq.ih.use_bus_addr)
> -		wptr = le32_to_cpu(ih->ring[ih->wptr_offs]);
> -	else
> -		wptr = le32_to_cpu(adev->wb.wb[ih->wptr_offs]);
> +	wptr = le32_to_cpu(*ih->wptr_cpu);
> 
>  	if (REG_GET_FIELD(wptr, IH_RB_WPTR, RB_OVERFLOW)) {
>  		wptr = REG_SET_FIELD(wptr, IH_RB_WPTR, RB_OVERFLOW,
> 0); @@ -290,10 +280,7 @@ static void tonga_ih_set_rptr(struct
> amdgpu_device *adev,  {
>  	if (ih->use_doorbell) {
>  		/* XXX check if swapping is necessary on BE */
> -		if (ih->use_bus_addr)
> -			ih->ring[ih->rptr_offs] = ih->rptr;
> -		else
> -			adev->wb.wb[ih->rptr_offs] = ih->rptr;
> +		*ih->rptr_cpu = ih->rptr;
>  		WDOORBELL32(ih->doorbell_index, ih->rptr);
>  	} else {
>  		WREG32(mmIH_RB_RPTR, ih->rptr);
> diff --git a/drivers/gpu/drm/amd/amdgpu/vega10_ih.c
> b/drivers/gpu/drm/amd/amdgpu/vega10_ih.c
> index 12d4e3ec851e..b4330eccee04 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vega10_ih.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vega10_ih.c
> @@ -86,11 +86,11 @@ static void vega10_ih_disable_interrupts(struct
> amdgpu_device *adev)
>   */
>  static int vega10_ih_irq_init(struct amdgpu_device *adev)  {
> +	struct amdgpu_ih_ring *ih = &adev->irq.ih;
>  	int ret = 0;
>  	int rb_bufsz;
>  	u32 ih_rb_cntl, ih_doorbell_rtpr;
>  	u32 tmp;
> -	u64 wptr_off;
> 
>  	/* disable irqs */
>  	vega10_ih_disable_interrupts(adev);
> @@ -99,15 +99,11 @@ static int vega10_ih_irq_init(struct amdgpu_device
> *adev)
> 
>  	ih_rb_cntl = RREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL);
>  	/* Ring Buffer base. [39:8] of 40-bit address of the beginning of the
> ring buffer*/
> -	if (adev->irq.ih.use_bus_addr) {
> -		WREG32_SOC15(OSSSYS, 0, mmIH_RB_BASE, adev-
> >irq.ih.rb_dma_addr >> 8);
> -		WREG32_SOC15(OSSSYS, 0, mmIH_RB_BASE_HI, ((u64)adev-
> >irq.ih.rb_dma_addr >> 40) & 0xff);
> -		ih_rb_cntl = REG_SET_FIELD(ih_rb_cntl, IH_RB_CNTL,
> MC_SPACE, 1);
> -	} else {
> -		WREG32_SOC15(OSSSYS, 0, mmIH_RB_BASE, adev-
> >irq.ih.gpu_addr >> 8);
> -		WREG32_SOC15(OSSSYS, 0, mmIH_RB_BASE_HI, (adev-
> >irq.ih.gpu_addr >> 40) & 0xff);
> -		ih_rb_cntl = REG_SET_FIELD(ih_rb_cntl, IH_RB_CNTL,
> MC_SPACE, 4);
> -	}
> +	WREG32_SOC15(OSSSYS, 0, mmIH_RB_BASE, adev-
> >irq.ih.gpu_addr >> 8);
> +	WREG32_SOC15(OSSSYS, 0, mmIH_RB_BASE_HI,
> +		     (adev->irq.ih.gpu_addr >> 40) & 0xff);
> +	ih_rb_cntl = REG_SET_FIELD(ih_rb_cntl, IH_RB_CNTL, MC_SPACE,
> +				   ih->use_bus_addr ? 1 : 4);
>  	rb_bufsz = order_base_2(adev->irq.ih.ring_size / 4);
>  	ih_rb_cntl = REG_SET_FIELD(ih_rb_cntl, IH_RB_CNTL,
> WPTR_OVERFLOW_CLEAR, 1);
>  	ih_rb_cntl = REG_SET_FIELD(ih_rb_cntl, IH_RB_CNTL,
> WPTR_OVERFLOW_ENABLE, 1); @@ -124,12 +120,10 @@ static int
> vega10_ih_irq_init(struct amdgpu_device *adev)
>  	WREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL, ih_rb_cntl);
> 
>  	/* set the writeback address whether it's enabled or not */
> -	if (adev->irq.ih.use_bus_addr)
> -		wptr_off = adev->irq.ih.rb_dma_addr + (adev-
> >irq.ih.wptr_offs * 4);
> -	else
> -		wptr_off = adev->wb.gpu_addr + (adev->irq.ih.wptr_offs *
> 4);
> -	WREG32_SOC15(OSSSYS, 0, mmIH_RB_WPTR_ADDR_LO,
> lower_32_bits(wptr_off));
> -	WREG32_SOC15(OSSSYS, 0, mmIH_RB_WPTR_ADDR_HI,
> upper_32_bits(wptr_off) & 0xFF);
> +	WREG32_SOC15(OSSSYS, 0, mmIH_RB_WPTR_ADDR_LO,
> +		     lower_32_bits(ih->wptr_addr));
> +	WREG32_SOC15(OSSSYS, 0, mmIH_RB_WPTR_ADDR_HI,
> +		     upper_32_bits(ih->wptr_addr) & 0xFF);
> 
>  	/* set rptr, wptr to 0 */
>  	WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR, 0); @@ -196,10 +190,7
> @@ static u32 vega10_ih_get_wptr(struct amdgpu_device *adev,  {
>  	u32 wptr, tmp;
> 
> -	if (ih->use_bus_addr)
> -		wptr = le32_to_cpu(ih->ring[ih->wptr_offs]);
> -	else
> -		wptr = le32_to_cpu(adev->wb.wb[ih->wptr_offs]);
> +	wptr = le32_to_cpu(*ih->wptr_cpu);
> 
>  	if (REG_GET_FIELD(wptr, IH_RB_WPTR, RB_OVERFLOW)) {
>  		wptr = REG_SET_FIELD(wptr, IH_RB_WPTR, RB_OVERFLOW,
> 0); @@ -359,10 +350,7 @@ static void vega10_ih_set_rptr(struct
> amdgpu_device *adev,  {
>  	if (ih->use_doorbell) {
>  		/* XXX check if swapping is necessary on BE */
> -		if (ih->use_bus_addr)
> -			ih->ring[ih->rptr_offs] = ih->rptr;
> -		else
> -			adev->wb.wb[ih->rptr_offs] = ih->rptr;
> +		*ih->rptr_cpu = ih->rptr;
>  		WDOORBELL32(ih->doorbell_index, ih->rptr);
>  	} else {
>  		WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR, ih->rptr);
> --
> 2.14.1
> 
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx


More information about the amd-gfx mailing list