[U-Boot] [PATCH] arm: re-implement proper ISB instruction for ARMv7-A

Tom Rini trini at konsulko.com
Fri Jul 29 03:12:15 CEST 2016


On Fri, Jul 29, 2016 at 09:06:29AM +0800, Ziyuan Xu wrote:
> 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.xu at 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.xu at 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?:-)

I would really like to try and fix the other possibly latent issues that
we have by not calling a real ISB.  Please try moving towards all places
that need an isb calling the correct one from barriers.h and giving it a
spin on the hardware you have available.

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20160728/2e837f41/attachment.sig>


More information about the U-Boot mailing list