diff options
Diffstat (limited to 'drivers/gpu/host1x/hw/cdma_hw.c')
| -rw-r--r-- | drivers/gpu/host1x/hw/cdma_hw.c | 46 | 
1 files changed, 26 insertions, 20 deletions
| diff --git a/drivers/gpu/host1x/hw/cdma_hw.c b/drivers/gpu/host1x/hw/cdma_hw.c index ce320534cbed..5d61088db2bb 100644 --- a/drivers/gpu/host1x/hw/cdma_hw.c +++ b/drivers/gpu/host1x/hw/cdma_hw.c @@ -39,8 +39,6 @@ static void push_buffer_init(struct push_buffer *pb)  static void cdma_timeout_cpu_incr(struct host1x_cdma *cdma, u32 getptr,  				u32 syncpt_incrs, u32 syncval, u32 nr_slots)  { -	struct host1x *host1x = cdma_to_host1x(cdma); -	struct push_buffer *pb = &cdma->push_buffer;  	unsigned int i;  	for (i = 0; i < syncpt_incrs; i++) @@ -48,18 +46,6 @@ static void cdma_timeout_cpu_incr(struct host1x_cdma *cdma, u32 getptr,  	/* after CPU incr, ensure shadow is up to date */  	host1x_syncpt_load(cdma->timeout.syncpt); - -	/* NOP all the PB slots */ -	while (nr_slots--) { -		u32 *p = (u32 *)(pb->mapped + getptr); -		*(p++) = HOST1X_OPCODE_NOP; -		*(p++) = HOST1X_OPCODE_NOP; -		dev_dbg(host1x->dev, "%s: NOP at %pad+%#x\n", __func__, -			&pb->dma, getptr); -		getptr = (getptr + 8) & (pb->size - 1); -	} - -	wmb();  }  /* @@ -68,20 +54,31 @@ static void cdma_timeout_cpu_incr(struct host1x_cdma *cdma, u32 getptr,  static void cdma_start(struct host1x_cdma *cdma)  {  	struct host1x_channel *ch = cdma_to_channel(cdma); +	u64 start, end;  	if (cdma->running)  		return;  	cdma->last_pos = cdma->push_buffer.pos; +	start = cdma->push_buffer.dma; +	end = cdma->push_buffer.size + 4;  	host1x_ch_writel(ch, HOST1X_CHANNEL_DMACTRL_DMASTOP,  			 HOST1X_CHANNEL_DMACTRL);  	/* set base, put and end pointer */ -	host1x_ch_writel(ch, cdma->push_buffer.dma, HOST1X_CHANNEL_DMASTART); +	host1x_ch_writel(ch, lower_32_bits(start), HOST1X_CHANNEL_DMASTART); +#if HOST1X_HW >= 6 +	host1x_ch_writel(ch, upper_32_bits(start), HOST1X_CHANNEL_DMASTART_HI); +#endif  	host1x_ch_writel(ch, cdma->push_buffer.pos, HOST1X_CHANNEL_DMAPUT); -	host1x_ch_writel(ch, cdma->push_buffer.dma + cdma->push_buffer.size + 4, -			 HOST1X_CHANNEL_DMAEND); +#if HOST1X_HW >= 6 +	host1x_ch_writel(ch, 0, HOST1X_CHANNEL_DMAPUT_HI); +#endif +	host1x_ch_writel(ch, lower_32_bits(end), HOST1X_CHANNEL_DMAEND); +#if HOST1X_HW >= 6 +	host1x_ch_writel(ch, upper_32_bits(end), HOST1X_CHANNEL_DMAEND_HI); +#endif  	/* reset GET */  	host1x_ch_writel(ch, HOST1X_CHANNEL_DMACTRL_DMASTOP | @@ -104,6 +101,7 @@ static void cdma_timeout_restart(struct host1x_cdma *cdma, u32 getptr)  {  	struct host1x *host1x = cdma_to_host1x(cdma);  	struct host1x_channel *ch = cdma_to_channel(cdma); +	u64 start, end;  	if (cdma->running)  		return; @@ -113,10 +111,18 @@ static void cdma_timeout_restart(struct host1x_cdma *cdma, u32 getptr)  	host1x_ch_writel(ch, HOST1X_CHANNEL_DMACTRL_DMASTOP,  			 HOST1X_CHANNEL_DMACTRL); +	start = cdma->push_buffer.dma; +	end = cdma->push_buffer.size + 4; +  	/* set base, end pointer (all of memory) */ -	host1x_ch_writel(ch, cdma->push_buffer.dma, HOST1X_CHANNEL_DMASTART); -	host1x_ch_writel(ch, cdma->push_buffer.dma + cdma->push_buffer.size, -			 HOST1X_CHANNEL_DMAEND); +	host1x_ch_writel(ch, lower_32_bits(start), HOST1X_CHANNEL_DMASTART); +#if HOST1X_HW >= 6 +	host1x_ch_writel(ch, upper_32_bits(start), HOST1X_CHANNEL_DMASTART_HI); +#endif +	host1x_ch_writel(ch, lower_32_bits(end), HOST1X_CHANNEL_DMAEND); +#if HOST1X_HW >= 6 +	host1x_ch_writel(ch, upper_32_bits(end), HOST1X_CHANNEL_DMAEND_HI); +#endif  	/* set GET, by loading the value in PUT (then reset GET) */  	host1x_ch_writel(ch, getptr, HOST1X_CHANNEL_DMAPUT); | 
