Hi Tom,

On 2016年07月29日 08:34, Tom Rini wrote:
On Fri, Jul 29, 2016 at 07:34:09AM +0800, Ziyuan Xu wrote:
Hi Tom,

On 2016年07月29日 06:15, Tom Rini wrote:
On Thu, Jul 28, 2016 at 07:03:17PM +0800, Chen-Yu Tsai wrote:
Hi,

On Thu, Jul 28, 2016 at 6:13 PM, Ziyuan Xu <xzy...@rock-chips.com> wrote:
For ARMv7-A architecture, the valid ISB instruction is asm volatile("isb").

This patch fixes the U-Boot was stuck in invalidate_dcache_all() before
booting linux kernel, which occurred on rk3288-base development board
such as evb-rk3288, rock2-rk3288. And something output via console like:

=> bootz 0x2000000
0x02000000
    ramdisk start = 0x00000000, ramdisk end = 0x00000000
    Continuing to boot without FDT
    Initial value for argc=3
    Final value for argc=3
    using: ATAGS

    Starting kernel ...

Linux kernel exactly the same way(see arch/arm/include/asm/barrier.h).

Signed-off-by: Ziyuan Xu <xzy...@rock-chips.com>
---

  arch/arm/include/asm/system.h | 6 ++++--
  1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/arch/arm/include/asm/system.h b/arch/arm/include/asm/system.h
index 2bdc0be..12d4ba0 100644
--- a/arch/arm/include/asm/system.h
+++ b/arch/arm/include/asm/system.h
@@ -227,13 +227,15 @@ void __noreturn psci_system_reset(bool smc);
   */
  void save_boot_params_ret(void);

-#define isb() __asm__ __volatile__ ("" : : : "memory")
-
  #define nop() __asm__ __volatile__("mov\tr0,r0\t@ nop\n\t");

  #ifdef __ARM_ARCH_7A__
+#define isb() __asm__ __volatile__ ("isb" : : : "memory")
+
  #define wfi() __asm__ __volatile__ ("wfi" : : : "memory")
  #else
+#define isb() __asm__ __volatile__ ("" : : : "memory")
+
  #define wfi()
  #endif

arch/arm/include/asm/barriers.h already has a proper set of
ISB/DSB macros. Please consider using those instead.
Please fix arch/arm/include/asm/system.h to use the macros found in
barriers.h rather than have their own versions.  Thanks!
If I understand correctly, I can change into as bellow:
#define isb() ISB
How about it?
Well, I'd rather not have ISB and isb, just ISB, which means we might
have to fix other places too.  If that starts looking too huge, we can
do this in steps and just do what you suggested for now and for next
release move everything over.
As I mentioned before, arch/arm/include/asm/barriers.h defined ISB macro. If I only want to fix the issue which I hit on rk3288 board, I just use ISB in arch/arm/include/asm/system.h::set_cr() instead of isb(). But isb() had been invoked in some places.

I can't verify integrallty after all revision, it involve some boards and feature. But this does fix for rk3288, if you agree with me, could you apply it provisionally?:-)




_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to