linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] dmaengine: ti: k3-udma-glue: fix channel enable functions
@ 2020-09-15 16:41 Grygorii Strashko
  2020-09-16  8:35 ` Peter Ujfalusi
  0 siblings, 1 reply; 3+ messages in thread
From: Grygorii Strashko @ 2020-09-15 16:41 UTC (permalink / raw)
  To: Vinod Koul, Peter Ujfalusi, dmaengine
  Cc: Sekhar Nori, linux-kernel, Vignesh Raghavendra, Grygorii Strashko

Now the K3 UDMA glue layer enable functions perform RMW operation on UDMA
RX/TX RT_CTL registers to set EN bit and enable channel, which is
incorrect, because only EN bit has to be set in those registers to enable
channel (all other bits should be cleared 0).
More over, this causes issues when bootloader leaves UDMA channel RX/TX
RT_CTL registers in incorrect state - TDOWN bit set, for example. As
result, UDMA channel will just perform teardown right after it's enabled.

Hence, fix it by writing correct values (EN=1) directly in UDMA channel
RX/TX RT_CTL registers in k3_udma_glue_enable_tx/rx_chn() functions.

Fixes: d70241913413 ("dmaengine: ti: k3-udma: Add glue layer for non DMAengine users")
Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
---
 drivers/dma/ti/k3-udma-glue.c | 15 +++------------
 1 file changed, 3 insertions(+), 12 deletions(-)

diff --git a/drivers/dma/ti/k3-udma-glue.c b/drivers/dma/ti/k3-udma-glue.c
index dc03880f021a..37d706cf3ba9 100644
--- a/drivers/dma/ti/k3-udma-glue.c
+++ b/drivers/dma/ti/k3-udma-glue.c
@@ -370,7 +370,6 @@ EXPORT_SYMBOL_GPL(k3_udma_glue_pop_tx_chn);
 
 int k3_udma_glue_enable_tx_chn(struct k3_udma_glue_tx_channel *tx_chn)
 {
-	u32 txrt_ctl;
 	int ret;
 
 	ret = xudma_navss_psil_pair(tx_chn->common.udmax,
@@ -383,15 +382,11 @@ int k3_udma_glue_enable_tx_chn(struct k3_udma_glue_tx_channel *tx_chn)
 
 	tx_chn->psil_paired = true;
 
-	txrt_ctl = UDMA_PEER_RT_EN_ENABLE;
 	xudma_tchanrt_write(tx_chn->udma_tchanx, UDMA_CHAN_RT_PEER_RT_EN_REG,
-			    txrt_ctl);
+			    UDMA_PEER_RT_EN_ENABLE);
 
-	txrt_ctl = xudma_tchanrt_read(tx_chn->udma_tchanx,
-				      UDMA_CHAN_RT_CTL_REG);
-	txrt_ctl |= UDMA_CHAN_RT_CTL_EN;
 	xudma_tchanrt_write(tx_chn->udma_tchanx, UDMA_CHAN_RT_CTL_REG,
-			    txrt_ctl);
+			    UDMA_CHAN_RT_CTL_EN);
 
 	k3_udma_glue_dump_tx_rt_chn(tx_chn, "txchn en");
 	return 0;
@@ -1059,7 +1054,6 @@ EXPORT_SYMBOL_GPL(k3_udma_glue_rx_flow_disable);
 
 int k3_udma_glue_enable_rx_chn(struct k3_udma_glue_rx_channel *rx_chn)
 {
-	u32 rxrt_ctl;
 	int ret;
 
 	if (rx_chn->remote)
@@ -1078,11 +1072,8 @@ int k3_udma_glue_enable_rx_chn(struct k3_udma_glue_rx_channel *rx_chn)
 
 	rx_chn->psil_paired = true;
 
-	rxrt_ctl = xudma_rchanrt_read(rx_chn->udma_rchanx,
-				      UDMA_CHAN_RT_CTL_REG);
-	rxrt_ctl |= UDMA_CHAN_RT_CTL_EN;
 	xudma_rchanrt_write(rx_chn->udma_rchanx, UDMA_CHAN_RT_CTL_REG,
-			    rxrt_ctl);
+			    UDMA_CHAN_RT_CTL_EN);
 
 	xudma_rchanrt_write(rx_chn->udma_rchanx, UDMA_CHAN_RT_PEER_RT_EN_REG,
 			    UDMA_PEER_RT_EN_ENABLE);
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] dmaengine: ti: k3-udma-glue: fix channel enable functions
  2020-09-15 16:41 [PATCH] dmaengine: ti: k3-udma-glue: fix channel enable functions Grygorii Strashko
@ 2020-09-16  8:35 ` Peter Ujfalusi
  2020-09-16  8:37   ` Grygorii Strashko
  0 siblings, 1 reply; 3+ messages in thread
From: Peter Ujfalusi @ 2020-09-16  8:35 UTC (permalink / raw)
  To: Grygorii Strashko, Vinod Koul, dmaengine
  Cc: Sekhar Nori, linux-kernel, Vignesh Raghavendra



On 15/09/2020 19.41, Grygorii Strashko wrote:
> Now the K3 UDMA glue layer enable functions perform RMW operation on UDMA
> RX/TX RT_CTL registers to set EN bit and enable channel, which is
> incorrect, because only EN bit has to be set in those registers to enable
> channel (all other bits should be cleared 0).
> More over, this causes issues when bootloader leaves UDMA channel RX/TX
> RT_CTL registers in incorrect state - TDOWN bit set, for example. As
> result, UDMA channel will just perform teardown right after it's enabled.
> 
> Hence, fix it by writing correct values (EN=1) directly in UDMA channel
> RX/TX RT_CTL registers in k3_udma_glue_enable_tx/rx_chn() functions.

This is how the DMAengine driver deals with the enable.

Acked-by: Peter Ujfalusi <peter.ujfalusi@ti.com>

> Fixes: d70241913413 ("dmaengine: ti: k3-udma: Add glue layer for non DMAengine users")
> Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
> ---
>  drivers/dma/ti/k3-udma-glue.c | 15 +++------------
>  1 file changed, 3 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/dma/ti/k3-udma-glue.c b/drivers/dma/ti/k3-udma-glue.c
> index dc03880f021a..37d706cf3ba9 100644
> --- a/drivers/dma/ti/k3-udma-glue.c
> +++ b/drivers/dma/ti/k3-udma-glue.c
> @@ -370,7 +370,6 @@ EXPORT_SYMBOL_GPL(k3_udma_glue_pop_tx_chn);
>  
>  int k3_udma_glue_enable_tx_chn(struct k3_udma_glue_tx_channel *tx_chn)
>  {
> -	u32 txrt_ctl;
>  	int ret;
>  
>  	ret = xudma_navss_psil_pair(tx_chn->common.udmax,
> @@ -383,15 +382,11 @@ int k3_udma_glue_enable_tx_chn(struct k3_udma_glue_tx_channel *tx_chn)
>  
>  	tx_chn->psil_paired = true;
>  
> -	txrt_ctl = UDMA_PEER_RT_EN_ENABLE;
>  	xudma_tchanrt_write(tx_chn->udma_tchanx, UDMA_CHAN_RT_PEER_RT_EN_REG,
> -			    txrt_ctl);
> +			    UDMA_PEER_RT_EN_ENABLE);
>  
> -	txrt_ctl = xudma_tchanrt_read(tx_chn->udma_tchanx,
> -				      UDMA_CHAN_RT_CTL_REG);
> -	txrt_ctl |= UDMA_CHAN_RT_CTL_EN;
>  	xudma_tchanrt_write(tx_chn->udma_tchanx, UDMA_CHAN_RT_CTL_REG,
> -			    txrt_ctl);
> +			    UDMA_CHAN_RT_CTL_EN);
>  
>  	k3_udma_glue_dump_tx_rt_chn(tx_chn, "txchn en");
>  	return 0;
> @@ -1059,7 +1054,6 @@ EXPORT_SYMBOL_GPL(k3_udma_glue_rx_flow_disable);
>  
>  int k3_udma_glue_enable_rx_chn(struct k3_udma_glue_rx_channel *rx_chn)
>  {
> -	u32 rxrt_ctl;
>  	int ret;
>  
>  	if (rx_chn->remote)
> @@ -1078,11 +1072,8 @@ int k3_udma_glue_enable_rx_chn(struct k3_udma_glue_rx_channel *rx_chn)
>  
>  	rx_chn->psil_paired = true;
>  
> -	rxrt_ctl = xudma_rchanrt_read(rx_chn->udma_rchanx,
> -				      UDMA_CHAN_RT_CTL_REG);
> -	rxrt_ctl |= UDMA_CHAN_RT_CTL_EN;
>  	xudma_rchanrt_write(rx_chn->udma_rchanx, UDMA_CHAN_RT_CTL_REG,
> -			    rxrt_ctl);
> +			    UDMA_CHAN_RT_CTL_EN);
>  
>  	xudma_rchanrt_write(rx_chn->udma_rchanx, UDMA_CHAN_RT_PEER_RT_EN_REG,
>  			    UDMA_PEER_RT_EN_ENABLE);
> 

- Péter

Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] dmaengine: ti: k3-udma-glue: fix channel enable functions
  2020-09-16  8:35 ` Peter Ujfalusi
@ 2020-09-16  8:37   ` Grygorii Strashko
  0 siblings, 0 replies; 3+ messages in thread
From: Grygorii Strashko @ 2020-09-16  8:37 UTC (permalink / raw)
  To: Peter Ujfalusi, Vinod Koul, dmaengine
  Cc: Sekhar Nori, linux-kernel, Vignesh Raghavendra



On 16/09/2020 11:35, Peter Ujfalusi wrote:
> 
> 
> On 15/09/2020 19.41, Grygorii Strashko wrote:
>> Now the K3 UDMA glue layer enable functions perform RMW operation on UDMA
>> RX/TX RT_CTL registers to set EN bit and enable channel, which is
>> incorrect, because only EN bit has to be set in those registers to enable
>> channel (all other bits should be cleared 0).
>> More over, this causes issues when bootloader leaves UDMA channel RX/TX
>> RT_CTL registers in incorrect state - TDOWN bit set, for example. As
>> result, UDMA channel will just perform teardown right after it's enabled.
>>
>> Hence, fix it by writing correct values (EN=1) directly in UDMA channel
>> RX/TX RT_CTL registers in k3_udma_glue_enable_tx/rx_chn() functions.
> 
> This is how the DMAengine driver deals with the enable.
> 
> Acked-by: Peter Ujfalusi <peter.ujfalusi@ti.com>

Sorry, but I'd need to resend v2 - based on wrong tree.
Worked too late yesterday :(

> 
>> Fixes: d70241913413 ("dmaengine: ti: k3-udma: Add glue layer for non DMAengine users")
>> Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
>> ---
>>   drivers/dma/ti/k3-udma-glue.c | 15 +++------------
>>   1 file changed, 3 insertions(+), 12 deletions(-)
>>
>> diff --git a/drivers/dma/ti/k3-udma-glue.c b/drivers/dma/ti/k3-udma-glue.c
>> index dc03880f021a..37d706cf3ba9 100644
>> --- a/drivers/dma/ti/k3-udma-glue.c
>> +++ b/drivers/dma/ti/k3-udma-glue.c
>> @@ -370,7 +370,6 @@ EXPORT_SYMBOL_GPL(k3_udma_glue_pop_tx_chn);
>>   
>>   int k3_udma_glue_enable_tx_chn(struct k3_udma_glue_tx_channel *tx_chn)
>>   {
>> -	u32 txrt_ctl;
>>   	int ret;
>>   
>>   	ret = xudma_navss_psil_pair(tx_chn->common.udmax,
>> @@ -383,15 +382,11 @@ int k3_udma_glue_enable_tx_chn(struct k3_udma_glue_tx_channel *tx_chn)
>>   
>>   	tx_chn->psil_paired = true;
>>   
>> -	txrt_ctl = UDMA_PEER_RT_EN_ENABLE;
>>   	xudma_tchanrt_write(tx_chn->udma_tchanx, UDMA_CHAN_RT_PEER_RT_EN_REG,
>> -			    txrt_ctl);
>> +			    UDMA_PEER_RT_EN_ENABLE);
>>   
>> -	txrt_ctl = xudma_tchanrt_read(tx_chn->udma_tchanx,
>> -				      UDMA_CHAN_RT_CTL_REG);
>> -	txrt_ctl |= UDMA_CHAN_RT_CTL_EN;
>>   	xudma_tchanrt_write(tx_chn->udma_tchanx, UDMA_CHAN_RT_CTL_REG,
>> -			    txrt_ctl);
>> +			    UDMA_CHAN_RT_CTL_EN);
>>   
>>   	k3_udma_glue_dump_tx_rt_chn(tx_chn, "txchn en");
>>   	return 0;
>> @@ -1059,7 +1054,6 @@ EXPORT_SYMBOL_GPL(k3_udma_glue_rx_flow_disable);
>>   
>>   int k3_udma_glue_enable_rx_chn(struct k3_udma_glue_rx_channel *rx_chn)
>>   {
>> -	u32 rxrt_ctl;
>>   	int ret;
>>   
>>   	if (rx_chn->remote)
>> @@ -1078,11 +1072,8 @@ int k3_udma_glue_enable_rx_chn(struct k3_udma_glue_rx_channel *rx_chn)
>>   
>>   	rx_chn->psil_paired = true;
>>   
>> -	rxrt_ctl = xudma_rchanrt_read(rx_chn->udma_rchanx,
>> -				      UDMA_CHAN_RT_CTL_REG);
>> -	rxrt_ctl |= UDMA_CHAN_RT_CTL_EN;
>>   	xudma_rchanrt_write(rx_chn->udma_rchanx, UDMA_CHAN_RT_CTL_REG,
>> -			    rxrt_ctl);
>> +			    UDMA_CHAN_RT_CTL_EN);
>>   
>>   	xudma_rchanrt_write(rx_chn->udma_rchanx, UDMA_CHAN_RT_PEER_RT_EN_REG,
>>   			    UDMA_PEER_RT_EN_ENABLE);
>>
> 
> - Péter
> 
> Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
> Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki
> 

-- 
Best regards,
grygorii

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-09-16  8:37 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-15 16:41 [PATCH] dmaengine: ti: k3-udma-glue: fix channel enable functions Grygorii Strashko
2020-09-16  8:35 ` Peter Ujfalusi
2020-09-16  8:37   ` Grygorii Strashko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).