Merge branch 'master' of git://git.denx.de/u-boot-arm

This commit is contained in:
Stefano Babic
2014-01-26 12:11:54 +01:00
402 changed files with 8007 additions and 4488 deletions

9
.gitignore vendored
View File

@@ -47,8 +47,6 @@
/u-boot.ais /u-boot.ais
/u-boot.dtb /u-boot.dtb
/u-boot.sb /u-boot.sb
/u-boot.bd
/u-boot.geany
# #
# Generated files # Generated files
@@ -59,6 +57,10 @@
/errlog /errlog
/reloc_off /reloc_off
/spl/
!/spl/Makefile
/tpl/
/include/generated/ /include/generated/
/include/spl-autoconf.mk /include/spl-autoconf.mk
/include/tpl-autoconf.mk /include/tpl-autoconf.mk
@@ -88,6 +90,3 @@ GPATH
GRTAGS GRTAGS
GSYMS GSYMS
GTAGS GTAGS
# spl ais files
/spl/*.ais

12
MAKEALL
View File

@@ -380,6 +380,12 @@ LIST_ARM11="$(targets_by_cpu arm1136) \
LIST_ARMV7="$(targets_by_cpu armv7)" LIST_ARMV7="$(targets_by_cpu armv7)"
#########################################################################
## ARMV8 Systems
#########################################################################
LIST_ARMV8="$(targets_by_cpu armv8)"
######################################################################### #########################################################################
## AT91 Systems ## AT91 Systems
######################################################################### #########################################################################
@@ -404,7 +410,11 @@ LIST_spear="$(targets_by_soc spear)"
## ARM groups ## ARM groups
######################################################################### #########################################################################
LIST_arm="$(targets_by_arch arm)" LIST_arm="$(targets_by_arch arm | \
for ARMV8_TARGET in $LIST_ARMV8; \
do sed "/$ARMV8_TARGET/d"; \
done) \
"
######################################################################### #########################################################################
## MIPS Systems (default = big endian) ## MIPS Systems (default = big endian)

154
Makefile
View File

@@ -8,7 +8,7 @@
VERSION = 2014 VERSION = 2014
PATCHLEVEL = 01 PATCHLEVEL = 01
SUBLEVEL = SUBLEVEL =
EXTRAVERSION = -rc1 EXTRAVERSION = -rc2
ifneq "$(SUBLEVEL)" "" ifneq "$(SUBLEVEL)" ""
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
else else
@@ -109,11 +109,6 @@ export TOPDIR SRCTREE OBJTREE SPLTREE TPLTREE
MKCONFIG := $(SRCTREE)/mkconfig MKCONFIG := $(SRCTREE)/mkconfig
export MKCONFIG export MKCONFIG
ifneq ($(OBJTREE),$(SRCTREE))
REMOTE_BUILD := 1
export REMOTE_BUILD
endif
# $(obj) and (src) are defined in config.mk but here in main Makefile # $(obj) and (src) are defined in config.mk but here in main Makefile
# we also need them before config.mk is included which is the case for # we also need them before config.mk is included which is the case for
# some targets like unconfig, clean, clobber, distclean, etc. # some targets like unconfig, clean, clobber, distclean, etc.
@@ -168,7 +163,7 @@ endif
include $(TOPDIR)/config.mk include $(TOPDIR)/config.mk
# Targets which don't build the source code # Targets which don't build the source code
NON_BUILD_TARGETS = backup clean clobber distclean mkproper tidy unconfig NON_BUILD_TARGETS = backup clean clobber distclean mrproper tidy unconfig
# Only do the generic board check when actually building, not configuring # Only do the generic board check when actually building, not configuring
ifeq ($(filter $(NON_BUILD_TARGETS),$(MAKECMDGOALS)),) ifeq ($(filter $(NON_BUILD_TARGETS),$(MAKECMDGOALS)),)
@@ -187,7 +182,7 @@ ifndef LDSCRIPT
#LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds.debug #LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds.debug
ifdef CONFIG_SYS_LDSCRIPT ifdef CONFIG_SYS_LDSCRIPT
# need to strip off double quotes # need to strip off double quotes
LDSCRIPT := $(subst ",,$(CONFIG_SYS_LDSCRIPT)) LDSCRIPT := $(CONFIG_SYS_LDSCRIPT:"%"=%)
endif endif
endif endif
@@ -218,15 +213,11 @@ endif
######################################################################### #########################################################################
# U-Boot objects....order is important (i.e. start must be first) # U-Boot objects....order is important (i.e. start must be first)
OBJS = $(CPUDIR)/start.o head-y := $(CPUDIR)/start.o
ifeq ($(CPU),ppc4xx) head-$(CONFIG_4xx) += arch/powerpc/cpu/ppc4xx/resetvec.o
OBJS += $(CPUDIR)/resetvec.o head-$(CONFIG_MPC85xx) += arch/powerpc/cpu/mpc85xx/resetvec.o
endif
ifeq ($(CPU),mpc85xx)
OBJS += $(CPUDIR)/resetvec.o
endif
OBJS := $(addprefix $(obj),$(OBJS)) OBJS := $(addprefix $(obj),$(head-y))
HAVE_VENDOR_COMMON_LIB = $(if $(wildcard board/$(VENDOR)/common/Makefile),y,n) HAVE_VENDOR_COMMON_LIB = $(if $(wildcard board/$(VENDOR)/common/Makefile),y,n)
@@ -249,9 +240,9 @@ LIBS-y += drivers/i2c/
LIBS-y += drivers/input/ LIBS-y += drivers/input/
LIBS-y += drivers/mmc/ LIBS-y += drivers/mmc/
LIBS-y += drivers/mtd/ LIBS-y += drivers/mtd/
LIBS-y += drivers/mtd/nand/ LIBS-$(CONFIG_CMD_NAND) += drivers/mtd/nand/
LIBS-y += drivers/mtd/onenand/ LIBS-y += drivers/mtd/onenand/
LIBS-y += drivers/mtd/ubi/ LIBS-$(CONFIG_CMD_UBI) += drivers/mtd/ubi/
LIBS-y += drivers/mtd/spi/ LIBS-y += drivers/mtd/spi/
LIBS-y += drivers/net/ LIBS-y += drivers/net/
LIBS-y += drivers/net/phy/ LIBS-y += drivers/net/phy/
@@ -275,7 +266,7 @@ LIBS-y += drivers/usb/ulpi/
LIBS-y += common/ LIBS-y += common/
LIBS-y += lib/libfdt/ LIBS-y += lib/libfdt/
LIBS-$(CONFIG_API) += api/ LIBS-$(CONFIG_API) += api/
LIBS-y += post/ LIBS-$(CONFIG_HAS_POST) += post/
LIBS-y += test/ LIBS-y += test/
ifneq (,$(filter $(SOC), mx25 mx27 mx5 mx6 mx31 mx35 mxs vf610)) ifneq (,$(filter $(SOC), mx25 mx27 mx5 mx6 mx31 mx35 mxs vf610))
@@ -334,6 +325,17 @@ else
BOARD_SIZE_CHECK = BOARD_SIZE_CHECK =
endif endif
# Statically apply RELA-style relocations (currently arm64 only)
ifneq ($(CONFIG_STATIC_RELA),)
# $(1) is u-boot ELF, $(2) is u-boot bin, $(3) is text base
DO_STATIC_RELA = \
start=$$($(NM) $(1) | grep __rel_dyn_start | cut -f 1 -d ' '); \
end=$$($(NM) $(1) | grep __rel_dyn_end | cut -f 1 -d ' '); \
$(obj)tools/relocate-rela $(2) $(3) $$start $$end
else
DO_STATIC_RELA =
endif
# Always append ALL so that arch config.mk's can add custom ones # Always append ALL so that arch config.mk's can add custom ones
ALL-y += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map ALL-y += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map
@@ -345,8 +347,9 @@ ALL-$(CONFIG_SPL_FRAMEWORK) += $(obj)u-boot.img
ALL-$(CONFIG_TPL) += $(obj)tpl/u-boot-tpl.bin ALL-$(CONFIG_TPL) += $(obj)tpl/u-boot-tpl.bin
ALL-$(CONFIG_OF_SEPARATE) += $(obj)u-boot.dtb $(obj)u-boot-dtb.bin ALL-$(CONFIG_OF_SEPARATE) += $(obj)u-boot.dtb $(obj)u-boot-dtb.bin
ifneq ($(CONFIG_SPL_TARGET),) ifneq ($(CONFIG_SPL_TARGET),)
ALL-$(CONFIG_SPL) += $(obj)$(subst ",,$(CONFIG_SPL_TARGET)) ALL-$(CONFIG_SPL) += $(obj)$(CONFIG_SPL_TARGET:"%"=%)
endif endif
ALL-$(CONFIG_REMAKE_ELF) += $(obj)u-boot.elf
# enable combined SPL/u-boot/dtb rules for tegra # enable combined SPL/u-boot/dtb rules for tegra
ifneq ($(CONFIG_TEGRA),) ifneq ($(CONFIG_TEGRA),)
@@ -378,6 +381,7 @@ $(obj)u-boot.srec: $(obj)u-boot
$(obj)u-boot.bin: $(obj)u-boot $(obj)u-boot.bin: $(obj)u-boot
$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@ $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
$(call DO_STATIC_RELA,$<,$@,$(CONFIG_SYS_TEXT_BASE))
$(BOARD_SIZE_CHECK) $(BOARD_SIZE_CHECK)
$(obj)u-boot.ldr: $(obj)u-boot $(obj)u-boot.ldr: $(obj)u-boot
@@ -482,12 +486,10 @@ $(obj)u-boot.sb: $(obj)u-boot.bin $(obj)spl/u-boot-spl.bin
$(obj)u-boot.spr: $(obj)u-boot.img $(obj)spl/u-boot-spl.bin $(obj)u-boot.spr: $(obj)u-boot.img $(obj)spl/u-boot-spl.bin
$(obj)tools/mkimage -A $(ARCH) -T firmware -C none \ $(obj)tools/mkimage -A $(ARCH) -T firmware -C none \
-a $(CONFIG_SPL_TEXT_BASE) -e $(CONFIG_SPL_TEXT_BASE) -n XLOADER \ -a $(CONFIG_SPL_TEXT_BASE) -e $(CONFIG_SPL_TEXT_BASE) -n XLOADER \
-d $(obj)spl/u-boot-spl.bin $(obj)spl/u-boot-spl.img -d $(obj)spl/u-boot-spl.bin $@
tr "\000" "\377" < /dev/zero | dd ibs=1 count=$(CONFIG_SPL_PAD_TO) \ $(OBJCOPY) -I binary -O binary \
of=$(obj)spl/u-boot-spl-pad.img 2>/dev/null --pad-to=$(CONFIG_SPL_PAD_TO) --gap-fill=0xff $@
dd if=$(obj)spl/u-boot-spl.img of=$(obj)spl/u-boot-spl-pad.img \ cat $(obj)u-boot.img >> $@
conv=notrunc 2>/dev/null
cat $(obj)spl/u-boot-spl-pad.img $(obj)u-boot.img > $@
ifneq ($(CONFIG_TEGRA),) ifneq ($(CONFIG_TEGRA),)
$(obj)u-boot-nodtb-tegra.bin: $(obj)spl/u-boot-spl.bin $(obj)u-boot.bin $(obj)u-boot-nodtb-tegra.bin: $(obj)spl/u-boot-spl.bin $(obj)u-boot.bin
@@ -510,11 +512,21 @@ $(obj)u-boot-img.bin: $(obj)spl/u-boot-spl.bin $(obj)u-boot.img
# at the start padded up to the start of the SPL image. And then concat # at the start padded up to the start of the SPL image. And then concat
# the SPL image to the end. # the SPL image to the end.
$(obj)u-boot-img-spl-at-end.bin: $(obj)spl/u-boot-spl.bin $(obj)u-boot.img $(obj)u-boot-img-spl-at-end.bin: $(obj)spl/u-boot-spl.bin $(obj)u-boot.img
tr "\000" "\377" < /dev/zero | dd ibs=1 count=$(CONFIG_UBOOT_PAD_TO) \ $(OBJCOPY) -I binary -O binary --pad-to=$(CONFIG_UBOOT_PAD_TO) \
of=$(obj)u-boot-pad.img 2>/dev/null --gap-fill=0xff $(obj)u-boot.img $@
dd if=$(obj)u-boot.img of=$(obj)u-boot-pad.img \ cat $(obj)spl/u-boot-spl.bin >> $@
conv=notrunc 2>/dev/null
cat $(obj)u-boot-pad.img $(obj)spl/u-boot-spl.bin > $@ # Create a new ELF from a raw binary file. This is useful for arm64
# where static relocation needs to be performed on the raw binary,
# but certain simulators only accept an ELF file (but don't do the
# relocation).
# FIXME refactor dts/Makefile to share target/arch detection
$(obj)u-boot.elf: $(obj)u-boot.bin
@$(OBJCOPY) -B aarch64 -I binary -O elf64-littleaarch64 \
$< $(obj)u-boot-elf.o
@$(LD) $(obj)u-boot-elf.o -o $@ \
--defsym=_start=$(CONFIG_SYS_TEXT_BASE) \
-Ttext=$(CONFIG_SYS_TEXT_BASE)
ifeq ($(CONFIG_SANDBOX),y) ifeq ($(CONFIG_SANDBOX),y)
GEN_UBOOT = \ GEN_UBOOT = \
@@ -530,7 +542,7 @@ GEN_UBOOT = \
endif endif
$(obj)u-boot: depend \ $(obj)u-boot: depend \
$(SUBDIR_TOOLS) $(OBJS) $(LIBS) $(LDSCRIPT) $(obj)u-boot.lds $(SUBDIR_TOOLS) $(OBJS) $(LIBS) $(obj)u-boot.lds
$(GEN_UBOOT) $(GEN_UBOOT)
ifeq ($(CONFIG_KALLSYMS),y) ifeq ($(CONFIG_KALLSYMS),y)
smap=`$(call SYSTEM_MAP,$(obj)u-boot) | \ smap=`$(call SYSTEM_MAP,$(obj)u-boot) | \
@@ -551,10 +563,7 @@ $(SUBDIRS): depend
$(SUBDIR_EXAMPLES-y): $(obj)u-boot $(SUBDIR_EXAMPLES-y): $(obj)u-boot
$(LDSCRIPT): depend $(obj)u-boot.lds: $(LDSCRIPT) depend
$(MAKE) -C $(dir $@) $(notdir $@)
$(obj)u-boot.lds: $(LDSCRIPT)
$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -ansi -D__ASSEMBLY__ -P - <$< >$@ $(CPP) $(CPPFLAGS) $(LDPPFLAGS) -ansi -D__ASSEMBLY__ -P - <$< >$@
nand_spl: $(TIMESTAMP_FILE) $(VERSION_FILE) depend nand_spl: $(TIMESTAMP_FILE) $(VERSION_FILE) depend
@@ -588,7 +597,7 @@ FINDFLAGS := -L
checkstack: checkstack:
$(CROSS_COMPILE)objdump -d $(obj)u-boot \ $(CROSS_COMPILE)objdump -d $(obj)u-boot \
`$(FIND) $(obj) -name u-boot-spl -print` | \ `$(FIND) $(obj) -name u-boot-spl -print` | \
perl $(src)tools/checkstack.pl $(ARCH) perl $(src)scripts/checkstack.pl $(ARCH)
tags ctags: tags ctags:
ctags -w -o $(obj)ctags `$(FIND) $(FINDFLAGS) $(TAG_SUBDIRS) \ ctags -w -o $(obj)ctags `$(FIND) $(FINDFLAGS) $(TAG_SUBDIRS) \
@@ -640,63 +649,49 @@ checkdtc:
# to regenerate the autoconf.mk file. # to regenerate the autoconf.mk file.
$(obj)include/autoconf.mk.dep: $(obj)include/config.h include/common.h $(obj)include/autoconf.mk.dep: $(obj)include/config.h include/common.h
@$(XECHO) Generating $@ ; \ @$(XECHO) Generating $@ ; \
set -e ; \
: Generate the dependancies ; \ : Generate the dependancies ; \
$(CC) -x c -DDO_DEPS_ONLY -M $(CFLAGS) $(CPPFLAGS) \ $(CC) -x c -DDO_DEPS_ONLY -M $(CFLAGS) $(CPPFLAGS) \
-MQ $(obj)include/autoconf.mk include/common.h > $@ -MQ $(obj)include/autoconf.mk include/common.h > $@ || \
rm $@
$(obj)include/autoconf.mk: $(obj)include/config.h $(obj)include/autoconf.mk: $(obj)include/config.h
@$(XECHO) Generating $@ ; \ @$(XECHO) Generating $@ ; \
set -e ; \
: Extract the config macros ; \ : Extract the config macros ; \
$(CPP) $(CFLAGS) -DDO_DEPS_ONLY -dM include/common.h | \ $(CPP) $(CFLAGS) -DDO_DEPS_ONLY -dM include/common.h > $@.tmp && \
sed -n -f tools/scripts/define2mk.sed > $@.tmp && \ sed -n -f tools/scripts/define2mk.sed $@.tmp > $@; \
mv $@.tmp $@ rm $@.tmp
# Auto-generate the spl-autoconf.mk file (which is included by all makefiles for SPL) # Auto-generate the spl-autoconf.mk file (which is included by all makefiles for SPL)
$(obj)include/tpl-autoconf.mk: $(obj)include/config.h $(obj)include/tpl-autoconf.mk: $(obj)include/config.h
@$(XECHO) Generating $@ ; \ @$(XECHO) Generating $@ ; \
set -e ; \
: Extract the config macros ; \ : Extract the config macros ; \
$(CPP) $(CFLAGS) -DCONFIG_TPL_BUILD -DCONFIG_SPL_BUILD\ $(CPP) $(CFLAGS) -DCONFIG_TPL_BUILD -DCONFIG_SPL_BUILD\
-DDO_DEPS_ONLY -dM include/common.h | \ -DDO_DEPS_ONLY -dM include/common.h > $@.tmp && \
sed -n -f tools/scripts/define2mk.sed > $@.tmp && \ sed -n -f tools/scripts/define2mk.sed $@.tmp > $@; \
mv $@.tmp $@ rm $@.tmp
$(obj)include/spl-autoconf.mk: $(obj)include/config.h $(obj)include/spl-autoconf.mk: $(obj)include/config.h
@$(XECHO) Generating $@ ; \ @$(XECHO) Generating $@ ; \
set -e ; \
: Extract the config macros ; \ : Extract the config macros ; \
$(CPP) $(CFLAGS) -DCONFIG_SPL_BUILD -DDO_DEPS_ONLY -dM include/common.h | \ $(CPP) $(CFLAGS) -DCONFIG_SPL_BUILD -DDO_DEPS_ONLY -dM include/common.h > $@.tmp && \
sed -n -f tools/scripts/define2mk.sed > $@.tmp && \ sed -n -f tools/scripts/define2mk.sed $@.tmp > $@; \
mv $@.tmp $@ rm $@.tmp
$(obj)include/generated/generic-asm-offsets.h: $(obj)include/autoconf.mk.dep \ $(obj)include/generated/generic-asm-offsets.h: $(obj)lib/asm-offsets.s
$(obj)include/spl-autoconf.mk \
$(obj)include/tpl-autoconf.mk \
$(obj)lib/asm-offsets.s
@$(XECHO) Generating $@ @$(XECHO) Generating $@
tools/scripts/make-asm-offsets $(obj)lib/asm-offsets.s $@ tools/scripts/make-asm-offsets $(obj)lib/asm-offsets.s $@
$(obj)lib/asm-offsets.s: $(obj)include/autoconf.mk.dep \ $(obj)lib/asm-offsets.s: $(obj)include/config.h $(src)lib/asm-offsets.c
$(obj)include/spl-autoconf.mk \
$(obj)include/tpl-autoconf.mk \
$(src)lib/asm-offsets.c
@mkdir -p $(obj)lib @mkdir -p $(obj)lib
$(CC) -DDO_DEPS_ONLY \ $(CC) -DDO_DEPS_ONLY \
$(CFLAGS) $(CFLAGS_$(BCURDIR)/$(@F)) $(CFLAGS_$(BCURDIR)) \ $(CFLAGS) $(CFLAGS_$(BCURDIR)/$(@F)) $(CFLAGS_$(BCURDIR)) \
-o $@ $(src)lib/asm-offsets.c -c -S -o $@ $(src)lib/asm-offsets.c -c -S
$(obj)include/generated/asm-offsets.h: $(obj)include/autoconf.mk.dep \ $(obj)include/generated/asm-offsets.h: $(obj)$(CPUDIR)/$(SOC)/asm-offsets.s
$(obj)include/spl-autoconf.mk \
$(obj)include/tpl-autoconf.mk \
$(obj)$(CPUDIR)/$(SOC)/asm-offsets.s
@$(XECHO) Generating $@ @$(XECHO) Generating $@
tools/scripts/make-asm-offsets $(obj)$(CPUDIR)/$(SOC)/asm-offsets.s $@ tools/scripts/make-asm-offsets $(obj)$(CPUDIR)/$(SOC)/asm-offsets.s $@
$(obj)$(CPUDIR)/$(SOC)/asm-offsets.s: $(obj)include/autoconf.mk.dep \ $(obj)$(CPUDIR)/$(SOC)/asm-offsets.s: $(obj)include/config.h
$(obj)include/spl-autoconf.mk \
$(obj)include/tpl-autoconf.mk
@mkdir -p $(obj)$(CPUDIR)/$(SOC) @mkdir -p $(obj)$(CPUDIR)/$(SOC)
if [ -f $(src)$(CPUDIR)/$(SOC)/asm-offsets.c ];then \ if [ -f $(src)$(CPUDIR)/$(SOC)/asm-offsets.c ];then \
$(CC) -DDO_DEPS_ONLY \ $(CC) -DDO_DEPS_ONLY \
@@ -719,16 +714,20 @@ tools: $(VERSION_FILE) $(TIMESTAMP_FILE)
$(MAKE) -C $@ all $(MAKE) -C $@ all
endif # config.mk endif # config.mk
# ARM relocations should all be R_ARM_RELATIVE. # ARM relocations should all be R_ARM_RELATIVE (32-bit) or
# R_AARCH64_RELATIVE (64-bit).
checkarmreloc: $(obj)u-boot checkarmreloc: $(obj)u-boot
@if test "R_ARM_RELATIVE" != \ @RELOC="`$(CROSS_COMPILE)readelf -r -W $< | cut -d ' ' -f 4 | \
"`$(CROSS_COMPILE)readelf -r $< | cut -d ' ' -f 4 | grep R_ARM | sort -u`"; \ grep R_A | sort -u`"; \
then echo "$< contains relocations other than \ if test "$$RELOC" != "R_ARM_RELATIVE" -a \
R_ARM_RELATIVE"; false; fi "$$RELOC" != "R_AARCH64_RELATIVE"; then \
echo "$< contains unexpected relocations: $$RELOC"; \
false; \
fi
$(VERSION_FILE): $(VERSION_FILE):
@mkdir -p $(dir $(VERSION_FILE)) @mkdir -p $(dir $(VERSION_FILE))
@( localvers='$(shell $(TOPDIR)/tools/setlocalversion $(TOPDIR))' ; \ @( localvers='$(shell $(TOPDIR)/scripts/setlocalversion $(TOPDIR))' ; \
printf '#define PLAIN_VERSION "%s%s"\n' \ printf '#define PLAIN_VERSION "%s%s"\n' \
"$(U_BOOT_VERSION)" "$${localvers}" ; \ "$(U_BOOT_VERSION)" "$${localvers}" ; \
printf '#define U_BOOT_VERSION "U-Boot %s%s"\n' \ printf '#define U_BOOT_VERSION "U-Boot %s%s"\n' \
@@ -783,9 +782,7 @@ $(obj).boards.depend: boards.cfg
######################################################################### #########################################################################
clean: clean:
@rm -f $(obj)examples/standalone/82559_eeprom \ @rm -f $(obj)examples/standalone/atmel_df_pow2 \
$(obj)examples/standalone/atmel_df_pow2 \
$(obj)examples/standalone/eepro100_eeprom \
$(obj)examples/standalone/hello_world \ $(obj)examples/standalone/hello_world \
$(obj)examples/standalone/interrupt \ $(obj)examples/standalone/interrupt \
$(obj)examples/standalone/mem_to_mem_idma2intr \ $(obj)examples/standalone/mem_to_mem_idma2intr \
@@ -795,10 +792,11 @@ clean:
$(obj)examples/standalone/timer $(obj)examples/standalone/timer
@rm -f $(obj)examples/api/demo{,.bin} @rm -f $(obj)examples/api/demo{,.bin}
@rm -f $(obj)tools/bmp_logo $(obj)tools/easylogo/easylogo \ @rm -f $(obj)tools/bmp_logo $(obj)tools/easylogo/easylogo \
$(obj)tools/env/{fw_printenv,fw_setenv} \ $(obj)tools/env/fw_printenv \
$(obj)tools/envcrc \ $(obj)tools/envcrc \
$(obj)tools/gdb/{astest,gdbcont,gdbsend} \ $(obj)tools/gdb/{gdbcont,gdbsend} \
$(obj)tools/gen_eth_addr $(obj)tools/img2srec \ $(obj)tools/gen_eth_addr $(obj)tools/img2srec \
$(obj)tools/dump{env,}image \
$(obj)tools/mk{env,}image $(obj)tools/mpc86x_clk \ $(obj)tools/mk{env,}image $(obj)tools/mpc86x_clk \
$(obj)tools/mk{$(BOARD),}spl \ $(obj)tools/mk{$(BOARD),}spl \
$(obj)tools/mxsboot \ $(obj)tools/mxsboot \
@@ -807,7 +805,6 @@ clean:
$(obj)tools/proftool $(obj)tools/proftool
@rm -f $(obj)board/cray/L1/{bootscript.c,bootscript.image} \ @rm -f $(obj)board/cray/L1/{bootscript.c,bootscript.image} \
$(obj)board/matrix_vision/*/bootscript.img \ $(obj)board/matrix_vision/*/bootscript.img \
$(obj)board/voiceblue/eeprom \
$(obj)u-boot.lds \ $(obj)u-boot.lds \
$(obj)arch/blackfin/cpu/init.{lds,elf} $(obj)arch/blackfin/cpu/init.{lds,elf}
@rm -f $(obj)include/bmp_logo.h @rm -f $(obj)include/bmp_logo.h
@@ -843,7 +840,6 @@ clobber: tidy
@rm -f $(obj)u-boot.ais @rm -f $(obj)u-boot.ais
@rm -f $(obj)u-boot.dtb @rm -f $(obj)u-boot.dtb
@rm -f $(obj)u-boot.sb @rm -f $(obj)u-boot.sb
@rm -f $(obj)u-boot.bd
@rm -f $(obj)u-boot.spr @rm -f $(obj)u-boot.spr
@rm -f $(obj)nand_spl/{u-boot.{lds,lst},System.map} @rm -f $(obj)nand_spl/{u-boot.{lds,lst},System.map}
@rm -f $(obj)nand_spl/{u-boot-nand_spl.lds,u-boot-spl,u-boot-spl.map} @rm -f $(obj)nand_spl/{u-boot-nand_spl.lds,u-boot-spl,u-boot-spl.map}

17
README
View File

@@ -423,6 +423,11 @@ The following options need to be configured:
CONFIG_SYS_FSL_DSP_CCSRBAR_DEFAULT CONFIG_SYS_FSL_DSP_CCSRBAR_DEFAULT
This value denotes start offset of DSP CCSR space. This value denotes start offset of DSP CCSR space.
CONFIG_SYS_FSL_SINGLE_SOURCE_CLK
Single Source Clock is clocking mode present in some of FSL SoC's.
In this mode, a single differential clock is used to supply
clocks to the sysclock, ddrclock and usbclock.
- Generic CPU options: - Generic CPU options:
CONFIG_SYS_BIG_ENDIAN, CONFIG_SYS_LITTLE_ENDIAN CONFIG_SYS_BIG_ENDIAN, CONFIG_SYS_LITTLE_ENDIAN
@@ -3267,6 +3272,9 @@ FIT uImage format:
Defines the size and behavior of the NAND that SPL uses Defines the size and behavior of the NAND that SPL uses
to read U-Boot to read U-Boot
CONFIG_SPL_NAND_BOOT
Add support NAND boot
CONFIG_SYS_NAND_U_BOOT_OFFS CONFIG_SYS_NAND_U_BOOT_OFFS
Location in NAND to read U-Boot from Location in NAND to read U-Boot from
@@ -5252,6 +5260,15 @@ when your kernel is intended to use an initial ramdisk:
Load Address: 0x00000000 Load Address: 0x00000000
Entry Point: 0x00000000 Entry Point: 0x00000000
The "dumpimage" is a tool to disassemble images built by mkimage. Its "-i"
option performs the converse operation of the mkimage's second form (the "-d"
option). Given an image built by mkimage, the dumpimage extracts a "data file"
from the image:
tools/dumpimage -i image -p position data_file
-i ==> extract from the 'image' a specific 'data_file', \
indexed by 'position'
Installing a Linux Image: Installing a Linux Image:
------------------------- -------------------------

View File

@@ -17,7 +17,8 @@ endif
LDFLAGS_FINAL += --gc-sections LDFLAGS_FINAL += --gc-sections
PLATFORM_RELFLAGS += -ffunction-sections -fdata-sections \ PLATFORM_RELFLAGS += -ffunction-sections -fdata-sections \
-fno-common -ffixed-r9 -msoft-float -fno-common -ffixed-r9
PLATFORM_RELFLAGS += $(call cc-option, -msoft-float)
# Support generic board on ARM # Support generic board on ARM
__HAVE_ARCH_GENERIC_BOARD := y __HAVE_ARCH_GENERIC_BOARD := y
@@ -105,4 +106,8 @@ PLATFORM_CPPFLAGS += $(call cc-option, -mword-relocations)
endif endif
# limit ourselves to the sections we want in the .bin. # limit ourselves to the sections we want in the .bin.
OBJCFLAGS += -j .text -j .rodata -j .data -j .u_boot_list -j .rel.dyn ifdef CONFIG_ARM64
OBJCFLAGS += -j .text -j .rodata -j .data -j .u_boot_list -j .rela.dyn
else
OBJCFLAGS += -j .text -j .rodata -j .hash -j .data -j .got.plt -j .u_boot_list -j .rel.dyn
endif

View File

@@ -0,0 +1,7 @@
#
# Copyright (C) Albert ARIBAUD <albert.u.boot@aribaud.net>
#
# SPDX-License-Identifier: GPL-2.0+
#
SPL_OBJCFLAGS += -j .machine_param

View File

@@ -24,7 +24,7 @@ ENTRY(lowlevel_init)
#ifdef CONFIG_SPL_BUILD #ifdef CONFIG_SPL_BUILD
ldr r9, =gdata ldr r9, =gdata
#else #else
sub sp, #GD_SIZE sub sp, sp, #GD_SIZE
bic sp, sp, #7 bic sp, sp, #7
mov r9, sp mov r9, sp
#endif #endif

View File

@@ -101,6 +101,12 @@ void zynq_slcr_devcfg_enable(void)
zynq_slcr_lock(); zynq_slcr_lock();
} }
u32 zynq_slcr_get_boot_mode(void)
{
/* Get the bootmode register value */
return readl(&slcr_base->boot_mode);
}
u32 zynq_slcr_get_idcode(void) u32 zynq_slcr_get_idcode(void)
{ {
return (readl(&slcr_base->pss_idcode) & SLCR_IDCODE_MASK) >> return (readl(&slcr_base->pss_idcode) & SLCR_IDCODE_MASK) >>

View File

@@ -107,8 +107,7 @@ void __udelay(unsigned long usec)
if (usec == 0) if (usec == 0)
return; return;
countticks = (u32) (((unsigned long long) TIMER_TICK_HZ * usec) / countticks = lldiv(TIMER_TICK_HZ * usec, 1000000);
1000000);
/* decrementing timer */ /* decrementing timer */
timeend = readl(&timer_base->counter) - countticks; timeend = readl(&timer_base->counter) - countticks;

View File

@@ -0,0 +1,17 @@
#
# (C) Copyright 2000-2003
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
#
# SPDX-License-Identifier: GPL-2.0+
#
extra-y := start.o
obj-y += cpu.o
obj-y += generic_timer.o
obj-y += cache_v8.o
obj-y += exceptions.o
obj-y += cache.o
obj-y += tlb.o
obj-y += gic.o
obj-y += transition.o

136
arch/arm/cpu/armv8/cache.S Normal file
View File

@@ -0,0 +1,136 @@
/*
* (C) Copyright 2013
* David Feng <fenghua@phytium.com.cn>
*
* This file is based on sample code from ARMv8 ARM.
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <asm-offsets.h>
#include <config.h>
#include <version.h>
#include <asm/macro.h>
#include <linux/linkage.h>
/*
* void __asm_flush_dcache_level(level)
*
* clean and invalidate one level cache.
*
* x0: cache level
* x1~x9: clobbered
*/
ENTRY(__asm_flush_dcache_level)
lsl x1, x0, #1
msr csselr_el1, x1 /* select cache level */
isb /* sync change of cssidr_el1 */
mrs x6, ccsidr_el1 /* read the new cssidr_el1 */
and x2, x6, #7 /* x2 <- log2(cache line size)-4 */
add x2, x2, #4 /* x2 <- log2(cache line size) */
mov x3, #0x3ff
and x3, x3, x6, lsr #3 /* x3 <- max number of #ways */
add w4, w3, w3
sub w4, w4, 1 /* round up log2(#ways + 1) */
clz w5, w4 /* bit position of #ways */
mov x4, #0x7fff
and x4, x4, x6, lsr #13 /* x4 <- max number of #sets */
/* x1 <- cache level << 1 */
/* x2 <- line length offset */
/* x3 <- number of cache ways - 1 */
/* x4 <- number of cache sets - 1 */
/* x5 <- bit position of #ways */
loop_set:
mov x6, x3 /* x6 <- working copy of #ways */
loop_way:
lsl x7, x6, x5
orr x9, x1, x7 /* map way and level to cisw value */
lsl x7, x4, x2
orr x9, x9, x7 /* map set number to cisw value */
dc cisw, x9 /* clean & invalidate by set/way */
subs x6, x6, #1 /* decrement the way */
b.ge loop_way
subs x4, x4, #1 /* decrement the set */
b.ge loop_set
ret
ENDPROC(__asm_flush_dcache_level)
/*
* void __asm_flush_dcache_all(void)
*
* clean and invalidate all data cache by SET/WAY.
*/
ENTRY(__asm_flush_dcache_all)
dsb sy
mrs x10, clidr_el1 /* read clidr_el1 */
lsr x11, x10, #24
and x11, x11, #0x7 /* x11 <- loc */
cbz x11, finished /* if loc is 0, exit */
mov x15, lr
mov x0, #0 /* start flush at cache level 0 */
/* x0 <- cache level */
/* x10 <- clidr_el1 */
/* x11 <- loc */
/* x15 <- return address */
loop_level:
lsl x1, x0, #1
add x1, x1, x0 /* x0 <- tripled cache level */
lsr x1, x10, x1
and x1, x1, #7 /* x1 <- cache type */
cmp x1, #2
b.lt skip /* skip if no cache or icache */
bl __asm_flush_dcache_level
skip:
add x0, x0, #1 /* increment cache level */
cmp x11, x0
b.gt loop_level
mov x0, #0
msr csselr_el1, x0 /* resotre csselr_el1 */
dsb sy
isb
mov lr, x15
finished:
ret
ENDPROC(__asm_flush_dcache_all)
/*
* void __asm_flush_dcache_range(start, end)
*
* clean & invalidate data cache in the range
*
* x0: start address
* x1: end address
*/
ENTRY(__asm_flush_dcache_range)
mrs x3, ctr_el0
lsr x3, x3, #16
and x3, x3, #0xf
mov x2, #4
lsl x2, x2, x3 /* cache line size */
/* x2 <- minimal cache line size in cache system */
sub x3, x2, #1
bic x0, x0, x3
1: dc civac, x0 /* clean & invalidate data or unified cache */
add x0, x0, x2
cmp x0, x1
b.lo 1b
dsb sy
ret
ENDPROC(__asm_flush_dcache_range)
/*
* void __asm_invalidate_icache_all(void)
*
* invalidate all tlb entries.
*/
ENTRY(__asm_invalidate_icache_all)
ic ialluis
isb sy
ret
ENDPROC(__asm_invalidate_icache_all)

View File

@@ -0,0 +1,219 @@
/*
* (C) Copyright 2013
* David Feng <fenghua@phytium.com.cn>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <asm/system.h>
#include <asm/armv8/mmu.h>
DECLARE_GLOBAL_DATA_PTR;
#ifndef CONFIG_SYS_DCACHE_OFF
static void set_pgtable_section(u64 section, u64 memory_type)
{
u64 *page_table = (u64 *)gd->arch.tlb_addr;
u64 value;
value = (section << SECTION_SHIFT) | PMD_TYPE_SECT | PMD_SECT_AF;
value |= PMD_ATTRINDX(memory_type);
page_table[section] = value;
}
/* to activate the MMU we need to set up virtual memory */
static void mmu_setup(void)
{
int i, j, el;
bd_t *bd = gd->bd;
/* Setup an identity-mapping for all spaces */
for (i = 0; i < (PGTABLE_SIZE >> 3); i++)
set_pgtable_section(i, MT_DEVICE_NGNRNE);
/* Setup an identity-mapping for all RAM space */
for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
ulong start = bd->bi_dram[i].start;
ulong end = bd->bi_dram[i].start + bd->bi_dram[i].size;
for (j = start >> SECTION_SHIFT;
j < end >> SECTION_SHIFT; j++) {
set_pgtable_section(j, MT_NORMAL);
}
}
/* load TTBR0 */
el = current_el();
if (el == 1)
asm volatile("msr ttbr0_el1, %0"
: : "r" (gd->arch.tlb_addr) : "memory");
else if (el == 2)
asm volatile("msr ttbr0_el2, %0"
: : "r" (gd->arch.tlb_addr) : "memory");
else
asm volatile("msr ttbr0_el3, %0"
: : "r" (gd->arch.tlb_addr) : "memory");
/* enable the mmu */
set_sctlr(get_sctlr() | CR_M);
}
/*
* Performs a invalidation of the entire data cache at all levels
*/
void invalidate_dcache_all(void)
{
__asm_flush_dcache_all();
}
/*
* Performs a clean & invalidation of the entire data cache at all levels
*/
void flush_dcache_all(void)
{
__asm_flush_dcache_all();
}
/*
* Invalidates range in all levels of D-cache/unified cache
*/
void invalidate_dcache_range(unsigned long start, unsigned long stop)
{
__asm_flush_dcache_range(start, stop);
}
/*
* Flush range(clean & invalidate) from all levels of D-cache/unified cache
*/
void flush_dcache_range(unsigned long start, unsigned long stop)
{
__asm_flush_dcache_range(start, stop);
}
void dcache_enable(void)
{
/* The data cache is not active unless the mmu is enabled */
if (!(get_sctlr() & CR_M)) {
invalidate_dcache_all();
__asm_invalidate_tlb_all();
mmu_setup();
}
set_sctlr(get_sctlr() | CR_C);
}
void dcache_disable(void)
{
uint32_t sctlr;
sctlr = get_sctlr();
/* if cache isn't enabled no need to disable */
if (!(sctlr & CR_C))
return;
set_sctlr(sctlr & ~(CR_C|CR_M));
flush_dcache_all();
__asm_invalidate_tlb_all();
}
int dcache_status(void)
{
return (get_sctlr() & CR_C) != 0;
}
#else /* CONFIG_SYS_DCACHE_OFF */
void invalidate_dcache_all(void)
{
}
void flush_dcache_all(void)
{
}
void invalidate_dcache_range(unsigned long start, unsigned long stop)
{
}
void flush_dcache_range(unsigned long start, unsigned long stop)
{
}
void dcache_enable(void)
{
}
void dcache_disable(void)
{
}
int dcache_status(void)
{
return 0;
}
#endif /* CONFIG_SYS_DCACHE_OFF */
#ifndef CONFIG_SYS_ICACHE_OFF
void icache_enable(void)
{
set_sctlr(get_sctlr() | CR_I);
}
void icache_disable(void)
{
set_sctlr(get_sctlr() & ~CR_I);
}
int icache_status(void)
{
return (get_sctlr() & CR_I) != 0;
}
void invalidate_icache_all(void)
{
__asm_invalidate_icache_all();
}
#else /* CONFIG_SYS_ICACHE_OFF */
void icache_enable(void)
{
}
void icache_disable(void)
{
}
int icache_status(void)
{
return 0;
}
void invalidate_icache_all(void)
{
}
#endif /* CONFIG_SYS_ICACHE_OFF */
/*
* Enable dCache & iCache, whether cache is actually enabled
* depend on CONFIG_SYS_DCACHE_OFF and CONFIG_SYS_ICACHE_OFF
*/
void enable_caches(void)
{
icache_enable();
dcache_enable();
}
/*
* Flush range from all levels of d-cache/unified-cache
*/
void flush_cache(unsigned long start, unsigned long size)
{
flush_dcache_range(start, start + size);
}

View File

@@ -0,0 +1,15 @@
#
# (C) Copyright 2002
# Gary Jennejohn, DENX Software Engineering, <garyj@denx.de>
#
# SPDX-License-Identifier: GPL-2.0+
#
PLATFORM_RELFLAGS += -fno-common -ffixed-x18
# SEE README.arm-unaligned-accesses
PF_NO_UNALIGNED := $(call cc-option, -mstrict-align)
PLATFORM_NO_UNALIGNED := $(PF_NO_UNALIGNED)
PF_CPPFLAGS_ARMV8 := $(call cc-option, -march=armv8-a)
PLATFORM_CPPFLAGS += $(PF_CPPFLAGS_ARMV8)
PLATFORM_CPPFLAGS += $(PF_NO_UNALIGNED)

43
arch/arm/cpu/armv8/cpu.c Normal file
View File

@@ -0,0 +1,43 @@
/*
* (C) Copyright 2008 Texas Insturments
*
* (C) Copyright 2002
* Sysgo Real-Time Solutions, GmbH <www.elinos.com>
* Marius Groeger <mgroeger@sysgo.de>
*
* (C) Copyright 2002
* Gary Jennejohn, DENX Software Engineering, <garyj@denx.de>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <command.h>
#include <asm/system.h>
#include <linux/compiler.h>
int cleanup_before_linux(void)
{
/*
* this function is called just before we call linux
* it prepares the processor for linux
*
* disable interrupt and turn off caches etc ...
*/
disable_interrupts();
/*
* Turn off I-cache and invalidate it
*/
icache_disable();
invalidate_icache_all();
/*
* turn off D-cache
* dcache_disable() in turn flushes the d-cache and disables MMU
*/
dcache_disable();
invalidate_dcache_all();
return 0;
}

View File

@@ -0,0 +1,113 @@
/*
* (C) Copyright 2013
* David Feng <fenghua@phytium.com.cn>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <asm-offsets.h>
#include <config.h>
#include <version.h>
#include <asm/ptrace.h>
#include <asm/macro.h>
#include <linux/linkage.h>
/*
* Enter Exception.
* This will save the processor state that is ELR/X0~X30
* to the stack frame.
*/
.macro exception_entry
stp x29, x30, [sp, #-16]!
stp x27, x28, [sp, #-16]!
stp x25, x26, [sp, #-16]!
stp x23, x24, [sp, #-16]!
stp x21, x22, [sp, #-16]!
stp x19, x20, [sp, #-16]!
stp x17, x18, [sp, #-16]!
stp x15, x16, [sp, #-16]!
stp x13, x14, [sp, #-16]!
stp x11, x12, [sp, #-16]!
stp x9, x10, [sp, #-16]!
stp x7, x8, [sp, #-16]!
stp x5, x6, [sp, #-16]!
stp x3, x4, [sp, #-16]!
stp x1, x2, [sp, #-16]!
/* Could be running at EL3/EL2/EL1 */
switch_el x11, 3f, 2f, 1f
3: mrs x1, esr_el3
mrs x2, elr_el3
b 0f
2: mrs x1, esr_el2
mrs x2, elr_el2
b 0f
1: mrs x1, esr_el1
mrs x2, elr_el1
0:
stp x2, x0, [sp, #-16]!
mov x0, sp
.endm
/*
* Exception vectors.
*/
.align 11
.globl vectors
vectors:
.align 7
b _do_bad_sync /* Current EL Synchronous Thread */
.align 7
b _do_bad_irq /* Current EL IRQ Thread */
.align 7
b _do_bad_fiq /* Current EL FIQ Thread */
.align 7
b _do_bad_error /* Current EL Error Thread */
.align 7
b _do_sync /* Current EL Synchronous Handler */
.align 7
b _do_irq /* Current EL IRQ Handler */
.align 7
b _do_fiq /* Current EL FIQ Handler */
.align 7
b _do_error /* Current EL Error Handler */
_do_bad_sync:
exception_entry
bl do_bad_sync
_do_bad_irq:
exception_entry
bl do_bad_irq
_do_bad_fiq:
exception_entry
bl do_bad_fiq
_do_bad_error:
exception_entry
bl do_bad_error
_do_sync:
exception_entry
bl do_sync
_do_irq:
exception_entry
bl do_irq
_do_fiq:
exception_entry
bl do_fiq
_do_error:
exception_entry
bl do_error

View File

@@ -0,0 +1,31 @@
/*
* (C) Copyright 2013
* David Feng <fenghua@phytium.com.cn>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <command.h>
#include <asm/system.h>
/*
* Generic timer implementation of get_tbclk()
*/
unsigned long get_tbclk(void)
{
unsigned long cntfrq;
asm volatile("mrs %0, cntfrq_el0" : "=r" (cntfrq));
return cntfrq;
}
/*
* Generic timer implementation of timer_read_counter()
*/
unsigned long timer_read_counter(void)
{
unsigned long cntpct;
isb();
asm volatile("mrs %0, cntpct_el0" : "=r" (cntpct));
return cntpct;
}

106
arch/arm/cpu/armv8/gic.S Normal file
View File

@@ -0,0 +1,106 @@
/*
* GIC Initialization Routines.
*
* (C) Copyright 2013
* David Feng <fenghua@phytium.com.cn>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <asm-offsets.h>
#include <config.h>
#include <linux/linkage.h>
#include <asm/macro.h>
#include <asm/gic.h>
/*************************************************************************
*
* void gic_init(void) __attribute__((weak));
*
* Currently, this routine only initialize secure copy of GIC
* with Security Extensions at EL3.
*
*************************************************************************/
WEAK(gic_init)
branch_if_slave x0, 2f
/* Initialize Distributor and SPIs */
ldr x1, =GICD_BASE
mov w0, #0x3 /* EnableGrp0 | EnableGrp1 */
str w0, [x1, GICD_CTLR] /* Secure GICD_CTLR */
ldr w0, [x1, GICD_TYPER]
and w2, w0, #0x1f /* ITLinesNumber */
cbz w2, 2f /* No SPIs */
add x1, x1, (GICD_IGROUPRn + 4)
mov w0, #~0 /* Config SPIs as Grp1 */
1: str w0, [x1], #0x4
sub w2, w2, #0x1
cbnz w2, 1b
/* Initialize SGIs and PPIs */
2: ldr x1, =GICD_BASE
mov w0, #~0 /* Config SGIs and PPIs as Grp1 */
str w0, [x1, GICD_IGROUPRn] /* GICD_IGROUPR0 */
mov w0, #0x1 /* Enable SGI 0 */
str w0, [x1, GICD_ISENABLERn]
/* Initialize Cpu Interface */
ldr x1, =GICC_BASE
mov w0, #0x1e7 /* Disable IRQ/FIQ Bypass & */
/* Enable Ack Group1 Interrupt & */
/* EnableGrp0 & EnableGrp1 */
str w0, [x1, GICC_CTLR] /* Secure GICC_CTLR */
mov w0, #0x1 << 7 /* Non-Secure access to GICC_PMR */
str w0, [x1, GICC_PMR]
ret
ENDPROC(gic_init)
/*************************************************************************
*
* void gic_send_sgi(u64 sgi) __attribute__((weak));
*
*************************************************************************/
WEAK(gic_send_sgi)
ldr x1, =GICD_BASE
mov w2, #0x8000
movk w2, #0x100, lsl #16
orr w2, w2, w0
str w2, [x1, GICD_SGIR]
ret
ENDPROC(gic_send_sgi)
/*************************************************************************
*
* void wait_for_wakeup(void) __attribute__((weak));
*
* Wait for SGI 0 from master.
*
*************************************************************************/
WEAK(wait_for_wakeup)
ldr x1, =GICC_BASE
0: wfi
ldr w0, [x1, GICC_AIAR]
str w0, [x1, GICC_AEOIR]
cbnz w0, 0b
ret
ENDPROC(wait_for_wakeup)
/*************************************************************************
*
* void smp_kick_all_cpus(void) __attribute__((weak));
*
*************************************************************************/
WEAK(smp_kick_all_cpus)
/* Kick secondary cpus up by SGI 0 interrupt */
mov x0, xzr /* SGI 0 */
mov x29, lr /* Save LR */
bl gic_send_sgi
mov lr, x29 /* Restore LR */
ret
ENDPROC(smp_kick_all_cpus)

164
arch/arm/cpu/armv8/start.S Normal file
View File

@@ -0,0 +1,164 @@
/*
* (C) Copyright 2013
* David Feng <fenghua@phytium.com.cn>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <asm-offsets.h>
#include <config.h>
#include <version.h>
#include <linux/linkage.h>
#include <asm/macro.h>
#include <asm/armv8/mmu.h>
/*************************************************************************
*
* Startup Code (reset vector)
*
*************************************************************************/
.globl _start
_start:
b reset
.align 3
.globl _TEXT_BASE
_TEXT_BASE:
.quad CONFIG_SYS_TEXT_BASE
/*
* These are defined in the linker script.
*/
.globl _end_ofs
_end_ofs:
.quad _end - _start
.globl _bss_start_ofs
_bss_start_ofs:
.quad __bss_start - _start
.globl _bss_end_ofs
_bss_end_ofs:
.quad __bss_end - _start
reset:
/*
* Could be EL3/EL2/EL1, Initial State:
* Little Endian, MMU Disabled, i/dCache Disabled
*/
adr x0, vectors
switch_el x1, 3f, 2f, 1f
3: msr vbar_el3, x0
msr cptr_el3, xzr /* Enable FP/SIMD */
ldr x0, =COUNTER_FREQUENCY
msr cntfrq_el0, x0 /* Initialize CNTFRQ */
b 0f
2: msr vbar_el2, x0
mov x0, #0x33ff
msr cptr_el2, x0 /* Enable FP/SIMD */
b 0f
1: msr vbar_el1, x0
mov x0, #3 << 20
msr cpacr_el1, x0 /* Enable FP/SIMD */
0:
/* Cache/BPB/TLB Invalidate */
bl __asm_flush_dcache_all /* dCache clean&invalidate */
bl __asm_invalidate_icache_all /* iCache invalidate */
bl __asm_invalidate_tlb_all /* invalidate TLBs */
/* Processor specific initialization */
bl lowlevel_init
branch_if_master x0, x1, master_cpu
/*
* Slave CPUs
*/
slave_cpu:
wfe
ldr x1, =CPU_RELEASE_ADDR
ldr x0, [x1]
cbz x0, slave_cpu
br x0 /* branch to the given address */
/*
* Master CPU
*/
master_cpu:
bl _main
/*-----------------------------------------------------------------------*/
WEAK(lowlevel_init)
/* Initialize GIC Secure Bank Status */
mov x29, lr /* Save LR */
bl gic_init
branch_if_master x0, x1, 1f
/*
* Slave should wait for master clearing spin table.
* This sync prevent salves observing incorrect
* value of spin table and jumping to wrong place.
*/
bl wait_for_wakeup
/*
* All processors will enter EL2 and optionally EL1.
*/
bl armv8_switch_to_el2
#ifdef CONFIG_ARMV8_SWITCH_TO_EL1
bl armv8_switch_to_el1
#endif
1:
mov lr, x29 /* Restore LR */
ret
ENDPROC(lowlevel_init)
/*-----------------------------------------------------------------------*/
ENTRY(c_runtime_cpu_setup)
/* If I-cache is enabled invalidate it */
#ifndef CONFIG_SYS_ICACHE_OFF
ic iallu /* I+BTB cache invalidate */
isb sy
#endif
#ifndef CONFIG_SYS_DCACHE_OFF
/*
* Setup MAIR and TCR.
*/
ldr x0, =MEMORY_ATTRIBUTES
ldr x1, =TCR_FLAGS
switch_el x2, 3f, 2f, 1f
3: orr x1, x1, TCR_EL3_IPS_BITS
msr mair_el3, x0
msr tcr_el3, x1
b 0f
2: orr x1, x1, TCR_EL2_IPS_BITS
msr mair_el2, x0
msr tcr_el2, x1
b 0f
1: orr x1, x1, TCR_EL1_IPS_BITS
msr mair_el1, x0
msr tcr_el1, x1
0:
#endif
/* Relocate vBAR */
adr x0, vectors
switch_el x1, 3f, 2f, 1f
3: msr vbar_el3, x0
b 0f
2: msr vbar_el2, x0
b 0f
1: msr vbar_el1, x0
0:
ret
ENDPROC(c_runtime_cpu_setup)

34
arch/arm/cpu/armv8/tlb.S Normal file
View File

@@ -0,0 +1,34 @@
/*
* (C) Copyright 2013
* David Feng <fenghua@phytium.com.cn>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <asm-offsets.h>
#include <config.h>
#include <version.h>
#include <linux/linkage.h>
#include <asm/macro.h>
/*
* void __asm_invalidate_tlb_all(void)
*
* invalidate all tlb entries.
*/
ENTRY(__asm_invalidate_tlb_all)
switch_el x9, 3f, 2f, 1f
3: tlbi alle3
dsb sy
isb
b 0f
2: tlbi alle2
dsb sy
isb
b 0f
1: tlbi vmalle1
dsb sy
isb
0:
ret
ENDPROC(__asm_invalidate_tlb_all)

View File

@@ -0,0 +1,83 @@
/*
* (C) Copyright 2013
* David Feng <fenghua@phytium.com.cn>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <asm-offsets.h>
#include <config.h>
#include <version.h>
#include <linux/linkage.h>
#include <asm/macro.h>
ENTRY(armv8_switch_to_el2)
switch_el x0, 1f, 0f, 0f
0: ret
1:
mov x0, #0x5b1 /* Non-secure EL0/EL1 | HVC | 64bit EL2 */
msr scr_el3, x0
msr cptr_el3, xzr /* Disable coprocessor traps to EL3 */
mov x0, #0x33ff
msr cptr_el2, x0 /* Disable coprocessor traps to EL2 */
/* Initialize SCTLR_EL2 */
msr sctlr_el2, xzr
/* Return to the EL2_SP2 mode from EL3 */
mov x0, sp
msr sp_el2, x0 /* Migrate SP */
mrs x0, vbar_el3
msr vbar_el2, x0 /* Migrate VBAR */
mov x0, #0x3c9
msr spsr_el3, x0 /* EL2_SP2 | D | A | I | F */
msr elr_el3, lr
eret
ENDPROC(armv8_switch_to_el2)
ENTRY(armv8_switch_to_el1)
switch_el x0, 0f, 1f, 0f
0: ret
1:
/* Initialize Generic Timers */
mrs x0, cnthctl_el2
orr x0, x0, #0x3 /* Enable EL1 access to timers */
msr cnthctl_el2, x0
msr cntvoff_el2, x0
mrs x0, cntkctl_el1
orr x0, x0, #0x3 /* Enable EL0 access to timers */
msr cntkctl_el1, x0
/* Initilize MPID/MPIDR registers */
mrs x0, midr_el1
mrs x1, mpidr_el1
msr vpidr_el2, x0
msr vmpidr_el2, x1
/* Disable coprocessor traps */
mov x0, #0x33ff
msr cptr_el2, x0 /* Disable coprocessor traps to EL2 */
msr hstr_el2, xzr /* Disable coprocessor traps to EL2 */
mov x0, #3 << 20
msr cpacr_el1, x0 /* Enable FP/SIMD at EL1 */
/* Initialize HCR_EL2 */
mov x0, #(1 << 31) /* 64bit EL1 */
orr x0, x0, #(1 << 29) /* Disable HVC */
msr hcr_el2, x0
/* SCTLR_EL1 initialization */
mov x0, #0x0800
movk x0, #0x30d0, lsl #16
msr sctlr_el1, x0
/* Return to the EL1_SP1 mode from EL2 */
mov x0, sp
msr sp_el1, x0 /* Migrate SP */
mrs x0, vbar_el2
msr vbar_el1, x0 /* Migrate VBAR */
mov x0, #0x3c5
msr spsr_el2, x0 /* EL1_SP1 | D | A | I | F */
msr elr_el2, lr
eret
ENDPROC(armv8_switch_to_el1)

View File

@@ -0,0 +1,89 @@
/*
* (C) Copyright 2013
* David Feng <fenghua@phytium.com.cn>
*
* (C) Copyright 2002
* Gary Jennejohn, DENX Software Engineering, <garyj@denx.de>
*
* SPDX-License-Identifier: GPL-2.0+
*/
OUTPUT_FORMAT("elf64-littleaarch64", "elf64-littleaarch64", "elf64-littleaarch64")
OUTPUT_ARCH(aarch64)
ENTRY(_start)
SECTIONS
{
. = 0x00000000;
. = ALIGN(8);
.text :
{
*(.__image_copy_start)
CPUDIR/start.o (.text*)
*(.text*)
}
. = ALIGN(8);
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
. = ALIGN(8);
.data : {
*(.data*)
}
. = ALIGN(8);
. = .;
. = ALIGN(8);
.u_boot_list : {
KEEP(*(SORT(.u_boot_list*)));
}
. = ALIGN(8);
.image_copy_end :
{
*(.__image_copy_end)
}
. = ALIGN(8);
.rel_dyn_start :
{
*(.__rel_dyn_start)
}
.rela.dyn : {
*(.rela*)
}
.rel_dyn_end :
{
*(.__rel_dyn_end)
}
_end = .;
. = ALIGN(8);
.bss_start : {
KEEP(*(.__bss_start));
}
.bss : {
*(.bss*)
. = ALIGN(8);
}
.bss_end : {
KEEP(*(.__bss_end));
}
/DISCARD/ : { *(.dynsym) }
/DISCARD/ : { *(.dynstr*) }
/DISCARD/ : { *(.dynamic*) }
/DISCARD/ : { *(.plt*) }
/DISCARD/ : { *(.interp*) }
/DISCARD/ : { *(.gnu*) }
}

View File

@@ -14,3 +14,16 @@ PLATFORM_CPPFLAGS += -mcpu=xscale
# ======================================================================== # ========================================================================
PF_RELFLAGS_SLB_AT := $(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,)) PF_RELFLAGS_SLB_AT := $(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,))
PLATFORM_RELFLAGS += $(PF_RELFLAGS_SLB_AT) PLATFORM_RELFLAGS += $(PF_RELFLAGS_SLB_AT)
#
# !WARNING!
# The PXA's OneNAND SPL uses .text.0 and .text.1 segments to allow booting from
# really small OneNAND memories where the mmap'd window is only 1KiB big. The
# .text.0 contains only the bare minimum needed to load the real SPL into SRAM.
# Add .text.0 and .text.1 into OBJFLAGS, so when the SPL is being objcopy'd,
# they are not discarded.
#
#ifdef CONFIG_SPL_BUILD
OBJCFLAGS += -j .text.0 -j .text.1
#endif

View File

@@ -28,12 +28,12 @@ DECLARE_GLOBAL_DATA_PTR;
static unsigned long long tick_to_time(unsigned long long tick) static unsigned long long tick_to_time(unsigned long long tick)
{ {
return tick * CONFIG_SYS_HZ / TIMER_FREQ_HZ; return lldiv(tick * CONFIG_SYS_HZ, TIMER_FREQ_HZ);
} }
static unsigned long long us_to_tick(unsigned long long us) static unsigned long long us_to_tick(unsigned long long us)
{ {
return (us * TIMER_FREQ_HZ) / 1000000; return lldiv(us * TIMER_FREQ_HZ, 1000000);
} }
int timer_init(void) int timer_init(void)

View File

@@ -92,8 +92,6 @@ SECTIONS
} }
.dynsym _end : { *(.dynsym) } .dynsym _end : { *(.dynsym) }
.hash : { *(.hash) }
.got.plt : { *(.got.plt) }
.dynbss : { *(.dynbss) } .dynbss : { *(.dynbss) }
.dynstr : { *(.dynstr*) } .dynstr : { *(.dynstr*) }
.dynamic : { *(.dynamic*) } .dynamic : { *(.dynamic*) }
@@ -101,4 +99,5 @@ SECTIONS
.interp : { *(.interp*) } .interp : { *(.interp*) }
.gnu : { *(.gnu*) } .gnu : { *(.gnu*) }
.ARM.exidx : { *(.ARM.exidx*) } .ARM.exidx : { *(.ARM.exidx*) }
.gnu.linkonce.armexidx : { *(.gnu.linkonce.armexidx.*) }
} }

View File

@@ -0,0 +1,13 @@
/*
* Xilinx Zynq 7000 DTSI
* Describes the hardware common to all Zynq 7000-based boards.
*
* Copyright (C) 2013 Xilinx, Inc.
*
* SPDX-License-Identifier: GPL-2.0+
*/
/include/ "skeleton.dtsi"
/ {
compatible = "xlnx,zynq-7000";
};

View File

@@ -19,6 +19,7 @@
#define DBSC3_1_BASE 0xE67A0000 #define DBSC3_1_BASE 0xE67A0000
#define TMU_BASE 0xE61E0000 #define TMU_BASE 0xE61E0000
#define GPIO5_BASE 0xE6055000 #define GPIO5_BASE 0xE6055000
#define SH_QSPI_BASE 0xE6B10000
#define S3C_BASE 0xE6784000 #define S3C_BASE 0xE6784000
#define S3C_INT_BASE 0xE6784A00 #define S3C_INT_BASE 0xE6784A00

View File

@@ -19,6 +19,7 @@
#define DBSC3_1_BASE 0xE67A0000 #define DBSC3_1_BASE 0xE67A0000
#define TMU_BASE 0xE61E0000 #define TMU_BASE 0xE61E0000
#define GPIO5_BASE 0xE6055000 #define GPIO5_BASE 0xE6055000
#define SH_QSPI_BASE 0xE6B10000
#define S3C_BASE 0xE6784000 #define S3C_BASE 0xE6784000
#define S3C_INT_BASE 0xE6784A00 #define S3C_INT_BASE 0xE6784A00

View File

@@ -0,0 +1,12 @@
/*
* (C) Copyright 2013 Altera Corporation <www.altera.com>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#ifndef _SOCFPGA_DWMMC_H_
#define _SOCFPGA_DWMMC_H_
extern int socfpga_dwmmc_init(u32 regbase, int bus_width, int index);
#endif /* _SOCFPGA_SDMMC_H_ */

View File

@@ -19,4 +19,69 @@ extern unsigned long sys_mgr_init_table[CONFIG_HPS_PINMUX_NUM];
#define CONFIG_SYSMGR_PINMUXGRP_OFFSET (0x400) #define CONFIG_SYSMGR_PINMUXGRP_OFFSET (0x400)
#define SYSMGR_SDMMC_CTRL_SET(smplsel, drvsel) \
((((drvsel) << 0) & 0x7) | (((smplsel) << 3) & 0x38))
struct socfpga_system_manager {
u32 siliconid1;
u32 siliconid2;
u32 _pad_0x8_0xf[2];
u32 wddbg;
u32 bootinfo;
u32 hpsinfo;
u32 parityinj;
u32 fpgaintfgrp_gbl;
u32 fpgaintfgrp_indiv;
u32 fpgaintfgrp_module;
u32 _pad_0x2c_0x2f;
u32 scanmgrgrp_ctrl;
u32 _pad_0x34_0x3f[3];
u32 frzctrl_vioctrl;
u32 _pad_0x44_0x4f[3];
u32 frzctrl_hioctrl;
u32 frzctrl_src;
u32 frzctrl_hwctrl;
u32 _pad_0x5c_0x5f;
u32 emacgrp_ctrl;
u32 emacgrp_l3master;
u32 _pad_0x68_0x6f[2];
u32 dmagrp_ctrl;
u32 dmagrp_persecurity;
u32 _pad_0x78_0x7f[2];
u32 iswgrp_handoff[8];
u32 _pad_0xa0_0xbf[8];
u32 romcodegrp_ctrl;
u32 romcodegrp_cpu1startaddr;
u32 romcodegrp_initswstate;
u32 romcodegrp_initswlastld;
u32 romcodegrp_bootromswstate;
u32 __pad_0xd4_0xdf[3];
u32 romcodegrp_warmramgrp_enable;
u32 romcodegrp_warmramgrp_datastart;
u32 romcodegrp_warmramgrp_length;
u32 romcodegrp_warmramgrp_execution;
u32 romcodegrp_warmramgrp_crc;
u32 __pad_0xf4_0xff[3];
u32 romhwgrp_ctrl;
u32 _pad_0x104_0x107;
u32 sdmmcgrp_ctrl;
u32 sdmmcgrp_l3master;
u32 nandgrp_bootstrap;
u32 nandgrp_l3master;
u32 usbgrp_l3master;
u32 _pad_0x11c_0x13f[9];
u32 eccgrp_l2;
u32 eccgrp_ocram;
u32 eccgrp_usb0;
u32 eccgrp_usb1;
u32 eccgrp_emac0;
u32 eccgrp_emac1;
u32 eccgrp_dma;
u32 eccgrp_can0;
u32 eccgrp_can1;
u32 eccgrp_nand;
u32 eccgrp_qspi;
u32 eccgrp_sdmmc;
};
#endif /* _SYSTEM_MANAGER_H_ */ #endif /* _SYSTEM_MANAGER_H_ */

View File

@@ -0,0 +1,25 @@
/*
* Copyright (c) 2013 Xilinx, Inc.
*
* SPDX-License-Identifier: GPL-2.0+
*/
#ifndef _ZYNQ_GPIO_H
#define _ZYNQ_GPIO_H
inline int gpio_get_value(unsigned gpio)
{
return 0;
}
inline int gpio_set_value(unsigned gpio, int val)
{
return 0;
}
inline int gpio_request(unsigned gpio, const char *label)
{
return 0;
}
#endif /* _ZYNQ_GPIO_H */

View File

@@ -13,6 +13,7 @@ extern void zynq_slcr_cpu_reset(void);
extern void zynq_slcr_gem_clk_setup(u32 gem_id, u32 rclk, u32 clk); extern void zynq_slcr_gem_clk_setup(u32 gem_id, u32 rclk, u32 clk);
extern void zynq_slcr_devcfg_disable(void); extern void zynq_slcr_devcfg_disable(void);
extern void zynq_slcr_devcfg_enable(void); extern void zynq_slcr_devcfg_enable(void);
extern u32 zynq_slcr_get_boot_mode(void);
extern u32 zynq_slcr_get_idcode(void); extern u32 zynq_slcr_get_idcode(void);
extern void zynq_ddrc_init(void); extern void zynq_ddrc_init(void);

View File

@@ -0,0 +1,111 @@
/*
* (C) Copyright 2013
* David Feng <fenghua@phytium.com.cn>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#ifndef _ASM_ARMV8_MMU_H_
#define _ASM_ARMV8_MMU_H_
#ifdef __ASSEMBLY__
#define _AC(X, Y) X
#else
#define _AC(X, Y) (X##Y)
#endif
#define UL(x) _AC(x, UL)
/***************************************************************/
/*
* The following definitions are related each other, shoud be
* calculated specifically.
*/
#define VA_BITS (42) /* 42 bits virtual address */
/* PAGE_SHIFT determines the page size */
#undef PAGE_SIZE
#define PAGE_SHIFT 16
#define PAGE_SIZE (1 << PAGE_SHIFT)
#define PAGE_MASK (~(PAGE_SIZE-1))
/*
* section address mask and size definitions.
*/
#define SECTION_SHIFT 29
#define SECTION_SIZE (UL(1) << SECTION_SHIFT)
#define SECTION_MASK (~(SECTION_SIZE-1))
/***************************************************************/
/*
* Memory types
*/
#define MT_DEVICE_NGNRNE 0
#define MT_DEVICE_NGNRE 1
#define MT_DEVICE_GRE 2
#define MT_NORMAL_NC 3
#define MT_NORMAL 4
#define MEMORY_ATTRIBUTES ((0x00 << (MT_DEVICE_NGNRNE*8)) | \
(0x04 << (MT_DEVICE_NGNRE*8)) | \
(0x0c << (MT_DEVICE_GRE*8)) | \
(0x44 << (MT_NORMAL_NC*8)) | \
(UL(0xff) << (MT_NORMAL*8)))
/*
* Hardware page table definitions.
*
* Level 2 descriptor (PMD).
*/
#define PMD_TYPE_MASK (3 << 0)
#define PMD_TYPE_FAULT (0 << 0)
#define PMD_TYPE_TABLE (3 << 0)
#define PMD_TYPE_SECT (1 << 0)
/*
* Section
*/
#define PMD_SECT_S (3 << 8)
#define PMD_SECT_AF (1 << 10)
#define PMD_SECT_NG (1 << 11)
#define PMD_SECT_PXN (UL(1) << 53)
#define PMD_SECT_UXN (UL(1) << 54)
/*
* AttrIndx[2:0]
*/
#define PMD_ATTRINDX(t) ((t) << 2)
#define PMD_ATTRINDX_MASK (7 << 2)
/*
* TCR flags.
*/
#define TCR_T0SZ(x) ((64 - (x)) << 0)
#define TCR_IRGN_NC (0 << 8)
#define TCR_IRGN_WBWA (1 << 8)
#define TCR_IRGN_WT (2 << 8)
#define TCR_IRGN_WBNWA (3 << 8)
#define TCR_IRGN_MASK (3 << 8)
#define TCR_ORGN_NC (0 << 10)
#define TCR_ORGN_WBWA (1 << 10)
#define TCR_ORGN_WT (2 << 10)
#define TCR_ORGN_WBNWA (3 << 10)
#define TCR_ORGN_MASK (3 << 10)
#define TCR_SHARED_NON (0 << 12)
#define TCR_SHARED_OUTER (1 << 12)
#define TCR_SHARED_INNER (2 << 12)
#define TCR_TG0_4K (0 << 14)
#define TCR_TG0_64K (1 << 14)
#define TCR_TG0_16K (2 << 14)
#define TCR_EL1_IPS_BITS (UL(3) << 32) /* 42 bits physical address */
#define TCR_EL2_IPS_BITS (3 << 16) /* 42 bits physical address */
#define TCR_EL3_IPS_BITS (3 << 16) /* 42 bits physical address */
/* PTWs cacheable, inner/outer WBWA and non-shareable */
#define TCR_FLAGS (TCR_TG0_64K | \
TCR_SHARED_NON | \
TCR_ORGN_WBWA | \
TCR_IRGN_WBWA | \
TCR_T0SZ(VA_BITS))
#endif /* _ASM_ARMV8_MMU_H_ */

View File

@@ -23,7 +23,7 @@
# define __SWAB_64_THRU_32__ # define __SWAB_64_THRU_32__
#endif #endif
#ifdef __ARMEB__ #if defined(__ARMEB__) || defined(__AARCH64EB__)
#include <linux/byteorder/big_endian.h> #include <linux/byteorder/big_endian.h>
#else #else
#include <linux/byteorder/little_endian.h> #include <linux/byteorder/little_endian.h>

View File

@@ -11,6 +11,8 @@
#include <asm/system.h> #include <asm/system.h>
#ifndef CONFIG_ARM64
/* /*
* Invalidate L2 Cache using co-proc instruction * Invalidate L2 Cache using co-proc instruction
*/ */
@@ -28,6 +30,9 @@ void l2_cache_disable(void);
void set_section_dcache(int section, enum dcache_option option); void set_section_dcache(int section, enum dcache_option option);
void dram_bank_mmu_setup(int bank); void dram_bank_mmu_setup(int bank);
#endif
/* /*
* The current upper bound for ARM L1 data cache line sizes is 64 bytes. We * The current upper bound for ARM L1 data cache line sizes is 64 bytes. We
* use that value for aligning DMA buffers unless the board config has specified * use that value for aligning DMA buffers unless the board config has specified

View File

@@ -9,4 +9,10 @@
#define CONFIG_LMB #define CONFIG_LMB
#define CONFIG_SYS_BOOT_RAMDISK_HIGH #define CONFIG_SYS_BOOT_RAMDISK_HIGH
#ifdef CONFIG_ARM64
#define CONFIG_PHYS_64BIT
#define CONFIG_STATIC_RELA
#endif
#endif #endif

View File

@@ -1,19 +1,54 @@
#ifndef __GIC_V2_H__ #ifndef __GIC_H__
#define __GIC_V2_H__ #define __GIC_H__
/* register offsets for the ARM generic interrupt controller (GIC) */ /* Register offsets for the ARM generic interrupt controller (GIC) */
#define GIC_DIST_OFFSET 0x1000 #define GIC_DIST_OFFSET 0x1000
#define GICD_CTLR 0x0000
#define GICD_TYPER 0x0004
#define GICD_IGROUPRn 0x0080
#define GICD_SGIR 0x0F00
#define GIC_CPU_OFFSET_A9 0x0100 #define GIC_CPU_OFFSET_A9 0x0100
#define GIC_CPU_OFFSET_A15 0x2000 #define GIC_CPU_OFFSET_A15 0x2000
/* Distributor Registers */
#define GICD_CTLR 0x0000
#define GICD_TYPER 0x0004
#define GICD_IIDR 0x0008
#define GICD_STATUSR 0x0010
#define GICD_SETSPI_NSR 0x0040
#define GICD_CLRSPI_NSR 0x0048
#define GICD_SETSPI_SR 0x0050
#define GICD_CLRSPI_SR 0x0058
#define GICD_SEIR 0x0068
#define GICD_IGROUPRn 0x0080
#define GICD_ISENABLERn 0x0100
#define GICD_ICENABLERn 0x0180
#define GICD_ISPENDRn 0x0200
#define GICD_ICPENDRn 0x0280
#define GICD_ISACTIVERn 0x0300
#define GICD_ICACTIVERn 0x0380
#define GICD_IPRIORITYRn 0x0400
#define GICD_ITARGETSRn 0x0800
#define GICD_ICFGR 0x0c00
#define GICD_IGROUPMODRn 0x0d00
#define GICD_NSACRn 0x0e00
#define GICD_SGIR 0x0f00
#define GICD_CPENDSGIRn 0x0f10
#define GICD_SPENDSGIRn 0x0f20
#define GICD_IROUTERn 0x6000
/* Cpu Interface Memory Mapped Registers */
#define GICC_CTLR 0x0000 #define GICC_CTLR 0x0000
#define GICC_PMR 0x0004 #define GICC_PMR 0x0004
#define GICC_BPR 0x0008
#define GICC_IAR 0x000C #define GICC_IAR 0x000C
#define GICC_EOIR 0x0010 #define GICC_EOIR 0x0010
#define GICC_RPR 0x0014
#define GICC_HPPIR 0x0018
#define GICC_ABPR 0x001c
#define GICC_AIAR 0x0020
#define GICC_AEOIR 0x0024
#define GICC_AHPPIR 0x0028
#define GICC_APRn 0x00d0
#define GICC_NSAPRn 0x00e0
#define GICC_IIDR 0x00fc
#define GICC_DIR 0x1000
#endif #endif /* __GIC_H__ */

View File

@@ -47,6 +47,10 @@ struct arch_global_data {
#include <asm-generic/global_data.h> #include <asm-generic/global_data.h>
#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm ("r9") #ifdef CONFIG_ARM64
#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm ("x18")
#else
#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm ("r9")
#endif
#endif /* __ASM_GBL_DATA_H */ #endif /* __ASM_GBL_DATA_H */

View File

@@ -75,42 +75,45 @@ static inline phys_addr_t virt_to_phys(void * vaddr)
#define __arch_putw(v,a) (*(volatile unsigned short *)(a) = (v)) #define __arch_putw(v,a) (*(volatile unsigned short *)(a) = (v))
#define __arch_putl(v,a) (*(volatile unsigned int *)(a) = (v)) #define __arch_putl(v,a) (*(volatile unsigned int *)(a) = (v))
extern inline void __raw_writesb(unsigned int addr, const void *data, int bytelen) extern inline void __raw_writesb(unsigned long addr, const void *data,
int bytelen)
{ {
uint8_t *buf = (uint8_t *)data; uint8_t *buf = (uint8_t *)data;
while(bytelen--) while(bytelen--)
__arch_putb(*buf++, addr); __arch_putb(*buf++, addr);
} }
extern inline void __raw_writesw(unsigned int addr, const void *data, int wordlen) extern inline void __raw_writesw(unsigned long addr, const void *data,
int wordlen)
{ {
uint16_t *buf = (uint16_t *)data; uint16_t *buf = (uint16_t *)data;
while(wordlen--) while(wordlen--)
__arch_putw(*buf++, addr); __arch_putw(*buf++, addr);
} }
extern inline void __raw_writesl(unsigned int addr, const void *data, int longlen) extern inline void __raw_writesl(unsigned long addr, const void *data,
int longlen)
{ {
uint32_t *buf = (uint32_t *)data; uint32_t *buf = (uint32_t *)data;
while(longlen--) while(longlen--)
__arch_putl(*buf++, addr); __arch_putl(*buf++, addr);
} }
extern inline void __raw_readsb(unsigned int addr, void *data, int bytelen) extern inline void __raw_readsb(unsigned long addr, void *data, int bytelen)
{ {
uint8_t *buf = (uint8_t *)data; uint8_t *buf = (uint8_t *)data;
while(bytelen--) while(bytelen--)
*buf++ = __arch_getb(addr); *buf++ = __arch_getb(addr);
} }
extern inline void __raw_readsw(unsigned int addr, void *data, int wordlen) extern inline void __raw_readsw(unsigned long addr, void *data, int wordlen)
{ {
uint16_t *buf = (uint16_t *)data; uint16_t *buf = (uint16_t *)data;
while(wordlen--) while(wordlen--)
*buf++ = __arch_getw(addr); *buf++ = __arch_getw(addr);
} }
extern inline void __raw_readsl(unsigned int addr, void *data, int longlen) extern inline void __raw_readsl(unsigned long addr, void *data, int longlen)
{ {
uint32_t *buf = (uint32_t *)data; uint32_t *buf = (uint32_t *)data;
while(longlen--) while(longlen--)

View File

@@ -54,5 +54,58 @@
bcs 1b bcs 1b
.endm .endm
#ifdef CONFIG_ARM64
/*
* Register aliases.
*/
lr .req x30
/*
* Branch according to exception level
*/
.macro switch_el, xreg, el3_label, el2_label, el1_label
mrs \xreg, CurrentEL
cmp \xreg, 0xc
b.eq \el3_label
cmp \xreg, 0x8
b.eq \el2_label
cmp \xreg, 0x4
b.eq \el1_label
.endm
/*
* Branch if current processor is a slave,
* choose processor with all zero affinity value as the master.
*/
.macro branch_if_slave, xreg, slave_label
mrs \xreg, mpidr_el1
tst \xreg, #0xff /* Test Affinity 0 */
b.ne \slave_label
lsr \xreg, \xreg, #8
tst \xreg, #0xff /* Test Affinity 1 */
b.ne \slave_label
lsr \xreg, \xreg, #8
tst \xreg, #0xff /* Test Affinity 2 */
b.ne \slave_label
lsr \xreg, \xreg, #16
tst \xreg, #0xff /* Test Affinity 3 */
b.ne \slave_label
.endm
/*
* Branch if current processor is a master,
* choose processor with all zero affinity value as the master.
*/
.macro branch_if_master, xreg1, xreg2, master_label
mrs \xreg1, mpidr_el1
lsr \xreg2, \xreg1, #32
lsl \xreg1, \xreg1, #40
lsr \xreg1, \xreg1, #40
orr \xreg1, \xreg1, \xreg2
cbz \xreg1, \master_label
.endm
#endif /* CONFIG_ARM64 */
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#endif /* __ASM_ARM_MACRO_H__ */ #endif /* __ASM_ARM_MACRO_H__ */

View File

@@ -28,9 +28,17 @@ typedef int __kernel_pid_t;
typedef unsigned short __kernel_ipc_pid_t; typedef unsigned short __kernel_ipc_pid_t;
typedef unsigned short __kernel_uid_t; typedef unsigned short __kernel_uid_t;
typedef unsigned short __kernel_gid_t; typedef unsigned short __kernel_gid_t;
#ifdef __aarch64__
typedef unsigned long __kernel_size_t;
typedef long __kernel_ssize_t;
typedef long __kernel_ptrdiff_t;
#else
typedef unsigned int __kernel_size_t; typedef unsigned int __kernel_size_t;
typedef int __kernel_ssize_t; typedef int __kernel_ssize_t;
typedef int __kernel_ptrdiff_t; typedef int __kernel_ptrdiff_t;
#endif
typedef long __kernel_time_t; typedef long __kernel_time_t;
typedef long __kernel_suseconds_t; typedef long __kernel_suseconds_t;
typedef long __kernel_clock_t; typedef long __kernel_clock_t;

View File

@@ -10,6 +10,25 @@
#ifndef __ASM_PROC_PTRACE_H #ifndef __ASM_PROC_PTRACE_H
#define __ASM_PROC_PTRACE_H #define __ASM_PROC_PTRACE_H
#ifdef CONFIG_ARM64
#define PCMASK 0
#ifndef __ASSEMBLY__
/*
* This struct defines the way the registers are stored
* on the stack during an exception.
*/
struct pt_regs {
unsigned long elr;
unsigned long regs[31];
};
#endif /* __ASSEMBLY__ */
#else /* CONFIG_ARM64 */
#define USR26_MODE 0x00 #define USR26_MODE 0x00
#define FIQ26_MODE 0x01 #define FIQ26_MODE 0x01
#define IRQ26_MODE 0x02 #define IRQ26_MODE 0x02
@@ -104,4 +123,6 @@ static inline int valid_user_regs(struct pt_regs *regs)
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#endif /* CONFIG_ARM64 */
#endif #endif

View File

@@ -13,6 +13,60 @@
/* /*
* Save the current interrupt enable state & disable IRQs * Save the current interrupt enable state & disable IRQs
*/ */
#ifdef CONFIG_ARM64
/*
* Save the current interrupt enable state
* and disable IRQs/FIQs
*/
#define local_irq_save(flags) \
({ \
asm volatile( \
"mrs %0, daif" \
"msr daifset, #3" \
: "=r" (flags) \
: \
: "memory"); \
})
/*
* restore saved IRQ & FIQ state
*/
#define local_irq_restore(flags) \
({ \
asm volatile( \
"msr daif, %0" \
: \
: "r" (flags) \
: "memory"); \
})
/*
* Enable IRQs/FIQs
*/
#define local_irq_enable() \
({ \
asm volatile( \
"msr daifclr, #3" \
: \
: \
: "memory"); \
})
/*
* Disable IRQs/FIQs
*/
#define local_irq_disable() \
({ \
asm volatile( \
"msr daifset, #3" \
: \
: \
: "memory"); \
})
#else /* CONFIG_ARM64 */
#define local_irq_save(x) \ #define local_irq_save(x) \
({ \ ({ \
unsigned long temp; \ unsigned long temp; \
@@ -107,7 +161,10 @@
: "r" (x) \ : "r" (x) \
: "memory") : "memory")
#if defined(CONFIG_CPU_SA1100) || defined(CONFIG_CPU_SA110) #endif /* CONFIG_ARM64 */
#if defined(CONFIG_CPU_SA1100) || defined(CONFIG_CPU_SA110) || \
defined(CONFIG_ARM64)
/* /*
* On the StrongARM, "swp" is terminally broken since it bypasses the * On the StrongARM, "swp" is terminally broken since it bypasses the
* cache totally. This means that the cache becomes inconsistent, and, * cache totally. This means that the cache becomes inconsistent, and,

View File

@@ -1,6 +1,86 @@
#ifndef __ASM_ARM_SYSTEM_H #ifndef __ASM_ARM_SYSTEM_H
#define __ASM_ARM_SYSTEM_H #define __ASM_ARM_SYSTEM_H
#ifdef CONFIG_ARM64
/*
* SCTLR_EL1/SCTLR_EL2/SCTLR_EL3 bits definitions
*/
#define CR_M (1 << 0) /* MMU enable */
#define CR_A (1 << 1) /* Alignment abort enable */
#define CR_C (1 << 2) /* Dcache enable */
#define CR_SA (1 << 3) /* Stack Alignment Check Enable */
#define CR_I (1 << 12) /* Icache enable */
#define CR_WXN (1 << 19) /* Write Permision Imply XN */
#define CR_EE (1 << 25) /* Exception (Big) Endian */
#define PGTABLE_SIZE (0x10000)
#ifndef __ASSEMBLY__
#define isb() \
({asm volatile( \
"isb" : : : "memory"); \
})
#define wfi() \
({asm volatile( \
"wfi" : : : "memory"); \
})
static inline unsigned int current_el(void)
{
unsigned int el;
asm volatile("mrs %0, CurrentEL" : "=r" (el) : : "cc");
return el >> 2;
}
static inline unsigned int get_sctlr(void)
{
unsigned int el, val;
el = current_el();
if (el == 1)
asm volatile("mrs %0, sctlr_el1" : "=r" (val) : : "cc");
else if (el == 2)
asm volatile("mrs %0, sctlr_el2" : "=r" (val) : : "cc");
else
asm volatile("mrs %0, sctlr_el3" : "=r" (val) : : "cc");
return val;
}
static inline void set_sctlr(unsigned int val)
{
unsigned int el;
el = current_el();
if (el == 1)
asm volatile("msr sctlr_el1, %0" : : "r" (val) : "cc");
else if (el == 2)
asm volatile("msr sctlr_el2, %0" : : "r" (val) : "cc");
else
asm volatile("msr sctlr_el3, %0" : : "r" (val) : "cc");
asm volatile("isb");
}
void __asm_flush_dcache_all(void);
void __asm_flush_dcache_range(u64 start, u64 end);
void __asm_invalidate_tlb_all(void);
void __asm_invalidate_icache_all(void);
void armv8_switch_to_el2(void);
void armv8_switch_to_el1(void);
void gic_init(void);
void gic_send_sgi(unsigned long sgino);
void wait_for_wakeup(void);
void smp_kick_all_cpus(void);
#endif /* __ASSEMBLY__ */
#else /* CONFIG_ARM64 */
#ifdef __KERNEL__ #ifdef __KERNEL__
#define CPU_ARCH_UNKNOWN 0 #define CPU_ARCH_UNKNOWN 0
@@ -45,6 +125,8 @@
#define CR_AFE (1 << 29) /* Access flag enable */ #define CR_AFE (1 << 29) /* Access flag enable */
#define CR_TE (1 << 30) /* Thumb exception enable */ #define CR_TE (1 << 30) /* Thumb exception enable */
#define PGTABLE_SIZE (4096 * 4)
/* /*
* This is used to ensure the compiler did actually allocate the register we * This is used to ensure the compiler did actually allocate the register we
* asked it for some inline assembly sequences. Apparently we can't trust * asked it for some inline assembly sequences. Apparently we can't trust
@@ -132,4 +214,6 @@ void mmu_page_table_flush(unsigned long start, unsigned long stop);
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif /* CONFIG_ARM64 */
#endif #endif

View File

@@ -39,7 +39,11 @@ typedef unsigned int u32;
typedef signed long long s64; typedef signed long long s64;
typedef unsigned long long u64; typedef unsigned long long u64;
#ifdef CONFIG_ARM64
#define BITS_PER_LONG 64
#else /* CONFIG_ARM64 */
#define BITS_PER_LONG 32 #define BITS_PER_LONG 32
#endif /* CONFIG_ARM64 */
/* Dma addresses are 32-bits wide. */ /* Dma addresses are 32-bits wide. */

View File

@@ -44,6 +44,10 @@ typedef struct bd_info {
#endif /* !CONFIG_SYS_GENERIC_BOARD */ #endif /* !CONFIG_SYS_GENERIC_BOARD */
/* For image.h:image_check_target_arch() */ /* For image.h:image_check_target_arch() */
#ifndef CONFIG_ARM64
#define IH_ARCH_DEFAULT IH_ARCH_ARM #define IH_ARCH_DEFAULT IH_ARCH_ARM
#else
#define IH_ARCH_DEFAULT IH_ARCH_ARM64
#endif
#endif /* _U_BOOT_H_ */ #endif /* _U_BOOT_H_ */

View File

@@ -8,7 +8,7 @@
/* /*
* Select endianness * Select endianness
*/ */
#ifndef __ARMEB__ #if __BYTE_ORDER == __LITTLE_ENDIAN
#define get_unaligned __get_unaligned_le #define get_unaligned __get_unaligned_le
#define put_unaligned __put_unaligned_le #define put_unaligned __put_unaligned_le
#else #else

View File

@@ -17,14 +17,22 @@ lib-y += _umodsi3.o
lib-y += div0.o lib-y += div0.o
endif endif
obj-y += crt0.o ifdef CONFIG_ARM64
obj-y += crt0_64.o
else
obj-y += crt0.o
endif
ifndef CONFIG_SPL_BUILD ifndef CONFIG_SPL_BUILD
obj-y += relocate.o ifdef CONFIG_ARM64
obj-y += relocate_64.o
else
obj-y += relocate.o
endif
ifndef CONFIG_SYS_GENERIC_BOARD ifndef CONFIG_SYS_GENERIC_BOARD
obj-y += board.o obj-y += board.o
endif endif
obj-y += sections.o obj-y += sections.o
obj-$(CONFIG_OF_LIBFDT) += bootm-fdt.o obj-$(CONFIG_OF_LIBFDT) += bootm-fdt.o
obj-$(CONFIG_CMD_BOOTM) += bootm.o obj-$(CONFIG_CMD_BOOTM) += bootm.o
@@ -35,11 +43,17 @@ else
obj-$(CONFIG_SPL_FRAMEWORK) += spl.o obj-$(CONFIG_SPL_FRAMEWORK) += spl.o
endif endif
ifdef CONFIG_ARM64
obj-y += interrupts_64.o
else
obj-y += interrupts.o obj-y += interrupts.o
endif
obj-y += reset.o obj-y += reset.o
obj-y += cache.o obj-y += cache.o
ifndef CONFIG_ARM64
obj-y += cache-cp15.o obj-y += cache-cp15.o
endif
# For EABI conformant tool chains, provide eabi_compat() # For EABI conformant tool chains, provide eabi_compat()
ifneq (,$(findstring -mabi=aapcs-linux,$(PLATFORM_CPPFLAGS))) ifneq (,$(findstring -mabi=aapcs-linux,$(PLATFORM_CPPFLAGS)))

View File

@@ -344,7 +344,7 @@ void board_init_f(ulong bootflag)
#if !(defined(CONFIG_SYS_ICACHE_OFF) && defined(CONFIG_SYS_DCACHE_OFF)) #if !(defined(CONFIG_SYS_ICACHE_OFF) && defined(CONFIG_SYS_DCACHE_OFF))
/* reserve TLB table */ /* reserve TLB table */
gd->arch.tlb_size = 4096 * 4; gd->arch.tlb_size = PGTABLE_SIZE;
addr -= gd->arch.tlb_size; addr -= gd->arch.tlb_size;
/* round down to next 64 kB limit */ /* round down to next 64 kB limit */
@@ -419,6 +419,7 @@ void board_init_f(ulong bootflag)
} }
#endif #endif
#ifndef CONFIG_ARM64
/* setup stackpointer for exeptions */ /* setup stackpointer for exeptions */
gd->irq_sp = addr_sp; gd->irq_sp = addr_sp;
#ifdef CONFIG_USE_IRQ #ifdef CONFIG_USE_IRQ
@@ -431,6 +432,10 @@ void board_init_f(ulong bootflag)
/* 8-byte alignment for ABI compliance */ /* 8-byte alignment for ABI compliance */
addr_sp &= ~0x07; addr_sp &= ~0x07;
#else /* CONFIG_ARM64 */
/* 16-byte alignment for ABI compliance */
addr_sp &= ~0x0f;
#endif /* CONFIG_ARM64 */
#else #else
addr_sp += 128; /* leave 32 words for abort-stack */ addr_sp += 128; /* leave 32 words for abort-stack */
gd->irq_sp = addr_sp; gd->irq_sp = addr_sp;

View File

@@ -196,6 +196,14 @@ static void do_nonsec_virt_switch(void)
debug("entered non-secure state\n"); debug("entered non-secure state\n");
#endif #endif
#endif #endif
#ifdef CONFIG_ARM64
smp_kick_all_cpus();
armv8_switch_to_el2();
#ifdef CONFIG_ARMV8_SWITCH_TO_EL1
armv8_switch_to_el1();
#endif
#endif
} }
/* Subcommand: PREP */ /* Subcommand: PREP */
@@ -240,6 +248,21 @@ static void boot_prep_linux(bootm_headers_t *images)
/* Subcommand: GO */ /* Subcommand: GO */
static void boot_jump_linux(bootm_headers_t *images, int flag) static void boot_jump_linux(bootm_headers_t *images, int flag)
{ {
#ifdef CONFIG_ARM64
void (*kernel_entry)(void *fdt_addr);
int fake = (flag & BOOTM_STATE_OS_FAKE_GO);
kernel_entry = (void (*)(void *fdt_addr))images->ep;
debug("## Transferring control to Linux (at address %lx)...\n",
(ulong) kernel_entry);
bootstage_mark(BOOTSTAGE_ID_RUN_OS);
announce_and_cleanup(fake);
if (!fake)
kernel_entry(images->ft_addr);
#else
unsigned long machid = gd->bd->bi_arch_number; unsigned long machid = gd->bd->bi_arch_number;
char *s; char *s;
void (*kernel_entry)(int zero, int arch, uint params); void (*kernel_entry)(int zero, int arch, uint params);
@@ -266,6 +289,7 @@ static void boot_jump_linux(bootm_headers_t *images, int flag)
if (!fake) if (!fake)
kernel_entry(0, machid, r2); kernel_entry(0, machid, r2);
#endif
} }
/* Main Entry point for arm bootm implementation /* Main Entry point for arm bootm implementation
@@ -326,3 +350,26 @@ int bootz_setup(ulong image, ulong *start, ulong *end)
} }
#endif /* CONFIG_CMD_BOOTZ */ #endif /* CONFIG_CMD_BOOTZ */
#if defined(CONFIG_BOOTM_VXWORKS)
void boot_prep_vxworks(bootm_headers_t *images)
{
#if defined(CONFIG_OF_LIBFDT)
int off;
if (images->ft_addr) {
off = fdt_path_offset(images->ft_addr, "/memory");
if (off < 0) {
if (arch_fixup_memory_node(images->ft_addr))
puts("## WARNING: fixup memory failed!\n");
}
}
#endif
cleanup_before_linux();
}
void boot_jump_vxworks(bootm_headers_t *images)
{
/* ARM VxWorks requires device tree physical address to be passed */
((void (*)(void *))images->ep)(images->ft_addr);
}
#endif

View File

@@ -67,7 +67,7 @@ ENTRY(_main)
ldr sp, =(CONFIG_SYS_INIT_SP_ADDR) ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
#endif #endif
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */ bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
sub sp, #GD_SIZE /* allocate one GD above SP */ sub sp, sp, #GD_SIZE /* allocate one GD above SP */
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */ bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
mov r9, sp /* GD is above SP */ mov r9, sp /* GD is above SP */
mov r0, #0 mov r0, #0

113
arch/arm/lib/crt0_64.S Normal file
View File

@@ -0,0 +1,113 @@
/*
* crt0 - C-runtime startup Code for AArch64 U-Boot
*
* (C) Copyright 2013
* David Feng <fenghua@phytium.com.cn>
*
* (C) Copyright 2012
* Albert ARIBAUD <albert.u.boot@aribaud.net>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <config.h>
#include <asm-offsets.h>
#include <asm/macro.h>
#include <linux/linkage.h>
/*
* This file handles the target-independent stages of the U-Boot
* start-up where a C runtime environment is needed. Its entry point
* is _main and is branched into from the target's start.S file.
*
* _main execution sequence is:
*
* 1. Set up initial environment for calling board_init_f().
* This environment only provides a stack and a place to store
* the GD ('global data') structure, both located in some readily
* available RAM (SRAM, locked cache...). In this context, VARIABLE
* global data, initialized or not (BSS), are UNAVAILABLE; only
* CONSTANT initialized data are available.
*
* 2. Call board_init_f(). This function prepares the hardware for
* execution from system RAM (DRAM, DDR...) As system RAM may not
* be available yet, , board_init_f() must use the current GD to
* store any data which must be passed on to later stages. These
* data include the relocation destination, the future stack, and
* the future GD location.
*
* (the following applies only to non-SPL builds)
*
* 3. Set up intermediate environment where the stack and GD are the
* ones allocated by board_init_f() in system RAM, but BSS and
* initialized non-const data are still not available.
*
* 4. Call relocate_code(). This function relocates U-Boot from its
* current location into the relocation destination computed by
* board_init_f().
*
* 5. Set up final environment for calling board_init_r(). This
* environment has BSS (initialized to 0), initialized non-const
* data (initialized to their intended value), and stack in system
* RAM. GD has retained values set by board_init_f(). Some CPUs
* have some work left to do at this point regarding memory, so
* call c_runtime_cpu_setup.
*
* 6. Branch to board_init_r().
*/
ENTRY(_main)
/*
* Set up initial C runtime environment and call board_init_f(0).
*/
ldr x0, =(CONFIG_SYS_INIT_SP_ADDR)
sub x0, x0, #GD_SIZE /* allocate one GD above SP */
bic sp, x0, #0xf /* 16-byte alignment for ABI compliance */
mov x18, sp /* GD is above SP */
mov x0, #0
bl board_init_f
/*
* Set up intermediate environment (new sp and gd) and call
* relocate_code(addr_moni). Trick here is that we'll return
* 'here' but relocated.
*/
ldr x0, [x18, #GD_START_ADDR_SP] /* x0 <- gd->start_addr_sp */
bic sp, x0, #0xf /* 16-byte alignment for ABI compliance */
ldr x18, [x18, #GD_BD] /* x18 <- gd->bd */
sub x18, x18, #GD_SIZE /* new GD is below bd */
adr lr, relocation_return
ldr x9, [x18, #GD_RELOC_OFF] /* x9 <- gd->reloc_off */
add lr, lr, x9 /* new return address after relocation */
ldr x0, [x18, #GD_RELOCADDR] /* x0 <- gd->relocaddr */
b relocate_code
relocation_return:
/*
* Set up final (full) environment
*/
bl c_runtime_cpu_setup /* still call old routine */
/*
* Clear BSS section
*/
ldr x0, =__bss_start /* this is auto-relocated! */
ldr x1, =__bss_end /* this is auto-relocated! */
mov x2, #0
clear_loop:
str x2, [x0]
add x0, x0, #8
cmp x0, x1
b.lo clear_loop
/* call board_init_r(gd_t *id, ulong dest_addr) */
mov x0, x18 /* gd_t */
ldr x1, [x18, #GD_RELOCADDR] /* dest_addr */
b board_init_r /* PC relative jump */
/* NOTREACHED - board_init_r() does not return */
ENDPROC(_main)

View File

@@ -0,0 +1,120 @@
/*
* (C) Copyright 2013
* David Feng <fenghua@phytium.com.cn>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <linux/compiler.h>
int interrupt_init(void)
{
return 0;
}
void enable_interrupts(void)
{
return;
}
int disable_interrupts(void)
{
return 0;
}
void show_regs(struct pt_regs *regs)
{
int i;
printf("ELR: %lx\n", regs->elr);
printf("LR: %lx\n", regs->regs[30]);
for (i = 0; i < 29; i += 2)
printf("x%-2d: %016lx x%-2d: %016lx\n",
i, regs->regs[i], i+1, regs->regs[i+1]);
printf("\n");
}
/*
* do_bad_sync handles the impossible case in the Synchronous Abort vector.
*/
void do_bad_sync(struct pt_regs *pt_regs, unsigned int esr)
{
printf("Bad mode in \"Synchronous Abort\" handler, esr 0x%08x\n", esr);
show_regs(pt_regs);
panic("Resetting CPU ...\n");
}
/*
* do_bad_irq handles the impossible case in the Irq vector.
*/
void do_bad_irq(struct pt_regs *pt_regs, unsigned int esr)
{
printf("Bad mode in \"Irq\" handler, esr 0x%08x\n", esr);
show_regs(pt_regs);
panic("Resetting CPU ...\n");
}
/*
* do_bad_fiq handles the impossible case in the Fiq vector.
*/
void do_bad_fiq(struct pt_regs *pt_regs, unsigned int esr)
{
printf("Bad mode in \"Fiq\" handler, esr 0x%08x\n", esr);
show_regs(pt_regs);
panic("Resetting CPU ...\n");
}
/*
* do_bad_error handles the impossible case in the Error vector.
*/
void do_bad_error(struct pt_regs *pt_regs, unsigned int esr)
{
printf("Bad mode in \"Error\" handler, esr 0x%08x\n", esr);
show_regs(pt_regs);
panic("Resetting CPU ...\n");
}
/*
* do_sync handles the Synchronous Abort exception.
*/
void do_sync(struct pt_regs *pt_regs, unsigned int esr)
{
printf("\"Synchronous Abort\" handler, esr 0x%08x\n", esr);
show_regs(pt_regs);
panic("Resetting CPU ...\n");
}
/*
* do_irq handles the Irq exception.
*/
void do_irq(struct pt_regs *pt_regs, unsigned int esr)
{
printf("\"Irq\" handler, esr 0x%08x\n", esr);
show_regs(pt_regs);
panic("Resetting CPU ...\n");
}
/*
* do_fiq handles the Fiq exception.
*/
void do_fiq(struct pt_regs *pt_regs, unsigned int esr)
{
printf("\"Fiq\" handler, esr 0x%08x\n", esr);
show_regs(pt_regs);
panic("Resetting CPU ...\n");
}
/*
* do_error handles the Error exception.
* Errors are more likely to be processor specific,
* it is defined with weak attribute and can be redefined
* in processor specific code.
*/
void __weak do_error(struct pt_regs *pt_regs, unsigned int esr)
{
printf("\"Error\" handler, esr 0x%08x\n", esr);
show_regs(pt_regs);
panic("Resetting CPU ...\n");
}

View File

@@ -0,0 +1,58 @@
/*
* relocate - common relocation function for AArch64 U-Boot
*
* (C) Copyright 2013
* Albert ARIBAUD <albert.u.boot@aribaud.net>
* David Feng <fenghua@phytium.com.cn>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <asm-offsets.h>
#include <config.h>
#include <linux/linkage.h>
/*
* void relocate_code (addr_moni)
*
* This function relocates the monitor code.
* x0 holds the destination address.
*/
ENTRY(relocate_code)
/*
* Copy u-boot from flash to RAM
*/
ldr x1, =__image_copy_start /* x1 <- SRC &__image_copy_start */
subs x9, x0, x1 /* x9 <- relocation offset */
b.eq relocate_done /* skip relocation */
ldr x2, =__image_copy_end /* x2 <- SRC &__image_copy_end */
copy_loop:
ldp x10, x11, [x1], #16 /* copy from source address [x1] */
stp x10, x11, [x0], #16 /* copy to target address [x0] */
cmp x1, x2 /* until source end address [x2] */
b.lo copy_loop
/*
* Fix .rela.dyn relocations
*/
ldr x2, =__rel_dyn_start /* x2 <- SRC &__rel_dyn_start */
ldr x3, =__rel_dyn_end /* x3 <- SRC &__rel_dyn_end */
fixloop:
ldp x0, x1, [x2], #16 /* (x0,x1) <- (SRC location, fixup) */
ldr x4, [x2], #8 /* x4 <- addend */
and x1, x1, #0xffffffff
cmp x1, #1027 /* relative fixup? */
bne fixnext
/* relative fix: store addend plus offset at dest location */
add x0, x0, x9
add x4, x4, x9
str x4, [x0]
fixnext:
cmp x2, x3
b.lo fixloop
relocate_done:
ret
ENDPROC(relocate_code)

View File

@@ -14,9 +14,9 @@ CONFIG_BFIN_CPU := \
$(shell awk '$$2 == "CONFIG_BFIN_CPU" { print $$3 }' \ $(shell awk '$$2 == "CONFIG_BFIN_CPU" { print $$3 }' \
$(src)include/configs/$(BOARD).h) $(src)include/configs/$(BOARD).h)
else else
CONFIG_BFIN_CPU := $(strip $(subst ",,$(CONFIG_BFIN_CPU))) CONFIG_BFIN_CPU := $(strip $(CONFIG_BFIN_CPU:"%"=%))
endif endif
CONFIG_BFIN_BOOT_MODE := $(strip $(subst ",,$(CONFIG_BFIN_BOOT_MODE))) CONFIG_BFIN_BOOT_MODE := $(strip $(CONFIG_BFIN_BOOT_MODE:"%"=%))
PLATFORM_RELFLAGS += -ffixed-P3 -fomit-frame-pointer -mno-fdpic PLATFORM_RELFLAGS += -ffixed-P3 -fomit-frame-pointer -mno-fdpic
PLATFORM_CPPFLAGS += -DCONFIG_BLACKFIN PLATFORM_CPPFLAGS += -DCONFIG_BLACKFIN

View File

@@ -18,8 +18,6 @@
#include <asm/mach-common/bits/core.h> #include <asm/mach-common/bits/core.h>
#include <asm/serial.h> #include <asm/serial.h>
#define BUG() while (1) asm volatile("emuexcpt;");
#ifndef __ADSPBF60x__ #ifndef __ADSPBF60x__
#include <asm/mach-common/bits/ebiu.h> #include <asm/mach-common/bits/ebiu.h>
#include <asm/mach-common/bits/pll.h> #include <asm/mach-common/bits/pll.h>
@@ -147,8 +145,6 @@ static struct ddr_config ddr_config_table[] = {
__attribute__((always_inline)) __attribute__((always_inline))
static inline void serial_init(void) static inline void serial_init(void)
{ {
uint32_t uart_base = UART_BASE;
#if defined(__ADSPBF54x__) || defined(__ADSPBF60x__) #if defined(__ADSPBF54x__) || defined(__ADSPBF60x__)
# ifdef BFIN_BOOT_UART_USE_RTS # ifdef BFIN_BOOT_UART_USE_RTS
# define BFIN_UART_USE_RTS 1 # define BFIN_UART_USE_RTS 1
@@ -156,6 +152,7 @@ static inline void serial_init(void)
# define BFIN_UART_USE_RTS 0 # define BFIN_UART_USE_RTS 0
# endif # endif
if (BFIN_UART_USE_RTS && CONFIG_BFIN_BOOT_MODE == BFIN_BOOT_UART) { if (BFIN_UART_USE_RTS && CONFIG_BFIN_BOOT_MODE == BFIN_BOOT_UART) {
uint32_t uart_base = UART_BASE;
size_t i; size_t i;
/* force RTS rather than relying on auto RTS */ /* force RTS rather than relying on auto RTS */
@@ -195,8 +192,8 @@ static inline void serial_init(void)
#if CONFIG_BFIN_BOOT_MODE != BFIN_BOOT_BYPASS #if CONFIG_BFIN_BOOT_MODE != BFIN_BOOT_BYPASS
if (BFIN_DEBUG_EARLY_SERIAL) { if (BFIN_DEBUG_EARLY_SERIAL) {
serial_early_init(uart_base); serial_early_init(UART_BASE);
serial_early_set_baud(uart_base, CONFIG_BAUDRATE); serial_early_set_baud(UART_BASE, CONFIG_BAUDRATE);
} }
#endif #endif
} }
@@ -547,7 +544,7 @@ maybe_self_refresh(ADI_BOOT_DATA *bs)
__attribute__((always_inline)) static inline u16 __attribute__((always_inline)) static inline u16
program_clocks(ADI_BOOT_DATA *bs, bool put_into_srfs) program_clocks(ADI_BOOT_DATA *bs, bool put_into_srfs)
{ {
u16 vr_ctl; u16 vr_ctl = 0;
serial_putc('a'); serial_putc('a');
@@ -731,6 +728,8 @@ update_serial_clocks(ADI_BOOT_DATA *bs, uint sdivB, uint divB, uint vcoB)
serial_putc('a'); serial_putc('a');
if (BFIN_DEBUG_EARLY_SERIAL ||
CONFIG_BFIN_BOOT_MODE == BFIN_BOOT_UART) {
#ifdef __ADSPBF60x__ #ifdef __ADSPBF60x__
sdivR = bfin_read_CGU_DIV(); sdivR = bfin_read_CGU_DIV();
sdivR = ((sdivR >> 8) & 0x1f) * ((sdivR >> 5) & 0x7); sdivR = ((sdivR >> 8) & 0x1f) * ((sdivR >> 5) & 0x7);
@@ -744,6 +743,8 @@ update_serial_clocks(ADI_BOOT_DATA *bs, uint sdivB, uint divB, uint vcoB)
divisor = vcoB * sdivR; divisor = vcoB * sdivR;
quotient = early_division(dividend, divisor); quotient = early_division(dividend, divisor);
serial_early_put_div(quotient - ANOMALY_05000230); serial_early_put_div(quotient - ANOMALY_05000230);
}
serial_putc('c'); serial_putc('c');
} }
@@ -913,7 +914,8 @@ check_hibernation(ADI_BOOT_DATA *bs, u16 vr_ctl, bool put_into_srfs)
continue; continue;
serial_putc('z'); serial_putc('z');
uint32_t *hibernate_magic = bfin_read32(DPM0_RESTORE4); uint32_t *hibernate_magic =
(uint32_t *)bfin_read32(DPM0_RESTORE4);
SSYNC(); /* make sure memory controller is done */ SSYNC(); /* make sure memory controller is done */
if (hibernate_magic[0] == 0xDEADBEEF) { if (hibernate_magic[0] == 0xDEADBEEF) {
serial_putc('c'); serial_putc('c');

View File

@@ -81,6 +81,8 @@ extern void blackfin_dcache_flush_invalidate_range(const void *, const void *);
# define NOP_PAD_ANOMALY_05000198 # define NOP_PAD_ANOMALY_05000198
#endif #endif
#define BFIN_BUG() while (1) asm volatile("emuexcpt;");
#define _bfin_readX(addr, size, asm_size, asm_ext) ({ \ #define _bfin_readX(addr, size, asm_size, asm_ext) ({ \
u32 __v; \ u32 __v; \
__asm__ __volatile__( \ __asm__ __volatile__( \
@@ -111,7 +113,7 @@ extern void blackfin_dcache_flush_invalidate_range(const void *, const void *);
sizeof(*(addr)) == 1 ? bfin_read8(addr) : \ sizeof(*(addr)) == 1 ? bfin_read8(addr) : \
sizeof(*(addr)) == 2 ? bfin_read16(addr) : \ sizeof(*(addr)) == 2 ? bfin_read16(addr) : \
sizeof(*(addr)) == 4 ? bfin_read32(addr) : \ sizeof(*(addr)) == 4 ? bfin_read32(addr) : \
({ BUG(); 0; }); \ ({ BFIN_BUG(); 0; }); \
}) })
#define bfin_write(addr, val) \ #define bfin_write(addr, val) \
do { \ do { \
@@ -119,7 +121,8 @@ do { \
case 1: bfin_write8(addr, val); break; \ case 1: bfin_write8(addr, val); break; \
case 2: bfin_write16(addr, val); break; \ case 2: bfin_write16(addr, val); break; \
case 4: bfin_write32(addr, val); break; \ case 4: bfin_write32(addr, val); break; \
default: BUG(); \ default: \
BFIN_BUG(); \
} \ } \
} while (0) } while (0)

View File

@@ -19,6 +19,7 @@
#include <net.h> #include <net.h>
#include <status_led.h> #include <status_led.h>
#include <version.h> #include <version.h>
#include <watchdog.h>
#include <asm/cplb.h> #include <asm/cplb.h>
#include <asm/mach-common/bits/mpu.h> #include <asm/mach-common/bits/mpu.h>

View File

@@ -36,7 +36,10 @@ u_long get_vco(void)
u_long get_cclk(void) u_long get_cclk(void)
{ {
static u_long cached_cclk_pll_div, cached_cclk; static u_long cached_cclk_pll_div, cached_cclk;
u_long div, csel, ssel; u_long div, csel;
#ifndef CGU_DIV
u_long ssel;
#endif
if (pll_is_bypassed()) if (pll_is_bypassed())
return CONFIG_CLKIN_HZ; return CONFIG_CLKIN_HZ;

View File

@@ -9,8 +9,9 @@ CROSS_COMPILE ?= ppc_8xx-
CONFIG_STANDALONE_LOAD_ADDR ?= 0x40000 CONFIG_STANDALONE_LOAD_ADDR ?= 0x40000
LDFLAGS_FINAL += --gc-sections LDFLAGS_FINAL += --gc-sections
PLATFORM_RELFLAGS += -fpic -mrelocatable -ffunction-sections -fdata-sections PLATFORM_RELFLAGS += -fpic -mrelocatable -ffunction-sections -fdata-sections \
PLATFORM_CPPFLAGS += -DCONFIG_PPC -D__powerpc__ -meabi
PLATFORM_CPPFLAGS += -DCONFIG_PPC -D__powerpc__ -ffixed-r2
PLATFORM_LDFLAGS += -n PLATFORM_LDFLAGS += -n
# Support generic board on PPC # Support generic board on PPC

View File

@@ -5,6 +5,4 @@
# SPDX-License-Identifier: GPL-2.0+ # SPDX-License-Identifier: GPL-2.0+
# #
PLATFORM_RELFLAGS += -meabi PLATFORM_CPPFLAGS += -DCONFIG_74xx_7xx -mstring
PLATFORM_CPPFLAGS += -DCONFIG_74xx_7xx -ffixed-r2 -mstring

View File

@@ -1,3 +1,3 @@
ifneq ($(filter mpc83xx mpc85xx mpc86xx,$(CPU)),) obj-$(CONFIG_MPC83xx) += mpc8xxx/
obj-y += mpc8xxx/ obj-$(CONFIG_MPC85xx) += mpc8xxx/
endif obj-$(CONFIG_MPC86xx) += mpc8xxx/

View File

@@ -4,7 +4,4 @@
# SPDX-License-Identifier: GPL-2.0+ # SPDX-License-Identifier: GPL-2.0+
# #
PLATFORM_RELFLAGS += -meabi PLATFORM_CPPFLAGS += -DCONFIG_MPC512X -DCONFIG_E300 -msoft-float -mcpu=603e
PLATFORM_CPPFLAGS += -DCONFIG_MPC512X -DCONFIG_E300 \
-ffixed-r2 -msoft-float -mcpu=603e

View File

@@ -5,6 +5,4 @@
# SPDX-License-Identifier: GPL-2.0+ # SPDX-License-Identifier: GPL-2.0+
# #
PLATFORM_RELFLAGS += -meabi PLATFORM_CPPFLAGS += -DCONFIG_5xx -mpowerpc -msoft-float
PLATFORM_CPPFLAGS += -DCONFIG_5xx -ffixed-r2 -mpowerpc -msoft-float

View File

@@ -5,7 +5,5 @@
# SPDX-License-Identifier: GPL-2.0+ # SPDX-License-Identifier: GPL-2.0+
# #
PLATFORM_RELFLAGS += -meabi PLATFORM_CPPFLAGS += -DCONFIG_MPC5xxx \
PLATFORM_CPPFLAGS += -DCONFIG_MPC5xxx -ffixed-r2 \
-mstring -mcpu=603e -mmultiple -mstring -mcpu=603e -mmultiple

View File

@@ -5,6 +5,4 @@
# SPDX-License-Identifier: GPL-2.0+ # SPDX-License-Identifier: GPL-2.0+
# #
PLATFORM_RELFLAGS += -meabi PLATFORM_CPPFLAGS += -DCONFIG_MPC824X -mstring -mcpu=603e -msoft-float
PLATFORM_CPPFLAGS += -DCONFIG_MPC824X -ffixed-r2 -mstring -mcpu=603e -msoft-float

View File

@@ -5,7 +5,5 @@
# SPDX-License-Identifier: GPL-2.0+ # SPDX-License-Identifier: GPL-2.0+
# #
PLATFORM_RELFLAGS += -meabi PLATFORM_CPPFLAGS += -DCONFIG_8260 -DCONFIG_CPM2 \
PLATFORM_CPPFLAGS += -DCONFIG_8260 -DCONFIG_CPM2 -ffixed-r2 \
-mstring -mcpu=603e -mmultiple -mstring -mcpu=603e -mmultiple

View File

@@ -4,7 +4,4 @@
# SPDX-License-Identifier: GPL-2.0+ # SPDX-License-Identifier: GPL-2.0+
# #
PLATFORM_RELFLAGS += -meabi PLATFORM_CPPFLAGS += -DCONFIG_MPC83xx -DCONFIG_E300 -msoft-float
PLATFORM_CPPFLAGS += -DCONFIG_MPC83xx -DCONFIG_E300 \
-ffixed-r2 -msoft-float

View File

@@ -5,13 +5,10 @@
# SPDX-License-Identifier: GPL-2.0+ # SPDX-License-Identifier: GPL-2.0+
# #
PLATFORM_RELFLAGS += -meabi PLATFORM_CPPFLAGS += -Wa,-me500 -msoft-float -mno-string
PLATFORM_CPPFLAGS += -ffixed-r2 -Wa,-me500 -msoft-float -mno-string
# -mspe=yes is needed to have -mno-spe accepted by a buggy GCC; # -mspe=yes is needed to have -mno-spe accepted by a buggy GCC;
# see "[PATCH,rs6000] make -mno-spe work as expected" on # see "[PATCH,rs6000] make -mno-spe work as expected" on
# http://gcc.gnu.org/ml/gcc-patches/2008-04/msg00311.html # http://gcc.gnu.org/ml/gcc-patches/2008-04/msg00311.html
PF_CPPFLAGS_SPE := $(call cc-option,-mspe=yes) \ PLATFORM_CPPFLAGS += $(call cc-option,-mspe=yes) \
$(call cc-option,-mno-spe) $(call cc-option,-mno-spe)
PLATFORM_CPPFLAGS += $(PF_CPPFLAGS_SPE)

View File

@@ -74,12 +74,33 @@ void get_sys_info(sys_info_t *sys_info)
uint ratio[CONFIG_SYS_FSL_NUM_CC_PLLS]; uint ratio[CONFIG_SYS_FSL_NUM_CC_PLLS];
unsigned long sysclk = CONFIG_SYS_CLK_FREQ; unsigned long sysclk = CONFIG_SYS_CLK_FREQ;
uint mem_pll_rat; uint mem_pll_rat;
#ifdef CONFIG_SYS_FSL_SINGLE_SOURCE_CLK
uint single_src;
#endif
sys_info->freq_systembus = sysclk; sys_info->freq_systembus = sysclk;
#ifdef CONFIG_SYS_FSL_SINGLE_SOURCE_CLK
/*
* DDR_REFCLK_SEL rcw bit is used to determine if DDR PLLS
* are driven by separate DDR Refclock or single source
* differential clock.
*/
single_src = (in_be32(&gur->rcwsr[5]) >>
FSL_CORENET2_RCWSR5_DDR_REFCLK_SEL_SHIFT) &
FSL_CORENET2_RCWSR5_DDR_REFCLK_SEL_MASK;
/*
* For single source clocking, both ddrclock and syclock
* are driven by differential sysclock.
*/
if (single_src == FSL_CORENET2_RCWSR5_DDR_REFCLK_SINGLE_CLK) {
printf("Single Source Clock Configuration\n");
sys_info->freq_ddrbus = CONFIG_SYS_CLK_FREQ;
} else
#endif
#ifdef CONFIG_DDR_CLK_FREQ #ifdef CONFIG_DDR_CLK_FREQ
sys_info->freq_ddrbus = CONFIG_DDR_CLK_FREQ; sys_info->freq_ddrbus = CONFIG_DDR_CLK_FREQ;
#else #else
sys_info->freq_ddrbus = sysclk; sys_info->freq_ddrbus = sysclk;
#endif #endif
sys_info->freq_systembus *= (in_be32(&gur->rcwsr[0]) >> 25) & 0x1f; sys_info->freq_systembus *= (in_be32(&gur->rcwsr[0]) >> 25) & 0x1f;
@@ -229,6 +250,9 @@ void get_sys_info(sys_info_t *sys_info)
case 4: case 4:
sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK + 1] / 4; sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK + 1] / 4;
break; break;
case 5:
sys_info->freq_fman[1] = sys_info->freq_systembus;
break;
case 6: case 6:
sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK] / 2; sys_info->freq_fman[1] = freq_c_pll[CONFIG_SYS_FM2_CLK] / 2;
break; break;

View File

@@ -5,7 +5,4 @@
# SPDX-License-Identifier: GPL-2.0+ # SPDX-License-Identifier: GPL-2.0+
# #
PLATFORM_RELFLAGS += -meabi PLATFORM_CPPFLAGS += -mstring -maltivec -mabi=altivec -msoft-float
PLATFORM_CPPFLAGS += -ffixed-r2 -mstring
PLATFORM_CPPFLAGS += -maltivec -mabi=altivec -msoft-float

View File

@@ -5,6 +5,4 @@
# SPDX-License-Identifier: GPL-2.0+ # SPDX-License-Identifier: GPL-2.0+
# #
PLATFORM_RELFLAGS += -meabi PLATFORM_CPPFLAGS += -DCONFIG_8xx -mstring -mcpu=860 -msoft-float
PLATFORM_CPPFLAGS += -DCONFIG_8xx -ffixed-r2 -mstring -mcpu=860 -msoft-float

View File

@@ -19,10 +19,8 @@ ifdef MINIMAL
obj-$(CONFIG_FSL_LAW) += law.o obj-$(CONFIG_FSL_LAW) += law.o
else else
obj-$(CONFIG_MPC85xx) += cpu.o
ifneq ($(CPU),mpc83xx) obj-$(CONFIG_MPC86xx) += cpu.o
obj-y += cpu.o
endif
obj-$(CONFIG_OF_LIBFDT) += fdt.o obj-$(CONFIG_OF_LIBFDT) += fdt.o
obj-$(CONFIG_FSL_LBC) += fsl_lbc.o obj-$(CONFIG_FSL_LBC) += fsl_lbc.o

View File

@@ -5,8 +5,7 @@
# SPDX-License-Identifier: GPL-2.0+ # SPDX-License-Identifier: GPL-2.0+
# #
PLATFORM_RELFLAGS += -meabi PLATFORM_CPPFLAGS += -DCONFIG_4xx -mstring -msoft-float
PLATFORM_CPPFLAGS += -DCONFIG_4xx -ffixed-r2 -mstring -msoft-float
cfg=$(shell grep configs $(OBJTREE)/include/config.h | sed 's/.*<\(configs.*\)>/\1/') cfg=$(shell grep configs $(OBJTREE)/include/config.h | sed 's/.*<\(configs.*\)>/\1/')
is440:=$(shell grep CONFIG_440 $(TOPDIR)/include/$(cfg)) is440:=$(shell grep CONFIG_440 $(TOPDIR)/include/$(cfg))

View File

@@ -711,7 +711,8 @@ defined(CONFIG_PPC_T1020) || defined(CONFIG_PPC_T1022)
#define CONFIG_FM_PLAT_CLK_DIV 1 #define CONFIG_FM_PLAT_CLK_DIV 1
#define CONFIG_SYS_FM1_CLK CONFIG_FM_PLAT_CLK_DIV #define CONFIG_SYS_FM1_CLK CONFIG_FM_PLAT_CLK_DIV
#define CONFIG_SYS_FM_MURAM_SIZE 0x30000 #define CONFIG_SYS_FM_MURAM_SIZE 0x30000
#define CONFIG_SYS_FSL_TBCLK_DIV 32 #define CONFIG_SYS_FSL_SINGLE_SOURCE_CLK
#define CONFIG_SYS_FSL_TBCLK_DIV 16
#define CONFIG_SYS_FSL_PCIE_COMPAT "fsl,qoriq-pcie-v2.4" #define CONFIG_SYS_FSL_PCIE_COMPAT "fsl,qoriq-pcie-v2.4"
#define CONFIG_SYS_FSL_USB1_PHY_ENABLE #define CONFIG_SYS_FSL_USB1_PHY_ENABLE
#define CONFIG_SYS_FSL_USB2_PHY_ENABLE #define CONFIG_SYS_FSL_USB2_PHY_ENABLE
@@ -745,7 +746,7 @@ defined(CONFIG_PPC_T1020) || defined(CONFIG_PPC_T1022)
#define CONFIG_SYS_NUM_FM1_DTSEC 6 #define CONFIG_SYS_NUM_FM1_DTSEC 6
#define CONFIG_SYS_NUM_FM1_10GEC 2 #define CONFIG_SYS_NUM_FM1_10GEC 2
#endif #endif
#define CONFIG_SYS_FSL_NUM_USB_CTRLS 2 #define CONFIG_USB_MAX_CONTROLLER_COUNT 2
#define CONFIG_NUM_DDR_CONTROLLERS 1 #define CONFIG_NUM_DDR_CONTROLLERS 1
#define CONFIG_PME_PLAT_CLK_DIV 1 #define CONFIG_PME_PLAT_CLK_DIV 1
#define CONFIG_SYS_PME_CLK CONFIG_PME_PLAT_CLK_DIV #define CONFIG_SYS_PME_CLK CONFIG_PME_PLAT_CLK_DIV

View File

@@ -1774,6 +1774,9 @@ defined(CONFIG_PPC_T1020) || defined(CONFIG_PPC_T1022)
#define FSL_CORENET2_RCWSR5_SRDS_PLL_PD_S3_PLL2 0x00040000 #define FSL_CORENET2_RCWSR5_SRDS_PLL_PD_S3_PLL2 0x00040000
#define FSL_CORENET2_RCWSR5_SRDS_PLL_PD_S4_PLL1 0x00020000 #define FSL_CORENET2_RCWSR5_SRDS_PLL_PD_S4_PLL1 0x00020000
#define FSL_CORENET2_RCWSR5_SRDS_PLL_PD_S4_PLL2 0x00010000 #define FSL_CORENET2_RCWSR5_SRDS_PLL_PD_S4_PLL2 0x00010000
#define FSL_CORENET2_RCWSR5_DDR_REFCLK_SEL_SHIFT 4
#define FSL_CORENET2_RCWSR5_DDR_REFCLK_SEL_MASK 0x00000011
#define FSL_CORENET2_RCWSR5_DDR_REFCLK_SINGLE_CLK 1
#else /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */ #else /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */
#define FSL_CORENET_RCWSR0_MEM_PLL_RAT_SHIFT 17 #define FSL_CORENET_RCWSR0_MEM_PLL_RAT_SHIFT 17

View File

@@ -32,6 +32,7 @@ DECLARE_GLOBAL_DATA_PTR;
extern ulong get_effective_memsize(void); extern ulong get_effective_memsize(void);
static ulong get_sp (void); static ulong get_sp (void);
extern void ft_fixup_num_cores(void *blob);
static void set_clocks_in_mhz (bd_t *kbd); static void set_clocks_in_mhz (bd_t *kbd);
#ifndef CONFIG_SYS_LINUX_LOWMEM_MAX_SIZE #ifndef CONFIG_SYS_LINUX_LOWMEM_MAX_SIZE
@@ -277,3 +278,58 @@ static void set_clocks_in_mhz (bd_t *kbd)
#endif /* CONFIG_MPC5xxx */ #endif /* CONFIG_MPC5xxx */
} }
} }
#if defined(CONFIG_BOOTM_VXWORKS)
void boot_prep_vxworks(bootm_headers_t *images)
{
#if defined(CONFIG_OF_LIBFDT)
int off;
u64 base, size;
if (!images->ft_addr)
return;
base = (u64)gd->bd->bi_memstart;
size = (u64)gd->bd->bi_memsize;
off = fdt_path_offset(images->ft_addr, "/memory");
if (off < 0)
fdt_fixup_memory(images->ft_addr, base, size);
#if defined(CONFIG_MP)
#if defined(CONFIG_MPC85xx)
ft_fixup_cpu(images->ft_addr, base + size);
ft_fixup_num_cores(images->ft_addr);
#elif defined(CONFIG_MPC86xx)
off = fdt_add_mem_rsv(images->ft_addr,
determine_mp_bootpg(NULL), (u64)4096);
if (off < 0)
printf("## WARNING %s: %s\n", __func__, fdt_strerror(off));
ft_fixup_num_cores(images->ft_addr);
#endif
flush_cache((unsigned long)images->ft_addr, images->ft_len);
#endif
#endif
}
void boot_jump_vxworks(bootm_headers_t *images)
{
/* PowerPC VxWorks boot interface conforms to the ePAPR standard
* general purpuse registers:
*
* r3: Effective address of the device tree image
* r4: 0
* r5: 0
* r6: ePAPR magic value
* r7: shall be the size of the boot IMA in bytes
* r8: 0
* r9: 0
* TCR: WRC = 0, no watchdog timer reset will occur
*/
WATCHDOG_RESET();
((void (*)(void *, ulong, ulong, ulong,
ulong, ulong, ulong))images->ep)(images->ft_addr,
0, 0, EPAPR_MAGIC, getenv_bootm_mapsize(), 0, 0);
}
#endif

View File

@@ -5,13 +5,23 @@
#include <common.h> #include <common.h>
#include <os.h> #include <os.h>
#include <asm/state.h>
DECLARE_GLOBAL_DATA_PTR; DECLARE_GLOBAL_DATA_PTR;
int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) void reset_cpu(ulong ignored)
{ {
if (state_uninit())
os_exit(2);
/* This is considered normal termination for now */ /* This is considered normal termination for now */
os_exit(0); os_exit(0);
}
int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
reset_cpu(0);
return 0; return 0;
} }
@@ -28,7 +38,14 @@ unsigned long __attribute__((no_instrument_function)) timer_get_us(void)
int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images) int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
{ {
return -1; if (flag & (BOOTM_STATE_OS_GO | BOOTM_STATE_OS_FAKE_GO)) {
bootstage_mark(BOOTSTAGE_ID_RUN_OS);
printf("## Transferring control to Linux (at address %08lx)...\n",
images->ep);
reset_cpu(0);
}
return 0;
} }
int cleanup_before_linux(void) int cleanup_before_linux(void)

View File

@@ -27,6 +27,10 @@
/* Operating System Interface */ /* Operating System Interface */
struct os_mem_hdr {
size_t length; /* number of bytes in the block */
};
ssize_t os_read(int fd, void *buf, size_t count) ssize_t os_read(int fd, void *buf, size_t count)
{ {
return read(fd, buf, count); return read(fd, buf, count);
@@ -128,8 +132,45 @@ void os_tty_raw(int fd)
void *os_malloc(size_t length) void *os_malloc(size_t length)
{ {
return mmap(NULL, length, PROT_READ | PROT_WRITE, struct os_mem_hdr *hdr;
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
hdr = mmap(NULL, length + sizeof(*hdr), PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (hdr == MAP_FAILED)
return NULL;
hdr->length = length;
return hdr + 1;
}
void *os_free(void *ptr)
{
struct os_mem_hdr *hdr = ptr;
hdr--;
if (ptr)
munmap(hdr, hdr->length + sizeof(*hdr));
}
void *os_realloc(void *ptr, size_t length)
{
struct os_mem_hdr *hdr = ptr;
void *buf = NULL;
hdr--;
if (length != 0) {
buf = os_malloc(length);
if (!buf)
return buf;
if (ptr) {
if (length > hdr->length)
length = hdr->length;
memcpy(buf, ptr, length);
}
}
os_free(ptr);
return buf;
} }
void os_usleep(unsigned long usec) void os_usleep(unsigned long usec)
@@ -347,3 +388,53 @@ ssize_t os_get_filesize(const char *fname)
return ret; return ret;
return buf.st_size; return buf.st_size;
} }
void os_putc(int ch)
{
putchar(ch);
}
void os_puts(const char *str)
{
while (*str)
os_putc(*str++);
}
int os_write_ram_buf(const char *fname)
{
struct sandbox_state *state = state_get_current();
int fd, ret;
fd = open(fname, O_CREAT | O_WRONLY, 0777);
if (fd < 0)
return -ENOENT;
ret = write(fd, state->ram_buf, state->ram_size);
close(fd);
if (ret != state->ram_size)
return -EIO;
return 0;
}
int os_read_ram_buf(const char *fname)
{
struct sandbox_state *state = state_get_current();
int fd, ret;
int size;
size = os_get_filesize(fname);
if (size < 0)
return -ENOENT;
if (size != state->ram_size)
return -ENOSPC;
fd = open(fname, O_RDONLY);
if (fd < 0)
return -ENOENT;
ret = read(fd, state->ram_buf, state->ram_size);
close(fd);
if (ret != state->ram_size)
return -EIO;
return 0;
}

View File

@@ -4,11 +4,12 @@
*/ */
#include <common.h> #include <common.h>
#include <os.h>
#include <asm/getopt.h> #include <asm/getopt.h>
#include <asm/sections.h> #include <asm/sections.h>
#include <asm/state.h> #include <asm/state.h>
#include <os.h> DECLARE_GLOBAL_DATA_PTR;
int sandbox_early_getopt_check(void) int sandbox_early_getopt_check(void)
{ {
@@ -50,9 +51,9 @@ int sandbox_early_getopt_check(void)
/* then the long flag */ /* then the long flag */
if (opt->has_arg) if (opt->has_arg)
printf("--%-*s", max_noarg_len, opt->flag);
else
printf("--%-*s <arg> ", max_arg_len, opt->flag); printf("--%-*s <arg> ", max_arg_len, opt->flag);
else
printf("--%-*s", max_noarg_len, opt->flag);
/* finally the help text */ /* finally the help text */
printf(" %s\n", opt->help); printf(" %s\n", opt->help);
@@ -75,7 +76,8 @@ int sandbox_main_loop_init(void)
/* Execute command if required */ /* Execute command if required */
if (state->cmd) { if (state->cmd) {
run_command_list(state->cmd, -1, 0); run_command_list(state->cmd, -1, 0);
os_exit(state->exit_type); if (!state->interactive)
os_exit(state->exit_type);
} }
return 0; return 0;
@@ -96,25 +98,93 @@ static int sandbox_cmdline_cb_fdt(struct sandbox_state *state, const char *arg)
} }
SANDBOX_CMDLINE_OPT_SHORT(fdt, 'd', 1, "Specify U-Boot's control FDT"); SANDBOX_CMDLINE_OPT_SHORT(fdt, 'd', 1, "Specify U-Boot's control FDT");
static int sandbox_cmdline_cb_interactive(struct sandbox_state *state,
const char *arg)
{
state->interactive = true;
return 0;
}
SANDBOX_CMDLINE_OPT_SHORT(interactive, 'i', 0, "Enter interactive mode");
static int sandbox_cmdline_cb_memory(struct sandbox_state *state,
const char *arg)
{
int err;
/* For now assume we always want to write it */
state->write_ram_buf = true;
state->ram_buf_fname = arg;
if (os_read_ram_buf(arg)) {
printf("Failed to read RAM buffer\n");
return err;
}
return 0;
}
SANDBOX_CMDLINE_OPT_SHORT(memory, 'm', 1,
"Read/write ram_buf memory contents from file");
static int sandbox_cmdline_cb_state(struct sandbox_state *state,
const char *arg)
{
state->state_fname = arg;
return 0;
}
SANDBOX_CMDLINE_OPT_SHORT(state, 's', 1, "Specify the sandbox state FDT");
static int sandbox_cmdline_cb_read(struct sandbox_state *state,
const char *arg)
{
state->read_state = true;
return 0;
}
SANDBOX_CMDLINE_OPT_SHORT(read, 'r', 0, "Read the state FDT on startup");
static int sandbox_cmdline_cb_write(struct sandbox_state *state,
const char *arg)
{
state->write_state = true;
return 0;
}
SANDBOX_CMDLINE_OPT_SHORT(write, 'w', 0, "Write state FDT on exit");
static int sandbox_cmdline_cb_ignore_missing(struct sandbox_state *state,
const char *arg)
{
state->ignore_missing_state_on_read = true;
return 0;
}
SANDBOX_CMDLINE_OPT_SHORT(ignore_missing, 'n', 0,
"Ignore missing state on read");
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
struct sandbox_state *state; struct sandbox_state *state;
int err; int ret;
err = state_init(); ret = state_init();
if (err) if (ret)
return err; goto err;
state = state_get_current(); state = state_get_current();
if (os_parse_args(state, argc, argv)) if (os_parse_args(state, argc, argv))
return 1; return 1;
/* ret = sandbox_read_state(state, state->state_fname);
* Do pre- and post-relocation init, then start up U-Boot. This will if (ret)
* never return. goto err;
*/
/* Do pre- and post-relocation init */
board_init_f(0); board_init_f(0);
/* NOTREACHED - board_init_f() does not return */ board_init_r(gd->new_gd, 0);
/* NOTREACHED - board_init_r() does not return */
return 0; return 0;
err:
printf("Error %d\n", ret);
return 1;
} }

View File

@@ -4,6 +4,9 @@
*/ */
#include <common.h> #include <common.h>
#include <errno.h>
#include <fdtdec.h>
#include <os.h>
#include <asm/state.h> #include <asm/state.h>
/* Main state record for the sandbox */ /* Main state record for the sandbox */
@@ -15,6 +18,324 @@ void state_record_exit(enum exit_type_id exit_type)
state->exit_type = exit_type; state->exit_type = exit_type;
} }
static int state_ensure_space(int extra_size)
{
void *blob = state->state_fdt;
int used, size, free;
void *buf;
int ret;
used = fdt_off_dt_strings(blob) + fdt_size_dt_strings(blob);
size = fdt_totalsize(blob);
free = size - used;
if (free > extra_size)
return 0;
size = used + extra_size;
buf = os_malloc(size);
if (!buf)
return -ENOMEM;
ret = fdt_open_into(blob, buf, size);
if (ret) {
os_free(buf);
return -EIO;
}
os_free(blob);
state->state_fdt = buf;
return 0;
}
static int state_read_file(struct sandbox_state *state, const char *fname)
{
int size;
int ret;
int fd;
size = os_get_filesize(fname);
if (size < 0) {
printf("Cannot find sandbox state file '%s'\n", fname);
return -ENOENT;
}
state->state_fdt = os_malloc(size);
if (!state->state_fdt) {
puts("No memory to read sandbox state\n");
return -ENOMEM;
}
fd = os_open(fname, OS_O_RDONLY);
if (fd < 0) {
printf("Cannot open sandbox state file '%s'\n", fname);
ret = -EPERM;
goto err_open;
}
if (os_read(fd, state->state_fdt, size) != size) {
printf("Cannot read sandbox state file '%s'\n", fname);
ret = -EIO;
goto err_read;
}
os_close(fd);
return 0;
err_read:
os_close(fd);
err_open:
os_free(state->state_fdt);
state->state_fdt = NULL;
return ret;
}
/***
* sandbox_read_state_nodes() - Read state associated with a driver
*
* This looks through all compatible nodes and calls the read function on
* each one, to read in the state.
*
* If nothing is found, it still calls the read function once, to set up a
* single global state for that driver.
*
* @state: Sandbox state
* @io: Method to use for reading state
* @blob: FDT containing state
* @return 0 if OK, -EINVAL if the read function returned failure
*/
int sandbox_read_state_nodes(struct sandbox_state *state,
struct sandbox_state_io *io, const void *blob)
{
int count;
int node;
int ret;
debug(" - read %s\n", io->name);
if (!io->read)
return 0;
node = -1;
count = 0;
while (blob) {
node = fdt_node_offset_by_compatible(blob, node, io->compat);
if (node < 0)
return 0; /* No more */
debug(" - read node '%s'\n", fdt_get_name(blob, node, NULL));
ret = io->read(blob, node);
if (ret) {
printf("Unable to read state for '%s'\n", io->compat);
return -EINVAL;
}
count++;
}
/*
* If we got no saved state, call the read function once without a
* node, to set up the global state.
*/
if (count == 0) {
debug(" - read global\n");
ret = io->read(NULL, -1);
if (ret) {
printf("Unable to read global state for '%s'\n",
io->name);
return -EINVAL;
}
}
return 0;
}
int sandbox_read_state(struct sandbox_state *state, const char *fname)
{
struct sandbox_state_io *io;
const void *blob;
bool got_err;
int ret;
if (state->read_state && fname) {
ret = state_read_file(state, fname);
if (ret == -ENOENT && state->ignore_missing_state_on_read)
ret = 0;
if (ret)
return ret;
}
/* Call all the state read funtcions */
got_err = false;
blob = state->state_fdt;
io = ll_entry_start(struct sandbox_state_io, state_io);
for (; io < ll_entry_end(struct sandbox_state_io, state_io); io++) {
ret = sandbox_read_state_nodes(state, io, blob);
if (ret < 0)
got_err = true;
}
if (state->read_state && fname) {
debug("Read sandbox state from '%s'%s\n", fname,
got_err ? " (with errors)" : "");
}
return got_err ? -1 : 0;
}
/***
* sandbox_write_state_node() - Write state associated with a driver
*
* This calls the write function to write out global state for that driver.
*
* TODO(sjg@chromium.org): Support writing out state from multiple drivers
* of the same time. We don't need this yet,and it will be much easier to
* do when driver model is available.
*
* @state: Sandbox state
* @io: Method to use for writing state
* @return 0 if OK, -EIO if there is a fatal error (such as out of space
* for adding the data), -EINVAL if the write function failed.
*/
int sandbox_write_state_node(struct sandbox_state *state,
struct sandbox_state_io *io)
{
void *blob;
int node;
int ret;
if (!io->write)
return 0;
ret = state_ensure_space(SANDBOX_STATE_MIN_SPACE);
if (ret) {
printf("Failed to add more space for state\n");
return -EIO;
}
/* The blob location can change when the size increases */
blob = state->state_fdt;
node = fdt_node_offset_by_compatible(blob, -1, io->compat);
if (node == -FDT_ERR_NOTFOUND) {
node = fdt_add_subnode(blob, 0, io->name);
if (node < 0) {
printf("Cannot create node '%s': %s\n", io->name,
fdt_strerror(node));
return -EIO;
}
if (fdt_setprop_string(blob, node, "compatible", io->compat)) {
puts("Cannot set compatible\n");
return -EIO;
}
} else if (node < 0) {
printf("Cannot access node '%s': %s\n", io->name,
fdt_strerror(node));
return -EIO;
}
debug("Write state for '%s' to node %d\n", io->compat, node);
ret = io->write(blob, node);
if (ret) {
printf("Unable to write state for '%s'\n", io->compat);
return -EINVAL;
}
return 0;
}
int sandbox_write_state(struct sandbox_state *state, const char *fname)
{
struct sandbox_state_io *io;
bool got_err;
int size;
int ret;
int fd;
/* Create a state FDT if we don't have one */
if (!state->state_fdt) {
size = 0x4000;
state->state_fdt = os_malloc(size);
if (!state->state_fdt) {
puts("No memory to create FDT\n");
return -ENOMEM;
}
ret = fdt_create_empty_tree(state->state_fdt, size);
if (ret < 0) {
printf("Cannot create empty state FDT: %s\n",
fdt_strerror(ret));
ret = -EIO;
goto err_create;
}
}
/* Call all the state write funtcions */
got_err = false;
io = ll_entry_start(struct sandbox_state_io, state_io);
ret = 0;
for (; io < ll_entry_end(struct sandbox_state_io, state_io); io++) {
ret = sandbox_write_state_node(state, io);
if (ret == -EIO)
break;
else if (ret)
got_err = true;
}
if (ret == -EIO) {
printf("Could not write sandbox state\n");
goto err_create;
}
ret = fdt_pack(state->state_fdt);
if (ret < 0) {
printf("Cannot pack state FDT: %s\n", fdt_strerror(ret));
ret = -EINVAL;
goto err_create;
}
size = fdt_totalsize(state->state_fdt);
fd = os_open(fname, OS_O_WRONLY | OS_O_CREAT);
if (fd < 0) {
printf("Cannot open sandbox state file '%s'\n", fname);
ret = -EIO;
goto err_create;
}
if (os_write(fd, state->state_fdt, size) != size) {
printf("Cannot write sandbox state file '%s'\n", fname);
ret = -EIO;
goto err_write;
}
os_close(fd);
debug("Wrote sandbox state to '%s'%s\n", fname,
got_err ? " (with errors)" : "");
return 0;
err_write:
os_close(fd);
err_create:
os_free(state->state_fdt);
return ret;
}
int state_setprop(int node, const char *prop_name, const void *data, int size)
{
void *blob;
int len;
int ret;
fdt_getprop(state->state_fdt, node, prop_name, &len);
/* Add space for the new property, its name and some overhead */
ret = state_ensure_space(size - len + strlen(prop_name) + 32);
if (ret)
return ret;
/* This should succeed, barring a mutiny */
blob = state->state_fdt;
ret = fdt_setprop(blob, node, prop_name, data, size);
if (ret) {
printf("%s: Unable to set property '%s' in node '%s': %s\n",
__func__, prop_name, fdt_get_name(blob, node, NULL),
fdt_strerror(ret));
return -ENOSPC;
}
return 0;
}
struct sandbox_state *state_get_current(void) struct sandbox_state *state_get_current(void)
{ {
assert(state); assert(state);
@@ -25,6 +346,10 @@ int state_init(void)
{ {
state = &main_state; state = &main_state;
state->ram_size = CONFIG_SYS_SDRAM_SIZE;
state->ram_buf = os_malloc(state->ram_size);
assert(state->ram_buf);
/* /*
* Example of how to use GPIOs: * Example of how to use GPIOs:
* *
@@ -33,3 +358,31 @@ int state_init(void)
*/ */
return 0; return 0;
} }
int state_uninit(void)
{
int err;
state = &main_state;
if (state->write_ram_buf) {
err = os_write_ram_buf(state->ram_buf_fname);
if (err) {
printf("Failed to write RAM buffer\n");
return err;
}
}
if (state->write_state) {
if (sandbox_write_state(state, state->state_fname)) {
printf("Failed to write sandbox state\n");
return -1;
}
}
if (state->state_fdt)
os_free(state->state_fdt);
memset(state, '\0', sizeof(*state));
return 0;
}

View File

@@ -12,7 +12,7 @@
/* Architecture-specific global data */ /* Architecture-specific global data */
struct arch_global_data { struct arch_global_data {
u8 *ram_buf; /* emulated RAM buffer */ uint8_t *ram_buf; /* emulated RAM buffer */
}; };
#include <asm-generic/global_data.h> #include <asm-generic/global_data.h>

View File

@@ -7,6 +7,8 @@
#define __SANDBOX_STATE_H #define __SANDBOX_STATE_H
#include <config.h> #include <config.h>
#include <stdbool.h>
#include <linux/stringify.h>
/* How we exited U-Boot */ /* How we exited U-Boot */
enum exit_type_id { enum exit_type_id {
@@ -23,17 +25,92 @@ struct sandbox_spi_info {
/* The complete state of the test system */ /* The complete state of the test system */
struct sandbox_state { struct sandbox_state {
const char *cmd; /* Command to execute */ const char *cmd; /* Command to execute */
bool interactive; /* Enable cmdline after execute */
const char *fdt_fname; /* Filename of FDT binary */ const char *fdt_fname; /* Filename of FDT binary */
enum exit_type_id exit_type; /* How we exited U-Boot */ enum exit_type_id exit_type; /* How we exited U-Boot */
const char *parse_err; /* Error to report from parsing */ const char *parse_err; /* Error to report from parsing */
int argc; /* Program arguments */ int argc; /* Program arguments */
char **argv; char **argv;
uint8_t *ram_buf; /* Emulated RAM buffer */
unsigned int ram_size; /* Size of RAM buffer */
const char *ram_buf_fname; /* Filename to use for RAM buffer */
bool write_ram_buf; /* Write RAM buffer on exit */
const char *state_fname; /* File containing sandbox state */
void *state_fdt; /* Holds saved state for sandbox */
bool read_state; /* Read sandbox state on startup */
bool write_state; /* Write sandbox state on exit */
bool ignore_missing_state_on_read; /* No error if state missing */
/* Pointer to information for each SPI bus/cs */ /* Pointer to information for each SPI bus/cs */
struct sandbox_spi_info spi[CONFIG_SANDBOX_SPI_MAX_BUS] struct sandbox_spi_info spi[CONFIG_SANDBOX_SPI_MAX_BUS]
[CONFIG_SANDBOX_SPI_MAX_CS]; [CONFIG_SANDBOX_SPI_MAX_CS];
}; };
/* Minimum space we guarantee in the state FDT when calling read/write*/
#define SANDBOX_STATE_MIN_SPACE 0x1000
/**
* struct sandbox_state_io - methods to saved/restore sandbox state
* @name: Name of of the device tree node, also the name of the variable
* holding this data so it should be an identifier (use underscore
* instead of minus)
* @compat: Compatible string for the node containing this state
*
* @read: Function to read state from FDT
* If data is available, then blob and node will provide access to it. If
* not (blob == NULL and node == -1) this function should set up an empty
* data set for start-of-day.
* @param blob: Pointer to device tree blob, or NULL if no data to read
* @param node: Node offset to read from
* @return 0 if OK, -ve on error
*
* @write: Function to write state to FDT
* The caller will ensure that there is a node ready for the state. The
* node may already contain the old state, in which case it should be
* overridden. There is guaranteed to be SANDBOX_STATE_MIN_SPACE bytes
* of free space, so error checking is not required for fdt_setprop...()
* calls which add up to less than this much space.
*
* For adding larger properties, use state_setprop().
*
* @param blob: Device tree blob holding state
* @param node: Node to write our state into
*
* Note that it is possible to save data as large blobs or as individual
* hierarchical properties. However, unless you intend to keep state files
* around for a long time and be able to run an old state file on a new
* sandbox, it might not be worth using individual properties for everything.
* This is certainly supported, it is just a matter of the effort you wish
* to put into the state read/write feature.
*/
struct sandbox_state_io {
const char *name;
const char *compat;
int (*write)(void *blob, int node);
int (*read)(const void *blob, int node);
};
/**
* SANDBOX_STATE_IO - Declare sandbox state to read/write
*
* Sandbox permits saving state from one run and restoring it in another. This
* allows the test system to retain state between runs and thus better
* emulate a real system. Examples of state that might be useful to save are
* the emulated GPIOs pin settings, flash memory contents and TPM private
* data. U-Boot memory contents is dealth with separately since it is large
* and it is not normally useful to save it (since a normal system does not
* preserve DRAM between runs). See the '-m' option for this.
*
* See struct sandbox_state_io above for member documentation.
*/
#define SANDBOX_STATE_IO(_name, _compat, _read, _write) \
ll_entry_declare(struct sandbox_state_io, _name, state_io) = { \
.name = __stringify(_name), \
.read = _read, \
.write = _write, \
.compat = _compat, \
}
/** /**
* Record the exit type to be reported by the test program. * Record the exit type to be reported by the test program.
* *
@@ -48,9 +125,60 @@ void state_record_exit(enum exit_type_id exit_type);
*/ */
struct sandbox_state *state_get_current(void); struct sandbox_state *state_get_current(void);
/**
* Read the sandbox state from the supplied device tree file
*
* This calls all registered state handlers to read in the sandbox state
* from a previous test run.
*
* @param state Sandbox state to update
* @param fname Filename of device tree file to read from
* @return 0 if OK, -ve on error
*/
int sandbox_read_state(struct sandbox_state *state, const char *fname);
/**
* Write the sandbox state to the supplied device tree file
*
* This calls all registered state handlers to write out the sandbox state
* so that it can be preserved for a future test run.
*
* If the file exists it is overwritten.
*
* @param state Sandbox state to update
* @param fname Filename of device tree file to write to
* @return 0 if OK, -ve on error
*/
int sandbox_write_state(struct sandbox_state *state, const char *fname);
/**
* Add a property to a sandbox state node
*
* This is equivalent to fdt_setprop except that it automatically enlarges
* the device tree if necessary. That means it is safe to write any amount
* of data here.
*
* This function can only be called from within struct sandbox_state_io's
* ->write method, i.e. within state I/O drivers.
*
* @param node Device tree node to write to
* @param prop_name Property to write
* @param data Data to write into property
* @param size Size of data to write into property
*/
int state_setprop(int node, const char *prop_name, const void *data, int size);
/** /**
* Initialize the test system state * Initialize the test system state
*/ */
int state_init(void); int state_init(void);
/**
* Uninitialize the test system state, writing out state if configured to
* do so.
*
* @return 0 if OK, -ve on error
*/
int state_uninit(void);
#endif #endif

View File

@@ -23,4 +23,6 @@ int dram_init(void);
int sandbox_early_getopt_check(void); int sandbox_early_getopt_check(void);
int sandbox_main_loop_init(void); int sandbox_main_loop_init(void);
int cleanup_before_linux(void);
#endif /* _U_BOOT_SANDBOX_H_ */ #endif /* _U_BOOT_SANDBOX_H_ */

View File

@@ -12,7 +12,7 @@ PLATFORM_CPPFLAGS += -m2a -m2a-nofpu -mb -ffreestanding
else # SH2 else # SH2
PLATFORM_CPPFLAGS += -m3e -mb PLATFORM_CPPFLAGS += -m3e -mb
endif endif
PLATFORM_CPPFLAGS += $(call cc-option,-mno-fdpic) PLATFORM_CPPFLAGS += -DCONFIG_SH2 $(call cc-option,-mno-fdpic)
PLATFORM_RELFLAGS += -ffixed-r13 PLATFORM_RELFLAGS += -ffixed-r13
PLATFORM_LDFLAGS += $(ENDIANNESS) PLATFORM_LDFLAGS += $(ENDIANNESS)

View File

@@ -23,11 +23,7 @@
int checkcpu(void) int checkcpu(void)
{ {
#if defined(CONFIG_SH2A)
puts("CPU: SH2A\n");
#else
puts("CPU: SH2\n"); puts("CPU: SH2\n");
#endif
return 0; return 0;
} }

View File

@@ -11,5 +11,5 @@
# SPDX-License-Identifier: GPL-2.0+ # SPDX-License-Identifier: GPL-2.0+
# #
# #
PLATFORM_CPPFLAGS += -m3 PLATFORM_CPPFLAGS += -DCONFIG_SH3 -m3
PLATFORM_RELFLAGS += -ffixed-r13 PLATFORM_RELFLAGS += -ffixed-r13

View File

@@ -8,5 +8,5 @@
# SPDX-License-Identifier: GPL-2.0+ # SPDX-License-Identifier: GPL-2.0+
# #
# #
PLATFORM_CPPFLAGS += -m4-nofpu PLATFORM_CPPFLAGS += -DCONFIG_SH4 -m4-nofpu
PLATFORM_RELFLAGS += -ffixed-r13 PLATFORM_RELFLAGS += -ffixed-r13

View File

@@ -13,11 +13,7 @@
int checkcpu(void) int checkcpu(void)
{ {
#ifdef CONFIG_SH4A
puts("CPU: SH-4A\n");
#else
puts("CPU: SH4\n"); puts("CPU: SH4\n");
#endif
return 0; return 0;
} }

View File

@@ -1,7 +1,7 @@
#ifndef __ASM_SH_CACHE_H #ifndef __ASM_SH_CACHE_H
#define __ASM_SH_CACHE_H #define __ASM_SH_CACHE_H
#if defined(CONFIG_SH4) || defined(CONFIG_SH4A) #if defined(CONFIG_SH4)
int cache_control(unsigned int cmd); int cache_control(unsigned int cmd);
@@ -18,7 +18,7 @@ struct __large_struct { unsigned long buf[100]; };
*/ */
#define ARCH_DMA_MINALIGN 32 #define ARCH_DMA_MINALIGN 32
#endif /* CONFIG_SH4 || CONFIG_SH4A */ #endif /* CONFIG_SH4 */
/* /*
* Use the L1 data cache line size value for the minimum DMA buffer alignment * Use the L1 data cache line size value for the minimum DMA buffer alignment

View File

@@ -37,6 +37,8 @@
# include <asm/cpu_sh7734.h> # include <asm/cpu_sh7734.h>
#elif defined (CONFIG_CPU_SH7752) #elif defined (CONFIG_CPU_SH7752)
# include <asm/cpu_sh7752.h> # include <asm/cpu_sh7752.h>
#elif defined (CONFIG_CPU_SH7753)
# include <asm/cpu_sh7753.h>
#elif defined (CONFIG_CPU_SH7757) #elif defined (CONFIG_CPU_SH7757)
# include <asm/cpu_sh7757.h> # include <asm/cpu_sh7757.h>
#elif defined (CONFIG_CPU_SH7763) #elif defined (CONFIG_CPU_SH7763)

View File

@@ -0,0 +1,197 @@
/*
* Copyright (C) 2012 Renesas Solutions Corp.
*
* SPDX-License-Identifier: GPL-2.0+
*/
#ifndef _ASM_CPU_SH7753_H_
#define _ASM_CPU_SH7753_H_
#define CCR 0xFF00001C
#define WTCNT 0xFFCC0000
#define CCR_CACHE_INIT 0x0000090b
#define CACHE_OC_NUM_WAYS 1
#ifndef __ASSEMBLY__ /* put C only stuff in this section */
/* MMU */
struct mmu_regs {
unsigned int reserved[4];
unsigned int mmucr;
};
#define MMU_BASE ((struct mmu_regs *)0xff000000)
/* Watchdog */
#define WTCSR0 0xffcc0002
#define WRSTCSR_R 0xffcc0003
#define WRSTCSR_W 0xffcc0002
#define WTCSR_PREFIX 0xa500
#define WRSTCSR_PREFIX 0x6900
#define WRSTCSR_WOVF_PREFIX 0x9600
/* SCIF */
#define SCIF0_BASE 0xfe4b0000 /* The real name is SCIF2 */
#define SCIF1_BASE 0xfe4c0000 /* The real name is SCIF3 */
#define SCIF2_BASE 0xfe4d0000 /* The real name is SCIF4 */
/* TMU0 */
#define TMU_BASE 0xFE430000
/* ETHER, GETHER MAC address */
struct ether_mac_regs {
unsigned int reserved[114];
unsigned int mahr;
unsigned int reserved2;
unsigned int malr;
};
#define GETHER0_MAC_BASE ((struct ether_mac_regs *)0xfee0400)
#define GETHER1_MAC_BASE ((struct ether_mac_regs *)0xfee0c00)
#define ETHER0_MAC_BASE ((struct ether_mac_regs *)0xfef0000)
#define ETHER1_MAC_BASE ((struct ether_mac_regs *)0xfef0800)
/* GETHER */
struct gether_control_regs {
unsigned int gbecont;
};
#define GETHER_CONTROL_BASE ((struct gether_control_regs *)0xffc10100)
#define GBECONT_RMII1 0x00020000
#define GBECONT_RMII0 0x00010000
/* SerMux */
struct sermux_regs {
unsigned char smr0;
unsigned char smr1;
unsigned char smr2;
unsigned char smr3;
unsigned char smr4;
unsigned char smr5;
};
#define SERMUX_BASE ((struct sermux_regs *)0xfe470000)
/* USB0/1 */
struct usb_common_regs {
unsigned short reserved[129];
unsigned short suspmode;
};
#define USB0_COMMON_BASE ((struct usb_common_regs *)0xfe450000)
#define USB1_COMMON_BASE ((struct usb_common_regs *)0xfe4f0000)
struct usb0_phy_regs {
unsigned short reset;
unsigned short reserved[4];
unsigned short portsel;
};
#define USB0_PHY_BASE ((struct usb0_phy_regs *)0xfe5f0000)
struct usb1_port_regs {
unsigned int port1sel;
unsigned int reserved;
unsigned int usb1intsts;
};
#define USB1_PORT_BASE ((struct usb1_port_regs *)0xfe4f2000)
struct usb1_alignment_regs {
unsigned int ehcidatac; /* 0xfe4fe018 */
unsigned int reserved[63];
unsigned int ohcidatac;
};
#define USB1_ALIGNMENT_BASE ((struct usb1_alignment_regs *)0xfe4fe018)
/* GPIO */
struct gpio_regs {
unsigned short pacr;
unsigned short pbcr;
unsigned short pccr;
unsigned short pdcr;
unsigned short pecr;
unsigned short pfcr;
unsigned short pgcr;
unsigned short phcr;
unsigned short picr;
unsigned short pjcr;
unsigned short pkcr;
unsigned short plcr;
unsigned short pmcr;
unsigned short pncr;
unsigned short pocr;
unsigned short reserved;
unsigned short pqcr;
unsigned short prcr;
unsigned short pscr;
unsigned short ptcr;
unsigned short pucr;
unsigned short pvcr;
unsigned short pwcr;
unsigned short pxcr;
unsigned short pycr;
unsigned short pzcr;
unsigned char padr;
unsigned char reserved_a;
unsigned char pbdr;
unsigned char reserved_b;
unsigned char pcdr;
unsigned char reserved_c;
unsigned char pddr;
unsigned char reserved_d;
unsigned char pedr;
unsigned char reserved_e;
unsigned char pfdr;
unsigned char reserved_f;
unsigned char pgdr;
unsigned char reserved_g;
unsigned char phdr;
unsigned char reserved_h;
unsigned char pidr;
unsigned char reserved_i;
unsigned char pjdr;
unsigned char reserved_j;
unsigned char pkdr;
unsigned char reserved_k;
unsigned char pldr;
unsigned char reserved_l;
unsigned char pmdr;
unsigned char reserved_m;
unsigned char pndr;
unsigned char reserved_n;
unsigned char podr;
unsigned char reserved_o;
unsigned char ppdr;
unsigned char reserved_p;
unsigned char pqdr;
unsigned char reserved_q;
unsigned char prdr;
unsigned char reserved_r;
unsigned char psdr;
unsigned char reserved_s;
unsigned char ptdr;
unsigned char reserved_t;
unsigned char pudr;
unsigned char reserved_u;
unsigned char pvdr;
unsigned char reserved_v;
unsigned char pwdr;
unsigned char reserved_w;
unsigned char pxdr;
unsigned char reserved_x;
unsigned char pydr;
unsigned char reserved_y;
unsigned char pzdr;
unsigned char reserved_z;
unsigned short ncer;
unsigned short ncmcr;
unsigned short nccsr;
unsigned char reserved2[2];
unsigned short psel0; /* +0x70 */
unsigned short psel1;
unsigned short psel2;
unsigned short psel3;
unsigned short psel4;
unsigned short psel5;
unsigned short psel6;
unsigned short reserved3[2];
unsigned short psel7;
};
#define GPIO_BASE ((struct gpio_regs *)0xffec0000)
#endif /* ifndef __ASSEMBLY__ */
#endif /* _ASM_CPU_SH7753_H_ */

View File

@@ -1,12 +1,10 @@
#ifndef _ASM_SH_PROCESSOR_H_ #ifndef _ASM_SH_PROCESSOR_H_
#define _ASM_SH_PROCESSOR_H_ #define _ASM_SH_PROCESSOR_H_
#if defined(CONFIG_SH2) || \ #if defined(CONFIG_SH2)
defined (CONFIG_SH2A)
# include <asm/cpu_sh2.h> # include <asm/cpu_sh2.h>
#elif defined (CONFIG_SH3) #elif defined(CONFIG_SH3)
# include <asm/cpu_sh3.h> # include <asm/cpu_sh3.h>
#elif defined (CONFIG_SH4) || \ #elif defined(CONFIG_SH4)
defined (CONFIG_SH4A)
# include <asm/cpu_sh4.h> # include <asm/cpu_sh4.h>
#endif #endif
#endif #endif

View File

@@ -84,5 +84,5 @@ void __udelay(unsigned long usec)
unsigned long get_tbclk(void) unsigned long get_tbclk(void)
{ {
return CONFIG_SYS_HZ; return CONFIG_SH_CMT_CLK_FREQ;
} }

View File

@@ -1,8 +1,8 @@
# #
# (C) Copyright 2012 # (C) Copyright 2000-2004
# Wolfgang Denk, DENX Software Engineering, wd@denx.de. # Wolfgang Denk, DENX Software Engineering, wd@denx.de.
# #
# SPDX-License-Identifier: GPL-2.0+ # SPDX-License-Identifier: GPL-2.0+
# #
obj-y := mini2440.o obj-y := vexpress64.o

View File

@@ -0,0 +1,56 @@
/*
* (C) Copyright 2013
* David Feng <fenghua@phytium.com.cn>
* Sharma Bhupesh <bhupesh.sharma@freescale.com>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <malloc.h>
#include <errno.h>
#include <netdev.h>
#include <asm/io.h>
#include <linux/compiler.h>
DECLARE_GLOBAL_DATA_PTR;
int board_init(void)
{
return 0;
}
int dram_init(void)
{
/*
* Clear spin table so that secondary processors
* observe the correct value after waken up from wfe.
*/
*(unsigned long *)CPU_RELEASE_ADDR = 0;
gd->ram_size = PHYS_SDRAM_1_SIZE;
return 0;
}
int timer_init(void)
{
return 0;
}
/*
* Board specific reset that is system reset.
*/
void reset_cpu(ulong addr)
{
}
/*
* Board specific ethernet initialization routine.
*/
int board_eth_init(bd_t *bis)
{
int rc = 0;
#ifdef CONFIG_SMC91111
rc = smc91111_initialize(0, CONFIG_SMC91111_BASE);
#endif
return rc;
}

View File

@@ -10,6 +10,7 @@
#include <netdev.h> #include <netdev.h>
#include <asm/blackfin.h> #include <asm/blackfin.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/sdh.h>
#include <asm/portmux.h> #include <asm/portmux.h>
#include "soft_switch.h" #include "soft_switch.h"

View File

@@ -2,6 +2,6 @@
aa55aa55 010e0100 aa55aa55 010e0100
# serdes protocol 0x2A_0x98 # serdes protocol 0x2A_0x98
140e0018 0f001218 00000000 00000000 140e0018 0f001218 00000000 00000000
54980000 9000a000 f8025000 a9000000 54980000 9000a000 e8104000 a9000000
01000000 00000000 00000000 0001b1f8 01000000 00000000 00000000 0001b1f8
00000000 14000020 00000000 00000011 00000000 14000020 00000000 00000011

View File

@@ -30,7 +30,7 @@ struct fsl_e_tlb_entry tlb_table[] = {
SET_TLB_ENTRY(1, 0xfffff000, 0xfffff000, SET_TLB_ENTRY(1, 0xfffff000, 0xfffff000,
MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
0, 0, BOOKE_PAGESZ_4K, 1), 0, 0, BOOKE_PAGESZ_4K, 1),
#ifdef CONFIG_SPL_NAND_MINIMAL #ifdef CONFIG_SPL_NAND_BOOT
SET_TLB_ENTRY(1, 0xffffe000, 0xffffe000, SET_TLB_ENTRY(1, 0xffffe000, 0xffffe000,
MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
0, 10, BOOKE_PAGESZ_4K, 1), 0, 10, BOOKE_PAGESZ_4K, 1),

View File

@@ -30,7 +30,7 @@ struct fsl_e_tlb_entry tlb_table[] = {
SET_TLB_ENTRY(1, 0xfffff000, 0xfffff000, SET_TLB_ENTRY(1, 0xfffff000, 0xfffff000,
MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
0, 0, BOOKE_PAGESZ_4K, 1), 0, 0, BOOKE_PAGESZ_4K, 1),
#ifdef CONFIG_SPL_NAND_MINIMAL #ifdef CONFIG_SPL_NAND_BOOT
SET_TLB_ENTRY(1, 0xffffe000, 0xffffe000, SET_TLB_ENTRY(1, 0xffffe000, 0xffffe000,
MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
0, 10, BOOKE_PAGESZ_4K, 1), 0, 10, BOOKE_PAGESZ_4K, 1),

View File

@@ -5,8 +5,6 @@
# SPDX-License-Identifier: GPL-2.0+ # SPDX-License-Identifier: GPL-2.0+
# #
CPPFLAGS += -I$(TOPDIR)
obj-y += law.o obj-y += law.o
obj-$(CONFIG_PCI) += pci.o obj-$(CONFIG_PCI) += pci.o
obj-y += tlb.o obj-y += tlb.o

Some files were not shown because too many files have changed in this diff Show More