u-boot/arch
Masahiro Yamada d6bc30af52 ARM: UniPhier: remove __packed that causes a problem on GCC 4.9
The DDR PHY training function, ddrphy_prepare_training() would not
work if compiled with GCC 4.9.

The struct ddrphy (arch/arm/include/asm/arch-uniphier/ddrphy-regs.h)
is specified with __packed because it represents a hardware register
mapping, but it turned out to cause a problem on GCC 4.9.

If -mno-unaligned-access is specified (yes, it is in
arch/arm/cpu/armv7/config.mk), GCC 4.9 is aware of the
__attribute__((packed)) and generates extra instructions to perform
the memory access in a way that does not cause unaligned access.
(Actually it is not need here because the register base, the first
argument of the ddrphy_prepare_training(), is always given with a
4-byte aligned address.)

Anyway, as a result, readl() / writel() is divided into byte-wise
accesses.  The problem is that this hardware only accepts 4-byte
register access.  Byte-wise accesses lead to unexpected behavior.

There are some options to avoid this problem.

[1] Remove -mno-unaligned-access
[2] Add __aligned(4) along with __packed to struct ddrphy
[3] Remove __packed from struct ddrphy

[1] solves the problem for ARMv7, but it does not for pre-ARMv6 and
ARMv6-M architectures where -mno-unaligned-access is default.
So, [1] does not seem reasonable in terms of code portability.

Both [2] and [3] work well, but [2] seems too much.  All the members
of struct ddrphy have the u32 type.  No padding would be inserted
even if __packed is dropped.

Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
Reviewed-by: Tom Rini <trini@ti.com>
2015-01-23 00:44:17 +09:00
..
arc arc: rename "arc700" in "arcv1" 2015-01-15 22:40:50 +03:00
arm ARM: UniPhier: remove __packed that causes a problem on GCC 4.9 2015-01-23 00:44:17 +09:00
avr32 Kbuild: introduce Makefile in arch/$ARCH/ 2014-12-08 09:35:45 -05:00
blackfin blackfin: include <linux/compiler.h> rather than define __iomem 2014-12-08 09:35:46 -05:00
m68k m68k: remove TASREG board 2015-01-13 09:37:21 -05:00
microblaze Kbuild: introduce Makefile in arch/$ARCH/ 2014-12-08 09:35:45 -05:00
mips Replace <compiler.h> with <linux/compiler.h> 2014-12-08 09:35:46 -05:00
nds32 Kbuild: introduce Makefile in arch/$ARCH/ 2014-12-08 09:35:45 -05:00
nios2 Kbuild: introduce Makefile in arch/$ARCH/ 2014-12-08 09:35:45 -05:00
openrisc Kbuild: introduce Makefile in arch/$ARCH/ 2014-12-08 09:35:45 -05:00
powerpc powerpc: 74xx_7xx: remove 74xx_7xx cpu support 2015-01-16 10:24:39 -05:00
sandbox dm: i2c: dts: Add an I2C bus for sandbox 2014-12-11 13:18:43 -07:00
sh Replace <compiler.h> with <linux/compiler.h> 2014-12-08 09:35:46 -05:00
sparc Kbuild: introduce Makefile in arch/$ARCH/ 2014-12-08 09:35:45 -05:00
x86 x86: coreboot: Configure pci memory regions 2015-01-13 07:25:05 -08:00
.gitignore .gitignore: drop include/asm/proc from ignore pattern 2014-06-19 11:18:54 -04:00
Kconfig kconfig: move CONFIG_USE_PRIVATE_LIBGCC to Kconfig 2014-10-23 13:19:09 -04:00