u-boot-brain/arch/arm
Yasushi SHOJI 314d9f7e3e imx: syscounter: make sure asm is volatile
Without the volatile attribute, compilers are entitled to optimize out
the same asm().  In the case of __udelay() in syscounter.c, it calls
`get_ticks()` twice, one for the starting time and the second in the
loop to check the current time.  When compilers inline `get_ticks()`
they see the same `mrrc` instructions and optimize out the second one.
This leads to infinite loop since we don't get updated value from the
system counter.

Here is a portion of the disassembly of __udelay:

  88:	428b      	cmp	r3, r1
  8a:	f8ce 20a4 	str.w	r2, [lr, #164]	; 0xa4
  8e:	bf08      	it	eq
  90:	4282      	cmpeq	r2, r0
  92:	f8ce 30a0 	str.w	r3, [lr, #160]	; 0xa0
  96:	d3f7      	bcc.n	88 <__udelay+0x88>
  98:	e8bd 8cf0 	ldmia.w	sp!, {r4, r5, r6, r7, sl, fp, pc}

Note that final jump / loop at 96 to 88, we don't have any `mrrc`.

With a volatile attribute, the above changes to this:

  8a:	ec53 2f0e 	mrrc	15, 0, r2, r3, cr14
  8e:	42ab      	cmp	r3, r5
  90:	f8c1 20a4 	str.w	r2, [r1, #164]	; 0xa4
  94:	bf08      	it	eq
  96:	42a2      	cmpeq	r2, r4
  98:	f8c1 30a0 	str.w	r3, [r1, #160]	; 0xa0
  9c:	d3f5      	bcc.n	8a <__udelay+0x8a>
  9e:	e8bd 8cf0 	ldmia.w	sp!, {r4, r5, r6, r7, sl, fp, pc}
  a2:	bf00      	nop

I'm advised[1] to put volatile on all asm(), so this commit also adds it
to the asm() in timer_init().

[1]: https://lists.denx.de/pipermail/u-boot/2018-March/322062.html

Signed-off-by: Yasushi SHOJI <yasushi.shoji@gmail.com>
Reviewed-by: Fabio Estevam <fabio.estevam@nxp.com>
2018-03-09 13:06:14 +01:00
..
cpu libfdt: move headers to <linux/libfdt.h> and <linux/libfdt_env.h> 2018-03-05 10:16:28 -05:00
dts Merge git://git.denx.de/u-boot-sh 2018-03-05 20:24:17 -05:00
include Merge git://git.denx.de/u-boot-mmc 2018-02-25 22:28:59 -05:00
lib libfdt: move headers to <linux/libfdt.h> and <linux/libfdt_env.h> 2018-03-05 10:16:28 -05:00
mach-aspeed aspeed: Refactor SCU to use consistent mask & shift 2017-05-08 11:57:35 -04:00
mach-at91 spl: eMMC/SD: Provide one __weak spl_boot_mode() function 2018-02-07 22:06:18 -05:00
mach-bcm283x bcm283x: Add pinctrl driver 2018-01-28 12:27:32 -05:00
mach-davinci spl: eMMC/SD: Provide one __weak spl_boot_mode() function 2018-02-07 22:06:18 -05:00
mach-exynos usb: net: migrate USB Ethernet adapters to Kconfig 2017-09-08 10:23:00 -04:00
mach-highbank ARM: highbank: move SoC sources to mach-highbank 2015-02-21 08:23:51 -05:00
mach-imx imx: syscounter: make sure asm is volatile 2018-03-09 13:06:14 +01:00
mach-integrator env: Convert CONFIG_ENV_IS_IN... to a choice 2017-08-15 20:50:01 -04:00
mach-keystone cmd: ti: Generalize cmd_ddr3 command 2018-01-19 15:49:26 -05:00
mach-kirkwood spi: Migrate CONFIG_KIRKWOOD_SPI to Kconfig 2018-02-13 23:01:44 -05:00
mach-meson libfdt: move headers to <linux/libfdt.h> and <linux/libfdt_env.h> 2018-03-05 10:16:28 -05:00
mach-mvebu libfdt: move headers to <linux/libfdt.h> and <linux/libfdt_env.h> 2018-03-05 10:16:28 -05:00
mach-omap2 libfdt: move headers to <linux/libfdt.h> and <linux/libfdt_env.h> 2018-03-05 10:16:28 -05:00
mach-orion5x spl: add hierarchical defaults for SPL_LDSCRIPT 2017-08-13 17:12:37 +02:00
mach-qemu ARM: qemu-arm: Add support for AArch64 2018-01-19 15:49:30 -05:00
mach-rmobile ARM: rmobile: Add R8A77965 M3N IDs 2018-03-05 10:59:37 +01:00
mach-rockchip rockchip: rk3288: Fix wrong TPL_TEXT_BASE 2018-02-24 18:47:23 +01:00
mach-s5pc1xx arm: s5pc1xx: move SoC to mach-s5pc1xx 2015-11-30 17:17:01 +09:00
mach-snapdragon db820c: add qualcomm dragonboard 820C support 2018-01-15 16:29:02 -05:00
mach-socfpga libfdt: move headers to <linux/libfdt.h> and <linux/libfdt_env.h> 2018-03-05 10:16:28 -05:00
mach-sti board: Add STMicroelectronics STiH410-B2260 support 2017-03-14 20:40:21 -04:00
mach-stm32 board: stm32: Fix stm32f746-disco boot 2018-01-29 12:48:30 -05:00
mach-sunxi spl: eMMC/SD: Provide one __weak spl_boot_mode() function 2018-02-07 22:06:18 -05:00
mach-tegra aes: Allow non-zero initialization vector 2018-01-29 12:50:13 -05:00
mach-uniphier libfdt: move headers to <linux/libfdt.h> and <linux/libfdt_env.h> 2018-03-05 10:16:28 -05:00
mach-versatile arm: Remove versatileab board 2015-09-11 15:01:25 -04:00
mach-zynq mmc: Added Kconfig support for CONFIG_ZYNQ_SDHCI_MAX_FREQ 2018-03-01 16:44:10 +01:00
thumb1/include/asm/proc-armv arm: support Thumb-1 with CONFIG_SYS_THUMB_BUILD 2015-11-10 15:03:48 +01:00
config.mk binman: arm: Include the binman symbol table 2017-12-12 19:53:45 -07:00
Kconfig ARM: Kconfig: Move TI_SECURE_DEVICE to a common area 2018-02-23 10:21:41 -05:00
Kconfig.debug arm: debug: add Kconfig entries for lowlevel debug 2014-10-26 22:23:12 +01:00
Makefile imx: add i.MX8M into Kconfig 2018-02-04 12:00:58 +01:00