From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ziyuan Xu Date: Thu, 28 Jul 2016 19:51:48 +0800 Subject: [U-Boot] [PATCH] arm: re-implement proper ISB instruction for ARMv7-A In-Reply-To: References: <1469700807-22212-1-git-send-email-xzy.xu@rock-chips.com> Message-ID: <5799F1D4.3010502@rock-chips.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi, On 2016?07?28? 19:03, Chen-Yu Tsai wrote: > Hi, > > On Thu, Jul 28, 2016 at 6:13 PM, Ziyuan Xu 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 >> --- >> >> 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. I know just what you mean. 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, IMHO, this patch is more apposite.:-) > > You'll see they also support ARMv6's CP15 ISB/DSB. > > Regards > ChenYu > > >