diff mbox series

[U-Boot] spl: fit: handle mmc read to sram case in rockchip SoCs

Message ID 20190329140910.29503-1-kever.yang@rock-chips.com
State Changes Requested
Delegated to: Philipp Tomsich
Headers show
Series [U-Boot] spl: fit: handle mmc read to sram case in rockchip SoCs | expand

Commit Message

Kever Yang March 29, 2019, 2:09 p.m. UTC
Rockchip fit image with atf may have firmware for sram,
so the fit driver need to read data from mmc to sram,
but Rockchip mmc controller does not support this data
path, we have to read into ddr first and then copy it
to sram.

Signed-off-by: Kever Yang <kever.yang@rock-chips.com>
---

 common/spl/spl_fit.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

Comments

Simon Goldschmidt March 29, 2019, 3:33 p.m. UTC | #1
On 29.03.19 15:09, Kever Yang wrote:
> Rockchip fit image with atf may have firmware for sram,
> so the fit driver need to read data from mmc to sram,
> but Rockchip mmc controller does not support this data
> path, we have to read into ddr first and then copy it
> to sram.
> 
> Signed-off-by: Kever Yang <kever.yang@rock-chips.com>
> ---
> 
>   common/spl/spl_fit.c | 10 ++++++++++
>   1 file changed, 10 insertions(+)
> 
> diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
> index c9bfe0cc8a..5c5b58f69d 100644
> --- a/common/spl/spl_fit.c
> +++ b/common/spl/spl_fit.c
> @@ -9,6 +9,7 @@
>   #include <fpga.h>
>   #include <image.h>
>   #include <linux/libfdt.h>
> +#include <malloc.h>
>   #include <spl.h>
>   
>   #ifndef CONFIG_SYS_BOOTM_LEN
> @@ -215,6 +216,15 @@ static int spl_load_fit_image(struct spl_load_info *info, ulong sector,
>   			return -ENOENT;
>   
>   		load_ptr = (load_addr + align_len) & ~align_len;
> +#if  defined(CONFIG_ROCKCHIP_RK3399) || defined(CONFIG_ROCKCHIP_RK3368)

This looks hacky. I don't think we should clutter platform independent 
code with platform dependent ifdefs. You're totally violating code 
abstraction here.

Regards,
Simon

> +		/*
> +		 * Rockchip SOC's mmc controller does not support read data
> +		 * from mmc to sram, we have to read to sdram first, and then
> +		 * copy to sram.
> +		 */
> +		if ((load_ptr & 0xffff0000) != CONFIG_SYS_SDRAM_BASE)
> +			load_ptr = (ulong)memalign(ARCH_DMA_MINALIGN, len);
> +#endif
>   		length = len;
>   
>   		overhead = get_aligned_image_overhead(info, offset);
>
Kever Yang March 30, 2019, 1:43 a.m. UTC | #2
Hi Simon,


On 03/29/2019 11:33 PM, Simon Goldschmidt wrote:
>
>
> On 29.03.19 15:09, Kever Yang wrote:
>> Rockchip fit image with atf may have firmware for sram,
>> so the fit driver need to read data from mmc to sram,
>> but Rockchip mmc controller does not support this data
>> path, we have to read into ddr first and then copy it
>> to sram.
>>
>> Signed-off-by: Kever Yang <kever.yang@rock-chips.com>
>> ---
>>
>>   common/spl/spl_fit.c | 10 ++++++++++
>>   1 file changed, 10 insertions(+)
>>
>> diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
>> index c9bfe0cc8a..5c5b58f69d 100644
>> --- a/common/spl/spl_fit.c
>> +++ b/common/spl/spl_fit.c
>> @@ -9,6 +9,7 @@
>>   #include <fpga.h>
>>   #include <image.h>
>>   #include <linux/libfdt.h>
>> +#include <malloc.h>
>>   #include <spl.h>
>>     #ifndef CONFIG_SYS_BOOTM_LEN
>> @@ -215,6 +216,15 @@ static int spl_load_fit_image(struct
>> spl_load_info *info, ulong sector,
>>               return -ENOENT;
>>             load_ptr = (load_addr + align_len) & ~align_len;
>> +#if  defined(CONFIG_ROCKCHIP_RK3399) || defined(CONFIG_ROCKCHIP_RK3368)
>
> This looks hacky. I don't think we should clutter platform independent
> code with platform dependent ifdefs. You're totally violating code
> abstraction here.
>

Thanks for your comment, I know this looks hacky, could you share you
idea about how to implement this better?
We do need this to make things work.

Thanks,
- Kever
> Regards,
> Simon
>
>> +        /*
>> +         * Rockchip SOC's mmc controller does not support read data
>> +         * from mmc to sram, we have to read to sdram first, and then
>> +         * copy to sram.
>> +         */
>> +        if ((load_ptr & 0xffff0000) != CONFIG_SYS_SDRAM_BASE)
>> +            load_ptr = (ulong)memalign(ARCH_DMA_MINALIGN, len);
>> +#endif
>>           length = len;
>>             overhead = get_aligned_image_overhead(info, offset);
>>
>
Philipp Tomsich March 30, 2019, 10:16 a.m. UTC | #3
Kever,

> On 30.03.2019, at 02:43, Kever Yang <kever.yang@rock-chips.com> wrote:
> 
> Hi Simon,
> 
> 
> On 03/29/2019 11:33 PM, Simon Goldschmidt wrote:
>> 
>> 
>> On 29.03.19 15:09, Kever Yang wrote:
>>> Rockchip fit image with atf may have firmware for sram,
>>> so the fit driver need to read data from mmc to sram,
>>> but Rockchip mmc controller does not support this data
>>> path, we have to read into ddr first and then copy it
>>> to sram.
>>> 
>>> Signed-off-by: Kever Yang <kever.yang@rock-chips.com>
>>> ---
>>> 
>>>   common/spl/spl_fit.c | 10 ++++++++++
>>>   1 file changed, 10 insertions(+)
>>> 
>>> diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
>>> index c9bfe0cc8a..5c5b58f69d 100644
>>> --- a/common/spl/spl_fit.c
>>> +++ b/common/spl/spl_fit.c
>>> @@ -9,6 +9,7 @@
>>>   #include <fpga.h>
>>>   #include <image.h>
>>>   #include <linux/libfdt.h>
>>> +#include <malloc.h>
>>>   #include <spl.h>
>>>     #ifndef CONFIG_SYS_BOOTM_LEN
>>> @@ -215,6 +216,15 @@ static int spl_load_fit_image(struct
>>> spl_load_info *info, ulong sector,
>>>               return -ENOENT;
>>>             load_ptr = (load_addr + align_len) & ~align_len;
>>> +#if  defined(CONFIG_ROCKCHIP_RK3399) || defined(CONFIG_ROCKCHIP_RK3368)
>> 
>> This looks hacky. I don't think we should clutter platform independent
>> code with platform dependent ifdefs. You're totally violating code
>> abstraction here.
>> 
> 
> Thanks for your comment, I know this looks hacky, could you share you
> idea about how to implement this better?
> We do need this to make things work.

A more appropriate way would be to leverage the bounce buffers in the SD/MMC
drivers and to make sure that the 0xffff0000 memory region is not allocated as a
DMA-able target address via bounce buffers.

Note that this is the same issue that I had highlighted about a year and a half ago
and that we ended up working around by loading the PMU firmware into DRAM,
pass the info about the loadables to ATF as part of the FDT, and finally have ATF
relocate the loadables to INTMEM.

> Thanks,
> - Kever
>> Regards,
>> Simon
>> 
>>> +        /*
>>> +         * Rockchip SOC's mmc controller does not support read data
>>> +         * from mmc to sram, we have to read to sdram first, and then
>>> +         * copy to sram.
>>> +         */
>>> +        if ((load_ptr & 0xffff0000) != CONFIG_SYS_SDRAM_BASE)
>>> +            load_ptr = (ulong)memalign(ARCH_DMA_MINALIGN, len);
>>> +#endif
>>>           length = len;
>>>             overhead = get_aligned_image_overhead(info, offset);
>>> 
>> 
> 
> 
> 
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> https://lists.denx.de/listinfo/u-boot
Kever Yang April 2, 2019, 8:51 a.m. UTC | #4
Hi Philipp,


On 03/30/2019 06:16 PM, Philipp Tomsich wrote:
> Kever,
>
>> On 30.03.2019, at 02:43, Kever Yang <kever.yang@rock-chips.com
>> <mailto:kever.yang@rock-chips.com>> wrote:
>>
>> Hi Simon,
>>
>>
>> On 03/29/2019 11:33 PM, Simon Goldschmidt wrote:
>>>
>>>
>>> On 29.03.19 15:09, Kever Yang wrote:
>>>> Rockchip fit image with atf may have firmware for sram,
>>>> so the fit driver need to read data from mmc to sram,
>>>> but Rockchip mmc controller does not support this data
>>>> path, we have to read into ddr first and then copy it
>>>> to sram.
>>>>
>>>> Signed-off-by: Kever Yang <kever.yang@rock-chips.com
>>>> <mailto:kever.yang@rock-chips.com>>
>>>> ---
>>>>
>>>>   common/spl/spl_fit.c | 10 ++++++++++
>>>>   1 file changed, 10 insertions(+)
>>>>
>>>> diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
>>>> index c9bfe0cc8a..5c5b58f69d 100644
>>>> --- a/common/spl/spl_fit.c
>>>> +++ b/common/spl/spl_fit.c
>>>> @@ -9,6 +9,7 @@
>>>>   #include <fpga.h>
>>>>   #include <image.h>
>>>>   #include <linux/libfdt.h>
>>>> +#include <malloc.h>
>>>>   #include <spl.h>
>>>>     #ifndef CONFIG_SYS_BOOTM_LEN
>>>> @@ -215,6 +216,15 @@ static int spl_load_fit_image(struct
>>>> spl_load_info *info, ulong sector,
>>>>               return -ENOENT;
>>>>             load_ptr = (load_addr + align_len) & ~align_len;
>>>> +#if  defined(CONFIG_ROCKCHIP_RK3399) ||
>>>> defined(CONFIG_ROCKCHIP_RK3368)
>>>
>>> This looks hacky. I don't think we should clutter platform independent
>>> code with platform dependent ifdefs. You're totally violating code
>>> abstraction here.
>>>
>>
>> Thanks for your comment, I know this looks hacky, could you share you
>> idea about how to implement this better?
>> We do need this to make things work.
>
> A more appropriate way would be to leverage the bounce buffers in the
> SD/MMC
> drivers and to make sure that the 0xffff0000 memory region is not
> allocated as a
> DMA-able target address via bounce buffers.

Bounce buffer is a good idea, I have implement it and send to patch to
the list, thanks
very much.

This patch can be drop.

Thanks,
- Kever
>
> Note that this is the same issue that I had highlighted about a year
> and a half ago
> and that we ended up working around by loading the PMU firmware into DRAM,
> pass the info about the loadables to ATF as part of the FDT, and
> finally have ATF
> relocate the loadables to INTMEM.
>
>> Thanks,
>> - Kever
>>> Regards,
>>> Simon
>>>
>>>> +        /*
>>>> +         * Rockchip SOC's mmc controller does not support read data
>>>> +         * from mmc to sram, we have to read to sdram first, and then
>>>> +         * copy to sram.
>>>> +         */
>>>> +        if ((load_ptr & 0xffff0000) != CONFIG_SYS_SDRAM_BASE)
>>>> +            load_ptr = (ulong)memalign(ARCH_DMA_MINALIGN, len);
>>>> +#endif
>>>>           length = len;
>>>>             overhead = get_aligned_image_overhead(info, offset);
>>>>
>>>
>>
>>
>>
>> _______________________________________________
>> U-Boot mailing list
>> U-Boot@lists.denx.de <mailto:U-Boot@lists.denx.de>
>> https://lists.denx.de/listinfo/u-boot
>
diff mbox series

Patch

diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
index c9bfe0cc8a..5c5b58f69d 100644
--- a/common/spl/spl_fit.c
+++ b/common/spl/spl_fit.c
@@ -9,6 +9,7 @@ 
 #include <fpga.h>
 #include <image.h>
 #include <linux/libfdt.h>
+#include <malloc.h>
 #include <spl.h>
 
 #ifndef CONFIG_SYS_BOOTM_LEN
@@ -215,6 +216,15 @@  static int spl_load_fit_image(struct spl_load_info *info, ulong sector,
 			return -ENOENT;
 
 		load_ptr = (load_addr + align_len) & ~align_len;
+#if  defined(CONFIG_ROCKCHIP_RK3399) || defined(CONFIG_ROCKCHIP_RK3368)
+		/*
+		 * Rockchip SOC's mmc controller does not support read data
+		 * from mmc to sram, we have to read to sdram first, and then
+		 * copy to sram.
+		 */
+		if ((load_ptr & 0xffff0000) != CONFIG_SYS_SDRAM_BASE)
+			load_ptr = (ulong)memalign(ARCH_DMA_MINALIGN, len);
+#endif
 		length = len;
 
 		overhead = get_aligned_image_overhead(info, offset);