[RFC,1/4] mmc: bcm2835_sdhci: use phys2bus macro when dma address is accessed

Message ID 20200120102029.14264-2-jh80.chung@samsung.com
State New
Headers show
Series
  • Support SDMA mode on RPI4 target - 32bit
Related show

Commit Message

Jaehoon Chung Jan. 20, 2020, 10:20 a.m.
Use phys2bus macro when dma address is accessed.
After applied it, SDMA mode can be used.

When thor download is used,
- Before : 1.8MB/s
- After : 7.23MB/s

Signed-off-by: Jaehoon Chung <jh80.chung at samsung.com>
---
 drivers/mmc/bcm2835_sdhci.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

Comments

Marek Szyprowski Jan. 20, 2020, 10:37 a.m. | #1
Hi Jaehoon,

On 20.01.2020 11:20, Jaehoon Chung wrote:
> Use phys2bus macro when dma address is accessed.
> After applied it, SDMA mode can be used.
>
> When thor download is used,
> - Before : 1.8MB/s
> - After : 7.23MB/s
>
> Signed-off-by: Jaehoon Chung <jh80.chung at samsung.com>
> ---
>   drivers/mmc/bcm2835_sdhci.c | 7 ++++++-
>   1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/mmc/bcm2835_sdhci.c b/drivers/mmc/bcm2835_sdhci.c
> index 39c93db275..222ba22d66 100644
> --- a/drivers/mmc/bcm2835_sdhci.c
> +++ b/drivers/mmc/bcm2835_sdhci.c
> @@ -46,6 +46,7 @@
>   #include <asm/arch/mbox.h>
>   #include <mach/sdhci.h>
>   #include <mach/timer.h>
> +#include <phys2bus.h>
>   
>   /* 400KHz is max freq for card ID etc. Use that as min */
>   #define MIN_FREQ 400000
> @@ -86,7 +87,11 @@ static inline void bcm2835_sdhci_raw_writel(struct sdhci_host *host, u32 val,
>   			;
>   	}
>   
> -	writel(val, host->ioaddr + reg);
> +	if (reg == SDHCI_DMA_ADDRESS)
> +		writel(phys_to_bus((unsigned long)val), host->ioaddr + reg);
> +	else
> +		writel(val, host->ioaddr + reg);
> +
>   	bcm_host->last_write = timer_get_us();
>   }

It would be better to fix this directly in the place where writel with 
SDHCI_DMA_ADDRESS is called:

simply change sdhci_writel(host, host->start_addr, SDHCI_DMA_ADDRESS) to 
sdhci_writel(host, phys_to_bus(host->start_addr), SDHCI_DMA_ADDRESS);

In such case no if statement is the needed and phys_to_bus() is safe for 
non-rpi users (it is identity in such case).

# git grep SDHCI_DMA_ADDRESS

shows 2 places where writel to SDHCI_DMA_ADDRESS is being done.

Best regards
Jaehoon Chung Jan. 20, 2020, 12:24 p.m. | #2
Hi Marek,

On 1/20/20 7:37 PM, Marek Szyprowski wrote:
> Hi Jaehoon,
> 
> On 20.01.2020 11:20, Jaehoon Chung wrote:
>> Use phys2bus macro when dma address is accessed.
>> After applied it, SDMA mode can be used.
>>
>> When thor download is used,
>> - Before : 1.8MB/s
>> - After : 7.23MB/s
>>
>> Signed-off-by: Jaehoon Chung <jh80.chung at samsung.com>
>> ---
>>   drivers/mmc/bcm2835_sdhci.c | 7 ++++++-
>>   1 file changed, 6 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/mmc/bcm2835_sdhci.c b/drivers/mmc/bcm2835_sdhci.c
>> index 39c93db275..222ba22d66 100644
>> --- a/drivers/mmc/bcm2835_sdhci.c
>> +++ b/drivers/mmc/bcm2835_sdhci.c
>> @@ -46,6 +46,7 @@
>>   #include <asm/arch/mbox.h>
>>   #include <mach/sdhci.h>
>>   #include <mach/timer.h>
>> +#include <phys2bus.h>
>>   
>>   /* 400KHz is max freq for card ID etc. Use that as min */
>>   #define MIN_FREQ 400000
>> @@ -86,7 +87,11 @@ static inline void bcm2835_sdhci_raw_writel(struct sdhci_host *host, u32 val,
>>   			;
>>   	}
>>   
>> -	writel(val, host->ioaddr + reg);
>> +	if (reg == SDHCI_DMA_ADDRESS)
>> +		writel(phys_to_bus((unsigned long)val), host->ioaddr + reg);
>> +	else
>> +		writel(val, host->ioaddr + reg);
>> +
>>   	bcm_host->last_write = timer_get_us();
>>   }
> 
> It would be better to fix this directly in the place where writel with 
> SDHCI_DMA_ADDRESS is called:
> 
> simply change sdhci_writel(host, host->start_addr, SDHCI_DMA_ADDRESS) to 
> sdhci_writel(host, phys_to_bus(host->start_addr), SDHCI_DMA_ADDRESS);
> 
> In such case no if statement is the needed and phys_to_bus() is safe for 
> non-rpi users (it is identity in such case).
> 
> # git grep SDHCI_DMA_ADDRESS
> 
> shows 2 places where writel to SDHCI_DMA_ADDRESS is being done.

It's more reasonable than my patch. I will update it. Thanks.

Best Regards,
Jaehoon Chung

> 
> Best regards
>

Patch

diff --git a/drivers/mmc/bcm2835_sdhci.c b/drivers/mmc/bcm2835_sdhci.c
index 39c93db275..222ba22d66 100644
--- a/drivers/mmc/bcm2835_sdhci.c
+++ b/drivers/mmc/bcm2835_sdhci.c
@@ -46,6 +46,7 @@ 
 #include <asm/arch/mbox.h>
 #include <mach/sdhci.h>
 #include <mach/timer.h>
+#include <phys2bus.h>
 
 /* 400KHz is max freq for card ID etc. Use that as min */
 #define MIN_FREQ 400000
@@ -86,7 +87,11 @@  static inline void bcm2835_sdhci_raw_writel(struct sdhci_host *host, u32 val,
 			;
 	}
 
-	writel(val, host->ioaddr + reg);
+	if (reg == SDHCI_DMA_ADDRESS)
+		writel(phys_to_bus((unsigned long)val), host->ioaddr + reg);
+	else
+		writel(val, host->ioaddr + reg);
+
 	bcm_host->last_write = timer_get_us();
 }