Skip to content
Snippets Groups Projects
Commit 40d5534c authored by Tom Rini's avatar Tom Rini
Browse files

ARM: Default to using optimized memset and memcpy routines


We have long had available optimized versions of the memset and memcpy
functions that are borrowed from the Linux kernel.  We should use these
in normal conditions as the speed wins in many workflows outweigh the
relatively minor size increase.  However, we have a number of places
where we're simply too close to size limits in SPL and must be able to
make the size vs performance trade-off in those cases.

Cc: Philippe Reynes <tremyfr@yahoo.fr>
Cc: Eric Jarrige <eric.jarrige@armadeus.org>
Cc: Heiko Schocher <hs@denx.de>
Cc: Magnus Lilja <lilja.magnus@gmail.com>
Cc: Lokesh Vutla <lokeshvutla@ti.com>
Cc: Chander Kashyap <k.chander@samsung.com>
Cc: Akshay Saraswat <akshay.s@samsung.com>
Cc: Simon Glass <sjg@chromium.org>
Cc: Stefan Roese <sr@denx.de>
Signed-off-by: default avatarTom Rini <trini@konsulko.com>
Acked-by: default avatarStefan Roese <sr@denx.de>
Reviewed-by: default avatarSimon Glass <sjg@chromium.org>
parent a4a35934
No related branches found
No related tags found
No related merge requests found
...@@ -128,7 +128,16 @@ config ENABLE_ARM_SOC_BOOT0_HOOK ...@@ -128,7 +128,16 @@ config ENABLE_ARM_SOC_BOOT0_HOOK
config USE_ARCH_MEMCPY config USE_ARCH_MEMCPY
bool "Use an assembly optimized implementation of memcpy" bool "Use an assembly optimized implementation of memcpy"
default y if CPU_V7 default y
depends on !ARM64
help
Enable the generation of an optimized version of memcpy.
Such implementation may be faster under some conditions
but may increase the binary size.
config SPL_USE_ARCH_MEMCPY
bool "Use an assembly optimized implementation of memcpy"
default y if USE_ARCH_MEMCPY
depends on !ARM64 depends on !ARM64
help help
Enable the generation of an optimized version of memcpy. Enable the generation of an optimized version of memcpy.
...@@ -137,7 +146,16 @@ config USE_ARCH_MEMCPY ...@@ -137,7 +146,16 @@ config USE_ARCH_MEMCPY
config USE_ARCH_MEMSET config USE_ARCH_MEMSET
bool "Use an assembly optimized implementation of memset" bool "Use an assembly optimized implementation of memset"
default y if CPU_V7 default y
depends on !ARM64
help
Enable the generation of an optimized version of memset.
Such implementation may be faster under some conditions
but may increase the binary size.
config SPL_USE_ARCH_MEMSET
bool "Use an assembly optimized implementation of memset"
default y if USE_ARCH_MEMSET
depends on !ARM64 depends on !ARM64
help help
Enable the generation of an optimized version of memset. Enable the generation of an optimized version of memset.
......
...@@ -30,12 +30,12 @@ obj-$(CONFIG_CMD_BOOTI) += bootm.o ...@@ -30,12 +30,12 @@ obj-$(CONFIG_CMD_BOOTI) += bootm.o
obj-$(CONFIG_CMD_BOOTM) += bootm.o obj-$(CONFIG_CMD_BOOTM) += bootm.o
obj-$(CONFIG_CMD_BOOTZ) += bootm.o zimage.o obj-$(CONFIG_CMD_BOOTZ) += bootm.o zimage.o
obj-$(CONFIG_SYS_L2_PL310) += cache-pl310.o obj-$(CONFIG_SYS_L2_PL310) += cache-pl310.o
obj-$(CONFIG_USE_ARCH_MEMSET) += memset.o
obj-$(CONFIG_USE_ARCH_MEMCPY) += memcpy.o
else else
obj-$(CONFIG_SPL_FRAMEWORK) += spl.o obj-$(CONFIG_SPL_FRAMEWORK) += spl.o
obj-$(CONFIG_SPL_FRAMEWORK) += zimage.o obj-$(CONFIG_SPL_FRAMEWORK) += zimage.o
endif endif
obj-$(CONFIG_$(SPL_)USE_ARCH_MEMSET) += memset.o
obj-$(CONFIG_$(SPL_)USE_ARCH_MEMCPY) += memcpy.o
obj-$(CONFIG_SEMIHOSTING) += semihosting.o obj-$(CONFIG_SEMIHOSTING) += semihosting.o
obj-y += sections.o obj-y += sections.o
......
...@@ -17,7 +17,7 @@ DECLARE_GLOBAL_DATA_PTR; ...@@ -17,7 +17,7 @@ DECLARE_GLOBAL_DATA_PTR;
*/ */
#if !defined(CONFIG_SPL_BUILD) || \ #if !defined(CONFIG_SPL_BUILD) || \
(defined(CONFIG_SPL_LIBGENERIC_SUPPORT) && \ (defined(CONFIG_SPL_LIBGENERIC_SUPPORT) && \
!defined(CONFIG_USE_ARCH_MEMSET)) !defined(CONFIG_SPL_USE_ARCH_MEMCPY))
#define _USE_MEMCPY #define _USE_MEMCPY
#endif #endif
......
CONFIG_ARM=y CONFIG_ARM=y
# CONFIG_SPL_USE_ARCH_MEMCPY is not set
CONFIG_TARGET_APF27=y CONFIG_TARGET_APF27=y
CONFIG_SPL_NAND_SUPPORT=y CONFIG_SPL_NAND_SUPPORT=y
CONFIG_SPL_SERIAL_SUPPORT=y CONFIG_SPL_SERIAL_SUPPORT=y
......
CONFIG_ARM=y CONFIG_ARM=y
# CONFIG_SPL_USE_ARCH_MEMCPY is not set
# CONFIG_SPL_USE_ARCH_MEMSET is not set
CONFIG_ARCH_AT91=y CONFIG_ARCH_AT91=y
CONFIG_TARGET_TAURUS=y CONFIG_TARGET_TAURUS=y
CONFIG_SPL_GPIO_SUPPORT=y CONFIG_SPL_GPIO_SUPPORT=y
......
CONFIG_ARM=y CONFIG_ARM=y
# CONFIG_SPL_USE_ARCH_MEMCPY is not set
# CONFIG_SPL_USE_ARCH_MEMSET is not set
CONFIG_ARCH_AT91=y CONFIG_ARCH_AT91=y
CONFIG_TARGET_CORVUS=y CONFIG_TARGET_CORVUS=y
CONFIG_SPL_GPIO_SUPPORT=y CONFIG_SPL_GPIO_SUPPORT=y
......
CONFIG_ARM=y CONFIG_ARM=y
# CONFIG_SPL_USE_ARCH_MEMCPY is not set
# CONFIG_SPL_USE_ARCH_MEMSET is not set
CONFIG_TARGET_MX31PDK=y CONFIG_TARGET_MX31PDK=y
CONFIG_SPL_LIBGENERIC_SUPPORT=y CONFIG_SPL_LIBGENERIC_SUPPORT=y
CONFIG_SPL_NAND_SUPPORT=y CONFIG_SPL_NAND_SUPPORT=y
......
CONFIG_ARM=y CONFIG_ARM=y
# CONFIG_SPL_USE_ARCH_MEMCPY is not set
# CONFIG_SPL_USE_ARCH_MEMSET is not set
CONFIG_OMAP44XX=y CONFIG_OMAP44XX=y
# CONFIG_SPL_I2C_SUPPORT is not set # CONFIG_SPL_I2C_SUPPORT is not set
# CONFIG_SPL_NAND_SUPPORT is not set # CONFIG_SPL_NAND_SUPPORT is not set
......
CONFIG_ARM=y CONFIG_ARM=y
# CONFIG_SPL_USE_ARCH_MEMCPY is not set
# CONFIG_SPL_USE_ARCH_MEMSET is not set
CONFIG_ARCH_AT91=y CONFIG_ARCH_AT91=y
CONFIG_TARGET_SMARTWEB=y CONFIG_TARGET_SMARTWEB=y
CONFIG_SPL_GPIO_SUPPORT=y CONFIG_SPL_GPIO_SUPPORT=y
......
CONFIG_ARM=y CONFIG_ARM=y
# CONFIG_SPL_USE_ARCH_MEMCPY is not set
# CONFIG_SPL_USE_ARCH_MEMSET is not set
CONFIG_ARCH_EXYNOS=y CONFIG_ARCH_EXYNOS=y
CONFIG_ARCH_EXYNOS5=y CONFIG_ARCH_EXYNOS5=y
CONFIG_TARGET_SMDK5250=y CONFIG_TARGET_SMDK5250=y
......
CONFIG_ARM=y CONFIG_ARM=y
# CONFIG_SPL_USE_ARCH_MEMCPY is not set
# CONFIG_SPL_USE_ARCH_MEMSET is not set
CONFIG_ARCH_EXYNOS=y CONFIG_ARCH_EXYNOS=y
CONFIG_ARCH_EXYNOS5=y CONFIG_ARCH_EXYNOS5=y
CONFIG_TARGET_SNOW=y CONFIG_TARGET_SNOW=y
......
CONFIG_ARM=y CONFIG_ARM=y
# CONFIG_SPL_USE_ARCH_MEMCPY is not set
# CONFIG_SPL_USE_ARCH_MEMSET is not set
CONFIG_ARCH_EXYNOS=y CONFIG_ARCH_EXYNOS=y
CONFIG_ARCH_EXYNOS5=y CONFIG_ARCH_EXYNOS5=y
CONFIG_TARGET_SPRING=y CONFIG_TARGET_SPRING=y
......
CONFIG_ARM=y CONFIG_ARM=y
# CONFIG_SPL_USE_ARCH_MEMCPY is not set
# CONFIG_SPL_USE_ARCH_MEMSET is not set
CONFIG_ARCH_AT91=y CONFIG_ARCH_AT91=y
CONFIG_TARGET_TAURUS=y CONFIG_TARGET_TAURUS=y
CONFIG_SPL_GPIO_SUPPORT=y CONFIG_SPL_GPIO_SUPPORT=y
......
CONFIG_ARM=y CONFIG_ARM=y
# CONFIG_SPL_USE_ARCH_MEMCPY is not set
# CONFIG_SPL_USE_ARCH_MEMSET is not set
CONFIG_TARGET_X600=y CONFIG_TARGET_X600=y
CONFIG_SPL_LIBCOMMON_SUPPORT=y CONFIG_SPL_LIBCOMMON_SUPPORT=y
CONFIG_SPL_LIBGENERIC_SUPPORT=y CONFIG_SPL_LIBGENERIC_SUPPORT=y
......
...@@ -35,6 +35,9 @@ EXT_COBJ-y += lib/string.o ...@@ -35,6 +35,9 @@ EXT_COBJ-y += lib/string.o
EXT_COBJ-y += lib/time.o EXT_COBJ-y += lib/time.o
EXT_COBJ-y += lib/vsprintf.o EXT_COBJ-y += lib/vsprintf.o
EXT_SOBJ-$(CONFIG_PPC) += arch/powerpc/lib/ppcstring.o EXT_SOBJ-$(CONFIG_PPC) += arch/powerpc/lib/ppcstring.o
ifeq ($(ARCH),arm)
EXT_SOBJ-$(CONFIG_USE_ARCH_MEMSET) += arch/arm/lib/memset.o
endif
# Create a list of object files to be compiled # Create a list of object files to be compiled
OBJS := $(OBJ-y) $(notdir $(EXT_COBJ-y) $(EXT_SOBJ-y)) OBJS := $(OBJ-y) $(notdir $(EXT_COBJ-y) $(EXT_SOBJ-y))
...@@ -60,5 +63,5 @@ $(addprefix $(obj)/,$(notdir $(EXT_COBJ-y))): $(obj)/%.o: lib/%.c FORCE ...@@ -60,5 +63,5 @@ $(addprefix $(obj)/,$(notdir $(EXT_COBJ-y))): $(obj)/%.o: lib/%.c FORCE
$(call if_changed_rule,cc_o_c) $(call if_changed_rule,cc_o_c)
# Rule to build architecture-specific library assembly files # Rule to build architecture-specific library assembly files
$(addprefix $(obj)/,$(notdir $(EXT_SOBJ-y))): $(obj)/%.o: arch/powerpc/lib/%.S FORCE $(addprefix $(obj)/,$(notdir $(EXT_SOBJ-y))): $(obj)/%.o: arch/$(ARCH)/lib/%.S FORCE
$(call if_changed_dep,as_o_S) $(call if_changed_dep,as_o_S)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment