[v2,2/2] dmaengine: JZ4780: Add support for the JZ4755.

Message ID 20221016151256.3021729-3-lis8215@gmail.com
State New
Headers
Series Add Ingenic JZ4755 DMA support |

Commit Message

Siarhei Volkau Oct. 16, 2022, 3:12 p.m. UTC
  The JZ4755 has 4 DMA channels per DMA unit, two idential DMA units.

The JZ4755 has the similar DMA engine to JZ4725b, so I assume it has the
same bug as JZ4725b, see commit a40c94be2336.

Signed-off-by: Siarhei Volkau <lis8215@gmail.com>
---
 drivers/dma/dma-jz4780.c | 8 ++++++++
 1 file changed, 8 insertions(+)
  

Comments

Paul Cercueil Oct. 17, 2022, 9:34 a.m. UTC | #1
Hi Siarhei,

Le dim., oct. 16 2022 at 18:12:56 +0300, Siarhei Volkau 
<lis8215@gmail.com> a écrit :
> The JZ4755 has 4 DMA channels per DMA unit, two idential DMA units.
> 
> The JZ4755 has the similar DMA engine to JZ4725b, so I assume it has 
> the
> same bug as JZ4725b, see commit a40c94be2336.

Can you verify that?

It should be pretty simple, if it has the bug you'll see I/O errors on 
the SD card.

Cheers,
-Paul

> Signed-off-by: Siarhei Volkau <lis8215@gmail.com>
> ---
>  drivers/dma/dma-jz4780.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/drivers/dma/dma-jz4780.c b/drivers/dma/dma-jz4780.c
> index 2a483802d..9c1a6e9a9 100644
> --- a/drivers/dma/dma-jz4780.c
> +++ b/drivers/dma/dma-jz4780.c
> @@ -1038,6 +1038,13 @@ static const struct jz4780_dma_soc_data 
> jz4725b_dma_soc_data = {
>  		 JZ_SOC_DATA_BREAK_LINKS,
>  };
> 
> +static const struct jz4780_dma_soc_data jz4755_dma_soc_data = {
> +	.nb_channels = 4,
> +	.transfer_ord_max = 5,
> +	.flags = JZ_SOC_DATA_PER_CHAN_PM | JZ_SOC_DATA_NO_DCKES_DCKEC |
> +		 JZ_SOC_DATA_BREAK_LINKS,
> +};
> +
>  static const struct jz4780_dma_soc_data jz4760_dma_soc_data = {
>  	.nb_channels = 5,
>  	.transfer_ord_max = 6,
> @@ -1101,6 +1108,7 @@ static const struct jz4780_dma_soc_data 
> x1830_dma_soc_data = {
>  static const struct of_device_id jz4780_dma_dt_match[] = {
>  	{ .compatible = "ingenic,jz4740-dma", .data = &jz4740_dma_soc_data 
> },
>  	{ .compatible = "ingenic,jz4725b-dma", .data = 
> &jz4725b_dma_soc_data },
> +	{ .compatible = "ingenic,jz4755-dma", .data = &jz4755_dma_soc_data 
> },
>  	{ .compatible = "ingenic,jz4760-dma", .data = &jz4760_dma_soc_data 
> },
>  	{ .compatible = "ingenic,jz4760-mdma", .data = 
> &jz4760_mdma_soc_data },
>  	{ .compatible = "ingenic,jz4760-bdma", .data = 
> &jz4760_bdma_soc_data },
> --
> 2.36.1
>
  
Siarhei Volkau Oct. 17, 2022, 5:29 p.m. UTC | #2
пн, 17 окт. 2022 г. в 12:34, Paul Cercueil <paul@crapouillou.net>:
> Can you verify that?
>
> It should be pretty simple, if it has the bug you'll see I/O errors on
> the SD card.

Well, the result is ambiguous:

Without that 'broken' flag: mmc works poorly, but becomes more or less
stable when MMC clock downs to 6MHz (90% boots without errors).
On the 12MHz MMC clock the issue doesn't appear in 50-70% cases.
On the 24MHz MMC clock the device never boots up.

However with the flag: MMC works stable on 24MHz MMC clock
(boot issue observed only once), but if I increase MMC clock speed even
a bit the problem appears oftenly ( >70% of cases).

So, that flag definitely helps a lot, but the nature of the problem might be
different.

BR,
Siarhei
  
Paul Cercueil Oct. 18, 2022, 1:16 p.m. UTC | #3
Hi,

Le lun., oct. 17 2022 at 20:29:27 +0300, Siarhei Volkau 
<lis8215@gmail.com> a écrit :
> пн, 17 окт. 2022 г. в 12:34, Paul Cercueil 
> <paul@crapouillou.net>:
>>  Can you verify that?
>> 
>>  It should be pretty simple, if it has the bug you'll see I/O errors 
>> on
>>  the SD card.
> 
> Well, the result is ambiguous:
> 
> Without that 'broken' flag: mmc works poorly, but becomes more or less
> stable when MMC clock downs to 6MHz (90% boots without errors).
> On the 12MHz MMC clock the issue doesn't appear in 50-70% cases.
> On the 24MHz MMC clock the device never boots up.
> 
> However with the flag: MMC works stable on 24MHz MMC clock
> (boot issue observed only once), but if I increase MMC clock speed 
> even
> a bit the problem appears oftenly ( >70% of cases).
> 
> So, that flag definitely helps a lot, but the nature of the problem 
> might be
> different.

If the flag makes any difference then it's needed.

The controller should support up to 50 MHz, make sure that your "mmc" 
clock is at 50 MHz otherwise changing the max-frequency DT property 
won't do much.

Cheers,
-Paul
  
Paul Cercueil Oct. 18, 2022, 1:19 p.m. UTC | #4
Hi Siarhei,

Le dim., oct. 16 2022 at 18:12:56 +0300, Siarhei Volkau 
<lis8215@gmail.com> a écrit :
> The JZ4755 has 4 DMA channels per DMA unit, two idential DMA units.
> 
> The JZ4755 has the similar DMA engine to JZ4725b, so I assume it has 
> the
> same bug as JZ4725b, see commit a40c94be2336.
> 
> Signed-off-by: Siarhei Volkau <lis8215@gmail.com>

Reviewed-by: Paul Cercueil <paul@crapouillou.net>

Cheers,
-Paul

> ---
>  drivers/dma/dma-jz4780.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/drivers/dma/dma-jz4780.c b/drivers/dma/dma-jz4780.c
> index 2a483802d..9c1a6e9a9 100644
> --- a/drivers/dma/dma-jz4780.c
> +++ b/drivers/dma/dma-jz4780.c
> @@ -1038,6 +1038,13 @@ static const struct jz4780_dma_soc_data 
> jz4725b_dma_soc_data = {
>  		 JZ_SOC_DATA_BREAK_LINKS,
>  };
> 
> +static const struct jz4780_dma_soc_data jz4755_dma_soc_data = {
> +	.nb_channels = 4,
> +	.transfer_ord_max = 5,
> +	.flags = JZ_SOC_DATA_PER_CHAN_PM | JZ_SOC_DATA_NO_DCKES_DCKEC |
> +		 JZ_SOC_DATA_BREAK_LINKS,
> +};
> +
>  static const struct jz4780_dma_soc_data jz4760_dma_soc_data = {
>  	.nb_channels = 5,
>  	.transfer_ord_max = 6,
> @@ -1101,6 +1108,7 @@ static const struct jz4780_dma_soc_data 
> x1830_dma_soc_data = {
>  static const struct of_device_id jz4780_dma_dt_match[] = {
>  	{ .compatible = "ingenic,jz4740-dma", .data = &jz4740_dma_soc_data 
> },
>  	{ .compatible = "ingenic,jz4725b-dma", .data = 
> &jz4725b_dma_soc_data },
> +	{ .compatible = "ingenic,jz4755-dma", .data = &jz4755_dma_soc_data 
> },
>  	{ .compatible = "ingenic,jz4760-dma", .data = &jz4760_dma_soc_data 
> },
>  	{ .compatible = "ingenic,jz4760-mdma", .data = 
> &jz4760_mdma_soc_data },
>  	{ .compatible = "ingenic,jz4760-bdma", .data = 
> &jz4760_bdma_soc_data },
> --
> 2.36.1
>
  

Patch

diff --git a/drivers/dma/dma-jz4780.c b/drivers/dma/dma-jz4780.c
index 2a483802d..9c1a6e9a9 100644
--- a/drivers/dma/dma-jz4780.c
+++ b/drivers/dma/dma-jz4780.c
@@ -1038,6 +1038,13 @@  static const struct jz4780_dma_soc_data jz4725b_dma_soc_data = {
 		 JZ_SOC_DATA_BREAK_LINKS,
 };
 
+static const struct jz4780_dma_soc_data jz4755_dma_soc_data = {
+	.nb_channels = 4,
+	.transfer_ord_max = 5,
+	.flags = JZ_SOC_DATA_PER_CHAN_PM | JZ_SOC_DATA_NO_DCKES_DCKEC |
+		 JZ_SOC_DATA_BREAK_LINKS,
+};
+
 static const struct jz4780_dma_soc_data jz4760_dma_soc_data = {
 	.nb_channels = 5,
 	.transfer_ord_max = 6,
@@ -1101,6 +1108,7 @@  static const struct jz4780_dma_soc_data x1830_dma_soc_data = {
 static const struct of_device_id jz4780_dma_dt_match[] = {
 	{ .compatible = "ingenic,jz4740-dma", .data = &jz4740_dma_soc_data },
 	{ .compatible = "ingenic,jz4725b-dma", .data = &jz4725b_dma_soc_data },
+	{ .compatible = "ingenic,jz4755-dma", .data = &jz4755_dma_soc_data },
 	{ .compatible = "ingenic,jz4760-dma", .data = &jz4760_dma_soc_data },
 	{ .compatible = "ingenic,jz4760-mdma", .data = &jz4760_mdma_soc_data },
 	{ .compatible = "ingenic,jz4760-bdma", .data = &jz4760_bdma_soc_data },