Merge branch 'u-boot/master' into 'u-boot-arm/master'
This commit is contained in:
commit
b939689c7b
@ -47,7 +47,7 @@ used under the terms of either of these licenses, i. e. with
|
||||
|
||||
SPDX-License-Identifier: GPL-2.0+ BSD-3-Clause
|
||||
|
||||
you can chose between GPL-2.0+ and BSD-3-Clause licensing.
|
||||
you can choose between GPL-2.0+ and BSD-3-Clause licensing.
|
||||
|
||||
We use the SPDX Unique License Identifiers here; these are available
|
||||
at [2].
|
||||
@ -67,3 +67,4 @@ BSD 3-clause "New" or "Revised" License BSD-3-Clause Y bsd-3-clause.txt http:/
|
||||
IBM PIBS (PowerPC Initialization and IBM-pibs ibm-pibs.txt
|
||||
Boot Software) license
|
||||
ISC License ISC Y isc.txt https://spdx.org/licenses/ISC
|
||||
X11 License X11 x11.txt https://spdx.org/licenses/X11.html
|
||||
|
25
Licenses/x11.txt
Normal file
25
Licenses/x11.txt
Normal file
@ -0,0 +1,25 @@
|
||||
X11 License
|
||||
Copyright (C) 1996 X Consortium
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
of the Software, and to permit persons to whom the Software is furnished to do
|
||||
so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE X
|
||||
CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name of the X Consortium shall not be
|
||||
used in advertising or otherwise to promote the sale, use or other dealings in
|
||||
this Software without prior written authorization from the X Consortium.
|
||||
|
||||
X Window System is a trademark of X Consortium, Inc.
|
@ -328,10 +328,11 @@ T: git git://git.denx.de/u-boot-ppc4xx.git
|
||||
F: arch/powerpc/cpu/ppc4xx/
|
||||
|
||||
NETWORK
|
||||
M: Joe Hershberger <joe.hershberger@gmail.com>
|
||||
M: Joe Hershberger <joe.hershberger@ni.com>
|
||||
S: Maintained
|
||||
T: git git://git.denx.de/u-boot-net.git
|
||||
F: drivers/net/
|
||||
F: net/
|
||||
|
||||
NAND FLASH
|
||||
M: Scott Wood <scottwood@freescale.com>
|
||||
|
11
Makefile
11
Makefile
@ -651,6 +651,7 @@ libs-$(CONFIG_FMAN_ENET) += drivers/net/fm/
|
||||
libs-$(CONFIG_SYS_FSL_DDR) += drivers/ddr/fsl/
|
||||
libs-y += drivers/serial/
|
||||
libs-y += drivers/usb/dwc3/
|
||||
libs-y += drivers/usb/emul/
|
||||
libs-y += drivers/usb/eth/
|
||||
libs-y += drivers/usb/gadget/
|
||||
libs-y += drivers/usb/gadget/udc/
|
||||
@ -728,7 +729,7 @@ DO_STATIC_RELA =
|
||||
endif
|
||||
|
||||
# Always append ALL so that arch config.mk's can add custom ones
|
||||
ALL-y += u-boot.srec u-boot.bin System.map binary_size_check
|
||||
ALL-y += u-boot.srec u-boot.bin System.map u-boot.cfg binary_size_check
|
||||
|
||||
ALL-$(CONFIG_ONENAND_U_BOOT) += u-boot-onenand.bin
|
||||
ifeq ($(CONFIG_SPL_FSL_PBL),y)
|
||||
@ -870,6 +871,11 @@ ifndef CONFIG_SYS_UBOOT_START
|
||||
CONFIG_SYS_UBOOT_START := 0
|
||||
endif
|
||||
|
||||
# Create a file containing the configuration options the image was built with
|
||||
quiet_cmd_cpp_cfg = CFG $@
|
||||
cmd_cpp_cfg = $(CPP) -Wp,-MD,$(depfile) $(cpp_flags) $(LDPPFLAGS) -ansi \
|
||||
-D__ASSEMBLY__ -x assembler-with-cpp -P -dM -E -o $@ $<
|
||||
|
||||
MKIMAGEFLAGS_u-boot.img = -A $(ARCH) -T firmware -C none -O u-boot \
|
||||
-a $(CONFIG_SYS_TEXT_BASE) -e $(CONFIG_SYS_UBOOT_START) \
|
||||
-n "U-Boot $(UBOOTRELEASE) for $(BOARD) board"
|
||||
@ -900,6 +906,9 @@ u-boot.sha1: u-boot.bin
|
||||
u-boot.dis: u-boot
|
||||
$(OBJDUMP) -d $< > $@
|
||||
|
||||
u-boot.cfg: include/config.h
|
||||
$(call if_changed,cpp_cfg)
|
||||
|
||||
ifdef CONFIG_TPL
|
||||
SPL_PAYLOAD := tpl/u-boot-with-tpl.bin
|
||||
else
|
||||
|
99
README
99
README
@ -690,6 +690,14 @@ The following options need to be configured:
|
||||
exists, unlike the similar options in the Linux kernel. Do not
|
||||
set these options unless they apply!
|
||||
|
||||
COUNTER_FREQUENCY
|
||||
Generic timer clock source frequency.
|
||||
|
||||
COUNTER_FREQUENCY_REAL
|
||||
Generic timer clock source frequency if the real clock is
|
||||
different from COUNTER_FREQUENCY, and can only be determined
|
||||
at run time.
|
||||
|
||||
NOTE: The following can be machine specific errata. These
|
||||
do have ability to provide rudimentary version and machine
|
||||
specific checks, but expect no product checks.
|
||||
@ -1947,6 +1955,26 @@ CBFS (Coreboot Filesystem) support
|
||||
the console jump but can help speed up operation when scrolling
|
||||
is slow.
|
||||
|
||||
CONFIG_LCD_ROTATION
|
||||
|
||||
Sometimes, for example if the display is mounted in portrait
|
||||
mode or even if it's mounted landscape but rotated by 180degree,
|
||||
we need to rotate our content of the display relative to the
|
||||
framebuffer, so that user can read the messages which are
|
||||
printed out.
|
||||
Once CONFIG_LCD_ROTATION is defined, the lcd_console will be
|
||||
initialized with a given rotation from "vl_rot" out of
|
||||
"vidinfo_t" which is provided by the board specific code.
|
||||
The value for vl_rot is coded as following (matching to
|
||||
fbcon=rotate:<n> linux-kernel commandline):
|
||||
0 = no rotation respectively 0 degree
|
||||
1 = 90 degree rotation
|
||||
2 = 180 degree rotation
|
||||
3 = 270 degree rotation
|
||||
|
||||
If CONFIG_LCD_ROTATION is not defined, the console will be
|
||||
initialized with 0degree rotation.
|
||||
|
||||
CONFIG_LCD_BMP_RLE8
|
||||
|
||||
Support drawing of RLE8-compressed bitmaps on the LCD.
|
||||
@ -2375,6 +2403,8 @@ CBFS (Coreboot Filesystem) support
|
||||
- define slave for bus 3 with CONFIG_SYS_MXC_I2C3_SLAVE
|
||||
If those defines are not set, default value is 100000
|
||||
for speed, and 0 for slave.
|
||||
- enable bus 3 with CONFIG_SYS_I2C_MXC_I2C3
|
||||
- enable bus 4 with CONFIG_SYS_I2C_MXC_I2C4
|
||||
|
||||
- drivers/i2c/rcar_i2c.c:
|
||||
- activate this driver with CONFIG_SYS_I2C_RCAR
|
||||
@ -3066,17 +3096,6 @@ CBFS (Coreboot Filesystem) support
|
||||
memories can be connected with a given cs line.
|
||||
Currently Xilinx Zynq qspi supports these type of connections.
|
||||
|
||||
CONFIG_SYS_SPI_ST_ENABLE_WP_PIN
|
||||
enable the W#/Vpp signal to disable writing to the status
|
||||
register on ST MICRON flashes like the N25Q128.
|
||||
The status register write enable/disable bit, combined with
|
||||
the W#/VPP signal provides hardware data protection for the
|
||||
device as follows: When the enable/disable bit is set to 1,
|
||||
and the W#/VPP signal is driven LOW, the status register
|
||||
nonvolatile bits become read-only and the WRITE STATUS REGISTER
|
||||
operation will not execute. The only way to exit this
|
||||
hardware-protected mode is to drive W#/VPP HIGH.
|
||||
|
||||
- SystemACE Support:
|
||||
CONFIG_SYSTEMACE
|
||||
|
||||
@ -3198,55 +3217,6 @@ CBFS (Coreboot Filesystem) support
|
||||
example, some LED's) on your board. At the moment,
|
||||
the following checkpoints are implemented:
|
||||
|
||||
- Detailed boot stage timing
|
||||
CONFIG_BOOTSTAGE
|
||||
Define this option to get detailed timing of each stage
|
||||
of the boot process.
|
||||
|
||||
CONFIG_BOOTSTAGE_USER_COUNT
|
||||
This is the number of available user bootstage records.
|
||||
Each time you call bootstage_mark(BOOTSTAGE_ID_ALLOC, ...)
|
||||
a new ID will be allocated from this stash. If you exceed
|
||||
the limit, recording will stop.
|
||||
|
||||
CONFIG_BOOTSTAGE_REPORT
|
||||
Define this to print a report before boot, similar to this:
|
||||
|
||||
Timer summary in microseconds:
|
||||
Mark Elapsed Stage
|
||||
0 0 reset
|
||||
3,575,678 3,575,678 board_init_f start
|
||||
3,575,695 17 arch_cpu_init A9
|
||||
3,575,777 82 arch_cpu_init done
|
||||
3,659,598 83,821 board_init_r start
|
||||
3,910,375 250,777 main_loop
|
||||
29,916,167 26,005,792 bootm_start
|
||||
30,361,327 445,160 start_kernel
|
||||
|
||||
CONFIG_CMD_BOOTSTAGE
|
||||
Add a 'bootstage' command which supports printing a report
|
||||
and un/stashing of bootstage data.
|
||||
|
||||
CONFIG_BOOTSTAGE_FDT
|
||||
Stash the bootstage information in the FDT. A root 'bootstage'
|
||||
node is created with each bootstage id as a child. Each child
|
||||
has a 'name' property and either 'mark' containing the
|
||||
mark time in microsecond, or 'accum' containing the
|
||||
accumulated time for that bootstage id in microseconds.
|
||||
For example:
|
||||
|
||||
bootstage {
|
||||
154 {
|
||||
name = "board_init_f";
|
||||
mark = <3575678>;
|
||||
};
|
||||
170 {
|
||||
name = "lcd";
|
||||
accum = <33482>;
|
||||
};
|
||||
};
|
||||
|
||||
Code in the Linux kernel can find this in /proc/devicetree.
|
||||
|
||||
Legacy uImage format:
|
||||
|
||||
@ -3340,9 +3310,9 @@ Legacy uImage format:
|
||||
65 net/eth.c Ethernet found.
|
||||
|
||||
-80 common/cmd_net.c usage wrong
|
||||
80 common/cmd_net.c before calling NetLoop()
|
||||
-81 common/cmd_net.c some error in NetLoop() occurred
|
||||
81 common/cmd_net.c NetLoop() back without error
|
||||
80 common/cmd_net.c before calling net_loop()
|
||||
-81 common/cmd_net.c some error in net_loop() occurred
|
||||
81 common/cmd_net.c net_loop() back without error
|
||||
-82 common/cmd_net.c size == 0 (File with size 0 loaded)
|
||||
82 common/cmd_net.c trying automatic boot
|
||||
83 common/cmd_net.c running "source" command
|
||||
@ -4911,6 +4881,9 @@ Low Level (hardware related) configuration options:
|
||||
- CONFIG_FSL_DDR_SYNC_REFRESH
|
||||
Enable sync of refresh for multiple controllers.
|
||||
|
||||
- CONFIG_FSL_DDR_BIST
|
||||
Enable built-in memory test for Freescale DDR controllers.
|
||||
|
||||
- CONFIG_SYS_83XX_DDR_USES_CS0
|
||||
Only for 83xx systems. If specified, then DDR should
|
||||
be configured using CS0 and CS1 instead of CS2 and CS3.
|
||||
|
@ -37,7 +37,7 @@ int dev_open_net(void *cookie)
|
||||
if (!dev_valid_net(cookie))
|
||||
return API_ENODEV;
|
||||
|
||||
if (eth_init(gd->bd) < 0)
|
||||
if (eth_init() < 0)
|
||||
return API_EIO;
|
||||
|
||||
return 0;
|
||||
|
@ -70,6 +70,12 @@ config SANDBOX
|
||||
select HAVE_GENERIC_BOARD
|
||||
select SYS_GENERIC_BOARD
|
||||
select SUPPORT_OF_CONTROL
|
||||
select DM
|
||||
select DM_SPI_FLASH
|
||||
select DM_SERIAL
|
||||
select DM_I2C
|
||||
select DM_SPI
|
||||
select DM_GPIO
|
||||
|
||||
config SH
|
||||
bool "SuperH architecture"
|
||||
@ -84,6 +90,9 @@ config X86
|
||||
select HAVE_GENERIC_BOARD
|
||||
select SYS_GENERIC_BOARD
|
||||
select SUPPORT_OF_CONTROL
|
||||
select DM
|
||||
select DM_SERIAL
|
||||
select DM_GPIO
|
||||
|
||||
endchoice
|
||||
|
||||
|
144
arch/arm/Kconfig
144
arch/arm/Kconfig
@ -33,6 +33,9 @@ config CPU_V7
|
||||
bool
|
||||
select HAS_VBAR
|
||||
|
||||
config CPU_V7M
|
||||
bool
|
||||
|
||||
config CPU_PXA
|
||||
bool
|
||||
|
||||
@ -47,6 +50,7 @@ config SYS_CPU
|
||||
default "arm1136" if CPU_ARM1136
|
||||
default "arm1176" if CPU_ARM1176
|
||||
default "armv7" if CPU_V7
|
||||
default "armv7m" if CPU_V7M
|
||||
default "pxa" if CPU_PXA
|
||||
default "sa1100" if CPU_SA1100
|
||||
default "armv8" if ARM64
|
||||
@ -61,18 +65,6 @@ config SEMIHOSTING
|
||||
choice
|
||||
prompt "Target select"
|
||||
|
||||
config TARGET_INTEGRATORAP_CM720T
|
||||
bool "Support integratorap_cm720t"
|
||||
select CPU_ARM720T
|
||||
|
||||
config TARGET_INTEGRATORAP_CM920T
|
||||
bool "Support integratorap_cm920t"
|
||||
select CPU_ARM920T
|
||||
|
||||
config TARGET_INTEGRATORCP_CM920T
|
||||
bool "Support integratorcp_cm920t"
|
||||
select CPU_ARM920T
|
||||
|
||||
config ARCH_AT91
|
||||
bool "Atmel AT91"
|
||||
|
||||
@ -92,14 +84,6 @@ config TARGET_SMDK2410
|
||||
bool "Support smdk2410"
|
||||
select CPU_ARM920T
|
||||
|
||||
config TARGET_INTEGRATORAP_CM926EJS
|
||||
bool "Support integratorap_cm926ejs"
|
||||
select CPU_ARM926EJS
|
||||
|
||||
config TARGET_INTEGRATORCP_CM926EJS
|
||||
bool "Support integratorcp_cm926ejs"
|
||||
select CPU_ARM926EJS
|
||||
|
||||
config TARGET_ASPENITE
|
||||
bool "Support aspenite"
|
||||
select CPU_ARM926EJS
|
||||
@ -235,6 +219,8 @@ config TARGET_SPEAR600
|
||||
config TARGET_STV0991
|
||||
bool "Support stv0991"
|
||||
select CPU_V7
|
||||
select DM
|
||||
select DM_SERIAL
|
||||
|
||||
config TARGET_X600
|
||||
bool "Support x600"
|
||||
@ -245,10 +231,6 @@ config ARCH_VERSATILE
|
||||
bool "ARM Ltd. Versatile family"
|
||||
select CPU_ARM926EJS
|
||||
|
||||
config TARGET_INTEGRATORCP_CM1136
|
||||
bool "Support integratorcp_cm1136"
|
||||
select CPU_ARM1136
|
||||
|
||||
config TARGET_IMX31_PHYCORE
|
||||
bool "Support imx31_phycore"
|
||||
select CPU_ARM1136
|
||||
@ -293,14 +275,9 @@ config TARGET_MX35PDK
|
||||
|
||||
config ARCH_BCM283X
|
||||
bool "Broadcom BCM283X family"
|
||||
|
||||
config TARGET_INTEGRATORAP_CM946ES
|
||||
bool "Support integratorap_cm946es"
|
||||
select CPU_ARM946ES
|
||||
|
||||
config TARGET_INTEGRATORCP_CM946ES
|
||||
bool "Support integratorcp_cm946es"
|
||||
select CPU_ARM946ES
|
||||
select DM
|
||||
select DM_SERIAL
|
||||
select DM_GPIO
|
||||
|
||||
config TARGET_VEXPRESS_CA15_TC2
|
||||
bool "Support vexpress_ca15_tc2"
|
||||
@ -330,21 +307,33 @@ config TARGET_CM_T335
|
||||
bool "Support cm_t335"
|
||||
select CPU_V7
|
||||
select SUPPORT_SPL
|
||||
select DM
|
||||
select DM_SERIAL
|
||||
select DM_GPIO
|
||||
|
||||
config TARGET_PEPPER
|
||||
bool "Support pepper"
|
||||
select CPU_V7
|
||||
select SUPPORT_SPL
|
||||
select DM
|
||||
select DM_SERIAL
|
||||
select DM_GPIO
|
||||
|
||||
config TARGET_AM335X_IGEP0033
|
||||
bool "Support am335x_igep0033"
|
||||
select CPU_V7
|
||||
select SUPPORT_SPL
|
||||
select DM
|
||||
select DM_SERIAL
|
||||
select DM_GPIO
|
||||
|
||||
config TARGET_PCM051
|
||||
bool "Support pcm051"
|
||||
select CPU_V7
|
||||
select SUPPORT_SPL
|
||||
select DM
|
||||
select DM_SERIAL
|
||||
select DM_GPIO
|
||||
|
||||
config TARGET_DRACO
|
||||
bool "Support draco"
|
||||
@ -370,11 +359,17 @@ config TARGET_PENGWYN
|
||||
bool "Support pengwyn"
|
||||
select CPU_V7
|
||||
select SUPPORT_SPL
|
||||
select DM
|
||||
select DM_SERIAL
|
||||
select DM_GPIO
|
||||
|
||||
config TARGET_AM335X_EVM
|
||||
bool "Support am335x_evm"
|
||||
select CPU_V7
|
||||
select SUPPORT_SPL
|
||||
select DM
|
||||
select DM_SERIAL
|
||||
select DM_GPIO
|
||||
|
||||
config TARGET_AM43XX_EVM
|
||||
bool "Support am43xx_evm"
|
||||
@ -385,6 +380,8 @@ config TARGET_BAV335X
|
||||
bool "Support bav335x"
|
||||
select CPU_V7
|
||||
select SUPPORT_SPL
|
||||
select DM
|
||||
select DM_SERIAL
|
||||
help
|
||||
The BAV335x OEM Network Processor integrates all the functions of an
|
||||
embedded network computer in a small, easy to use SODIMM module which
|
||||
@ -419,15 +416,26 @@ config TARGET_BCMNSP
|
||||
config ARCH_EXYNOS
|
||||
bool "Samsung EXYNOS"
|
||||
select CPU_V7
|
||||
select DM
|
||||
select DM_SPI_FLASH
|
||||
select DM_SERIAL
|
||||
select DM_SPI
|
||||
select DM_GPIO
|
||||
|
||||
config ARCH_S5PC1XX
|
||||
bool "Samsung S5PC1XX"
|
||||
select CPU_V7
|
||||
select DM
|
||||
select DM_SERIAL
|
||||
select DM_GPIO
|
||||
|
||||
config ARCH_HIGHBANK
|
||||
bool "Calxeda Highbank"
|
||||
select CPU_V7
|
||||
|
||||
config ARCH_INTEGRATOR
|
||||
bool "ARM Ltd. Integrator family"
|
||||
|
||||
config ARCH_KEYSTONE
|
||||
bool "TI Keystone"
|
||||
select CPU_V7
|
||||
@ -517,11 +525,20 @@ config TARGET_MX6QARM2
|
||||
config TARGET_MX6QSABREAUTO
|
||||
bool "Support mx6qsabreauto"
|
||||
select CPU_V7
|
||||
select DM
|
||||
select DM_THERMAL
|
||||
|
||||
config TARGET_MX6SABRESD
|
||||
bool "Support mx6sabresd"
|
||||
select CPU_V7
|
||||
select SUPPORT_SPL
|
||||
select DM
|
||||
select DM_THERMAL
|
||||
|
||||
config TARGET_MX6CUBOXI
|
||||
bool "Support Solid-run mx6 boards"
|
||||
select CPU_V7
|
||||
select SUPPORT_SPL
|
||||
|
||||
config TARGET_MX6SLEVK
|
||||
bool "Support mx6slevk"
|
||||
@ -531,6 +548,8 @@ config TARGET_MX6SXSABRESD
|
||||
bool "Support mx6sxsabresd"
|
||||
select CPU_V7
|
||||
select SUPPORT_SPL
|
||||
select DM
|
||||
select DM_THERMAL
|
||||
|
||||
config TARGET_GW_VENTANA
|
||||
bool "Support gw_ventana"
|
||||
@ -591,16 +610,25 @@ config TARGET_CM_FX6
|
||||
bool "Support cm_fx6"
|
||||
select CPU_V7
|
||||
select SUPPORT_SPL
|
||||
select DM
|
||||
select DM_SERIAL
|
||||
select DM_GPIO
|
||||
|
||||
config TARGET_SOCFPGA_ARRIA5
|
||||
bool "Support socfpga_arria5"
|
||||
select CPU_V7
|
||||
select SUPPORT_SPL
|
||||
select DM
|
||||
select DM_SPI_FLASH
|
||||
select DM_SPI
|
||||
|
||||
config TARGET_SOCFPGA_CYCLONE5
|
||||
bool "Support socfpga_cyclone5"
|
||||
select CPU_V7
|
||||
select SUPPORT_SPL
|
||||
select DM
|
||||
select DM_SPI_FLASH
|
||||
select DM_SPI
|
||||
|
||||
config ARCH_SUNXI
|
||||
bool "Support sunxi (Allwinner) SoCs"
|
||||
@ -617,10 +645,15 @@ config TARGET_VF610TWR
|
||||
bool "Support vf610twr"
|
||||
select CPU_V7
|
||||
|
||||
config ZYNQ
|
||||
config TARGET_COLIBRI_VF
|
||||
bool "Support Colibri VF50/61"
|
||||
select CPU_V7
|
||||
|
||||
config ARCH_ZYNQ
|
||||
bool "Xilinx Zynq Platform"
|
||||
select CPU_V7
|
||||
select SUPPORT_SPL
|
||||
select DM
|
||||
|
||||
config TARGET_XILINX_ZYNQMP
|
||||
bool "Support Xilinx ZynqMP Platform"
|
||||
@ -632,6 +665,12 @@ config TEGRA
|
||||
select SPL
|
||||
select OF_CONTROL
|
||||
select CPU_V7
|
||||
select DM
|
||||
select DM_SPI_FLASH
|
||||
select DM_SERIAL
|
||||
select DM_I2C
|
||||
select DM_SPI
|
||||
select DM_GPIO
|
||||
|
||||
config TARGET_VEXPRESS64_AEMV8A
|
||||
bool "Support vexpress_aemv8a"
|
||||
@ -656,6 +695,28 @@ config TARGET_LS2085A_SIMU
|
||||
select ARM64
|
||||
select ARMV8_MULTIENTRY
|
||||
|
||||
config TARGET_LS2085AQDS
|
||||
bool "Support ls2085aqds"
|
||||
select ARM64
|
||||
select ARMV8_MULTIENTRY
|
||||
select SUPPORT_SPL
|
||||
help
|
||||
Support for Freescale LS2085AQDS platform
|
||||
The LS2085A Development System (QDS) is a high-performance
|
||||
development platform that supports the QorIQ LS2085A
|
||||
Layerscape Architecture processor.
|
||||
|
||||
config TARGET_LS2085ARDB
|
||||
bool "Support ls2085ardb"
|
||||
select ARM64
|
||||
select ARMV8_MULTIENTRY
|
||||
select SUPPORT_SPL
|
||||
help
|
||||
Support for Freescale LS2085ARDB platform.
|
||||
The LS2085A Reference design board (RDB) is a high-performance
|
||||
development platform that supports the QorIQ LS2085A
|
||||
Layerscape Architecture processor.
|
||||
|
||||
config TARGET_LS1021AQDS
|
||||
bool "Support ls1021aqds"
|
||||
select CPU_V7
|
||||
@ -726,6 +787,13 @@ config ARCH_UNIPHIER
|
||||
select SUPPORT_SPL
|
||||
select SPL
|
||||
select OF_CONTROL
|
||||
select DM
|
||||
select DM_SERIAL
|
||||
select DM_I2C
|
||||
|
||||
config TARGET_STM32F429_DISCOVERY
|
||||
bool "Support STM32F429 Discovery"
|
||||
select CPU_V7M
|
||||
|
||||
endchoice
|
||||
|
||||
@ -739,6 +807,8 @@ source "arch/arm/cpu/armv7/exynos/Kconfig"
|
||||
|
||||
source "arch/arm/mach-highbank/Kconfig"
|
||||
|
||||
source "arch/arm/mach-integrator/Kconfig"
|
||||
|
||||
source "arch/arm/mach-keystone/Kconfig"
|
||||
|
||||
source "arch/arm/mach-kirkwood/Kconfig"
|
||||
@ -767,7 +837,7 @@ source "arch/arm/mach-uniphier/Kconfig"
|
||||
|
||||
source "arch/arm/mach-versatile/Kconfig"
|
||||
|
||||
source "arch/arm/cpu/armv7/zynq/Kconfig"
|
||||
source "arch/arm/mach-zynq/Kconfig"
|
||||
|
||||
source "arch/arm/cpu/armv7/Kconfig"
|
||||
|
||||
@ -784,7 +854,6 @@ source "board/Marvell/db-mv784mp-gp/Kconfig"
|
||||
source "board/Marvell/gplugd/Kconfig"
|
||||
source "board/altera/socfpga/Kconfig"
|
||||
source "board/armadeus/apf27/Kconfig"
|
||||
source "board/armltd/integrator/Kconfig"
|
||||
source "board/armltd/vexpress/Kconfig"
|
||||
source "board/armltd/vexpress64/Kconfig"
|
||||
source "board/bachmann/ot1200/Kconfig"
|
||||
@ -807,6 +876,8 @@ source "board/denx/m53evk/Kconfig"
|
||||
source "board/embest/mx6boards/Kconfig"
|
||||
source "board/esg/ima3-mx53/Kconfig"
|
||||
source "board/freescale/ls2085a/Kconfig"
|
||||
source "board/freescale/ls2085aqds/Kconfig"
|
||||
source "board/freescale/ls2085ardb/Kconfig"
|
||||
source "board/freescale/ls1021aqds/Kconfig"
|
||||
source "board/freescale/ls1021atwr/Kconfig"
|
||||
source "board/freescale/mx23evk/Kconfig"
|
||||
@ -856,6 +927,7 @@ source "board/siemens/draco/Kconfig"
|
||||
source "board/siemens/pxm2/Kconfig"
|
||||
source "board/siemens/rut/Kconfig"
|
||||
source "board/silica/pengwyn/Kconfig"
|
||||
source "board/solidrun/mx6cuboxi/Kconfig"
|
||||
source "board/solidrun/hummingboard/Kconfig"
|
||||
source "board/spear/spear300/Kconfig"
|
||||
source "board/spear/spear310/Kconfig"
|
||||
@ -864,6 +936,7 @@ source "board/spear/spear600/Kconfig"
|
||||
source "board/spear/x600/Kconfig"
|
||||
source "board/st-ericsson/snowball/Kconfig"
|
||||
source "board/st-ericsson/u8500/Kconfig"
|
||||
source "board/st/stm32f429-discovery/Kconfig"
|
||||
source "board/st/stv0991/Kconfig"
|
||||
source "board/sunxi/Kconfig"
|
||||
source "board/syteco/zmx25/Kconfig"
|
||||
@ -875,6 +948,7 @@ source "board/ti/ti814x/Kconfig"
|
||||
source "board/ti/ti816x/Kconfig"
|
||||
source "board/timll/devkit3250/Kconfig"
|
||||
source "board/toradex/colibri_pxa270/Kconfig"
|
||||
source "board/toradex/colibri_vf/Kconfig"
|
||||
source "board/tqc/tqma6/Kconfig"
|
||||
source "board/trizepsiv/Kconfig"
|
||||
source "board/ttcontrol/vision2/Kconfig"
|
||||
|
@ -55,6 +55,7 @@ machine-$(CONFIG_ORION5X) += orion5x
|
||||
machine-$(CONFIG_TEGRA) += tegra
|
||||
machine-$(CONFIG_ARCH_UNIPHIER) += uniphier
|
||||
machine-$(CONFIG_ARCH_VERSATILE) += versatile
|
||||
machine-$(CONFIG_ARCH_ZYNQ) += zynq
|
||||
|
||||
machdirs := $(patsubst %,arch/arm/mach-%/,$(machine-y))
|
||||
|
||||
|
@ -9,7 +9,6 @@
|
||||
|
||||
#include <asm-offsets.h>
|
||||
#include <config.h>
|
||||
#include <asm/hardware.h>
|
||||
|
||||
/*
|
||||
*************************************************************************
|
||||
|
@ -49,13 +49,6 @@ static const iomux_cfg_t iomux_boot[] = {
|
||||
MX23_PAD_LCD_D03__GPIO_1_3 | MUX_CONFIG_BOOTMODE_PAD,
|
||||
MX23_PAD_LCD_D04__GPIO_1_4 | MUX_CONFIG_BOOTMODE_PAD,
|
||||
MX23_PAD_LCD_D05__GPIO_1_5 | MUX_CONFIG_BOOTMODE_PAD,
|
||||
#elif defined(CONFIG_MX28)
|
||||
MX28_PAD_LCD_D00__GPIO_1_0 | MUX_CONFIG_BOOTMODE_PAD,
|
||||
MX28_PAD_LCD_D01__GPIO_1_1 | MUX_CONFIG_BOOTMODE_PAD,
|
||||
MX28_PAD_LCD_D02__GPIO_1_2 | MUX_CONFIG_BOOTMODE_PAD,
|
||||
MX28_PAD_LCD_D03__GPIO_1_3 | MUX_CONFIG_BOOTMODE_PAD,
|
||||
MX28_PAD_LCD_D04__GPIO_1_4 | MUX_CONFIG_BOOTMODE_PAD,
|
||||
MX28_PAD_LCD_D05__GPIO_1_5 | MUX_CONFIG_BOOTMODE_PAD,
|
||||
#endif
|
||||
};
|
||||
|
||||
@ -65,10 +58,10 @@ static uint8_t mxs_get_bootmode_index(void)
|
||||
int i;
|
||||
uint8_t masked;
|
||||
|
||||
#if defined(CONFIG_MX23)
|
||||
/* Setup IOMUX of bootmode pads to GPIO */
|
||||
mxs_iomux_setup_multiple_pads(iomux_boot, ARRAY_SIZE(iomux_boot));
|
||||
|
||||
#if defined(CONFIG_MX23)
|
||||
/* Setup bootmode pins as GPIO input */
|
||||
gpio_direction_input(MX23_PAD_LCD_D00__GPIO_1_0);
|
||||
gpio_direction_input(MX23_PAD_LCD_D01__GPIO_1_1);
|
||||
@ -83,21 +76,11 @@ static uint8_t mxs_get_bootmode_index(void)
|
||||
bootmode |= (gpio_get_value(MX23_PAD_LCD_D03__GPIO_1_3) ? 1 : 0) << 3;
|
||||
bootmode |= (gpio_get_value(MX23_PAD_LCD_D05__GPIO_1_5) ? 1 : 0) << 5;
|
||||
#elif defined(CONFIG_MX28)
|
||||
/* Setup bootmode pins as GPIO input */
|
||||
gpio_direction_input(MX28_PAD_LCD_D00__GPIO_1_0);
|
||||
gpio_direction_input(MX28_PAD_LCD_D01__GPIO_1_1);
|
||||
gpio_direction_input(MX28_PAD_LCD_D02__GPIO_1_2);
|
||||
gpio_direction_input(MX28_PAD_LCD_D03__GPIO_1_3);
|
||||
gpio_direction_input(MX28_PAD_LCD_D04__GPIO_1_4);
|
||||
gpio_direction_input(MX28_PAD_LCD_D05__GPIO_1_5);
|
||||
|
||||
/* Read bootmode pads */
|
||||
bootmode |= (gpio_get_value(MX28_PAD_LCD_D00__GPIO_1_0) ? 1 : 0) << 0;
|
||||
bootmode |= (gpio_get_value(MX28_PAD_LCD_D01__GPIO_1_1) ? 1 : 0) << 1;
|
||||
bootmode |= (gpio_get_value(MX28_PAD_LCD_D02__GPIO_1_2) ? 1 : 0) << 2;
|
||||
bootmode |= (gpio_get_value(MX28_PAD_LCD_D03__GPIO_1_3) ? 1 : 0) << 3;
|
||||
bootmode |= (gpio_get_value(MX28_PAD_LCD_D04__GPIO_1_4) ? 1 : 0) << 4;
|
||||
bootmode |= (gpio_get_value(MX28_PAD_LCD_D05__GPIO_1_5) ? 1 : 0) << 5;
|
||||
/* The global boot mode will be detected by ROM code and its value
|
||||
* is stored at the fixed address 0x00019BF0 in OCRAM.
|
||||
*/
|
||||
#define GLOBAL_BOOT_MODE_ADDR 0x00019BF0
|
||||
bootmode = __raw_readl(GLOBAL_BOOT_MODE_ADDR);
|
||||
#endif
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(mxs_boot_modes); i++) {
|
||||
|
@ -32,7 +32,7 @@ int arch_cpu_init(void)
|
||||
periph_clk_cfg |= CONFIG_SPEAR_UART48M;
|
||||
writel(periph_clk_cfg, &misc_p->periph_clk_cfg);
|
||||
#endif
|
||||
#if defined(CONFIG_DESIGNWARE_ETH)
|
||||
#if defined(CONFIG_ETH_DESIGNWARE)
|
||||
periph1_clken |= MISC_ETHENB;
|
||||
#endif
|
||||
#if defined(CONFIG_DW_UDC)
|
||||
|
@ -53,7 +53,7 @@ static void cache_flush (void)
|
||||
asm ("mcr p15, 0, %0, c7, c6, 0": :"r" (i));
|
||||
}
|
||||
|
||||
#ifndef CONFIG_INTEGRATOR
|
||||
#ifndef CONFIG_ARCH_INTEGRATOR
|
||||
|
||||
__attribute__((noreturn)) void reset_cpu(ulong addr __attribute__((unused)))
|
||||
{
|
||||
@ -63,4 +63,4 @@ __attribute__((noreturn)) void reset_cpu(ulong addr __attribute__((unused)))
|
||||
;
|
||||
}
|
||||
|
||||
#endif /* #ifdef CONFIG_INTEGRATOR */
|
||||
#endif /* #ifdef CONFIG_ARCH_INTEGRATOR */
|
||||
|
@ -12,7 +12,7 @@ obj-y += cache_v7.o
|
||||
obj-y += cpu.o cp15.o
|
||||
obj-y += syslib.o
|
||||
|
||||
ifneq ($(CONFIG_AM43XX)$(CONFIG_AM33XX)$(CONFIG_OMAP44XX)$(CONFIG_OMAP54XX)$(CONFIG_TEGRA)$(CONFIG_MX6)$(CONFIG_TI81XX)$(CONFIG_AT91FAMILY)$(CONFIG_SUNXI),)
|
||||
ifneq ($(CONFIG_AM43XX)$(CONFIG_AM33XX)$(CONFIG_OMAP44XX)$(CONFIG_OMAP54XX)$(CONFIG_TEGRA)$(CONFIG_MX6)$(CONFIG_TI81XX)$(CONFIG_AT91FAMILY)$(CONFIG_SUNXI)$(CONFIG_SOCFPGA),)
|
||||
ifneq ($(CONFIG_SKIP_LOWLEVEL_INIT),y)
|
||||
obj-y += lowlevel_init.o
|
||||
endif
|
||||
@ -56,4 +56,3 @@ obj-$(if $(filter stv0991,$(SOC)),y) += stv0991/
|
||||
obj-$(CONFIG_ARCH_SUNXI) += sunxi/
|
||||
obj-$(CONFIG_U8500) += u8500/
|
||||
obj-$(CONFIG_VF610) += vf610/
|
||||
obj-$(CONFIG_ZYNQ) += zynq/
|
||||
|
@ -65,19 +65,7 @@ endchoice
|
||||
config SYS_SOC
|
||||
default "exynos"
|
||||
|
||||
config DM
|
||||
default y
|
||||
|
||||
config DM_SERIAL
|
||||
default y
|
||||
|
||||
config DM_SPI
|
||||
default y
|
||||
|
||||
config DM_SPI_FLASH
|
||||
default y
|
||||
|
||||
config DM_GPIO
|
||||
config DM_USB
|
||||
default y
|
||||
|
||||
source "board/samsung/smdkv310/Kconfig"
|
||||
|
@ -20,7 +20,7 @@ void get_sys_info(struct sys_info *sys_info)
|
||||
{
|
||||
struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
|
||||
#ifdef CONFIG_FSL_IFC
|
||||
struct fsl_ifc *ifc_regs = (void *)CONFIG_SYS_IFC_ADDR;
|
||||
struct fsl_ifc ifc_regs = {(void *)CONFIG_SYS_IFC_ADDR, (void *)NULL};
|
||||
u32 ccr;
|
||||
#endif
|
||||
struct ccsr_clk *clk = (void *)(CONFIG_SYS_FSL_LS1_CLK_ADDR);
|
||||
@ -74,7 +74,7 @@ void get_sys_info(struct sys_info *sys_info)
|
||||
}
|
||||
|
||||
#if defined(CONFIG_FSL_IFC)
|
||||
ccr = in_be32(&ifc_regs->ifc_ccr);
|
||||
ccr = in_be32(&ifc_regs.gregs->ifc_ccr);
|
||||
ccr = ((ccr & IFC_CCR_CLK_DIV_MASK) >> IFC_CCR_CLK_DIV_SHIFT) + 1;
|
||||
|
||||
sys_info->freq_localbus = sys_info->freq_systembus / ccr;
|
||||
|
@ -514,17 +514,21 @@ void mx6_dram_cfg(const struct mx6_ddr_sysinfo *sysinfo,
|
||||
/* MR2 */
|
||||
val = (sysinfo->rtt_wr & 3) << 9 | (ddr3_cfg->SRT & 1) << 7 |
|
||||
((tcwl - 3) & 3) << 3;
|
||||
debug("MR2 CS%d: 0x%08x\n", cs, (u32)MR(val, 2, 3, cs));
|
||||
mmdc0->mdscr = MR(val, 2, 3, cs);
|
||||
/* MR3 */
|
||||
debug("MR3 CS%d: 0x%08x\n", cs, (u32)MR(0, 3, 3, cs));
|
||||
mmdc0->mdscr = MR(0, 3, 3, cs);
|
||||
/* MR1 */
|
||||
val = ((sysinfo->rtt_nom & 1) ? 1 : 0) << 2 |
|
||||
((sysinfo->rtt_nom & 2) ? 1 : 0) << 6;
|
||||
debug("MR1 CS%d: 0x%08x\n", cs, (u32)MR(val, 1, 3, cs));
|
||||
mmdc0->mdscr = MR(val, 1, 3, cs);
|
||||
/* MR0 */
|
||||
val = ((tcl - 1) << 4) | /* CAS */
|
||||
(1 << 8) | /* DLL Reset */
|
||||
((twr - 3) << 9); /* Write Recovery */
|
||||
debug("MR0 CS%d: 0x%08x\n", cs, (u32)MR(val, 0, 3, cs));
|
||||
mmdc0->mdscr = MR(val, 0, 3, cs);
|
||||
/* ZQ calibration */
|
||||
val = (1 << 10);
|
||||
@ -535,10 +539,11 @@ void mx6_dram_cfg(const struct mx6_ddr_sysinfo *sysinfo,
|
||||
mmdc0->mdpdc = (tcke & 0x7) << 16 |
|
||||
5 << 12 | /* PWDT_1: 256 cycles */
|
||||
5 << 8 | /* PWDT_0: 256 cycles */
|
||||
1 << 7 | /* SLOW_PD */
|
||||
1 << 6 | /* BOTH_CS_PD */
|
||||
(tcksrx & 0x7) << 3 |
|
||||
(tcksre & 0x7);
|
||||
if (!sysinfo->pd_fast_exit)
|
||||
mmdc0->mdpdc |= (1 << 7); /* SLOW_PD */
|
||||
mmdc0->mapsr = 0x00001006; /* ADOPT power down enabled */
|
||||
|
||||
/* Step 11: Configure ZQ calibration: one-time and periodic 1ms */
|
||||
|
@ -159,6 +159,16 @@ void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
|
||||
#ifdef CONFIG_SCSI_AHCI_PLAT
|
||||
void arch_preboot_os(void)
|
||||
{
|
||||
ahci_reset(DWC_AHSATA_BASE);
|
||||
ahci_reset((void __iomem *)DWC_AHSATA_BASE);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CMD_FASTBOOT) && !defined(CONFIG_ENV_IS_NOWHERE)
|
||||
int fb_set_reboot_flag(void)
|
||||
{
|
||||
printf("Setting reboot to fastboot flag ...\n");
|
||||
setenv("dofastboot", "1");
|
||||
saveenv();
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
@ -69,7 +69,7 @@ int init_sata(int dev)
|
||||
val = TI_SATA_IDLE_NO | TI_SATA_STANDBY_NO;
|
||||
writel(val, TI_SATA_WRAPPER_BASE + TI_SATA_SYSCONFIG);
|
||||
|
||||
ret = ahci_init(DWC_AHSATA_BASE);
|
||||
ret = ahci_init((void __iomem *)DWC_AHSATA_BASE);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -88,6 +88,6 @@ void scsi_init(void)
|
||||
|
||||
void scsi_bus_reset(void)
|
||||
{
|
||||
ahci_reset(DWC_AHSATA_BASE);
|
||||
ahci_init(DWC_AHSATA_BASE);
|
||||
ahci_reset((void __iomem *)DWC_AHSATA_BASE);
|
||||
ahci_init((void __iomem *)DWC_AHSATA_BASE);
|
||||
}
|
||||
|
@ -60,3 +60,16 @@ void __weak usb_fake_mac_from_die_id(u32 *id)
|
||||
eth_setenv_enetaddr("usbethaddr", device_mac);
|
||||
}
|
||||
}
|
||||
|
||||
void __weak usb_set_serial_num_from_die_id(u32 *id)
|
||||
{
|
||||
char serialno[72];
|
||||
uint32_t serialno_lo, serialno_hi;
|
||||
|
||||
if (!getenv("serial#")) {
|
||||
serialno_hi = id[0];
|
||||
serialno_lo = id[1];
|
||||
sprintf(serialno, "%08x%08x", serialno_hi, serialno_lo);
|
||||
setenv("serial#", serialno);
|
||||
}
|
||||
}
|
||||
|
@ -17,6 +17,9 @@ config TARGET_OMAP3_SDP3430
|
||||
config TARGET_OMAP3_BEAGLE
|
||||
bool "TI OMAP3 BeagleBoard"
|
||||
select SUPPORT_SPL
|
||||
select DM
|
||||
select DM_SERIAL
|
||||
select DM_GPIO
|
||||
|
||||
config TARGET_CM_T35
|
||||
bool "CompuLab CM-T3530 and CM-T3730 boards"
|
||||
@ -28,6 +31,9 @@ config TARGET_CM_T3517
|
||||
config TARGET_DEVKIT8000
|
||||
bool "TimLL OMAP3 Devkit8000"
|
||||
select SUPPORT_SPL
|
||||
select DM
|
||||
select DM_SERIAL
|
||||
select DM_GPIO
|
||||
|
||||
config TARGET_OMAP3_EVM
|
||||
bool "TI OMAP3 EVM"
|
||||
@ -44,13 +50,22 @@ config TARGET_OMAP3_EVM_QUICK_NAND
|
||||
config TARGET_OMAP3_IGEP00X0
|
||||
bool "IGEP"
|
||||
select SUPPORT_SPL
|
||||
select DM
|
||||
select DM_SERIAL
|
||||
select DM_GPIO
|
||||
|
||||
config TARGET_OMAP3_OVERO
|
||||
bool "OMAP35xx Gumstix Overo"
|
||||
select SUPPORT_SPL
|
||||
select DM
|
||||
select DM_SERIAL
|
||||
select DM_GPIO
|
||||
|
||||
config TARGET_OMAP3_ZOOM1
|
||||
bool "TI Zoom1"
|
||||
select DM
|
||||
select DM_SERIAL
|
||||
select DM_GPIO
|
||||
|
||||
config TARGET_AM3517_CRANE
|
||||
bool "am3517_crane"
|
||||
@ -94,18 +109,12 @@ config TARGET_TWISTER
|
||||
config TARGET_OMAP3_CAIRO
|
||||
bool "QUIPOS CAIRO"
|
||||
select SUPPORT_SPL
|
||||
select DM
|
||||
select DM_SERIAL
|
||||
select DM_GPIO
|
||||
|
||||
endchoice
|
||||
|
||||
config DM
|
||||
default y
|
||||
|
||||
config DM_GPIO
|
||||
default y if DM
|
||||
|
||||
config DM_SERIAL
|
||||
default y if DM
|
||||
|
||||
config SYS_SOC
|
||||
default "omap3"
|
||||
|
||||
|
@ -460,7 +460,7 @@ void enable_basic_clocks(void)
|
||||
(*prcm)->cm_l4per_gpio6_clkctrl,
|
||||
(*prcm)->cm_l4per_gpio7_clkctrl,
|
||||
(*prcm)->cm_l4per_gpio8_clkctrl,
|
||||
#ifdef CONFIG_USB_DWC3
|
||||
#if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP)
|
||||
(*prcm)->cm_l3init_ocp2scp1_clkctrl,
|
||||
(*prcm)->cm_l3init_usb_otg_ss1_clkctrl,
|
||||
#endif
|
||||
@ -495,7 +495,7 @@ void enable_basic_clocks(void)
|
||||
setbits_le32((*prcm)->cm_l3init_hsmmc2_clkctrl,
|
||||
HSMMC_CLKCTRL_CLKSEL_MASK);
|
||||
|
||||
#ifdef CONFIG_USB_DWC3
|
||||
#if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP)
|
||||
/* Enable 960 MHz clock for dwc3 */
|
||||
setbits_le32((*prcm)->cm_l3init_usb_otg_ss1_clkctrl,
|
||||
OPTFCLKEN_REFCLK960M);
|
||||
|
@ -440,6 +440,10 @@ struct omap_sys_ctrl_regs const dra7xx_ctrl = {
|
||||
.control_emif1_sdram_config_ext = 0x4AE0C144,
|
||||
.control_emif2_sdram_config_ext = 0x4AE0C148,
|
||||
.control_wkup_ldovbb_mpu_voltage_ctrl = 0x4AE0C158,
|
||||
.control_std_fuse_die_id_0 = 0x4AE0C200,
|
||||
.control_std_fuse_die_id_1 = 0x4AE0C208,
|
||||
.control_std_fuse_die_id_2 = 0x4AE0C20C,
|
||||
.control_std_fuse_die_id_3 = 0x4AE0C210,
|
||||
.control_padconf_mode = 0x4AE0C5A0,
|
||||
.control_xtal_oscillator = 0x4AE0C5A4,
|
||||
.control_i2c_2 = 0x4AE0C5A8,
|
||||
|
@ -8,24 +8,36 @@ config TARGET_ARMADILLO_800EVA
|
||||
|
||||
config TARGET_GOSE
|
||||
bool "Gose board"
|
||||
select DM
|
||||
select DM_SERIAL
|
||||
|
||||
config TARGET_KOELSCH
|
||||
bool "Koelsch board"
|
||||
select DM
|
||||
select DM_SERIAL
|
||||
|
||||
config TARGET_LAGER
|
||||
bool "Lager board"
|
||||
select DM
|
||||
select DM_SERIAL
|
||||
|
||||
config TARGET_KZM9G
|
||||
bool "KZM9D board"
|
||||
|
||||
config TARGET_ALT
|
||||
bool "Alt board"
|
||||
select DM
|
||||
select DM_SERIAL
|
||||
|
||||
config TARGET_SILK
|
||||
bool "Silk board"
|
||||
select DM
|
||||
select DM_SERIAL
|
||||
|
||||
config TARGET_PORTER
|
||||
bool "Porter board"
|
||||
select DM
|
||||
select DM_SERIAL
|
||||
|
||||
endchoice
|
||||
|
||||
|
@ -7,7 +7,6 @@
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
|
||||
obj-y := lowlevel_init.o
|
||||
obj-y += misc.o timer.o reset_manager.o system_manager.o clock_manager.o \
|
||||
fpga_manager.o
|
||||
obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o scan_manager.o
|
||||
|
@ -1,45 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Altera Corporation <www.altera.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Set up the platform, once the cpu has been initialized */
|
||||
.globl lowlevel_init
|
||||
lowlevel_init:
|
||||
|
||||
/* Remap */
|
||||
#ifdef CONFIG_SPL_BUILD
|
||||
/*
|
||||
* SPL : configure the remap (L3 NIC-301 GPV)
|
||||
* so the on-chip RAM at lower memory instead ROM.
|
||||
*/
|
||||
ldr r0, =SOCFPGA_L3REGS_ADDRESS
|
||||
mov r1, #0x19
|
||||
str r1, [r0]
|
||||
#else
|
||||
/*
|
||||
* U-Boot : configure the remap (L3 NIC-301 GPV)
|
||||
* so the SDRAM at lower memory instead on-chip RAM.
|
||||
*/
|
||||
ldr r0, =SOCFPGA_L3REGS_ADDRESS
|
||||
mov r1, #0x2
|
||||
str r1, [r0]
|
||||
|
||||
/* Private components security */
|
||||
|
||||
/*
|
||||
* U-Boot : configure private timer, global timer and cpu
|
||||
* component access as non secure for kernel stage (as required
|
||||
* by kernel)
|
||||
*/
|
||||
mrc p15,4,r0,c15,c0,0
|
||||
add r1, r0, #0x54
|
||||
ldr r2, [r1]
|
||||
orr r2, r2, #0xff
|
||||
orr r2, r2, #0xf00
|
||||
str r2, [r1]
|
||||
#endif /* #ifdef CONFIG_SPL_BUILD */
|
||||
mov pc, lr
|
@ -49,7 +49,7 @@ void enable_caches(void)
|
||||
/*
|
||||
* DesignWare Ethernet initialization
|
||||
*/
|
||||
#ifdef CONFIG_DESIGNWARE_ETH
|
||||
#ifdef CONFIG_ETH_DESIGNWARE
|
||||
int cpu_eth_init(bd_t *bis)
|
||||
{
|
||||
#if CONFIG_EMAC_BASE == SOCFPGA_EMAC0_ADDRESS
|
||||
|
@ -113,3 +113,27 @@ void socfpga_spim_enable(void)
|
||||
clrbits_le32(reset, (1 << RSTMGR_PERMODRST_SPIM0_LSB) |
|
||||
(1 << RSTMGR_PERMODRST_SPIM1_LSB));
|
||||
}
|
||||
|
||||
/* Bring UART0 out of reset. */
|
||||
void socfpga_uart0_enable(void)
|
||||
{
|
||||
const void *reset = &reset_manager_base->per_mod_reset;
|
||||
|
||||
clrbits_le32(reset, 1 << RSTMGR_PERMODRST_UART0_LSB);
|
||||
}
|
||||
|
||||
/* Bring SDRAM controller out of reset. */
|
||||
void socfpga_sdram_enable(void)
|
||||
{
|
||||
const void *reset = &reset_manager_base->per_mod_reset;
|
||||
|
||||
clrbits_le32(reset, 1 << RSTMGR_PERMODRST_SDR_LSB);
|
||||
}
|
||||
|
||||
/* Bring OSC1 timer out of reset. */
|
||||
void socfpga_osc1timer_enable(void)
|
||||
{
|
||||
const void *reset = &reset_manager_base->per_mod_reset;
|
||||
|
||||
clrbits_le32(reset, 1 << RSTMGR_PERMODRST_OSC1TIMER0_LSB);
|
||||
}
|
||||
|
@ -6,6 +6,7 @@
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/pl310.h>
|
||||
#include <asm/u-boot.h>
|
||||
#include <asm/utils.h>
|
||||
#include <image.h>
|
||||
@ -15,9 +16,13 @@
|
||||
#include <asm/arch/freeze_controller.h>
|
||||
#include <asm/arch/clock_manager.h>
|
||||
#include <asm/arch/scan_manager.h>
|
||||
#include <asm/arch/sdram.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
static struct pl310_regs *const pl310 =
|
||||
(struct pl310_regs *)CONFIG_SYS_PL310_BASE;
|
||||
|
||||
#define MAIN_VCO_BASE ( \
|
||||
(CONFIG_HPS_MAINPLLGRP_VCO_DENOM << \
|
||||
CLKMGR_MAINPLLGRP_VCO_DENOM_OFFSET) | \
|
||||
@ -43,6 +48,31 @@ DECLARE_GLOBAL_DATA_PTR;
|
||||
CLKMGR_SDRPLLGRP_VCO_NUMER_OFFSET) \
|
||||
)
|
||||
|
||||
void board_init_f(ulong dummy)
|
||||
{
|
||||
struct socfpga_system_manager *sysmgr_regs =
|
||||
(struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
|
||||
unsigned long reg;
|
||||
/*
|
||||
* First C code to run. Clear fake OCRAM ECC first as SBE
|
||||
* and DBE might triggered during power on
|
||||
*/
|
||||
reg = readl(&sysmgr_regs->eccgrp_ocram);
|
||||
if (reg & SYSMGR_ECC_OCRAM_SERR)
|
||||
writel(SYSMGR_ECC_OCRAM_SERR | SYSMGR_ECC_OCRAM_EN,
|
||||
&sysmgr_regs->eccgrp_ocram);
|
||||
if (reg & SYSMGR_ECC_OCRAM_DERR)
|
||||
writel(SYSMGR_ECC_OCRAM_DERR | SYSMGR_ECC_OCRAM_EN,
|
||||
&sysmgr_regs->eccgrp_ocram);
|
||||
|
||||
memset(__bss_start, 0, __bss_end - __bss_start);
|
||||
|
||||
/* Remap SDRAM to 0x0 */
|
||||
writel(0x1, &pl310->pl310_addr_filter_start);
|
||||
|
||||
board_init_r(NULL, 0);
|
||||
}
|
||||
|
||||
u32 spl_boot_device(void)
|
||||
{
|
||||
return BOOT_DEVICE_RAM;
|
||||
@ -53,6 +83,7 @@ u32 spl_boot_device(void)
|
||||
*/
|
||||
void spl_board_init(void)
|
||||
{
|
||||
unsigned long sdram_size;
|
||||
#ifndef CONFIG_SOCFPGA_VIRTUAL_TARGET
|
||||
cm_config_t cm_default_cfg = {
|
||||
/* main group */
|
||||
@ -144,10 +175,19 @@ void spl_board_init(void)
|
||||
/* freeze all IO banks */
|
||||
sys_mgr_frzctrl_freeze_req();
|
||||
|
||||
socfpga_sdram_enable();
|
||||
socfpga_uart0_enable();
|
||||
socfpga_osc1timer_enable();
|
||||
|
||||
timer_init();
|
||||
|
||||
debug("Reconfigure Clock Manager\n");
|
||||
/* reconfigure the PLLs */
|
||||
cm_basic_init(&cm_default_cfg);
|
||||
|
||||
/* Enable bootrom to configure IOs. */
|
||||
sysmgr_enable_warmrstcfgio();
|
||||
|
||||
/* configure the IOCSR / IO buffer settings */
|
||||
if (scan_mgr_configure_iocsr())
|
||||
hang();
|
||||
@ -165,4 +205,25 @@ void spl_board_init(void)
|
||||
|
||||
/* enable console uart printing */
|
||||
preloader_console_init();
|
||||
|
||||
if (sdram_mmr_init_full(0xffffffff) != 0) {
|
||||
puts("SDRAM init failed.\n");
|
||||
hang();
|
||||
}
|
||||
|
||||
debug("SDRAM: Calibrating PHY\n");
|
||||
/* SDRAM calibration */
|
||||
if (sdram_calibration_full() == 0) {
|
||||
puts("SDRAM calibration failed.\n");
|
||||
hang();
|
||||
}
|
||||
|
||||
sdram_size = sdram_calculate_size();
|
||||
debug("SDRAM: %ld MiB\n", sdram_size >> 20);
|
||||
|
||||
/* Sanity check ensure correct SDRAM size specified */
|
||||
if (get_ram_size(0, sdram_size) != sdram_size) {
|
||||
puts("SDRAM size check failed!\n");
|
||||
hang();
|
||||
}
|
||||
}
|
||||
|
@ -66,3 +66,12 @@ void sysmgr_pinmux_init(void)
|
||||
|
||||
populate_sysmgr_fpgaintf_module();
|
||||
}
|
||||
|
||||
/*
|
||||
* This bit allows the bootrom to configure the IOs after a warm reset.
|
||||
*/
|
||||
void sysmgr_enable_warmrstcfgio(void)
|
||||
{
|
||||
setbits_le32(&sysmgr_regs->romcodegrp_ctrl,
|
||||
SYSMGR_ROMCODEGRP_CTRL_WARMRSTCFGIO);
|
||||
}
|
||||
|
@ -46,28 +46,33 @@ static int gpio_init(void)
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPB(22), SUNXI_GPIO_INPUT);
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPB(23), SUNXI_GPIO_INPUT);
|
||||
#endif
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPF(2), SUNXI_GPF2_UART0_TX);
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPF(4), SUNXI_GPF4_UART0_RX);
|
||||
#if defined(CONFIG_MACH_SUN8I)
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPF(2), SUN8I_GPF_UART0_TX);
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPF(4), SUN8I_GPF_UART0_RX);
|
||||
#else
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPF(2), SUNXI_GPF_UART0_TX);
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPF(4), SUNXI_GPF_UART0_RX);
|
||||
#endif
|
||||
sunxi_gpio_set_pull(SUNXI_GPF(4), 1);
|
||||
#elif CONFIG_CONS_INDEX == 1 && (defined(CONFIG_MACH_SUN4I) || defined(CONFIG_MACH_SUN7I))
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPB(22), SUN4I_GPB22_UART0_TX);
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPB(23), SUN4I_GPB23_UART0_RX);
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPB(22), SUN4I_GPB_UART0);
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPB(23), SUN4I_GPB_UART0);
|
||||
sunxi_gpio_set_pull(SUNXI_GPB(23), SUNXI_GPIO_PULL_UP);
|
||||
#elif CONFIG_CONS_INDEX == 1 && defined(CONFIG_MACH_SUN5I)
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPB(19), SUN5I_GPB19_UART0_TX);
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPB(20), SUN5I_GPB20_UART0_RX);
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPB(19), SUN5I_GPB_UART0);
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPB(20), SUN5I_GPB_UART0);
|
||||
sunxi_gpio_set_pull(SUNXI_GPB(20), SUNXI_GPIO_PULL_UP);
|
||||
#elif CONFIG_CONS_INDEX == 1 && defined(CONFIG_MACH_SUN6I)
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPH(20), SUN6I_GPH20_UART0_TX);
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPH(21), SUN6I_GPH21_UART0_RX);
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPH(20), SUN6I_GPH_UART0);
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPH(21), SUN6I_GPH_UART0);
|
||||
sunxi_gpio_set_pull(SUNXI_GPH(21), SUNXI_GPIO_PULL_UP);
|
||||
#elif CONFIG_CONS_INDEX == 2 && defined(CONFIG_MACH_SUN5I)
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPG(3), SUN5I_GPG3_UART1_TX);
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPG(4), SUN5I_GPG4_UART1_RX);
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPG(3), SUN5I_GPG_UART1);
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPG(4), SUN5I_GPG_UART1);
|
||||
sunxi_gpio_set_pull(SUNXI_GPG(4), SUNXI_GPIO_PULL_UP);
|
||||
#elif CONFIG_CONS_INDEX == 5 && defined(CONFIG_MACH_SUN8I)
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPL(2), SUN8I_GPL2_R_UART_TX);
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPL(3), SUN8I_GPL3_R_UART_RX);
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPL(2), SUN8I_GPL_R_UART);
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPL(3), SUN8I_GPL_R_UART);
|
||||
sunxi_gpio_set_pull(SUNXI_GPL(3), SUNXI_GPIO_PULL_UP);
|
||||
#else
|
||||
#error Unsupported console port number. Please fix pin mux settings in board.c
|
||||
|
@ -21,15 +21,15 @@ static int rsb_set_device_mode(void);
|
||||
static void rsb_cfg_io(void)
|
||||
{
|
||||
#ifdef CONFIG_MACH_SUN8I
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPL(0), SUN8I_GPL0_R_RSB_SCK);
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPL(1), SUN8I_GPL1_R_RSB_SDA);
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPL(0), SUN8I_GPL_R_RSB);
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPL(1), SUN8I_GPL_R_RSB);
|
||||
sunxi_gpio_set_pull(SUNXI_GPL(0), 1);
|
||||
sunxi_gpio_set_pull(SUNXI_GPL(1), 1);
|
||||
sunxi_gpio_set_drv(SUNXI_GPL(0), 2);
|
||||
sunxi_gpio_set_drv(SUNXI_GPL(1), 2);
|
||||
#elif defined CONFIG_MACH_SUN9I
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPN(0), SUN9I_GPN0_R_RSB_SCK);
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPN(1), SUN9I_GPN1_R_RSB_SDA);
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPN(0), SUN9I_GPN_R_RSB);
|
||||
sunxi_gpio_set_cfgpin(SUNXI_GPN(1), SUN9I_GPN_R_RSB);
|
||||
sunxi_gpio_set_pull(SUNXI_GPN(0), 1);
|
||||
sunxi_gpio_set_pull(SUNXI_GPN(1), 1);
|
||||
sunxi_gpio_set_drv(SUNXI_GPN(0), 2);
|
||||
|
@ -41,6 +41,7 @@ static struct sunxi_usbc_hcd {
|
||||
int usb_rst_mask;
|
||||
int ahb_clk_mask;
|
||||
int gpio_vbus;
|
||||
int gpio_vbus_det;
|
||||
int irq;
|
||||
int id;
|
||||
} sunxi_usbc_hcd[] = {
|
||||
@ -80,12 +81,6 @@ static struct sunxi_usbc_hcd {
|
||||
|
||||
static int enabled_hcd_count;
|
||||
|
||||
static bool use_axp_drivebus(int index)
|
||||
{
|
||||
return index == 0 &&
|
||||
strcmp(CONFIG_USB0_VBUS_PIN, "axp_drivebus") == 0;
|
||||
}
|
||||
|
||||
void *sunxi_usbc_get_io_base(int index)
|
||||
{
|
||||
switch (index) {
|
||||
@ -102,9 +97,6 @@ void *sunxi_usbc_get_io_base(int index)
|
||||
|
||||
static int get_vbus_gpio(int index)
|
||||
{
|
||||
if (use_axp_drivebus(index))
|
||||
return -1;
|
||||
|
||||
switch (index) {
|
||||
case 0: return sunxi_name_to_gpio(CONFIG_USB0_VBUS_PIN);
|
||||
case 1: return sunxi_name_to_gpio(CONFIG_USB1_VBUS_PIN);
|
||||
@ -113,6 +105,14 @@ static int get_vbus_gpio(int index)
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int get_vbus_detect_gpio(int index)
|
||||
{
|
||||
switch (index) {
|
||||
case 0: return sunxi_name_to_gpio(CONFIG_USB0_VBUS_DET);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void usb_phy_write(struct sunxi_usbc_hcd *sunxi_usbc, int addr,
|
||||
int data, int len)
|
||||
{
|
||||
@ -192,22 +192,35 @@ void sunxi_usbc_enable_squelch_detect(int index, int enable)
|
||||
int sunxi_usbc_request_resources(int index)
|
||||
{
|
||||
struct sunxi_usbc_hcd *sunxi_usbc = &sunxi_usbc_hcd[index];
|
||||
int ret = 0;
|
||||
|
||||
sunxi_usbc->gpio_vbus = get_vbus_gpio(index);
|
||||
if (sunxi_usbc->gpio_vbus != -1)
|
||||
return gpio_request(sunxi_usbc->gpio_vbus, "usbc_vbus");
|
||||
if (sunxi_usbc->gpio_vbus != -1) {
|
||||
ret |= gpio_request(sunxi_usbc->gpio_vbus, "usbc_vbus");
|
||||
ret |= gpio_direction_output(sunxi_usbc->gpio_vbus, 0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
sunxi_usbc->gpio_vbus_det = get_vbus_detect_gpio(index);
|
||||
if (sunxi_usbc->gpio_vbus_det != -1) {
|
||||
ret |= gpio_request(sunxi_usbc->gpio_vbus_det, "usbc_vbus_det");
|
||||
ret |= gpio_direction_input(sunxi_usbc->gpio_vbus_det);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int sunxi_usbc_free_resources(int index)
|
||||
{
|
||||
struct sunxi_usbc_hcd *sunxi_usbc = &sunxi_usbc_hcd[index];
|
||||
int ret = 0;
|
||||
|
||||
if (sunxi_usbc->gpio_vbus != -1)
|
||||
return gpio_free(sunxi_usbc->gpio_vbus);
|
||||
ret |= gpio_free(sunxi_usbc->gpio_vbus);
|
||||
|
||||
return 0;
|
||||
if (sunxi_usbc->gpio_vbus_det != -1)
|
||||
ret |= gpio_free(sunxi_usbc->gpio_vbus_det);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void sunxi_usbc_enable(int index)
|
||||
@ -258,22 +271,38 @@ void sunxi_usbc_vbus_enable(int index)
|
||||
{
|
||||
struct sunxi_usbc_hcd *sunxi_usbc = &sunxi_usbc_hcd[index];
|
||||
|
||||
#ifdef AXP_DRIVEBUS
|
||||
if (use_axp_drivebus(index))
|
||||
axp_drivebus_enable();
|
||||
#endif
|
||||
if (sunxi_usbc->gpio_vbus != -1)
|
||||
gpio_direction_output(sunxi_usbc->gpio_vbus, 1);
|
||||
gpio_set_value(sunxi_usbc->gpio_vbus, 1);
|
||||
}
|
||||
|
||||
void sunxi_usbc_vbus_disable(int index)
|
||||
{
|
||||
struct sunxi_usbc_hcd *sunxi_usbc = &sunxi_usbc_hcd[index];
|
||||
|
||||
#ifdef AXP_DRIVEBUS
|
||||
if (use_axp_drivebus(index))
|
||||
axp_drivebus_disable();
|
||||
#endif
|
||||
if (sunxi_usbc->gpio_vbus != -1)
|
||||
gpio_direction_output(sunxi_usbc->gpio_vbus, 0);
|
||||
gpio_set_value(sunxi_usbc->gpio_vbus, 0);
|
||||
}
|
||||
|
||||
int sunxi_usbc_vbus_detect(int index)
|
||||
{
|
||||
struct sunxi_usbc_hcd *sunxi_usbc = &sunxi_usbc_hcd[index];
|
||||
int err, retries = 3;
|
||||
|
||||
if (sunxi_usbc->gpio_vbus_det == -1) {
|
||||
eprintf("Error: invalid vbus detection pin\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
err = gpio_get_value(sunxi_usbc->gpio_vbus_det);
|
||||
/*
|
||||
* Vbus may have been provided by the board and just been turned of
|
||||
* some milliseconds ago on reset, what we're measuring then is a
|
||||
* residual charge on Vbus, sleep a bit and try again.
|
||||
*/
|
||||
while (err > 0 && retries--) {
|
||||
mdelay(100);
|
||||
err = gpio_get_value(sunxi_usbc->gpio_vbus_det);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@ -18,6 +18,8 @@
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
#endif
|
||||
|
||||
static char soc_type[] = "xx0";
|
||||
|
||||
#ifdef CONFIG_MXC_OCOTP
|
||||
void enable_ocotp_clk(unsigned char enable)
|
||||
{
|
||||
@ -284,14 +286,37 @@ static char *get_reset_cause(void)
|
||||
|
||||
int print_cpuinfo(void)
|
||||
{
|
||||
printf("CPU: Freescale Vybrid VF610 at %d MHz\n",
|
||||
mxc_get_clock(MXC_ARM_CLK) / 1000000);
|
||||
printf("CPU: Freescale Vybrid VF%s at %d MHz\n",
|
||||
soc_type, mxc_get_clock(MXC_ARM_CLK) / 1000000);
|
||||
printf("Reset cause: %s\n", get_reset_cause());
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
int arch_cpu_init(void)
|
||||
{
|
||||
struct mscm *mscm = (struct mscm *)MSCM_BASE_ADDR;
|
||||
|
||||
soc_type[0] = mscm->cpxcount ? '6' : '5'; /*Dual Core => VF6x0 */
|
||||
soc_type[1] = mscm->cpxcfg1 ? '1' : '0'; /* L2 Cache => VFx10 */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ARCH_MISC_INIT
|
||||
int arch_misc_init(void)
|
||||
{
|
||||
char soc[6];
|
||||
|
||||
strcat(soc, "vf");
|
||||
strcat(soc, soc_type);
|
||||
setenv("soc", soc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
int cpu_eth_init(bd_t *bis)
|
||||
{
|
||||
int rc = -ENODEV;
|
||||
@ -317,3 +342,19 @@ int get_clocks(void)
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifndef CONFIG_SYS_DCACHE_OFF
|
||||
void enable_caches(void)
|
||||
{
|
||||
#if defined(CONFIG_SYS_ARM_CACHE_WRITETHROUGH)
|
||||
enum dcache_option option = DCACHE_WRITETHROUGH;
|
||||
#else
|
||||
enum dcache_option option = DCACHE_WRITEBACK;
|
||||
#endif
|
||||
dcache_enable();
|
||||
icache_enable();
|
||||
|
||||
/* Enable caching on OCRAM */
|
||||
mmu_set_region_dcache_behaviour(IRAM_BASE_ADDR, IRAM_SIZE, option);
|
||||
}
|
||||
#endif
|
||||
|
@ -1,7 +0,0 @@
|
||||
#
|
||||
# Copyright (C) 2013 - 2015 Xilinx, Inc. All rights reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
#
|
||||
# Allow NEON instructions (needed for lowlevel_init.S with GNU toolchain)
|
||||
PLATFORM_RELFLAGS += -mfpu=neon
|
11
arch/arm/cpu/armv7m/Makefile
Normal file
11
arch/arm/cpu/armv7m/Makefile
Normal file
@ -0,0 +1,11 @@
|
||||
#
|
||||
# (C) Copyright 2000-2006
|
||||
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
|
||||
extra-y := start.o
|
||||
obj-y += cpu.o
|
||||
|
||||
obj-$(CONFIG_STM32F4) += stm32f4/
|
8
arch/arm/cpu/armv7m/config.mk
Normal file
8
arch/arm/cpu/armv7m/config.mk
Normal file
@ -0,0 +1,8 @@
|
||||
#
|
||||
# (C) Copyright 2015
|
||||
# Kamil Lulko, <rev13@wp.pl>
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
|
||||
PLATFORM_CPPFLAGS += -march=armv7-m -mthumb
|
35
arch/arm/cpu/armv7m/cpu.c
Normal file
35
arch/arm/cpu/armv7m/cpu.c
Normal file
@ -0,0 +1,35 @@
|
||||
/*
|
||||
* (C) Copyright 2010,2011
|
||||
* Vladimir Khusainov, Emcraft Systems, vlad@emcraft.com
|
||||
*
|
||||
* (C) Copyright 2015
|
||||
* Kamil Lulko, <rev13@wp.pl>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/armv7m.h>
|
||||
|
||||
/*
|
||||
* This is called right before passing control to
|
||||
* the Linux kernel point.
|
||||
*/
|
||||
int cleanup_before_linux(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Perform the low-level reset.
|
||||
*/
|
||||
void reset_cpu(ulong addr)
|
||||
{
|
||||
/*
|
||||
* Perform reset but keep priority group unchanged.
|
||||
*/
|
||||
writel((V7M_AIRCR_VECTKEY << V7M_AIRCR_VECTKEY_SHIFT)
|
||||
| (V7M_SCB->aircr & V7M_AIRCR_PRIGROUP_MSK)
|
||||
| V7M_AIRCR_SYSRESET, &V7M_SCB->aircr);
|
||||
}
|
15
arch/arm/cpu/armv7m/start.S
Normal file
15
arch/arm/cpu/armv7m/start.S
Normal file
@ -0,0 +1,15 @@
|
||||
/*
|
||||
* (C) Copyright 2015
|
||||
* Kamil Lulko, <rev13@wp.pl>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
.globl reset
|
||||
.type reset, %function
|
||||
reset:
|
||||
b _main
|
||||
|
||||
.globl c_runtime_cpu_setup
|
||||
c_runtime_cpu_setup:
|
||||
mov pc, lr
|
11
arch/arm/cpu/armv7m/stm32f4/Makefile
Normal file
11
arch/arm/cpu/armv7m/stm32f4/Makefile
Normal file
@ -0,0 +1,11 @@
|
||||
#
|
||||
# (C) Copyright 2000-2006
|
||||
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
#
|
||||
# (C) Copyright 2015
|
||||
# Kamil Lulko, <rev13@wp.pl>
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
|
||||
obj-y += soc.o clock.o timer.o flash.o
|
209
arch/arm/cpu/armv7m/stm32f4/clock.c
Normal file
209
arch/arm/cpu/armv7m/stm32f4/clock.c
Normal file
@ -0,0 +1,209 @@
|
||||
/*
|
||||
* (C) Copyright 2015
|
||||
* Kamil Lulko, <rev13@wp.pl>
|
||||
*
|
||||
* (C) Copyright 2014
|
||||
* STMicroelectronics
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/stm32.h>
|
||||
|
||||
#define RCC_CR_HSION (1 << 0)
|
||||
#define RCC_CR_HSEON (1 << 16)
|
||||
#define RCC_CR_HSERDY (1 << 17)
|
||||
#define RCC_CR_HSEBYP (1 << 18)
|
||||
#define RCC_CR_CSSON (1 << 19)
|
||||
#define RCC_CR_PLLON (1 << 24)
|
||||
#define RCC_CR_PLLRDY (1 << 25)
|
||||
|
||||
#define RCC_PLLCFGR_PLLM_MASK 0x3F
|
||||
#define RCC_PLLCFGR_PLLN_MASK 0x7FC0
|
||||
#define RCC_PLLCFGR_PLLP_MASK 0x30000
|
||||
#define RCC_PLLCFGR_PLLQ_MASK 0xF000000
|
||||
#define RCC_PLLCFGR_PLLSRC (1 << 22)
|
||||
#define RCC_PLLCFGR_PLLN_SHIFT 6
|
||||
#define RCC_PLLCFGR_PLLP_SHIFT 16
|
||||
#define RCC_PLLCFGR_PLLQ_SHIFT 24
|
||||
|
||||
#define RCC_CFGR_AHB_PSC_MASK 0xF0
|
||||
#define RCC_CFGR_APB1_PSC_MASK 0x1C00
|
||||
#define RCC_CFGR_APB2_PSC_MASK 0xE000
|
||||
#define RCC_CFGR_SW0 (1 << 0)
|
||||
#define RCC_CFGR_SW1 (1 << 1)
|
||||
#define RCC_CFGR_SW_MASK 0x3
|
||||
#define RCC_CFGR_SW_HSI 0
|
||||
#define RCC_CFGR_SW_HSE RCC_CFGR_SW0
|
||||
#define RCC_CFGR_SW_PLL RCC_CFGR_SW1
|
||||
#define RCC_CFGR_SWS0 (1 << 2)
|
||||
#define RCC_CFGR_SWS1 (1 << 3)
|
||||
#define RCC_CFGR_SWS_MASK 0xC
|
||||
#define RCC_CFGR_SWS_HSI 0
|
||||
#define RCC_CFGR_SWS_HSE RCC_CFGR_SWS0
|
||||
#define RCC_CFGR_SWS_PLL RCC_CFGR_SWS1
|
||||
#define RCC_CFGR_HPRE_SHIFT 4
|
||||
#define RCC_CFGR_PPRE1_SHIFT 10
|
||||
#define RCC_CFGR_PPRE2_SHIFT 13
|
||||
|
||||
#define RCC_APB1ENR_PWREN (1 << 28)
|
||||
|
||||
#define PWR_CR_VOS0 (1 << 14)
|
||||
#define PWR_CR_VOS1 (1 << 15)
|
||||
#define PWR_CR_VOS_MASK 0xC000
|
||||
#define PWR_CR_VOS_SCALE_MODE_1 (PWR_CR_VOS0 | PWR_CR_VOS1)
|
||||
#define PWR_CR_VOS_SCALE_MODE_2 (PWR_CR_VOS1)
|
||||
#define PWR_CR_VOS_SCALE_MODE_3 (PWR_CR_VOS0)
|
||||
|
||||
#define FLASH_ACR_WS(n) n
|
||||
#define FLASH_ACR_PRFTEN (1 << 8)
|
||||
#define FLASH_ACR_ICEN (1 << 9)
|
||||
#define FLASH_ACR_DCEN (1 << 10)
|
||||
|
||||
struct pll_psc {
|
||||
u8 pll_m;
|
||||
u16 pll_n;
|
||||
u8 pll_p;
|
||||
u8 pll_q;
|
||||
u8 ahb_psc;
|
||||
u8 apb1_psc;
|
||||
u8 apb2_psc;
|
||||
};
|
||||
|
||||
#define AHB_PSC_1 0
|
||||
#define AHB_PSC_2 0x8
|
||||
#define AHB_PSC_4 0x9
|
||||
#define AHB_PSC_8 0xA
|
||||
#define AHB_PSC_16 0xB
|
||||
#define AHB_PSC_64 0xC
|
||||
#define AHB_PSC_128 0xD
|
||||
#define AHB_PSC_256 0xE
|
||||
#define AHB_PSC_512 0xF
|
||||
|
||||
#define APB_PSC_1 0
|
||||
#define APB_PSC_2 0x4
|
||||
#define APB_PSC_4 0x5
|
||||
#define APB_PSC_8 0x6
|
||||
#define APB_PSC_16 0x7
|
||||
|
||||
#if !defined(CONFIG_STM32_HSE_HZ)
|
||||
#error "CONFIG_STM32_HSE_HZ not defined!"
|
||||
#else
|
||||
#if (CONFIG_STM32_HSE_HZ == 8000000)
|
||||
struct pll_psc pll_psc_168 = {
|
||||
.pll_m = 8,
|
||||
.pll_n = 336,
|
||||
.pll_p = 2,
|
||||
.pll_q = 7,
|
||||
.ahb_psc = AHB_PSC_1,
|
||||
.apb1_psc = APB_PSC_4,
|
||||
.apb2_psc = APB_PSC_2
|
||||
};
|
||||
#else
|
||||
#error "No PLL/Prescaler configuration for given CONFIG_STM32_HSE_HZ exists"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
int configure_clocks(void)
|
||||
{
|
||||
/* Reset RCC configuration */
|
||||
setbits_le32(&STM32_RCC->cr, RCC_CR_HSION);
|
||||
writel(0, &STM32_RCC->cfgr); /* Reset CFGR */
|
||||
clrbits_le32(&STM32_RCC->cr, (RCC_CR_HSEON | RCC_CR_CSSON
|
||||
| RCC_CR_PLLON));
|
||||
writel(0x24003010, &STM32_RCC->pllcfgr); /* Reset value from RM */
|
||||
clrbits_le32(&STM32_RCC->cr, RCC_CR_HSEBYP);
|
||||
writel(0, &STM32_RCC->cir); /* Disable all interrupts */
|
||||
|
||||
/* Configure for HSE+PLL operation */
|
||||
setbits_le32(&STM32_RCC->cr, RCC_CR_HSEON);
|
||||
while (!(readl(&STM32_RCC->cr) & RCC_CR_HSERDY))
|
||||
;
|
||||
|
||||
/* Enable high performance mode, System frequency up to 168 MHz */
|
||||
setbits_le32(&STM32_RCC->apb1enr, RCC_APB1ENR_PWREN);
|
||||
writel(PWR_CR_VOS_SCALE_MODE_1, &STM32_PWR->cr);
|
||||
|
||||
setbits_le32(&STM32_RCC->cfgr, ((
|
||||
pll_psc_168.ahb_psc << RCC_CFGR_HPRE_SHIFT)
|
||||
| (pll_psc_168.apb1_psc << RCC_CFGR_PPRE1_SHIFT)
|
||||
| (pll_psc_168.apb2_psc << RCC_CFGR_PPRE2_SHIFT)));
|
||||
|
||||
writel(pll_psc_168.pll_m
|
||||
| (pll_psc_168.pll_n << RCC_PLLCFGR_PLLN_SHIFT)
|
||||
| (((pll_psc_168.pll_p >> 1) - 1) << RCC_PLLCFGR_PLLP_SHIFT)
|
||||
| (pll_psc_168.pll_q << RCC_PLLCFGR_PLLQ_SHIFT),
|
||||
&STM32_RCC->pllcfgr);
|
||||
setbits_le32(&STM32_RCC->pllcfgr, RCC_PLLCFGR_PLLSRC);
|
||||
|
||||
setbits_le32(&STM32_RCC->cr, RCC_CR_PLLON);
|
||||
|
||||
while (!(readl(&STM32_RCC->cr) & RCC_CR_PLLRDY))
|
||||
;
|
||||
|
||||
/* 5 wait states, Prefetch enabled, D-Cache enabled, I-Cache enabled */
|
||||
writel(FLASH_ACR_WS(5) | FLASH_ACR_PRFTEN | FLASH_ACR_ICEN
|
||||
| FLASH_ACR_DCEN, &STM32_FLASH->acr);
|
||||
|
||||
clrbits_le32(&STM32_RCC->cfgr, (RCC_CFGR_SW0 | RCC_CFGR_SW1));
|
||||
setbits_le32(&STM32_RCC->cfgr, RCC_CFGR_SW_PLL);
|
||||
|
||||
while ((readl(&STM32_RCC->cfgr) & RCC_CFGR_SWS_MASK) !=
|
||||
RCC_CFGR_SWS_PLL)
|
||||
;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned long clock_get(enum clock clck)
|
||||
{
|
||||
u32 sysclk = 0;
|
||||
u32 shift = 0;
|
||||
/* Prescaler table lookups for clock computation */
|
||||
u8 ahb_psc_table[16] = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9
|
||||
};
|
||||
u8 apb_psc_table[8] = {
|
||||
0, 0, 0, 0, 1, 2, 3, 4
|
||||
};
|
||||
|
||||
if ((readl(&STM32_RCC->cfgr) & RCC_CFGR_SWS_MASK) ==
|
||||
RCC_CFGR_SWS_PLL) {
|
||||
u16 pllm, plln, pllp;
|
||||
pllm = (readl(&STM32_RCC->pllcfgr) & RCC_PLLCFGR_PLLM_MASK);
|
||||
plln = ((readl(&STM32_RCC->pllcfgr) & RCC_PLLCFGR_PLLN_MASK)
|
||||
>> RCC_PLLCFGR_PLLN_SHIFT);
|
||||
pllp = ((((readl(&STM32_RCC->pllcfgr) & RCC_PLLCFGR_PLLP_MASK)
|
||||
>> RCC_PLLCFGR_PLLP_SHIFT) + 1) << 1);
|
||||
sysclk = ((CONFIG_STM32_HSE_HZ / pllm) * plln) / pllp;
|
||||
}
|
||||
|
||||
switch (clck) {
|
||||
case CLOCK_CORE:
|
||||
return sysclk;
|
||||
break;
|
||||
case CLOCK_AHB:
|
||||
shift = ahb_psc_table[(
|
||||
(readl(&STM32_RCC->cfgr) & RCC_CFGR_AHB_PSC_MASK)
|
||||
>> RCC_CFGR_HPRE_SHIFT)];
|
||||
return sysclk >>= shift;
|
||||
break;
|
||||
case CLOCK_APB1:
|
||||
shift = apb_psc_table[(
|
||||
(readl(&STM32_RCC->cfgr) & RCC_CFGR_APB1_PSC_MASK)
|
||||
>> RCC_CFGR_PPRE1_SHIFT)];
|
||||
return sysclk >>= shift;
|
||||
break;
|
||||
case CLOCK_APB2:
|
||||
shift = apb_psc_table[(
|
||||
(readl(&STM32_RCC->cfgr) & RCC_CFGR_APB2_PSC_MASK)
|
||||
>> RCC_CFGR_PPRE2_SHIFT)];
|
||||
return sysclk >>= shift;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
break;
|
||||
}
|
||||
}
|
143
arch/arm/cpu/armv7m/stm32f4/flash.c
Normal file
143
arch/arm/cpu/armv7m/stm32f4/flash.c
Normal file
@ -0,0 +1,143 @@
|
||||
/*
|
||||
* (C) Copyright 2015
|
||||
* Kamil Lulko, <rev13@wp.pl>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/stm32.h>
|
||||
|
||||
#define STM32_FLASH_KEY1 0x45670123
|
||||
#define STM32_FLASH_KEY2 0xCDEF89AB
|
||||
|
||||
flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS];
|
||||
|
||||
const u32 sect_sz_kb[CONFIG_SYS_MAX_FLASH_SECT] = {
|
||||
[0 ... 3] = 16 * 1024,
|
||||
[4] = 64 * 1024,
|
||||
[5 ... 11] = 128 * 1024
|
||||
};
|
||||
|
||||
static void stm32f4_flash_lock(u8 lock)
|
||||
{
|
||||
if (lock) {
|
||||
setbits_le32(&STM32_FLASH->cr, STM32_FLASH_CR_LOCK);
|
||||
} else {
|
||||
writel(STM32_FLASH_KEY1, &STM32_FLASH->key);
|
||||
writel(STM32_FLASH_KEY2, &STM32_FLASH->key);
|
||||
}
|
||||
}
|
||||
|
||||
unsigned long flash_init(void)
|
||||
{
|
||||
unsigned long total_size = 0;
|
||||
u8 i, j;
|
||||
|
||||
for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; i++) {
|
||||
flash_info[i].flash_id = FLASH_STM32F4;
|
||||
flash_info[i].sector_count = CONFIG_SYS_MAX_FLASH_SECT;
|
||||
flash_info[i].start[0] = CONFIG_SYS_FLASH_BASE + (i << 20);
|
||||
flash_info[i].size = sect_sz_kb[0];
|
||||
for (j = 1; j < CONFIG_SYS_MAX_FLASH_SECT; j++) {
|
||||
flash_info[i].start[j] = flash_info[i].start[j - 1]
|
||||
+ (sect_sz_kb[j - 1]);
|
||||
flash_info[i].size += sect_sz_kb[j];
|
||||
}
|
||||
total_size += flash_info[i].size;
|
||||
}
|
||||
|
||||
return total_size;
|
||||
}
|
||||
|
||||
void flash_print_info(flash_info_t *info)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (info->flash_id == FLASH_UNKNOWN) {
|
||||
printf("missing or unknown FLASH type\n");
|
||||
return;
|
||||
} else if (info->flash_id == FLASH_STM32F4) {
|
||||
printf("STM32F4 Embedded Flash\n");
|
||||
}
|
||||
|
||||
printf(" Size: %ld MB in %d Sectors\n",
|
||||
info->size >> 20, info->sector_count);
|
||||
|
||||
printf(" Sector Start Addresses:");
|
||||
for (i = 0; i < info->sector_count; ++i) {
|
||||
if ((i % 5) == 0)
|
||||
printf("\n ");
|
||||
printf(" %08lX%s",
|
||||
info->start[i],
|
||||
info->protect[i] ? " (RO)" : " ");
|
||||
}
|
||||
printf("\n");
|
||||
return;
|
||||
}
|
||||
|
||||
int flash_erase(flash_info_t *info, int first, int last)
|
||||
{
|
||||
u8 bank = 0xFF;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; i++) {
|
||||
if (info == &flash_info[i]) {
|
||||
bank = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (bank == 0xFF)
|
||||
return -1;
|
||||
|
||||
stm32f4_flash_lock(0);
|
||||
|
||||
for (i = first; i <= last; i++) {
|
||||
while (readl(&STM32_FLASH->sr) & STM32_FLASH_SR_BSY)
|
||||
;
|
||||
|
||||
if (bank == 0) {
|
||||
setbits_le32(&STM32_FLASH->cr,
|
||||
(i << STM32_FLASH_CR_SNB_OFFSET));
|
||||
} else if (bank == 1) {
|
||||
setbits_le32(&STM32_FLASH->cr,
|
||||
((0x10 | i) << STM32_FLASH_CR_SNB_OFFSET));
|
||||
} else {
|
||||
stm32f4_flash_lock(1);
|
||||
return -1;
|
||||
}
|
||||
setbits_le32(&STM32_FLASH->cr, STM32_FLASH_CR_SER);
|
||||
setbits_le32(&STM32_FLASH->cr, STM32_FLASH_CR_STRT);
|
||||
|
||||
while (readl(&STM32_FLASH->sr) & STM32_FLASH_SR_BSY)
|
||||
;
|
||||
|
||||
clrbits_le32(&STM32_FLASH->cr, STM32_FLASH_CR_SER);
|
||||
stm32f4_flash_lock(1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int write_buff(flash_info_t *info, uchar *src, ulong addr, ulong cnt)
|
||||
{
|
||||
ulong i;
|
||||
|
||||
while (readl(&STM32_FLASH->sr) & STM32_FLASH_SR_BSY)
|
||||
;
|
||||
|
||||
stm32f4_flash_lock(0);
|
||||
|
||||
setbits_le32(&STM32_FLASH->cr, STM32_FLASH_CR_PG);
|
||||
/* To make things simple use byte writes only */
|
||||
for (i = 0; i < cnt; i++) {
|
||||
*(uchar *)(addr + i) = src[i];
|
||||
while (readl(&STM32_FLASH->sr) & STM32_FLASH_SR_BSY)
|
||||
;
|
||||
}
|
||||
clrbits_le32(&STM32_FLASH->cr, STM32_FLASH_CR_PG);
|
||||
stm32f4_flash_lock(1);
|
||||
|
||||
return 0;
|
||||
}
|
37
arch/arm/cpu/armv7m/stm32f4/soc.c
Normal file
37
arch/arm/cpu/armv7m/stm32f4/soc.c
Normal file
@ -0,0 +1,37 @@
|
||||
/*
|
||||
* (C) Copyright 2015
|
||||
* Kamil Lulko, <rev13@wp.pl>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/armv7m.h>
|
||||
#include <asm/arch/stm32.h>
|
||||
|
||||
u32 get_cpu_rev(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int arch_cpu_init(void)
|
||||
{
|
||||
configure_clocks();
|
||||
|
||||
/*
|
||||
* Configure the memory protection unit (MPU) to allow full access to
|
||||
* the whole 4GB address space.
|
||||
*/
|
||||
writel(0, &V7M_MPU->rnr);
|
||||
writel(0, &V7M_MPU->rbar);
|
||||
writel((V7M_MPU_RASR_AP_RW_RW | V7M_MPU_RASR_SIZE_4GB
|
||||
| V7M_MPU_RASR_EN), &V7M_MPU->rasr);
|
||||
writel(V7M_MPU_CTRL_ENABLE | V7M_MPU_CTRL_HFNMIENA, &V7M_MPU->ctrl);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void s_init(void)
|
||||
{
|
||||
}
|
118
arch/arm/cpu/armv7m/stm32f4/timer.c
Normal file
118
arch/arm/cpu/armv7m/stm32f4/timer.c
Normal file
@ -0,0 +1,118 @@
|
||||
/*
|
||||
* (C) Copyright 2015
|
||||
* Kamil Lulko, <rev13@wp.pl>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/armv7m.h>
|
||||
#include <asm/arch/stm32.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
#define STM32_TIM2_BASE (STM32_APB1PERIPH_BASE + 0x0000)
|
||||
|
||||
#define RCC_APB1ENR_TIM2EN (1 << 0)
|
||||
|
||||
struct stm32_tim2_5 {
|
||||
u32 cr1;
|
||||
u32 cr2;
|
||||
u32 smcr;
|
||||
u32 dier;
|
||||
u32 sr;
|
||||
u32 egr;
|
||||
u32 ccmr1;
|
||||
u32 ccmr2;
|
||||
u32 ccer;
|
||||
u32 cnt;
|
||||
u32 psc;
|
||||
u32 arr;
|
||||
u32 reserved1;
|
||||
u32 ccr1;
|
||||
u32 ccr2;
|
||||
u32 ccr3;
|
||||
u32 ccr4;
|
||||
u32 reserved2;
|
||||
u32 dcr;
|
||||
u32 dmar;
|
||||
u32 or;
|
||||
};
|
||||
|
||||
#define TIM_CR1_CEN (1 << 0)
|
||||
|
||||
#define TIM_EGR_UG (1 << 0)
|
||||
|
||||
int timer_init(void)
|
||||
{
|
||||
struct stm32_tim2_5 *tim = (struct stm32_tim2_5 *)STM32_TIM2_BASE;
|
||||
|
||||
setbits_le32(&STM32_RCC->apb1enr, RCC_APB1ENR_TIM2EN);
|
||||
|
||||
if (clock_get(CLOCK_AHB) == clock_get(CLOCK_APB1))
|
||||
writel((clock_get(CLOCK_APB1) / CONFIG_SYS_HZ_CLOCK) - 1,
|
||||
&tim->psc);
|
||||
else
|
||||
writel(((clock_get(CLOCK_APB1) * 2) / CONFIG_SYS_HZ_CLOCK) - 1,
|
||||
&tim->psc);
|
||||
|
||||
writel(0xFFFFFFFF, &tim->arr);
|
||||
writel(TIM_CR1_CEN, &tim->cr1);
|
||||
setbits_le32(&tim->egr, TIM_EGR_UG);
|
||||
|
||||
gd->arch.tbl = 0;
|
||||
gd->arch.tbu = 0;
|
||||
gd->arch.lastinc = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
ulong get_timer(ulong base)
|
||||
{
|
||||
return (get_ticks() / (CONFIG_SYS_HZ_CLOCK / CONFIG_SYS_HZ)) - base;
|
||||
}
|
||||
|
||||
unsigned long long get_ticks(void)
|
||||
{
|
||||
struct stm32_tim2_5 *tim = (struct stm32_tim2_5 *)STM32_TIM2_BASE;
|
||||
u32 now;
|
||||
|
||||
now = readl(&tim->cnt);
|
||||
|
||||
if (now >= gd->arch.lastinc)
|
||||
gd->arch.tbl += (now - gd->arch.lastinc);
|
||||
else
|
||||
gd->arch.tbl += (0xFFFFFFFF - gd->arch.lastinc) + now;
|
||||
|
||||
gd->arch.lastinc = now;
|
||||
|
||||
return gd->arch.tbl;
|
||||
}
|
||||
|
||||
void reset_timer(void)
|
||||
{
|
||||
struct stm32_tim2_5 *tim = (struct stm32_tim2_5 *)STM32_TIM2_BASE;
|
||||
|
||||
gd->arch.lastinc = readl(&tim->cnt);
|
||||
gd->arch.tbl = 0;
|
||||
}
|
||||
|
||||
/* delay x useconds */
|
||||
void __udelay(ulong usec)
|
||||
{
|
||||
unsigned long long start;
|
||||
|
||||
start = get_ticks(); /* get current timestamp */
|
||||
while ((get_ticks() - start) < usec)
|
||||
; /* loop till time has passed */
|
||||
}
|
||||
|
||||
/*
|
||||
* This function is derived from PowerPC code (timebase clock frequency).
|
||||
* On ARM it returns the number of timer ticks per second.
|
||||
*/
|
||||
ulong get_tbclk(void)
|
||||
{
|
||||
return CONFIG_SYS_HZ_CLOCK;
|
||||
}
|
@ -6,6 +6,8 @@
|
||||
|
||||
obj-y += cpu.o
|
||||
obj-y += lowlevel.o
|
||||
obj-y += soc.o
|
||||
obj-y += speed.o
|
||||
obj-$(CONFIG_SYS_HAS_SERDES) += fsl_lsch3_serdes.o ls2085a_serdes.o
|
||||
obj-$(CONFIG_MP) += mp.o
|
||||
obj-$(CONFIG_OF_LIBFDT) += fdt.o
|
||||
|
@ -8,3 +8,141 @@ Freescale LayerScape with Chassis Generation 3
|
||||
|
||||
This architecture supports Freescale ARMv8 SoCs with Chassis generation 3,
|
||||
for example LS2085A.
|
||||
|
||||
Flash Layout
|
||||
============
|
||||
|
||||
(1) A typical layout of various images (including Linux and other firmware images)
|
||||
is shown below considering a 32MB NOR flash device present on most
|
||||
pre-silicon platforms (simulator and emulator):
|
||||
|
||||
-------------------------
|
||||
| FIT Image |
|
||||
| (linux + DTB + RFS) |
|
||||
------------------------- ----> 0x0120_0000
|
||||
| Debug Server FW |
|
||||
------------------------- ----> 0x00C0_0000
|
||||
| AIOP FW |
|
||||
------------------------- ----> 0x0070_0000
|
||||
| MC FW |
|
||||
------------------------- ----> 0x006C_0000
|
||||
| MC DPL Blob |
|
||||
------------------------- ----> 0x0020_0000
|
||||
| BootLoader + Env|
|
||||
------------------------- ----> 0x0000_1000
|
||||
| PBI |
|
||||
------------------------- ----> 0x0000_0080
|
||||
| RCW |
|
||||
------------------------- ----> 0x0000_0000
|
||||
|
||||
32-MB NOR flash layout for pre-silicon platforms (simulator and emulator)
|
||||
|
||||
(2) A typical layout of various images (including Linux and other firmware images)
|
||||
is shown below considering a 128MB NOR flash device present on QDS and RDB
|
||||
boards:
|
||||
----------------------------------------- ----> 0x5_8800_0000 ---
|
||||
| .. Unused .. (7M) | |
|
||||
----------------------------------------- ----> 0x5_8790_0000 |
|
||||
| FIT Image (linux + DTB + RFS) (40M) | |
|
||||
----------------------------------------- ----> 0x5_8510_0000 |
|
||||
| PHY firmware (2M) | |
|
||||
----------------------------------------- ----> 0x5_84F0_0000 | 64K
|
||||
| Debug Server FW (2M) | | Alt
|
||||
----------------------------------------- ----> 0x5_84D0_0000 | Bank
|
||||
| AIOP FW (4M) | |
|
||||
----------------------------------------- ----> 0x5_8490_0000 (vbank4)
|
||||
| MC DPC Blob (1M) | |
|
||||
----------------------------------------- ----> 0x5_8480_0000 |
|
||||
| MC DPL Blob (1M) | |
|
||||
----------------------------------------- ----> 0x5_8470_0000 |
|
||||
| MC FW (4M) | |
|
||||
----------------------------------------- ----> 0x5_8430_0000 |
|
||||
| BootLoader Environment (1M) | |
|
||||
----------------------------------------- ----> 0x5_8420_0000 |
|
||||
| BootLoader (1M) | |
|
||||
----------------------------------------- ----> 0x5_8410_0000 |
|
||||
| RCW and PBI (1M) | |
|
||||
----------------------------------------- ----> 0x5_8400_0000 ---
|
||||
| .. Unused .. (7M) | |
|
||||
----------------------------------------- ----> 0x5_8390_0000 |
|
||||
| FIT Image (linux + DTB + RFS) (40M) | |
|
||||
----------------------------------------- ----> 0x5_8110_0000 |
|
||||
| PHY firmware (2M) | |
|
||||
----------------------------------------- ----> 0x5_80F0_0000 | 64K
|
||||
| Debug Server FW (2M) | | Bank
|
||||
----------------------------------------- ----> 0x5_80D0_0000 |
|
||||
| AIOP FW (4M) | |
|
||||
----------------------------------------- ----> 0x5_8090_0000 (vbank0)
|
||||
| MC DPC Blob (1M) | |
|
||||
----------------------------------------- ----> 0x5_8080_0000 |
|
||||
| MC DPL Blob (1M) | |
|
||||
----------------------------------------- ----> 0x5_8070_0000 |
|
||||
| MC FW (4M) | |
|
||||
----------------------------------------- ----> 0x5_8030_0000 |
|
||||
| BootLoader Environment (1M) | |
|
||||
----------------------------------------- ----> 0x5_8020_0000 |
|
||||
| BootLoader (1M) | |
|
||||
----------------------------------------- ----> 0x5_8010_0000 |
|
||||
| RCW and PBI (1M) | |
|
||||
----------------------------------------- ----> 0x5_8000_0000 ---
|
||||
|
||||
128-MB NOR flash layout for QDS and RDB boards
|
||||
|
||||
Environment Variables
|
||||
=====================
|
||||
mcboottimeout: MC boot timeout in milliseconds. If this variable is not defined
|
||||
the value CONFIG_SYS_LS_MC_BOOT_TIMEOUT_MS will be assumed.
|
||||
|
||||
mcmemsize: MC DRAM block size. If this variable is not defined, the value
|
||||
CONFIG_SYS_LS_MC_DRAM_BLOCK_MIN_SIZE will be assumed.
|
||||
|
||||
Booting from NAND
|
||||
-------------------
|
||||
Booting from NAND requires two images, RCW and u-boot-with-spl.bin.
|
||||
The difference between NAND boot RCW image and NOR boot image is the PBI
|
||||
command sequence. Below is one example for PBI commands for QDS which uses
|
||||
NAND device with 2KB/page, block size 128KB.
|
||||
|
||||
1) CCSR 4-byte write to 0x00e00404, data=0x00000000
|
||||
2) CCSR 4-byte write to 0x00e00400, data=0x1800a000
|
||||
The above two commands set bootloc register to 0x00000000_1800a000 where
|
||||
the u-boot code will be running in OCRAM.
|
||||
|
||||
3) Block Copy: SRC=0x0107, SRC_ADDR=0x00020000, DEST_ADDR=0x1800a000,
|
||||
BLOCK_SIZE=0x00014000
|
||||
This command copies u-boot image from NAND device into OCRAM. The values need
|
||||
to adjust accordingly.
|
||||
|
||||
SRC should match the cfg_rcw_src, the reset config pins. It depends
|
||||
on the NAND device. See reference manual for cfg_rcw_src.
|
||||
SRC_ADDR is the offset of u-boot-with-spl.bin image in NAND device. In
|
||||
the example above, 128KB. For easy maintenance, we put it at
|
||||
the beginning of next block from RCW.
|
||||
DEST_ADDR is fixed at 0x1800a000, matching bootloc set above.
|
||||
BLOCK_SIZE is the size to be copied by PBI.
|
||||
|
||||
RCW image should be written to the beginning of NAND device. Example of using
|
||||
u-boot command
|
||||
|
||||
nand write <rcw image in memory> 0 <size of rcw image>
|
||||
|
||||
To form the NAND image, build u-boot with NAND config, for example,
|
||||
ls2085aqds_nand_defconfig. The image needed is u-boot-with-spl.bin.
|
||||
The u-boot image should be written to match SRC_ADDR, in above example 0x20000.
|
||||
|
||||
nand write <u-boot image in memory> 200000 <size of u-boot image>
|
||||
|
||||
With these two images in NAND device, the board can boot from NAND.
|
||||
|
||||
Another example for RDB boards,
|
||||
|
||||
1) CCSR 4-byte write to 0x00e00404, data=0x00000000
|
||||
2) CCSR 4-byte write to 0x00e00400, data=0x1800a000
|
||||
3) Block Copy: SRC=0x0119, SRC_ADDR=0x00080000, DEST_ADDR=0x1800a000,
|
||||
BLOCK_SIZE=0x00014000
|
||||
|
||||
nand write <rcw image in memory> 0 <size of rcw image>
|
||||
nand write <u-boot image in memory> 80000 <size of u-boot image>
|
||||
|
||||
Notice the difference from QDS is SRC, SRC_ADDR and the offset of u-boot image
|
||||
to match board NAND device with 4KB/page, block size 512KB.
|
||||
|
@ -10,7 +10,12 @@
|
||||
#include <asm/armv8/mmu.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch-fsl-lsch3/immap_lsch3.h>
|
||||
#include <fsl_debug_server.h>
|
||||
#include <fsl-mc/fsl_mc.h>
|
||||
#include <asm/arch/fsl_serdes.h>
|
||||
#ifdef CONFIG_FSL_ESDHC
|
||||
#include <fsl_esdhc.h>
|
||||
#endif
|
||||
#include "cpu.h"
|
||||
#include "mp.h"
|
||||
#include "speed.h"
|
||||
@ -24,8 +29,9 @@ DECLARE_GLOBAL_DATA_PTR;
|
||||
* levels of translation tables here to cover 40-bit address space.
|
||||
* We use 4KB granule size, with 40 bits physical address, T0SZ=24
|
||||
* Level 0 IA[39], table address @0
|
||||
* Level 1 IA[31:30], table address @01000, 0x2000
|
||||
* Level 2 IA[29:21], table address @0x3000
|
||||
* Level 1 IA[31:30], table address @0x1000, 0x2000
|
||||
* Level 2 IA[29:21], table address @0x3000, 0x4000
|
||||
* Address above 0x5000 is free for other purpose.
|
||||
*/
|
||||
|
||||
#define SECTION_SHIFT_L0 39UL
|
||||
@ -60,12 +66,12 @@ static inline void early_mmu_setup(void)
|
||||
{
|
||||
int el;
|
||||
u64 i;
|
||||
u64 section_l1t0, section_l1t1, section_l2;
|
||||
u64 section_l1t0, section_l1t1, section_l2t0, section_l2t1;
|
||||
u64 *level0_table = (u64 *)CONFIG_SYS_FSL_OCRAM_BASE;
|
||||
u64 *level1_table_0 = (u64 *)(CONFIG_SYS_FSL_OCRAM_BASE + 0x1000);
|
||||
u64 *level1_table_1 = (u64 *)(CONFIG_SYS_FSL_OCRAM_BASE + 0x2000);
|
||||
u64 *level2_table = (u64 *)(CONFIG_SYS_FSL_OCRAM_BASE + 0x3000);
|
||||
|
||||
u64 *level2_table_0 = (u64 *)(CONFIG_SYS_FSL_OCRAM_BASE + 0x3000);
|
||||
u64 *level2_table_1 = (u64 *)(CONFIG_SYS_FSL_OCRAM_BASE + 0x4000);
|
||||
|
||||
level0_table[0] =
|
||||
(u64)level1_table_0 | PMD_TYPE_TABLE;
|
||||
@ -79,21 +85,25 @@ static inline void early_mmu_setup(void)
|
||||
*/
|
||||
section_l1t0 = 0;
|
||||
section_l1t1 = BLOCK_SIZE_L0;
|
||||
section_l2 = 0;
|
||||
section_l2t0 = 0;
|
||||
section_l2t1 = CONFIG_SYS_FLASH_BASE;
|
||||
for (i = 0; i < 512; i++) {
|
||||
set_pgtable_section(level1_table_0, i, section_l1t0,
|
||||
MT_DEVICE_NGNRNE);
|
||||
set_pgtable_section(level1_table_1, i, section_l1t1,
|
||||
MT_NORMAL);
|
||||
set_pgtable_section(level2_table, i, section_l2,
|
||||
set_pgtable_section(level2_table_0, i, section_l2t0,
|
||||
MT_DEVICE_NGNRNE);
|
||||
set_pgtable_section(level2_table_1, i, section_l2t1,
|
||||
MT_DEVICE_NGNRNE);
|
||||
section_l1t0 += BLOCK_SIZE_L1;
|
||||
section_l1t1 += BLOCK_SIZE_L1;
|
||||
section_l2 += BLOCK_SIZE_L2;
|
||||
section_l2t0 += BLOCK_SIZE_L2;
|
||||
section_l2t1 += BLOCK_SIZE_L2;
|
||||
}
|
||||
|
||||
level1_table_0[0] =
|
||||
(u64)level2_table | PMD_TYPE_TABLE;
|
||||
(u64)level2_table_0 | PMD_TYPE_TABLE;
|
||||
level1_table_0[1] =
|
||||
0x40000000 | PMD_SECT_AF | PMD_TYPE_SECT |
|
||||
PMD_ATTRINDX(MT_DEVICE_NGNRNE);
|
||||
@ -104,17 +114,34 @@ static inline void early_mmu_setup(void)
|
||||
0xc0000000 | PMD_SECT_AF | PMD_TYPE_SECT |
|
||||
PMD_ATTRINDX(MT_NORMAL);
|
||||
|
||||
/* Rewrite table to enable cache */
|
||||
set_pgtable_section(level2_table,
|
||||
/* Rewerite table to enable cache for OCRAM */
|
||||
set_pgtable_section(level2_table_0,
|
||||
CONFIG_SYS_FSL_OCRAM_BASE >> SECTION_SHIFT_L2,
|
||||
CONFIG_SYS_FSL_OCRAM_BASE,
|
||||
MT_NORMAL);
|
||||
for (i = CONFIG_SYS_IFC_BASE >> SECTION_SHIFT_L2;
|
||||
i < (CONFIG_SYS_IFC_BASE + CONFIG_SYS_IFC_SIZE)
|
||||
>> SECTION_SHIFT_L2; i++) {
|
||||
section_l2 = i << SECTION_SHIFT_L2;
|
||||
set_pgtable_section(level2_table, i,
|
||||
section_l2, MT_NORMAL);
|
||||
|
||||
#if defined(CONFIG_SYS_NOR0_CSPR_EARLY) && defined(CONFIG_SYS_NOR_AMASK_EARLY)
|
||||
/* Rewrite table to enable cache for two entries (4MB) */
|
||||
section_l2t1 = CONFIG_SYS_IFC_BASE;
|
||||
set_pgtable_section(level2_table_0,
|
||||
section_l2t1 >> SECTION_SHIFT_L2,
|
||||
section_l2t1,
|
||||
MT_NORMAL);
|
||||
section_l2t1 += BLOCK_SIZE_L2;
|
||||
set_pgtable_section(level2_table_0,
|
||||
section_l2t1 >> SECTION_SHIFT_L2,
|
||||
section_l2t1,
|
||||
MT_NORMAL);
|
||||
#endif
|
||||
|
||||
/* Create a mapping for 256MB IFC region to final flash location */
|
||||
level1_table_0[CONFIG_SYS_FLASH_BASE >> SECTION_SHIFT_L1] =
|
||||
(u64)level2_table_1 | PMD_TYPE_TABLE;
|
||||
section_l2t1 = CONFIG_SYS_IFC_BASE;
|
||||
for (i = 0; i < 0x10000000 >> SECTION_SHIFT_L2; i++) {
|
||||
set_pgtable_section(level2_table_1, i,
|
||||
section_l2t1, MT_DEVICE_NGNRNE);
|
||||
section_l2t1 += BLOCK_SIZE_L2;
|
||||
}
|
||||
|
||||
el = current_el();
|
||||
@ -347,6 +374,7 @@ u32 fsl_qoriq_core_to_type(unsigned int core)
|
||||
#ifdef CONFIG_DISPLAY_CPUINFO
|
||||
int print_cpuinfo(void)
|
||||
{
|
||||
struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
|
||||
struct sys_info sysinfo;
|
||||
char buf[32];
|
||||
unsigned int i, core;
|
||||
@ -370,21 +398,40 @@ int print_cpuinfo(void)
|
||||
printf(" DP-DDR: %-4s MHz", strmhz(buf, sysinfo.freq_ddrbus2));
|
||||
puts("\n");
|
||||
|
||||
/* Display the RCW, so that no one gets confused as to what RCW
|
||||
* we're actually using for this boot.
|
||||
*/
|
||||
puts("Reset Configuration Word (RCW):");
|
||||
for (i = 0; i < ARRAY_SIZE(gur->rcwsr); i++) {
|
||||
u32 rcw = in_le32(&gur->rcwsr[i]);
|
||||
|
||||
if ((i % 4) == 0)
|
||||
printf("\n %02x:", i * 4);
|
||||
printf(" %08x", rcw);
|
||||
}
|
||||
puts("\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_FSL_ESDHC
|
||||
int cpu_mmc_init(bd_t *bis)
|
||||
{
|
||||
return fsl_esdhc_mmc_init(bis);
|
||||
}
|
||||
#endif
|
||||
|
||||
int cpu_eth_init(bd_t *bis)
|
||||
{
|
||||
int error = 0;
|
||||
|
||||
#ifdef CONFIG_FSL_MC_ENET
|
||||
error = mc_init(bis);
|
||||
error = fsl_mc_ldpaa_init(bis);
|
||||
#endif
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
int arch_early_init_r(void)
|
||||
{
|
||||
int rv;
|
||||
@ -393,5 +440,43 @@ int arch_early_init_r(void)
|
||||
if (rv)
|
||||
printf("Did not wake secondary cores\n");
|
||||
|
||||
#ifdef CONFIG_SYS_HAS_SERDES
|
||||
fsl_serdes_init();
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
int timer_init(void)
|
||||
{
|
||||
u32 __iomem *cntcr = (u32 *)CONFIG_SYS_FSL_TIMER_ADDR;
|
||||
u32 __iomem *cltbenr = (u32 *)CONFIG_SYS_FSL_PMU_CLTBENR;
|
||||
#ifdef COUNTER_FREQUENCY_REAL
|
||||
unsigned long cntfrq = COUNTER_FREQUENCY_REAL;
|
||||
|
||||
/* Update with accurate clock frequency */
|
||||
asm volatile("msr cntfrq_el0, %0" : : "r" (cntfrq) : "memory");
|
||||
#endif
|
||||
|
||||
/* Enable timebase for all clusters.
|
||||
* It is safe to do so even some clusters are not enabled.
|
||||
*/
|
||||
out_le32(cltbenr, 0xf);
|
||||
|
||||
/* Enable clock for timer
|
||||
* This is a global setting.
|
||||
*/
|
||||
out_le32(cntcr, 0x1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void reset_cpu(ulong addr)
|
||||
{
|
||||
u32 __iomem *rstcr = (u32 *)CONFIG_SYS_FSL_RST_ADDR;
|
||||
u32 val;
|
||||
|
||||
/* Raise RESET_REQ_B */
|
||||
val = in_le32(rstcr);
|
||||
val |= 0x02;
|
||||
out_le32(rstcr, val);
|
||||
}
|
||||
|
@ -7,6 +7,9 @@
|
||||
#include <common.h>
|
||||
#include <libfdt.h>
|
||||
#include <fdt_support.h>
|
||||
#ifdef CONFIG_FSL_ESDHC
|
||||
#include <fsl_esdhc.h>
|
||||
#endif
|
||||
#include "mp.h"
|
||||
|
||||
#ifdef CONFIG_MP
|
||||
@ -62,7 +65,11 @@ void ft_cpu_setup(void *blob, bd_t *bd)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SYS_NS16550
|
||||
do_fixup_by_compat_u32(blob, "ns16550",
|
||||
do_fixup_by_compat_u32(blob, "fsl,ns16550",
|
||||
"clock-frequency", CONFIG_SYS_NS16550_CLK, 1);
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_FSL_ESDHC)
|
||||
fdt_fixup_esdhc(blob, bd);
|
||||
#endif
|
||||
}
|
||||
|
115
arch/arm/cpu/armv8/fsl-lsch3/fsl_lsch3_serdes.c
Normal file
115
arch/arm/cpu/armv8/fsl-lsch3/fsl_lsch3_serdes.c
Normal file
@ -0,0 +1,115 @@
|
||||
/*
|
||||
* Copyright 2015 Freescale Semiconductor, Inc.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/errno.h>
|
||||
#include <asm/arch/fsl_serdes.h>
|
||||
#include <asm/arch-fsl-lsch3/immap_lsch3.h>
|
||||
#include <fsl-mc/ldpaa_wriop.h>
|
||||
|
||||
#ifdef CONFIG_SYS_FSL_SRDS_1
|
||||
static u8 serdes1_prtcl_map[SERDES_PRCTL_COUNT];
|
||||
#endif
|
||||
#ifdef CONFIG_SYS_FSL_SRDS_2
|
||||
static u8 serdes2_prtcl_map[SERDES_PRCTL_COUNT];
|
||||
#endif
|
||||
|
||||
int is_serdes_configured(enum srds_prtcl device)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
#ifdef CONFIG_SYS_FSL_SRDS_1
|
||||
ret |= serdes1_prtcl_map[device];
|
||||
#endif
|
||||
#ifdef CONFIG_SYS_FSL_SRDS_2
|
||||
ret |= serdes2_prtcl_map[device];
|
||||
#endif
|
||||
|
||||
return !!ret;
|
||||
}
|
||||
|
||||
int serdes_get_first_lane(u32 sd, enum srds_prtcl device)
|
||||
{
|
||||
struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
|
||||
u32 cfg = in_le32(&gur->rcwsr[28]);
|
||||
int i;
|
||||
|
||||
switch (sd) {
|
||||
#ifdef CONFIG_SYS_FSL_SRDS_1
|
||||
case FSL_SRDS_1:
|
||||
cfg &= FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_MASK;
|
||||
cfg >>= FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_SHIFT;
|
||||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_SYS_FSL_SRDS_2
|
||||
case FSL_SRDS_2:
|
||||
cfg &= FSL_CHASSIS3_RCWSR28_SRDS2_PRTCL_MASK;
|
||||
cfg >>= FSL_CHASSIS3_RCWSR28_SRDS2_PRTCL_SHIFT;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
printf("invalid SerDes%d\n", sd);
|
||||
break;
|
||||
}
|
||||
/* Is serdes enabled at all? */
|
||||
if (cfg == 0)
|
||||
return -ENODEV;
|
||||
|
||||
for (i = 0; i < SRDS_MAX_LANES; i++) {
|
||||
if (serdes_get_prtcl(sd, cfg, i) == device)
|
||||
return i;
|
||||
}
|
||||
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
void serdes_init(u32 sd, u32 sd_addr, u32 sd_prctl_mask, u32 sd_prctl_shift,
|
||||
u8 serdes_prtcl_map[SERDES_PRCTL_COUNT])
|
||||
{
|
||||
struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
|
||||
u32 cfg;
|
||||
int lane;
|
||||
|
||||
memset(serdes_prtcl_map, 0, sizeof(serdes_prtcl_map));
|
||||
|
||||
cfg = in_le32(&gur->rcwsr[28]) & sd_prctl_mask;
|
||||
cfg >>= sd_prctl_shift;
|
||||
printf("Using SERDES%d Protocol: %d (0x%x)\n", sd + 1, cfg, cfg);
|
||||
|
||||
if (!is_serdes_prtcl_valid(sd, cfg))
|
||||
printf("SERDES%d[PRTCL] = 0x%x is not valid\n", sd + 1, cfg);
|
||||
|
||||
for (lane = 0; lane < SRDS_MAX_LANES; lane++) {
|
||||
enum srds_prtcl lane_prtcl = serdes_get_prtcl(sd, cfg, lane);
|
||||
if (unlikely(lane_prtcl >= SERDES_PRCTL_COUNT))
|
||||
debug("Unknown SerDes lane protocol %d\n", lane_prtcl);
|
||||
else {
|
||||
serdes_prtcl_map[lane_prtcl] = 1;
|
||||
#ifdef CONFIG_FSL_MC_ENET
|
||||
wriop_init_dpmac(sd, lane + 1, (int)lane_prtcl);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void fsl_serdes_init(void)
|
||||
{
|
||||
#ifdef CONFIG_SYS_FSL_SRDS_1
|
||||
serdes_init(FSL_SRDS_1,
|
||||
CONFIG_SYS_FSL_LSCH3_SERDES_ADDR,
|
||||
FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_MASK,
|
||||
FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_SHIFT,
|
||||
serdes1_prtcl_map);
|
||||
#endif
|
||||
#ifdef CONFIG_SYS_FSL_SRDS_2
|
||||
serdes_init(FSL_SRDS_2,
|
||||
CONFIG_SYS_FSL_LSCH3_SERDES_ADDR + FSL_SRDS_2 * 0x10000,
|
||||
FSL_CHASSIS3_RCWSR28_SRDS2_PRTCL_MASK,
|
||||
FSL_CHASSIS3_RCWSR28_SRDS2_PRTCL_SHIFT,
|
||||
serdes2_prtcl_map);
|
||||
#endif
|
||||
}
|
@ -15,6 +15,15 @@
|
||||
ENTRY(lowlevel_init)
|
||||
mov x29, lr /* Save LR */
|
||||
|
||||
/* Add fully-coherent masters to DVM domain */
|
||||
ldr x1, =CCI_MN_BASE
|
||||
ldr x2, [x1, #CCI_MN_RNF_NODEID_LIST]
|
||||
str x2, [x1, #CCI_MN_DVM_DOMAIN_CTL_SET]
|
||||
1: ldr x3, [x1, #CCI_MN_DVM_DOMAIN_CTL_SET]
|
||||
mvn x0, x3
|
||||
tst x0, x3 /* Wait for domain addition to complete */
|
||||
b.ne 1b
|
||||
|
||||
/* Set the SMMU page size in the sACR register */
|
||||
ldr x1, =SMMU_BASE
|
||||
ldr w0, [x1, #0x10]
|
||||
@ -224,6 +233,9 @@ ENTRY(secondary_boot_func)
|
||||
/* physical address of this cpus spin table element */
|
||||
add x11, x1, x0
|
||||
|
||||
ldr x0, =__real_cntfrq
|
||||
ldr x0, [x0]
|
||||
msr cntfrq_el0, x0 /* set with real frequency */
|
||||
str x9, [x11, #16] /* LPID */
|
||||
mov x4, #1
|
||||
str x4, [x11, #8] /* STATUS */
|
||||
@ -275,6 +287,9 @@ ENDPROC(secondary_switch_to_el1)
|
||||
|
||||
/* 64 bit alignment for elements accessed as data */
|
||||
.align 4
|
||||
.global __real_cntfrq
|
||||
__real_cntfrq:
|
||||
.quad COUNTER_FREQUENCY
|
||||
.globl __secondary_boot_code_size
|
||||
.type __secondary_boot_code_size, %object
|
||||
/* Secondary Boot Code ends here */
|
||||
|
117
arch/arm/cpu/armv8/fsl-lsch3/ls2085a_serdes.c
Normal file
117
arch/arm/cpu/armv8/fsl-lsch3/ls2085a_serdes.c
Normal file
@ -0,0 +1,117 @@
|
||||
/*
|
||||
* Copyright 2015 Freescale Semiconductor, Inc.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/arch/fsl_serdes.h>
|
||||
#include <asm/arch-fsl-lsch3/immap_lsch3.h>
|
||||
|
||||
struct serdes_config {
|
||||
u8 protocol;
|
||||
u8 lanes[SRDS_MAX_LANES];
|
||||
};
|
||||
|
||||
static struct serdes_config serdes1_cfg_tbl[] = {
|
||||
/* SerDes 1 */
|
||||
{0x03, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, PCIE2, PCIE2 } },
|
||||
{0x05, {PCIE2, PCIE2, PCIE2, PCIE2, SGMII4, SGMII3, SGMII2, SGMII1 } },
|
||||
{0x07, {SGMII8, SGMII7, SGMII6, SGMII5, SGMII4, SGMII3, SGMII2,
|
||||
SGMII1 } },
|
||||
{0x09, {SGMII8, SGMII7, SGMII6, SGMII5, SGMII4, SGMII3, SGMII2,
|
||||
SGMII1 } },
|
||||
{0x0A, {SGMII8, SGMII7, SGMII6, SGMII5, SGMII4, SGMII3, SGMII2,
|
||||
SGMII1 } },
|
||||
{0x0C, {SGMII8, SGMII7, SGMII6, SGMII5, SGMII4, SGMII3, SGMII2,
|
||||
SGMII1 } },
|
||||
{0x0E, {SGMII8, SGMII7, SGMII6, SGMII5, SGMII4, SGMII3, SGMII2,
|
||||
SGMII1 } },
|
||||
{0x26, {SGMII8, SGMII7, SGMII6, SGMII5, SGMII4, SGMII3, XFI2, XFI1 } },
|
||||
{0x28, {SGMII8, SGMII7, SGMII6, SGMII5, XFI4, XFI3, XFI2, XFI1 } },
|
||||
{0x2A, {XFI8, XFI7, XFI6, XFI5, XFI4, XFI3, XFI2, XFI1 } },
|
||||
{0x2B, {SGMII8, SGMII7, SGMII6, SGMII5, XAUI1, XAUI1, XAUI1, XAUI1 } },
|
||||
{0x32, {XAUI2, XAUI2, XAUI2, XAUI2, XAUI1, XAUI1, XAUI1, XAUI1 } },
|
||||
{0x33, {PCIE2, PCIE2, PCIE2, PCIE2, QSGMII_D, QSGMII_C, QSGMII_B,
|
||||
QSGMII_A} },
|
||||
{0x35, {QSGMII_D, QSGMII_C, QSGMII_B, PCIE2, XFI4, XFI3, XFI2, XFI1 } },
|
||||
{}
|
||||
};
|
||||
static struct serdes_config serdes2_cfg_tbl[] = {
|
||||
/* SerDes 2 */
|
||||
{0x07, {SGMII9, SGMII10, SGMII11, SGMII12, SGMII13, SGMII14, SGMII15,
|
||||
SGMII16 } },
|
||||
{0x09, {SGMII9, SGMII10, SGMII11, SGMII12, SGMII13, SGMII14, SGMII15,
|
||||
SGMII16 } },
|
||||
{0x0A, {SGMII9, SGMII10, SGMII11, SGMII12, SGMII13, SGMII14, SGMII15,
|
||||
SGMII16 } },
|
||||
{0x0C, {SGMII9, SGMII10, SGMII11, SGMII12, SGMII13, SGMII14, SGMII15,
|
||||
SGMII16 } },
|
||||
{0x0E, {SGMII9, SGMII10, SGMII11, SGMII12, SGMII13, SGMII14, SGMII15,
|
||||
SGMII16 } },
|
||||
{0x3D, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3 } },
|
||||
{0x3E, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3 } },
|
||||
{0x3F, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, PCIE4, PCIE4 } },
|
||||
{0x40, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, PCIE4, PCIE4 } },
|
||||
{0x41, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, SATA1, SATA2 } },
|
||||
{0x42, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, SATA1, SATA2 } },
|
||||
{0x43, {PCIE3, PCIE3, PCIE3, PCIE3, NONE, NONE, SATA1, SATA2 } },
|
||||
{0x44, {PCIE3, PCIE3, PCIE3, PCIE3, NONE, NONE, SATA1, SATA2 } },
|
||||
{0x45, {PCIE3, SGMII10, SGMII11, SGMII12, PCIE4, SGMII14, SGMII15,
|
||||
SGMII16 } },
|
||||
{0x47, {SGMII9, SGMII10, SGMII11, SGMII12, PCIE4, PCIE4, PCIE4,
|
||||
PCIE4 } },
|
||||
{0x49, {SGMII9, SGMII10, SGMII11, SGMII12, PCIE4, PCIE4, SATA1,
|
||||
SATA2 } },
|
||||
{0x4A, {SGMII9, SGMII10, SGMII11, SGMII12, PCIE4, PCIE4, SATA1,
|
||||
SATA2 } },
|
||||
{}
|
||||
};
|
||||
|
||||
static struct serdes_config *serdes_cfg_tbl[] = {
|
||||
serdes1_cfg_tbl,
|
||||
serdes2_cfg_tbl,
|
||||
};
|
||||
|
||||
enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane)
|
||||
{
|
||||
struct serdes_config *ptr;
|
||||
|
||||
if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
|
||||
return 0;
|
||||
|
||||
ptr = serdes_cfg_tbl[serdes];
|
||||
while (ptr->protocol) {
|
||||
if (ptr->protocol == cfg)
|
||||
return ptr->lanes[lane];
|
||||
ptr++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int is_serdes_prtcl_valid(int serdes, u32 prtcl)
|
||||
{
|
||||
int i;
|
||||
struct serdes_config *ptr;
|
||||
|
||||
if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
|
||||
return 0;
|
||||
|
||||
ptr = serdes_cfg_tbl[serdes];
|
||||
while (ptr->protocol) {
|
||||
if (ptr->protocol == prtcl)
|
||||
break;
|
||||
ptr++;
|
||||
}
|
||||
|
||||
if (!ptr->protocol)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < SRDS_MAX_LANES; i++) {
|
||||
if (ptr->lanes[i] != NONE)
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
@ -31,6 +31,13 @@ int fsl_lsch3_wake_seconday_cores(void)
|
||||
int i, timeout = 10;
|
||||
u64 *table = get_spin_tbl_addr();
|
||||
|
||||
#ifdef COUNTER_FREQUENCY_REAL
|
||||
/* update for secondary cores */
|
||||
__real_cntfrq = COUNTER_FREQUENCY_REAL;
|
||||
flush_dcache_range((unsigned long)&__real_cntfrq,
|
||||
(unsigned long)&__real_cntfrq + 8);
|
||||
#endif
|
||||
|
||||
cores = cpu_mask();
|
||||
/* Clear spin table so that secondary processors
|
||||
* observe the correct value after waking up from wfe.
|
||||
|
@ -26,6 +26,7 @@
|
||||
#define id_to_core(x) ((x & 3) | (x >> 6))
|
||||
#ifndef __ASSEMBLY__
|
||||
extern u64 __spin_table[];
|
||||
extern u64 __real_cntfrq;
|
||||
extern u64 *secondary_boot_code;
|
||||
extern size_t __secondary_boot_code_size;
|
||||
int fsl_lsch3_wake_seconday_cores(void);
|
||||
|
107
arch/arm/cpu/armv8/fsl-lsch3/soc.c
Normal file
107
arch/arm/cpu/armv8/fsl-lsch3/soc.c
Normal file
@ -0,0 +1,107 @@
|
||||
/*
|
||||
* Copyright 2015 Freescale Semiconductor
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <fsl_ifc.h>
|
||||
#include <nand.h>
|
||||
#include <spl.h>
|
||||
#include <asm/arch-fsl-lsch3/soc.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/global_data.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
static void erratum_a008751(void)
|
||||
{
|
||||
#ifdef CONFIG_SYS_FSL_ERRATUM_A008751
|
||||
u32 __iomem *scfg = (u32 __iomem *)SCFG_BASE;
|
||||
|
||||
writel(0x27672b2a, scfg + SCFG_USB3PRM1CR / 4);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void erratum_rcw_src(void)
|
||||
{
|
||||
#if defined(CONFIG_SPL)
|
||||
u32 __iomem *dcfg_ccsr = (u32 __iomem *)DCFG_BASE;
|
||||
u32 __iomem *dcfg_dcsr = (u32 __iomem *)DCFG_DCSR_BASE;
|
||||
u32 val;
|
||||
|
||||
val = in_le32(dcfg_ccsr + DCFG_PORSR1 / 4);
|
||||
val &= ~DCFG_PORSR1_RCW_SRC;
|
||||
val |= DCFG_PORSR1_RCW_SRC_NOR;
|
||||
out_le32(dcfg_dcsr + DCFG_DCSR_PORCR1 / 4, val);
|
||||
#endif
|
||||
}
|
||||
|
||||
#define I2C_DEBUG_REG 0x6
|
||||
#define I2C_GLITCH_EN 0x8
|
||||
/*
|
||||
* This erratum requires setting glitch_en bit to enable
|
||||
* digital glitch filter to improve clock stability.
|
||||
*/
|
||||
static void erratum_a009203(void)
|
||||
{
|
||||
u8 __iomem *ptr;
|
||||
#ifdef CONFIG_SYS_I2C
|
||||
#ifdef I2C1_BASE_ADDR
|
||||
ptr = (u8 __iomem *)(I2C1_BASE_ADDR + I2C_DEBUG_REG);
|
||||
|
||||
writeb(I2C_GLITCH_EN, ptr);
|
||||
#endif
|
||||
#ifdef I2C2_BASE_ADDR
|
||||
ptr = (u8 __iomem *)(I2C2_BASE_ADDR + I2C_DEBUG_REG);
|
||||
|
||||
writeb(I2C_GLITCH_EN, ptr);
|
||||
#endif
|
||||
#ifdef I2C3_BASE_ADDR
|
||||
ptr = (u8 __iomem *)(I2C3_BASE_ADDR + I2C_DEBUG_REG);
|
||||
|
||||
writeb(I2C_GLITCH_EN, ptr);
|
||||
#endif
|
||||
#ifdef I2C4_BASE_ADDR
|
||||
ptr = (u8 __iomem *)(I2C4_BASE_ADDR + I2C_DEBUG_REG);
|
||||
|
||||
writeb(I2C_GLITCH_EN, ptr);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
void fsl_lsch3_early_init_f(void)
|
||||
{
|
||||
erratum_a008751();
|
||||
erratum_rcw_src();
|
||||
init_early_memctl_regs(); /* tighten IFC timing */
|
||||
erratum_a009203();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SPL_BUILD
|
||||
void board_init_f(ulong dummy)
|
||||
{
|
||||
/* Clear global data */
|
||||
memset((void *)gd, 0, sizeof(gd_t));
|
||||
|
||||
arch_cpu_init();
|
||||
board_early_init_f();
|
||||
timer_init();
|
||||
env_init();
|
||||
gd->baudrate = getenv_ulong("baudrate", 10, CONFIG_BAUDRATE);
|
||||
|
||||
serial_init();
|
||||
console_init_f();
|
||||
dram_init();
|
||||
|
||||
/* Clear the BSS. */
|
||||
memset(__bss_start, 0, __bss_end - __bss_start);
|
||||
|
||||
board_init_r(NULL, 0);
|
||||
}
|
||||
|
||||
u32 spl_boot_device(void)
|
||||
{
|
||||
return BOOT_DEVICE_NAND;
|
||||
}
|
||||
#endif
|
@ -26,7 +26,7 @@ void get_sys_info(struct sys_info *sys_info)
|
||||
{
|
||||
struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
|
||||
#ifdef CONFIG_FSL_IFC
|
||||
struct fsl_ifc *ifc_regs = (void *)CONFIG_SYS_IFC_ADDR;
|
||||
struct fsl_ifc ifc_regs = {(void *)CONFIG_SYS_IFC_ADDR, (void *)NULL};
|
||||
u32 ccr;
|
||||
#endif
|
||||
struct ccsr_clk_cluster_group __iomem *clk_grp[2] = {
|
||||
@ -86,6 +86,8 @@ void get_sys_info(struct sys_info *sys_info)
|
||||
sys_info->freq_systembus *= (in_le32(&gur->rcwsr[0]) >>
|
||||
FSL_CHASSIS3_RCWSR0_SYS_PLL_RAT_SHIFT) &
|
||||
FSL_CHASSIS3_RCWSR0_SYS_PLL_RAT_MASK;
|
||||
/* Platform clock is half of platform PLL */
|
||||
sys_info->freq_systembus /= 2;
|
||||
sys_info->freq_ddrbus *= (in_le32(&gur->rcwsr[0]) >>
|
||||
FSL_CHASSIS3_RCWSR0_MEM_PLL_RAT_SHIFT) &
|
||||
FSL_CHASSIS3_RCWSR0_MEM_PLL_RAT_MASK;
|
||||
@ -102,10 +104,7 @@ void get_sys_info(struct sys_info *sys_info)
|
||||
offsetof(struct ccsr_clk_cluster_group,
|
||||
pllngsr[i%3].gsr));
|
||||
ratio[i] = (in_le32(offset) >> 1) & 0x3f;
|
||||
if (ratio[i] > 4)
|
||||
freq_c_pll[i] = sysclk * ratio[i];
|
||||
else
|
||||
freq_c_pll[i] = sys_info->freq_systembus * ratio[i];
|
||||
freq_c_pll[i] = sysclk * ratio[i];
|
||||
}
|
||||
|
||||
for_each_cpu(i, cpu, cpu_numcores(), cpu_mask()) {
|
||||
@ -119,7 +118,7 @@ void get_sys_info(struct sys_info *sys_info)
|
||||
}
|
||||
|
||||
#if defined(CONFIG_FSL_IFC)
|
||||
ccr = in_le32(&ifc_regs->ifc_ccr);
|
||||
ccr = in_le32(&ifc_regs.gregs->ifc_ccr);
|
||||
ccr = ((ccr & IFC_CCR_CLK_DIV_MASK) >> IFC_CCR_CLK_DIV_SHIFT) + 1;
|
||||
|
||||
sys_info->freq_localbus = sys_info->freq_systembus / ccr;
|
||||
|
@ -25,7 +25,18 @@ unsigned long get_tbclk(void)
|
||||
unsigned long timer_read_counter(void)
|
||||
{
|
||||
unsigned long cntpct;
|
||||
#ifdef CONFIG_SYS_FSL_ERRATUM_A008585
|
||||
/* This erratum number needs to be confirmed to match ARM document */
|
||||
unsigned long temp;
|
||||
#endif
|
||||
isb();
|
||||
asm volatile("mrs %0, cntpct_el0" : "=r" (cntpct));
|
||||
#ifdef CONFIG_SYS_FSL_ERRATUM_A008585
|
||||
asm volatile("mrs %0, cntpct_el0" : "=r" (temp));
|
||||
while (temp != cntpct) {
|
||||
asm volatile("mrs %0, cntpct_el0" : "=r" (cntpct));
|
||||
asm volatile("mrs %0, cntpct_el0" : "=r" (temp));
|
||||
}
|
||||
#endif
|
||||
return cntpct;
|
||||
}
|
||||
|
77
arch/arm/cpu/armv8/u-boot-spl.lds
Normal file
77
arch/arm/cpu/armv8/u-boot-spl.lds
Normal file
@ -0,0 +1,77 @@
|
||||
/*
|
||||
* (C) Copyright 2013
|
||||
* David Feng <fenghua@phytium.com.cn>
|
||||
*
|
||||
* (C) Copyright 2002
|
||||
* Gary Jennejohn, DENX Software Engineering, <garyj@denx.de>
|
||||
*
|
||||
* (C) Copyright 2010
|
||||
* Texas Instruments, <www.ti.com>
|
||||
* Aneesh V <aneesh@ti.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
MEMORY { .sram : ORIGIN = CONFIG_SPL_TEXT_BASE,
|
||||
LENGTH = CONFIG_SPL_MAX_SIZE }
|
||||
MEMORY { .sdram : ORIGIN = CONFIG_SPL_BSS_START_ADDR,
|
||||
LENGTH = CONFIG_SPL_BSS_MAX_SIZE }
|
||||
|
||||
OUTPUT_FORMAT("elf64-littleaarch64", "elf64-littleaarch64", "elf64-littleaarch64")
|
||||
OUTPUT_ARCH(aarch64)
|
||||
ENTRY(_start)
|
||||
SECTIONS
|
||||
{
|
||||
.text : {
|
||||
. = ALIGN(8);
|
||||
*(.__image_copy_start)
|
||||
CPUDIR/start.o (.text*)
|
||||
*(.text*)
|
||||
} >.sram
|
||||
|
||||
.rodata : {
|
||||
. = ALIGN(8);
|
||||
*(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
|
||||
} >.sram
|
||||
|
||||
.data : {
|
||||
. = ALIGN(8);
|
||||
*(.data*)
|
||||
} >.sram
|
||||
|
||||
.u_boot_list : {
|
||||
. = ALIGN(8);
|
||||
KEEP(*(SORT(.u_boot_list*)));
|
||||
} >.sram
|
||||
|
||||
.image_copy_end : {
|
||||
. = ALIGN(8);
|
||||
*(.__image_copy_end)
|
||||
} >.sram
|
||||
|
||||
.end : {
|
||||
. = ALIGN(8);
|
||||
*(.__end)
|
||||
} >.sram
|
||||
|
||||
.bss_start : {
|
||||
. = ALIGN(8);
|
||||
KEEP(*(.__bss_start));
|
||||
} >.sdram
|
||||
|
||||
.bss : {
|
||||
*(.bss*)
|
||||
. = ALIGN(8);
|
||||
} >.sdram
|
||||
|
||||
.bss_end : {
|
||||
KEEP(*(.__bss_end));
|
||||
} >.sdram
|
||||
|
||||
/DISCARD/ : { *(.dynsym) }
|
||||
/DISCARD/ : { *(.dynstr*) }
|
||||
/DISCARD/ : { *(.dynamic*) }
|
||||
/DISCARD/ : { *(.plt*) }
|
||||
/DISCARD/ : { *(.interp*) }
|
||||
/DISCARD/ : { *(.gnu*) }
|
||||
}
|
@ -7,3 +7,4 @@
|
||||
|
||||
obj-y += clk.o
|
||||
obj-y += cpu.o
|
||||
obj-$(CONFIG_MP) += mp.o
|
||||
|
@ -6,6 +6,7 @@
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/arch/clk.h>
|
||||
#include <asm/arch/hardware.h>
|
||||
#include <asm/arch/sys_proto.h>
|
||||
|
||||
@ -16,6 +17,8 @@ unsigned long get_uart_clk(int dev_id)
|
||||
u32 ver = zynqmp_get_silicon_version();
|
||||
|
||||
switch (ver) {
|
||||
case ZYNQMP_CSU_VERSION_VELOCE:
|
||||
return 48000;
|
||||
case ZYNQMP_CSU_VERSION_EP108:
|
||||
return 25000000;
|
||||
}
|
||||
|
@ -20,9 +20,175 @@ unsigned int zynqmp_get_silicon_version(void)
|
||||
gd->cpu_clk = get_tbclk();
|
||||
|
||||
switch (gd->cpu_clk) {
|
||||
case 0 ... 1000000:
|
||||
return ZYNQMP_CSU_VERSION_VELOCE;
|
||||
case 50000000:
|
||||
return ZYNQMP_CSU_VERSION_QEMU;
|
||||
}
|
||||
|
||||
return ZYNQMP_CSU_VERSION_EP108;
|
||||
}
|
||||
|
||||
#ifndef CONFIG_SYS_DCACHE_OFF
|
||||
#include <asm/armv8/mmu.h>
|
||||
|
||||
#define SECTION_SHIFT_L1 30UL
|
||||
#define SECTION_SHIFT_L2 21UL
|
||||
#define BLOCK_SIZE_L0 0x8000000000UL
|
||||
#define BLOCK_SIZE_L1 (1 << SECTION_SHIFT_L1)
|
||||
#define BLOCK_SIZE_L2 (1 << SECTION_SHIFT_L2)
|
||||
|
||||
#define TCR_TG1_4K (1 << 31)
|
||||
#define TCR_EPD1_DISABLE (1 << 23)
|
||||
#define ZYNQMO_VA_BITS 40
|
||||
#define ZYNQMP_TCR TCR_TG1_4K | \
|
||||
TCR_EPD1_DISABLE | \
|
||||
TCR_SHARED_OUTER | \
|
||||
TCR_SHARED_INNER | \
|
||||
TCR_IRGN_WBWA | \
|
||||
TCR_ORGN_WBWA | \
|
||||
TCR_T0SZ(ZYNQMO_VA_BITS)
|
||||
|
||||
#define MEMORY_ATTR PMD_SECT_AF | PMD_SECT_INNER_SHARE | \
|
||||
PMD_ATTRINDX(MT_NORMAL) | \
|
||||
PMD_TYPE_SECT
|
||||
#define DEVICE_ATTR PMD_SECT_AF | PMD_SECT_PXN | \
|
||||
PMD_SECT_UXN | PMD_ATTRINDX(MT_DEVICE_NGNRNE) | \
|
||||
PMD_TYPE_SECT
|
||||
|
||||
/* 4K size is required to place 512 entries in each level */
|
||||
#define TLB_TABLE_SIZE 0x1000
|
||||
|
||||
struct attr_tbl {
|
||||
u32 num;
|
||||
u64 attr;
|
||||
};
|
||||
|
||||
static struct attr_tbl attr_tbll1t0[4] = { {16, 0x0},
|
||||
{8, DEVICE_ATTR},
|
||||
{32, MEMORY_ATTR},
|
||||
{456, DEVICE_ATTR}
|
||||
};
|
||||
static struct attr_tbl attr_tbll2t3[4] = { {0x180, DEVICE_ATTR},
|
||||
{0x40, 0x0},
|
||||
{0x3F, DEVICE_ATTR},
|
||||
{0x1, MEMORY_ATTR}
|
||||
};
|
||||
|
||||
/*
|
||||
* This mmu table looks as below
|
||||
* Level 0 table contains two entries to 512GB sizes. One is Level1 Table 0
|
||||
* and other Level1 Table1.
|
||||
* Level1 Table0 contains entries for each 1GB from 0 to 511GB.
|
||||
* Level1 Table1 contains entries for each 1GB from 512GB to 1TB.
|
||||
* Level2 Table0, Level2 Table1, Level2 Table2 and Level2 Table3 contains
|
||||
* entries for each 2MB starting from 0GB, 1GB, 2GB and 3GB respectively.
|
||||
*/
|
||||
static void zynqmp_mmu_setup(void)
|
||||
{
|
||||
int el;
|
||||
u32 index_attr;
|
||||
u64 i, section_l1t0, section_l1t1;
|
||||
u64 section_l2t0, section_l2t1, section_l2t2, section_l2t3;
|
||||
u64 *level0_table = (u64 *)gd->arch.tlb_addr;
|
||||
u64 *level1_table_0 = (u64 *)(gd->arch.tlb_addr + TLB_TABLE_SIZE);
|
||||
u64 *level1_table_1 = (u64 *)(gd->arch.tlb_addr + (2 * TLB_TABLE_SIZE));
|
||||
u64 *level2_table_0 = (u64 *)(gd->arch.tlb_addr + (3 * TLB_TABLE_SIZE));
|
||||
u64 *level2_table_1 = (u64 *)(gd->arch.tlb_addr + (4 * TLB_TABLE_SIZE));
|
||||
u64 *level2_table_2 = (u64 *)(gd->arch.tlb_addr + (5 * TLB_TABLE_SIZE));
|
||||
u64 *level2_table_3 = (u64 *)(gd->arch.tlb_addr + (6 * TLB_TABLE_SIZE));
|
||||
|
||||
level0_table[0] =
|
||||
(u64)level1_table_0 | PMD_TYPE_TABLE;
|
||||
level0_table[1] =
|
||||
(u64)level1_table_1 | PMD_TYPE_TABLE;
|
||||
|
||||
/*
|
||||
* set level 1 table 0, covering 0 to 512GB
|
||||
* set level 1 table 1, covering 512GB to 1TB
|
||||
*/
|
||||
section_l1t0 = 0;
|
||||
section_l1t1 = BLOCK_SIZE_L0;
|
||||
|
||||
index_attr = 0;
|
||||
for (i = 0; i < 512; i++) {
|
||||
level1_table_0[i] = section_l1t0;
|
||||
level1_table_0[i] |= attr_tbll1t0[index_attr].attr;
|
||||
attr_tbll1t0[index_attr].num--;
|
||||
if (attr_tbll1t0[index_attr].num == 0)
|
||||
index_attr++;
|
||||
level1_table_1[i] = section_l1t1;
|
||||
level1_table_1[i] |= DEVICE_ATTR;
|
||||
section_l1t0 += BLOCK_SIZE_L1;
|
||||
section_l1t1 += BLOCK_SIZE_L1;
|
||||
}
|
||||
|
||||
level1_table_0[0] =
|
||||
(u64)level2_table_0 | PMD_TYPE_TABLE;
|
||||
level1_table_0[1] =
|
||||
(u64)level2_table_1 | PMD_TYPE_TABLE;
|
||||
level1_table_0[2] =
|
||||
(u64)level2_table_2 | PMD_TYPE_TABLE;
|
||||
level1_table_0[3] =
|
||||
(u64)level2_table_3 | PMD_TYPE_TABLE;
|
||||
|
||||
section_l2t0 = 0;
|
||||
section_l2t1 = section_l2t0 + BLOCK_SIZE_L1; /* 1GB */
|
||||
section_l2t2 = section_l2t1 + BLOCK_SIZE_L1; /* 2GB */
|
||||
section_l2t3 = section_l2t2 + BLOCK_SIZE_L1; /* 3GB */
|
||||
|
||||
index_attr = 0;
|
||||
|
||||
for (i = 0; i < 512; i++) {
|
||||
level2_table_0[i] = section_l2t0 | MEMORY_ATTR;
|
||||
level2_table_1[i] = section_l2t1 | MEMORY_ATTR;
|
||||
level2_table_2[i] = section_l2t2 | DEVICE_ATTR;
|
||||
level2_table_3[i] = section_l2t3 |
|
||||
attr_tbll2t3[index_attr].attr;
|
||||
attr_tbll2t3[index_attr].num--;
|
||||
if (attr_tbll2t3[index_attr].num == 0)
|
||||
index_attr++;
|
||||
section_l2t0 += BLOCK_SIZE_L2;
|
||||
section_l2t1 += BLOCK_SIZE_L2;
|
||||
section_l2t2 += BLOCK_SIZE_L2;
|
||||
section_l2t3 += BLOCK_SIZE_L2;
|
||||
}
|
||||
|
||||
/* flush new MMU table */
|
||||
flush_dcache_range(gd->arch.tlb_addr,
|
||||
gd->arch.tlb_addr + gd->arch.tlb_size);
|
||||
|
||||
/* point TTBR to the new table */
|
||||
el = current_el();
|
||||
set_ttbr_tcr_mair(el, gd->arch.tlb_addr,
|
||||
ZYNQMP_TCR, MEMORY_ATTRIBUTES);
|
||||
|
||||
set_sctlr(get_sctlr() | CR_M);
|
||||
}
|
||||
|
||||
int arch_cpu_init(void)
|
||||
{
|
||||
icache_enable();
|
||||
__asm_invalidate_dcache_all();
|
||||
__asm_invalidate_tlb_all();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* This function is called from lib/board.c.
|
||||
* It recreates MMU table in main memory. MMU and d-cache are enabled earlier.
|
||||
* There is no need to disable d-cache for this operation.
|
||||
*/
|
||||
void enable_caches(void)
|
||||
{
|
||||
/* The data cache is not active unless the mmu is enabled */
|
||||
if (!(get_sctlr() & CR_M)) {
|
||||
invalidate_dcache_all();
|
||||
__asm_invalidate_tlb_all();
|
||||
zynqmp_mmu_setup();
|
||||
}
|
||||
puts("Enabling Caches...\n");
|
||||
|
||||
set_sctlr(get_sctlr() | CR_C);
|
||||
}
|
||||
#endif
|
||||
|
242
arch/arm/cpu/armv8/zynqmp/mp.c
Normal file
242
arch/arm/cpu/armv8/zynqmp/mp.c
Normal file
@ -0,0 +1,242 @@
|
||||
/*
|
||||
* (C) Copyright 2014 - 2015 Xilinx, Inc.
|
||||
* Michal Simek <michal.simek@xilinx.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/arch/hardware.h>
|
||||
#include <asm/arch/sys_proto.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#define LOCK 0
|
||||
#define SPLIT 1
|
||||
|
||||
#define HALT 0
|
||||
#define RELEASE 1
|
||||
|
||||
#define ZYNQMP_BOOTADDR_HIGH_MASK 0xFFFFFFFF
|
||||
#define ZYNQMP_R5_HIVEC_ADDR 0xFFFF0000
|
||||
#define ZYNQMP_R5_LOVEC_ADDR 0x0
|
||||
#define ZYNQMP_RPU_CFG_CPU_HALT_MASK 0x01
|
||||
#define ZYNQMP_RPU_CFG_HIVEC_MASK 0x04
|
||||
#define ZYNQMP_RPU_GLBL_CTRL_SPLIT_LOCK_MASK 0x08
|
||||
#define ZYNQMP_RPU_GLBL_CTRL_TCM_COMB_MASK 0x40
|
||||
#define ZYNQMP_RPU_GLBL_CTRL_SLCLAMP_MASK 0x10
|
||||
|
||||
#define ZYNQMP_CRLAPB_RST_LPD_AMBA_RST_MASK 0x04
|
||||
#define ZYNQMP_CRLAPB_RST_LPD_R50_RST_MASK 0x01
|
||||
#define ZYNQMP_CRLAPB_RST_LPD_R51_RST_MASK 0x02
|
||||
#define ZYNQMP_CRLAPB_CPU_R5_CTRL_CLKACT_MASK 0x1000000
|
||||
|
||||
#define ZYNQMP_TCM_START_ADDRESS 0xFFE00000
|
||||
#define ZYNQMP_TCM_BOTH_SIZE 0x40000
|
||||
|
||||
#define ZYNQMP_CORE_APU0 0
|
||||
#define ZYNQMP_CORE_APU3 3
|
||||
|
||||
#define ZYNQMP_MAX_CORES 6
|
||||
|
||||
int is_core_valid(unsigned int core)
|
||||
{
|
||||
if (core < ZYNQMP_MAX_CORES)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cpu_reset(int nr)
|
||||
{
|
||||
puts("Feature is not implemented.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void set_r5_halt_mode(u8 halt, u8 mode)
|
||||
{
|
||||
u32 tmp;
|
||||
|
||||
tmp = readl(&rpu_base->rpu0_cfg);
|
||||
if (halt == HALT)
|
||||
tmp &= ~ZYNQMP_RPU_CFG_CPU_HALT_MASK;
|
||||
else
|
||||
tmp |= ZYNQMP_RPU_CFG_CPU_HALT_MASK;
|
||||
writel(tmp, &rpu_base->rpu0_cfg);
|
||||
|
||||
if (mode == LOCK) {
|
||||
tmp = readl(&rpu_base->rpu1_cfg);
|
||||
if (halt == HALT)
|
||||
tmp &= ~ZYNQMP_RPU_CFG_CPU_HALT_MASK;
|
||||
else
|
||||
tmp |= ZYNQMP_RPU_CFG_CPU_HALT_MASK;
|
||||
writel(tmp, &rpu_base->rpu1_cfg);
|
||||
}
|
||||
}
|
||||
|
||||
static void set_r5_tcm_mode(u8 mode)
|
||||
{
|
||||
u32 tmp;
|
||||
|
||||
tmp = readl(&rpu_base->rpu_glbl_ctrl);
|
||||
if (mode == LOCK) {
|
||||
tmp &= ~ZYNQMP_RPU_GLBL_CTRL_SPLIT_LOCK_MASK;
|
||||
tmp |= ZYNQMP_RPU_GLBL_CTRL_TCM_COMB_MASK |
|
||||
ZYNQMP_RPU_GLBL_CTRL_SLCLAMP_MASK;
|
||||
} else {
|
||||
tmp |= ZYNQMP_RPU_GLBL_CTRL_SPLIT_LOCK_MASK;
|
||||
tmp &= ~(ZYNQMP_RPU_GLBL_CTRL_TCM_COMB_MASK |
|
||||
ZYNQMP_RPU_GLBL_CTRL_SLCLAMP_MASK);
|
||||
}
|
||||
|
||||
writel(tmp, &rpu_base->rpu_glbl_ctrl);
|
||||
}
|
||||
|
||||
static void set_r5_reset(u8 mode)
|
||||
{
|
||||
u32 tmp;
|
||||
|
||||
tmp = readl(&crlapb_base->rst_lpd_top);
|
||||
tmp |= (ZYNQMP_CRLAPB_RST_LPD_AMBA_RST_MASK |
|
||||
ZYNQMP_CRLAPB_RST_LPD_R50_RST_MASK);
|
||||
|
||||
if (mode == LOCK)
|
||||
tmp |= ZYNQMP_CRLAPB_RST_LPD_R51_RST_MASK;
|
||||
|
||||
writel(tmp, &crlapb_base->rst_lpd_top);
|
||||
}
|
||||
|
||||
static void release_r5_reset(u8 mode)
|
||||
{
|
||||
u32 tmp;
|
||||
|
||||
tmp = readl(&crlapb_base->rst_lpd_top);
|
||||
tmp &= ~(ZYNQMP_CRLAPB_RST_LPD_AMBA_RST_MASK |
|
||||
ZYNQMP_CRLAPB_RST_LPD_R50_RST_MASK);
|
||||
|
||||
if (mode == LOCK)
|
||||
tmp &= ~ZYNQMP_CRLAPB_RST_LPD_R51_RST_MASK;
|
||||
|
||||
writel(tmp, &crlapb_base->rst_lpd_top);
|
||||
}
|
||||
|
||||
static void enable_clock_r5(void)
|
||||
{
|
||||
u32 tmp;
|
||||
|
||||
tmp = readl(&crlapb_base->cpu_r5_ctrl);
|
||||
tmp |= ZYNQMP_CRLAPB_CPU_R5_CTRL_CLKACT_MASK;
|
||||
writel(tmp, &crlapb_base->cpu_r5_ctrl);
|
||||
|
||||
/* Give some delay for clock
|
||||
* to propogate */
|
||||
udelay(0x500);
|
||||
}
|
||||
|
||||
int cpu_disable(int nr)
|
||||
{
|
||||
if (nr >= ZYNQMP_CORE_APU0 && nr <= ZYNQMP_CORE_APU3) {
|
||||
u32 val = readl(&crfapb_base->rst_fpd_apu);
|
||||
val |= 1 << nr;
|
||||
writel(val, &crfapb_base->rst_fpd_apu);
|
||||
} else {
|
||||
set_r5_reset(LOCK);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cpu_status(int nr)
|
||||
{
|
||||
if (nr >= ZYNQMP_CORE_APU0 && nr <= ZYNQMP_CORE_APU3) {
|
||||
u32 addr_low = readl(((u8 *)&apu_base->rvbar_addr0_l) + nr * 8);
|
||||
u32 addr_high = readl(((u8 *)&apu_base->rvbar_addr0_h) +
|
||||
nr * 8);
|
||||
u32 val = readl(&crfapb_base->rst_fpd_apu);
|
||||
val &= 1 << nr;
|
||||
printf("APU CPU%d %s - starting address HI: %x, LOW: %x\n",
|
||||
nr, val ? "OFF" : "ON" , addr_high, addr_low);
|
||||
} else {
|
||||
u32 val = readl(&crlapb_base->rst_lpd_top);
|
||||
val &= 1 << (nr - 4);
|
||||
printf("RPU CPU%d %s\n", nr - 4, val ? "OFF" : "ON");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void set_r5_start(u8 high)
|
||||
{
|
||||
u32 tmp;
|
||||
|
||||
tmp = readl(&rpu_base->rpu0_cfg);
|
||||
if (high)
|
||||
tmp |= ZYNQMP_RPU_CFG_HIVEC_MASK;
|
||||
else
|
||||
tmp &= ~ZYNQMP_RPU_CFG_HIVEC_MASK;
|
||||
writel(tmp, &rpu_base->rpu0_cfg);
|
||||
|
||||
tmp = readl(&rpu_base->rpu1_cfg);
|
||||
if (high)
|
||||
tmp |= ZYNQMP_RPU_CFG_HIVEC_MASK;
|
||||
else
|
||||
tmp &= ~ZYNQMP_RPU_CFG_HIVEC_MASK;
|
||||
writel(tmp, &rpu_base->rpu1_cfg);
|
||||
}
|
||||
|
||||
int cpu_release(int nr, int argc, char * const argv[])
|
||||
{
|
||||
if (nr >= ZYNQMP_CORE_APU0 && nr <= ZYNQMP_CORE_APU3) {
|
||||
u64 boot_addr = simple_strtoull(argv[0], NULL, 16);
|
||||
/* HIGH */
|
||||
writel((u32)(boot_addr >> 32),
|
||||
((u8 *)&apu_base->rvbar_addr0_h) + nr * 8);
|
||||
/* LOW */
|
||||
writel((u32)(boot_addr & ZYNQMP_BOOTADDR_HIGH_MASK),
|
||||
((u8 *)&apu_base->rvbar_addr0_l) + nr * 8);
|
||||
|
||||
u32 val = readl(&crfapb_base->rst_fpd_apu);
|
||||
val &= ~(1 << nr);
|
||||
writel(val, &crfapb_base->rst_fpd_apu);
|
||||
} else {
|
||||
if (argc != 2) {
|
||||
printf("Invalid number of arguments to release.\n");
|
||||
printf("<addr> <mode>-Start addr lockstep or split\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
u32 boot_addr = simple_strtoul(argv[0], NULL, 16);
|
||||
if (!(boot_addr == ZYNQMP_R5_LOVEC_ADDR ||
|
||||
boot_addr == ZYNQMP_R5_HIVEC_ADDR)) {
|
||||
printf("Invalid starting address 0x%x\n", boot_addr);
|
||||
printf("0 or 0xffff0000 are permitted\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (!strncmp(argv[1], "lockstep", 8)) {
|
||||
printf("R5 lockstep mode\n");
|
||||
set_r5_tcm_mode(LOCK);
|
||||
set_r5_halt_mode(HALT, LOCK);
|
||||
|
||||
if (boot_addr == 0)
|
||||
set_r5_start(0);
|
||||
else
|
||||
set_r5_start(1);
|
||||
|
||||
enable_clock_r5();
|
||||
release_r5_reset(LOCK);
|
||||
set_r5_halt_mode(RELEASE, LOCK);
|
||||
} else if (!strncmp(argv[1], "split", 5)) {
|
||||
printf("R5 split mode\n");
|
||||
set_r5_tcm_mode(SPLIT);
|
||||
set_r5_halt_mode(HALT, SPLIT);
|
||||
enable_clock_r5();
|
||||
release_r5_reset(SPLIT);
|
||||
set_r5_halt_mode(RELEASE, SPLIT);
|
||||
} else {
|
||||
printf("Unsupported mode\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
@ -39,11 +39,12 @@ dtb-$(CONFIG_ARCH_UNIPHIER) += \
|
||||
uniphier-ph1-pro4-ref.dtb \
|
||||
uniphier-ph1-ld4-ref.dtb \
|
||||
uniphier-ph1-sld8-ref.dtb
|
||||
dtb-$(CONFIG_ZYNQ) += zynq-zc702.dtb \
|
||||
dtb-$(CONFIG_ARCH_ZYNQ) += zynq-zc702.dtb \
|
||||
zynq-zc706.dtb \
|
||||
zynq-zed.dtb \
|
||||
zynq-zybo.dtb \
|
||||
zynq-microzed.dtb \
|
||||
zynq-picozed.dtb \
|
||||
zynq-zc770-xm010.dtb \
|
||||
zynq-zc770-xm012.dtb \
|
||||
zynq-zc770-xm013.dtb
|
||||
@ -54,6 +55,9 @@ dtb-$(CONFIG_SOCFPGA) += \
|
||||
socfpga_cyclone5_socdk.dtb \
|
||||
socfpga_cyclone5_socrates.dtb
|
||||
|
||||
dtb-$(CONFIG_LS102XA) += ls1021a-qds.dtb \
|
||||
ls1021a-twr.dtb
|
||||
|
||||
targets += $(dtb-y)
|
||||
|
||||
DTC_FLAGS += -R 4 -p 0x1000
|
||||
|
@ -2,6 +2,8 @@
|
||||
* U-Boot additions to enable a generic Exynos GPIO driver
|
||||
*
|
||||
* Copyright (c) 2014 Google, Inc
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
/{
|
||||
|
@ -2,6 +2,8 @@
|
||||
* U-Boot additions to enable a generic Exynos GPIO driver
|
||||
*
|
||||
* Copyright (c) 2014 Google, Inc
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
/{
|
||||
|
@ -2,6 +2,8 @@
|
||||
* U-Boot additions to enable a generic Exynos GPIO driver
|
||||
*
|
||||
* Copyright (c) 2014 Google, Inc
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
/{
|
||||
|
@ -40,9 +40,9 @@
|
||||
};
|
||||
|
||||
i2c4: i2c@12ca0000 {
|
||||
cros-ec@1e {
|
||||
cros_ec: cros-ec@1e {
|
||||
reg = <0x1e>;
|
||||
compatible = "google,cros-ec";
|
||||
compatible = "google,cros-ec-i2c";
|
||||
i2c-max-frequency = <100000>;
|
||||
u-boot,i2c-offset-len = <0>;
|
||||
ec-interrupt = <&gpx1 6 GPIO_ACTIVE_LOW>;
|
||||
@ -65,9 +65,10 @@
|
||||
spi@131b0000 {
|
||||
spi-max-frequency = <1000000>;
|
||||
spi-deactivate-delay = <100>;
|
||||
cros_ec: cros-ec@0 {
|
||||
reg = <0>;
|
||||
compatible = "google,cros-ec";
|
||||
|
||||
embedded-controller {
|
||||
compatible = "google,cros-ec-i2c";
|
||||
reg = <0x1e>;
|
||||
spi-max-frequency = <5000000>;
|
||||
ec-interrupt = <&gpx1 6 GPIO_ACTIVE_LOW>;
|
||||
optimise-flash-write;
|
||||
@ -133,6 +134,7 @@
|
||||
|
||||
ehci@12110000 {
|
||||
samsung,vbus-gpio = <&gpx1 1 GPIO_ACTIVE_HIGH>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
xhci@12000000 {
|
||||
|
@ -104,12 +104,12 @@
|
||||
spi@12d40000 { /* spi2 */
|
||||
spi-max-frequency = <4000000>;
|
||||
spi-deactivate-delay = <200>;
|
||||
|
||||
cros_ec: cros-ec@0 {
|
||||
compatible = "google,cros-ec-spi";
|
||||
reg = <0>;
|
||||
compatible = "google,cros-ec";
|
||||
spi-half-duplex;
|
||||
spi-max-timeout-ms = <1100>;
|
||||
spi-frame-header = <0xec>;
|
||||
ec-interrupt = <&gpx1 5 GPIO_ACTIVE_LOW>;
|
||||
|
||||
/*
|
||||
|
@ -2,6 +2,8 @@
|
||||
* U-Boot additions to enable a generic Exynos GPIO driver
|
||||
*
|
||||
* Copyright (c) 2014 Google, Inc
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
/{
|
||||
|
@ -97,11 +97,10 @@
|
||||
spi-max-frequency = <4000000>;
|
||||
spi-deactivate-delay = <200>;
|
||||
cros_ec: cros-ec@0 {
|
||||
compatible = "google,cros-ec-spi";
|
||||
reg = <0>;
|
||||
compatible = "google,cros-ec";
|
||||
spi-half-duplex;
|
||||
spi-max-timeout-ms = <1100>;
|
||||
spi-frame-header = <0xec>;
|
||||
ec-interrupt = <&gpx1 5 GPIO_ACTIVE_LOW>;
|
||||
|
||||
/*
|
||||
|
216
arch/arm/dts/ls1021a-qds.dts
Normal file
216
arch/arm/dts/ls1021a-qds.dts
Normal file
@ -0,0 +1,216 @@
|
||||
/*
|
||||
* Freescale ls1021a QDS board device tree source
|
||||
*
|
||||
* Copyright 2013-2015 Freescale Semiconductor, Inc.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
#include "ls1021a.dtsi"
|
||||
|
||||
/ {
|
||||
model = "LS1021A QDS Board";
|
||||
|
||||
aliases {
|
||||
enet0_rgmii_phy = &rgmii_phy1;
|
||||
enet1_rgmii_phy = &rgmii_phy2;
|
||||
enet2_rgmii_phy = &rgmii_phy3;
|
||||
enet0_sgmii_phy = &sgmii_phy1c;
|
||||
enet1_sgmii_phy = &sgmii_phy1d;
|
||||
spi0 = &qspi;
|
||||
spi1 = &dspi0;
|
||||
};
|
||||
};
|
||||
|
||||
&dspi0 {
|
||||
bus-num = <0>;
|
||||
status = "okay";
|
||||
|
||||
dspiflash: at45db021d@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "spi-flash";
|
||||
spi-max-frequency = <16000000>;
|
||||
spi-cpol;
|
||||
spi-cpha;
|
||||
reg = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
&qspi {
|
||||
bus-num = <0>;
|
||||
status = "okay";
|
||||
|
||||
qflash0: s25fl128s@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "spi-flash";
|
||||
spi-max-frequency = <20000000>;
|
||||
reg = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
status = "okay";
|
||||
|
||||
pca9547: mux@77 {
|
||||
reg = <0x77>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
i2c@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0x0>;
|
||||
|
||||
ds3232: rtc@68 {
|
||||
compatible = "dallas,ds3232";
|
||||
reg = <0x68>;
|
||||
interrupts = <GIC_SPI 169 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
};
|
||||
|
||||
i2c@2 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0x2>;
|
||||
|
||||
ina220@40 {
|
||||
compatible = "ti,ina220";
|
||||
reg = <0x40>;
|
||||
shunt-resistor = <1000>;
|
||||
};
|
||||
|
||||
ina220@41 {
|
||||
compatible = "ti,ina220";
|
||||
reg = <0x41>;
|
||||
shunt-resistor = <1000>;
|
||||
};
|
||||
};
|
||||
|
||||
i2c@3 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0x3>;
|
||||
|
||||
eeprom@56 {
|
||||
compatible = "atmel,24c512";
|
||||
reg = <0x56>;
|
||||
};
|
||||
|
||||
eeprom@57 {
|
||||
compatible = "atmel,24c512";
|
||||
reg = <0x57>;
|
||||
};
|
||||
|
||||
adt7461a@4c {
|
||||
compatible = "adi,adt7461a";
|
||||
reg = <0x4c>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&ifc {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <1>;
|
||||
/* NOR, NAND Flashes and FPGA on board */
|
||||
ranges = <0x0 0x0 0x60000000 0x08000000
|
||||
0x2 0x0 0x7e800000 0x00010000
|
||||
0x3 0x0 0x7fb00000 0x00000100>;
|
||||
status = "okay";
|
||||
|
||||
nor@0,0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "cfi-flash";
|
||||
reg = <0x0 0x0 0x8000000>;
|
||||
bank-width = <2>;
|
||||
device-width = <1>;
|
||||
};
|
||||
|
||||
fpga: board-control@3,0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "simple-bus";
|
||||
reg = <0x3 0x0 0x0000100>;
|
||||
bank-width = <1>;
|
||||
device-width = <1>;
|
||||
ranges = <0 3 0 0x100>;
|
||||
|
||||
mdio-mux-emi1 {
|
||||
compatible = "mdio-mux-mmioreg";
|
||||
mdio-parent-bus = <&mdio0>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0x54 1>; /* BRDCFG4 */
|
||||
mux-mask = <0xe0>; /* EMI1[2:0] */
|
||||
|
||||
/* Onboard PHYs */
|
||||
ls1021amdio0: mdio@0 {
|
||||
reg = <0>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
rgmii_phy1: ethernet-phy@1 {
|
||||
reg = <0x1>;
|
||||
};
|
||||
};
|
||||
|
||||
ls1021amdio1: mdio@20 {
|
||||
reg = <0x20>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
rgmii_phy2: ethernet-phy@2 {
|
||||
reg = <0x2>;
|
||||
};
|
||||
};
|
||||
|
||||
ls1021amdio2: mdio@40 {
|
||||
reg = <0x40>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
rgmii_phy3: ethernet-phy@3 {
|
||||
reg = <0x3>;
|
||||
};
|
||||
};
|
||||
|
||||
ls1021amdio3: mdio@60 {
|
||||
reg = <0x60>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
sgmii_phy1c: ethernet-phy@1c {
|
||||
reg = <0x1c>;
|
||||
};
|
||||
};
|
||||
|
||||
ls1021amdio4: mdio@80 {
|
||||
reg = <0x80>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
sgmii_phy1d: ethernet-phy@1d {
|
||||
reg = <0x1d>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&lpuart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&mdio0 {
|
||||
tbi0: tbi-phy@8 {
|
||||
reg = <0x8>;
|
||||
device_type = "tbi-phy";
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&uart1 {
|
||||
status = "okay";
|
||||
};
|
87
arch/arm/dts/ls1021a-twr.dts
Normal file
87
arch/arm/dts/ls1021a-twr.dts
Normal file
@ -0,0 +1,87 @@
|
||||
/*
|
||||
* Freescale ls1021a TWR board device tree source
|
||||
*
|
||||
* Copyright 2013-2015 Freescale Semiconductor, Inc.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
#include "ls1021a.dtsi"
|
||||
|
||||
/ {
|
||||
model = "LS1021A TWR Board";
|
||||
|
||||
aliases {
|
||||
enet2_rgmii_phy = &rgmii_phy1;
|
||||
enet0_sgmii_phy = &sgmii_phy2;
|
||||
enet1_sgmii_phy = &sgmii_phy0;
|
||||
spi0 = &qspi;
|
||||
};
|
||||
};
|
||||
|
||||
&qspi {
|
||||
bus-num = <0>;
|
||||
status = "okay";
|
||||
|
||||
qflash0: n25q128a13@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "spi-flash";
|
||||
spi-max-frequency = <20000000>;
|
||||
reg = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&i2c1 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&ifc {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <1>;
|
||||
/* NOR Flash on board */
|
||||
ranges = <0x0 0x0 0x60000000 0x08000000>;
|
||||
status = "okay";
|
||||
|
||||
nor@0,0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "cfi-flash";
|
||||
reg = <0x0 0x0 0x8000000>;
|
||||
bank-width = <2>;
|
||||
device-width = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
&lpuart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&mdio0 {
|
||||
sgmii_phy0: ethernet-phy@0 {
|
||||
reg = <0x0>;
|
||||
};
|
||||
rgmii_phy1: ethernet-phy@1 {
|
||||
reg = <0x1>;
|
||||
};
|
||||
sgmii_phy2: ethernet-phy@2 {
|
||||
reg = <0x2>;
|
||||
};
|
||||
tbi1: tbi-phy@1f {
|
||||
reg = <0x1f>;
|
||||
device_type = "tbi-phy";
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&uart1 {
|
||||
status = "okay";
|
||||
};
|
381
arch/arm/dts/ls1021a.dtsi
Normal file
381
arch/arm/dts/ls1021a.dtsi
Normal file
@ -0,0 +1,381 @@
|
||||
/*
|
||||
* Freescale ls1021a SOC common device tree source
|
||||
*
|
||||
* Copyright 2013-2015 Freescale Semiconductor, Inc.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include "skeleton.dtsi"
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
|
||||
/ {
|
||||
compatible = "fsl,ls1021a";
|
||||
interrupt-parent = <&gic>;
|
||||
|
||||
aliases {
|
||||
serial0 = &lpuart0;
|
||||
serial1 = &lpuart1;
|
||||
serial2 = &lpuart2;
|
||||
serial3 = &lpuart3;
|
||||
serial4 = &lpuart4;
|
||||
serial5 = &lpuart5;
|
||||
sysclk = &sysclk;
|
||||
};
|
||||
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
cpu@f00 {
|
||||
compatible = "arm,cortex-a7";
|
||||
device_type = "cpu";
|
||||
reg = <0xf00>;
|
||||
clocks = <&cluster1_clk>;
|
||||
};
|
||||
|
||||
cpu@f01 {
|
||||
compatible = "arm,cortex-a7";
|
||||
device_type = "cpu";
|
||||
reg = <0xf01>;
|
||||
clocks = <&cluster1_clk>;
|
||||
};
|
||||
};
|
||||
|
||||
timer {
|
||||
compatible = "arm,armv7-timer";
|
||||
interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
|
||||
<GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
|
||||
<GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
|
||||
<GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>;
|
||||
};
|
||||
|
||||
pmu {
|
||||
compatible = "arm,cortex-a7-pmu";
|
||||
interrupts = <GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 139 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
soc {
|
||||
compatible = "simple-bus";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
device_type = "soc";
|
||||
interrupt-parent = <&gic>;
|
||||
ranges;
|
||||
|
||||
gic: interrupt-controller@1400000 {
|
||||
compatible = "arm,cortex-a7-gic";
|
||||
#interrupt-cells = <3>;
|
||||
interrupt-controller;
|
||||
reg = <0x1401000 0x1000>,
|
||||
<0x1402000 0x1000>,
|
||||
<0x1404000 0x2000>,
|
||||
<0x1406000 0x2000>;
|
||||
interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_HIGH)>;
|
||||
|
||||
};
|
||||
|
||||
ifc: ifc@1530000 {
|
||||
compatible = "fsl,ifc", "simple-bus";
|
||||
reg = <0x1530000 0x10000>;
|
||||
interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
dcfg: dcfg@1ee0000 {
|
||||
compatible = "fsl,ls1021a-dcfg", "syscon";
|
||||
reg = <0x1ee0000 0x10000>;
|
||||
big-endian;
|
||||
};
|
||||
|
||||
esdhc: esdhc@1560000 {
|
||||
compatible = "fsl,esdhc";
|
||||
reg = <0x1560000 0x10000>;
|
||||
interrupts = <GIC_SPI 94 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clock-frequency = <0>;
|
||||
voltage-ranges = <1800 1800 3300 3300>;
|
||||
sdhci,auto-cmd12;
|
||||
big-endian;
|
||||
bus-width = <4>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
scfg: scfg@1570000 {
|
||||
compatible = "fsl,ls1021a-scfg", "syscon";
|
||||
reg = <0x1570000 0x10000>;
|
||||
big-endian;
|
||||
};
|
||||
|
||||
clockgen: clocking@1ee1000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0x0 0x1ee1000 0x10000>;
|
||||
|
||||
sysclk: sysclk {
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
clock-output-names = "sysclk";
|
||||
};
|
||||
|
||||
cga_pll1: pll@800 {
|
||||
compatible = "fsl,qoriq-core-pll-2.0";
|
||||
#clock-cells = <1>;
|
||||
reg = <0x800 0x10>;
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "cga-pll1", "cga-pll1-div2",
|
||||
"cga-pll1-div4";
|
||||
};
|
||||
|
||||
platform_clk: pll@c00 {
|
||||
compatible = "fsl,qoriq-core-pll-2.0";
|
||||
#clock-cells = <1>;
|
||||
reg = <0xc00 0x10>;
|
||||
clocks = <&sysclk>;
|
||||
clock-output-names = "platform-clk", "platform-clk-div2";
|
||||
};
|
||||
|
||||
cluster1_clk: clk0c0@0 {
|
||||
compatible = "fsl,qoriq-core-mux-2.0";
|
||||
#clock-cells = <0>;
|
||||
reg = <0x0 0x10>;
|
||||
clock-names = "pll1cga", "pll1cga-div2", "pll1cga-div4";
|
||||
clocks = <&cga_pll1 0>, <&cga_pll1 1>, <&cga_pll1 2>;
|
||||
clock-output-names = "cluster1-clk";
|
||||
};
|
||||
};
|
||||
|
||||
dspi0: dspi@2100000 {
|
||||
compatible = "fsl,vf610-dspi";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0x2100000 0x10000>;
|
||||
interrupts = <GIC_SPI 96 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clock-names = "dspi";
|
||||
clocks = <&platform_clk 1>;
|
||||
num-cs = <6>;
|
||||
big-endian;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
dspi1: dspi@2110000 {
|
||||
compatible = "fsl,vf610-dspi";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0x2110000 0x10000>;
|
||||
interrupts = <GIC_SPI 97 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clock-names = "dspi";
|
||||
clocks = <&platform_clk 1>;
|
||||
num-cs = <6>;
|
||||
big-endian;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
qspi: quadspi@1550000 {
|
||||
compatible = "fsl,vf610-qspi";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0x1550000 0x10000>,
|
||||
<0x40000000 0x4000000>;
|
||||
num-cs = <2>;
|
||||
big-endian;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
i2c0: i2c@2180000 {
|
||||
compatible = "fsl,vf610-i2c";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0x2180000 0x10000>;
|
||||
interrupts = <GIC_SPI 88 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clock-names = "i2c";
|
||||
clocks = <&platform_clk 1>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
i2c1: i2c@2190000 {
|
||||
compatible = "fsl,vf610-i2c";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0x2190000 0x10000>;
|
||||
interrupts = <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clock-names = "i2c";
|
||||
clocks = <&platform_clk 1>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
i2c2: i2c@21a0000 {
|
||||
compatible = "fsl,vf610-i2c";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0x21a0000 0x10000>;
|
||||
interrupts = <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clock-names = "i2c";
|
||||
clocks = <&platform_clk 1>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
uart0: serial@21c0500 {
|
||||
compatible = "fsl,16550-FIFO64", "ns16550a";
|
||||
reg = <0x21c0500 0x100>;
|
||||
interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clock-frequency = <0>;
|
||||
fifo-size = <15>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
uart1: serial@21c0600 {
|
||||
compatible = "fsl,16550-FIFO64", "ns16550a";
|
||||
reg = <0x21c0600 0x100>;
|
||||
interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clock-frequency = <0>;
|
||||
fifo-size = <15>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
uart2: serial@21d0500 {
|
||||
compatible = "fsl,16550-FIFO64", "ns16550a";
|
||||
reg = <0x21d0500 0x100>;
|
||||
interrupts = <GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clock-frequency = <0>;
|
||||
fifo-size = <15>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
uart3: serial@21d0600 {
|
||||
compatible = "fsl,16550-FIFO64", "ns16550a";
|
||||
reg = <0x21d0600 0x100>;
|
||||
interrupts = <GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clock-frequency = <0>;
|
||||
fifo-size = <15>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
lpuart0: serial@2950000 {
|
||||
compatible = "fsl,ls1021a-lpuart";
|
||||
reg = <0x2950000 0x1000>;
|
||||
interrupts = <GIC_SPI 80 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&sysclk>;
|
||||
clock-names = "ipg";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
lpuart1: serial@2960000 {
|
||||
compatible = "fsl,ls1021a-lpuart";
|
||||
reg = <0x2960000 0x1000>;
|
||||
interrupts = <GIC_SPI 81 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&platform_clk 1>;
|
||||
clock-names = "ipg";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
lpuart2: serial@2970000 {
|
||||
compatible = "fsl,ls1021a-lpuart";
|
||||
reg = <0x2970000 0x1000>;
|
||||
interrupts = <GIC_SPI 82 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&platform_clk 1>;
|
||||
clock-names = "ipg";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
lpuart3: serial@2980000 {
|
||||
compatible = "fsl,ls1021a-lpuart";
|
||||
reg = <0x2980000 0x1000>;
|
||||
interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&platform_clk 1>;
|
||||
clock-names = "ipg";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
lpuart4: serial@2990000 {
|
||||
compatible = "fsl,ls1021a-lpuart";
|
||||
reg = <0x2990000 0x1000>;
|
||||
interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&platform_clk 1>;
|
||||
clock-names = "ipg";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
lpuart5: serial@29a0000 {
|
||||
compatible = "fsl,ls1021a-lpuart";
|
||||
reg = <0x29a0000 0x1000>;
|
||||
interrupts = <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&platform_clk 1>;
|
||||
clock-names = "ipg";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
wdog0: watchdog@2ad0000 {
|
||||
compatible = "fsl,imx21-wdt";
|
||||
reg = <0x2ad0000 0x10000>;
|
||||
interrupts = <GIC_SPI 115 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&platform_clk 1>;
|
||||
clock-names = "wdog-en";
|
||||
big-endian;
|
||||
};
|
||||
|
||||
sai1: sai@2b50000 {
|
||||
compatible = "fsl,vf610-sai";
|
||||
reg = <0x2b50000 0x10000>;
|
||||
interrupts = <GIC_SPI 132 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&platform_clk 1>;
|
||||
clock-names = "sai";
|
||||
dma-names = "tx", "rx";
|
||||
dmas = <&edma0 1 47>,
|
||||
<&edma0 1 46>;
|
||||
big-endian;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sai2: sai@2b60000 {
|
||||
compatible = "fsl,vf610-sai";
|
||||
reg = <0x2b60000 0x10000>;
|
||||
interrupts = <GIC_SPI 133 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&platform_clk 1>;
|
||||
clock-names = "sai";
|
||||
dma-names = "tx", "rx";
|
||||
dmas = <&edma0 1 45>,
|
||||
<&edma0 1 44>;
|
||||
big-endian;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
edma0: edma@2c00000 {
|
||||
#dma-cells = <2>;
|
||||
compatible = "fsl,vf610-edma";
|
||||
reg = <0x2c00000 0x10000>,
|
||||
<0x2c10000 0x10000>,
|
||||
<0x2c20000 0x10000>;
|
||||
interrupts = <GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "edma-tx", "edma-err";
|
||||
dma-channels = <32>;
|
||||
big-endian;
|
||||
clock-names = "dmamux0", "dmamux1";
|
||||
clocks = <&platform_clk 1>,
|
||||
<&platform_clk 1>;
|
||||
};
|
||||
|
||||
mdio0: mdio@2d24000 {
|
||||
compatible = "gianfar";
|
||||
device_type = "mdio";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0x2d24000 0x4000>;
|
||||
};
|
||||
|
||||
usb@8600000 {
|
||||
compatible = "fsl-usb2-dr-v2.5", "fsl-usb2-dr";
|
||||
reg = <0x8600000 0x1000>;
|
||||
interrupts = <GIC_SPI 171 IRQ_TYPE_LEVEL_HIGH>;
|
||||
dr_mode = "host";
|
||||
phy_type = "ulpi";
|
||||
};
|
||||
|
||||
usb3@3100000 {
|
||||
compatible = "snps,dwc3";
|
||||
reg = <0x3100000 0x10000>;
|
||||
interrupts = <GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH>;
|
||||
dr_mode = "host";
|
||||
};
|
||||
};
|
||||
};
|
@ -2,6 +2,8 @@
|
||||
* U-Boot additions to enable a generic Exynos GPIO driver
|
||||
*
|
||||
* Copyright (c) 2014 Google, Inc
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
/ {
|
||||
|
@ -2,6 +2,8 @@
|
||||
* U-Boot additions to enable a generic Exynos GPIO driver
|
||||
*
|
||||
* Copyright (c) 2014 Google, Inc
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
/ {
|
||||
|
13
arch/arm/dts/skeleton64.dtsi
Normal file
13
arch/arm/dts/skeleton64.dtsi
Normal file
@ -0,0 +1,13 @@
|
||||
/*
|
||||
* Skeleton device tree in the 64 bits version; the bare minimum
|
||||
* needed to boot; just include and add a compatible value. The
|
||||
* bootloader will typically populate the memory node.
|
||||
*/
|
||||
|
||||
/ {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
chosen { };
|
||||
aliases { };
|
||||
memory { device_type = "memory"; reg = <0 0 0 0>; };
|
||||
};
|
@ -25,6 +25,10 @@
|
||||
* to be added to the gmac1 device tree blob.
|
||||
*/
|
||||
ethernet0 = &gmac1;
|
||||
|
||||
spi0 = "/spi@ff705000"; /* QSPI */
|
||||
spi1 = "/spi@fff00000";
|
||||
spi2 = "/spi@fff01000";
|
||||
};
|
||||
|
||||
regulator_3_3v: 3-3-v-regulator {
|
||||
@ -72,3 +76,23 @@
|
||||
&usb1 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&qspi {
|
||||
status = "okay";
|
||||
|
||||
flash0: n25q00@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "n25q00";
|
||||
reg = <0>; /* chip select */
|
||||
spi-max-frequency = <50000000>;
|
||||
m25p,fast-read;
|
||||
page-size = <256>;
|
||||
block-size = <16>; /* 2^16, 64KB */
|
||||
read-delay = <4>; /* delay value in read data capture register */
|
||||
tshsl-ns = <50>;
|
||||
tsd2d-ns = <50>;
|
||||
tchsh-ns = <4>;
|
||||
tslch-ns = <4>;
|
||||
};
|
||||
};
|
||||
|
@ -25,6 +25,10 @@
|
||||
* to be added to the gmac1 device tree blob.
|
||||
*/
|
||||
ethernet0 = &gmac1;
|
||||
|
||||
spi0 = "/spi@ff705000"; /* QSPI */
|
||||
spi1 = "/spi@fff00000";
|
||||
spi2 = "/spi@fff01000";
|
||||
};
|
||||
|
||||
regulator_3_3v: 3-3-v-regulator {
|
||||
@ -77,3 +81,23 @@
|
||||
&usb1 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&qspi {
|
||||
status = "okay";
|
||||
|
||||
flash0: n25q00@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "n25q00";
|
||||
reg = <0>; /* chip select */
|
||||
spi-max-frequency = <50000000>;
|
||||
m25p,fast-read;
|
||||
page-size = <256>;
|
||||
block-size = <16>; /* 2^16, 64KB */
|
||||
read-delay = <4>; /* delay value in read data capture register */
|
||||
tshsl-ns = <50>;
|
||||
tsd2d-ns = <50>;
|
||||
tchsh-ns = <4>;
|
||||
tslch-ns = <4>;
|
||||
};
|
||||
};
|
||||
|
@ -230,6 +230,7 @@
|
||||
|
||||
usb@7d000000 { /* Rear external USB port. */
|
||||
status = "okay";
|
||||
nvidia,vbus-gpio = <&gpio TEGRA_GPIO(N, 4) GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
usb-phy@7d000000 {
|
||||
@ -246,6 +247,7 @@
|
||||
|
||||
usb@7d008000 { /* Left external USB port. */
|
||||
status = "okay";
|
||||
nvidia,vbus-gpio = <&gpio TEGRA_GPIO(N, 5) GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
usb-phy@7d008000 {
|
||||
|
23
arch/arm/dts/zynq-picozed.dts
Normal file
23
arch/arm/dts/zynq-picozed.dts
Normal file
@ -0,0 +1,23 @@
|
||||
/*
|
||||
* Avnet PicoZed board DTS
|
||||
*
|
||||
* Copyright (C) 2015 Xilinx, Inc.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
/dts-v1/;
|
||||
#include "zynq-7000.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Zynq PicoZed Board";
|
||||
compatible = "xlnx,zynq-picozed", "xlnx,zynq-7000";
|
||||
|
||||
aliases {
|
||||
serial0 = &uart1;
|
||||
};
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = <0 0x40000000>;
|
||||
};
|
||||
};
|
@ -22,6 +22,9 @@ ifeq ($(SOC),$(filter $(SOC),mx6))
|
||||
obj-$(CONFIG_CMD_SATA) += sata.o
|
||||
obj-$(CONFIG_IMX_VIDEO_SKIP) += video.o
|
||||
endif
|
||||
ifeq ($(SOC),$(filter $(SOC),vf610))
|
||||
obj-y += ddrmc-vf610.o
|
||||
endif
|
||||
obj-$(CONFIG_CMD_BMODE) += cmd_bmode.o
|
||||
obj-$(CONFIG_CMD_HDMIDETECT) += cmd_hdmidet.o
|
||||
obj-$(CONFIG_CMD_DEKBLOB) += cmd_dek.o
|
||||
|
278
arch/arm/imx-common/ddrmc-vf610.c
Normal file
278
arch/arm/imx-common/ddrmc-vf610.c
Normal file
@ -0,0 +1,278 @@
|
||||
/*
|
||||
* Copyright 2015 Toradex, Inc.
|
||||
*
|
||||
* Based on vf610twr:
|
||||
* Copyright 2013 Freescale Semiconductor, Inc.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/imx-regs.h>
|
||||
#include <asm/arch/iomux-vf610.h>
|
||||
#include <asm/arch/ddrmc-vf610.h>
|
||||
|
||||
void ddrmc_setup_iomux(void)
|
||||
{
|
||||
static const iomux_v3_cfg_t ddr_pads[] = {
|
||||
VF610_PAD_DDR_A15__DDR_A_15,
|
||||
VF610_PAD_DDR_A14__DDR_A_14,
|
||||
VF610_PAD_DDR_A13__DDR_A_13,
|
||||
VF610_PAD_DDR_A12__DDR_A_12,
|
||||
VF610_PAD_DDR_A11__DDR_A_11,
|
||||
VF610_PAD_DDR_A10__DDR_A_10,
|
||||
VF610_PAD_DDR_A9__DDR_A_9,
|
||||
VF610_PAD_DDR_A8__DDR_A_8,
|
||||
VF610_PAD_DDR_A7__DDR_A_7,
|
||||
VF610_PAD_DDR_A6__DDR_A_6,
|
||||
VF610_PAD_DDR_A5__DDR_A_5,
|
||||
VF610_PAD_DDR_A4__DDR_A_4,
|
||||
VF610_PAD_DDR_A3__DDR_A_3,
|
||||
VF610_PAD_DDR_A2__DDR_A_2,
|
||||
VF610_PAD_DDR_A1__DDR_A_1,
|
||||
VF610_PAD_DDR_A0__DDR_A_0,
|
||||
VF610_PAD_DDR_BA2__DDR_BA_2,
|
||||
VF610_PAD_DDR_BA1__DDR_BA_1,
|
||||
VF610_PAD_DDR_BA0__DDR_BA_0,
|
||||
VF610_PAD_DDR_CAS__DDR_CAS_B,
|
||||
VF610_PAD_DDR_CKE__DDR_CKE_0,
|
||||
VF610_PAD_DDR_CLK__DDR_CLK_0,
|
||||
VF610_PAD_DDR_CS__DDR_CS_B_0,
|
||||
VF610_PAD_DDR_D15__DDR_D_15,
|
||||
VF610_PAD_DDR_D14__DDR_D_14,
|
||||
VF610_PAD_DDR_D13__DDR_D_13,
|
||||
VF610_PAD_DDR_D12__DDR_D_12,
|
||||
VF610_PAD_DDR_D11__DDR_D_11,
|
||||
VF610_PAD_DDR_D10__DDR_D_10,
|
||||
VF610_PAD_DDR_D9__DDR_D_9,
|
||||
VF610_PAD_DDR_D8__DDR_D_8,
|
||||
VF610_PAD_DDR_D7__DDR_D_7,
|
||||
VF610_PAD_DDR_D6__DDR_D_6,
|
||||
VF610_PAD_DDR_D5__DDR_D_5,
|
||||
VF610_PAD_DDR_D4__DDR_D_4,
|
||||
VF610_PAD_DDR_D3__DDR_D_3,
|
||||
VF610_PAD_DDR_D2__DDR_D_2,
|
||||
VF610_PAD_DDR_D1__DDR_D_1,
|
||||
VF610_PAD_DDR_D0__DDR_D_0,
|
||||
VF610_PAD_DDR_DQM1__DDR_DQM_1,
|
||||
VF610_PAD_DDR_DQM0__DDR_DQM_0,
|
||||
VF610_PAD_DDR_DQS1__DDR_DQS_1,
|
||||
VF610_PAD_DDR_DQS0__DDR_DQS_0,
|
||||
VF610_PAD_DDR_RAS__DDR_RAS_B,
|
||||
VF610_PAD_DDR_WE__DDR_WE_B,
|
||||
VF610_PAD_DDR_ODT1__DDR_ODT_0,
|
||||
VF610_PAD_DDR_ODT0__DDR_ODT_1,
|
||||
VF610_PAD_DDR_RESETB,
|
||||
};
|
||||
|
||||
imx_iomux_v3_setup_multiple_pads(ddr_pads, ARRAY_SIZE(ddr_pads));
|
||||
}
|
||||
|
||||
void ddrmc_phy_init(void)
|
||||
{
|
||||
struct ddrmr_regs *ddrmr = (struct ddrmr_regs *)DDR_BASE_ADDR;
|
||||
|
||||
writel(DDRMC_PHY_DQ_TIMING, &ddrmr->phy[0]);
|
||||
writel(DDRMC_PHY_DQ_TIMING, &ddrmr->phy[16]);
|
||||
writel(DDRMC_PHY_DQ_TIMING, &ddrmr->phy[32]);
|
||||
|
||||
writel(DDRMC_PHY_DQS_TIMING, &ddrmr->phy[1]);
|
||||
writel(DDRMC_PHY_DQS_TIMING, &ddrmr->phy[17]);
|
||||
|
||||
writel(DDRMC_PHY_CTRL, &ddrmr->phy[2]);
|
||||
writel(DDRMC_PHY_CTRL, &ddrmr->phy[18]);
|
||||
writel(DDRMC_PHY_CTRL, &ddrmr->phy[34]);
|
||||
|
||||
writel(DDRMC_PHY_MASTER_CTRL, &ddrmr->phy[3]);
|
||||
writel(DDRMC_PHY_MASTER_CTRL, &ddrmr->phy[19]);
|
||||
writel(DDRMC_PHY_MASTER_CTRL, &ddrmr->phy[35]);
|
||||
|
||||
writel(DDRMC_PHY_SLAVE_CTRL, &ddrmr->phy[4]);
|
||||
writel(DDRMC_PHY_SLAVE_CTRL, &ddrmr->phy[20]);
|
||||
writel(DDRMC_PHY_SLAVE_CTRL, &ddrmr->phy[36]);
|
||||
|
||||
/* LPDDR2 only parameter */
|
||||
writel(DDRMC_PHY_OFF, &ddrmr->phy[49]);
|
||||
|
||||
writel(DDRMC_PHY50_DDR3_MODE |
|
||||
DDRMC_PHY50_EN_SW_HALF_CYCLE, &ddrmr->phy[50]);
|
||||
|
||||
/* Processor Pad ODT settings */
|
||||
writel(DDRMC_PHY_PROC_PAD_ODT, &ddrmr->phy[52]);
|
||||
}
|
||||
|
||||
static void ddrmc_ctrl_lvl_init(struct ddrmc_lvl_info *lvl)
|
||||
{
|
||||
struct ddrmr_regs *ddrmr = (struct ddrmr_regs *)DDR_BASE_ADDR;
|
||||
u32 cr102 = 0, cr105 = 0, cr106 = 0, cr110 = 0;
|
||||
|
||||
if (lvl->wrlvl_reg_en) {
|
||||
writel(DDRMC_CR97_WRLVL_EN, &ddrmr->cr[97]);
|
||||
writel(DDRMC_CR98_WRLVL_DL_0(lvl->wrlvl_dl_0), &ddrmr->cr[98]);
|
||||
writel(DDRMC_CR99_WRLVL_DL_1(lvl->wrlvl_dl_1), &ddrmr->cr[99]);
|
||||
}
|
||||
|
||||
if (lvl->rdlvl_reg_en) {
|
||||
cr102 |= DDRMC_CR102_RDLVL_REG_EN;
|
||||
cr105 |= DDRMC_CR105_RDLVL_DL_0(lvl->rdlvl_dl_0);
|
||||
cr110 |= DDRMC_CR110_RDLVL_DL_1(lvl->rdlvl_dl_1);
|
||||
}
|
||||
|
||||
if (lvl->rdlvl_gt_reg_en) {
|
||||
cr102 |= DDRMC_CR102_RDLVL_GT_REGEN;
|
||||
cr106 |= DDRMC_CR106_RDLVL_GTDL_0(lvl->rdlvl_gt_dl_0);
|
||||
cr110 |= DDRMC_CR110_RDLVL_GTDL_1(lvl->rdlvl_gt_dl_1);
|
||||
}
|
||||
|
||||
writel(cr102, &ddrmr->cr[102]);
|
||||
writel(cr105, &ddrmr->cr[105]);
|
||||
writel(cr106, &ddrmr->cr[106]);
|
||||
writel(cr110, &ddrmr->cr[110]);
|
||||
}
|
||||
|
||||
void ddrmc_ctrl_init_ddr3(struct ddr3_jedec_timings const *timings,
|
||||
struct ddrmc_lvl_info *lvl,
|
||||
int col_diff, int row_diff)
|
||||
{
|
||||
struct ddrmr_regs *ddrmr = (struct ddrmr_regs *)DDR_BASE_ADDR;
|
||||
|
||||
writel(DDRMC_CR00_DRAM_CLASS_DDR3, &ddrmr->cr[0]);
|
||||
writel(DDRMC_CR02_DRAM_TINIT(timings->tinit), &ddrmr->cr[2]);
|
||||
writel(DDRMC_CR10_TRST_PWRON(timings->trst_pwron), &ddrmr->cr[10]);
|
||||
|
||||
writel(DDRMC_CR11_CKE_INACTIVE(timings->cke_inactive), &ddrmr->cr[11]);
|
||||
writel(DDRMC_CR12_WRLAT(timings->wrlat) |
|
||||
DDRMC_CR12_CASLAT_LIN(timings->caslat_lin), &ddrmr->cr[12]);
|
||||
writel(DDRMC_CR13_TRC(timings->trc) | DDRMC_CR13_TRRD(timings->trrd) |
|
||||
DDRMC_CR13_TCCD(timings->tccd), &ddrmr->cr[13]);
|
||||
writel(DDRMC_CR14_TFAW(timings->tfaw) | DDRMC_CR14_TRP(timings->trp) |
|
||||
DDRMC_CR14_TWTR(timings->twtr) |
|
||||
DDRMC_CR14_TRAS_MIN(timings->tras_min), &ddrmr->cr[14]);
|
||||
writel(DDRMC_CR16_TMRD(timings->tmrd) |
|
||||
DDRMC_CR16_TRTP(timings->trtp), &ddrmr->cr[16]);
|
||||
writel(DDRMC_CR17_TRAS_MAX(timings->tras_max) |
|
||||
DDRMC_CR17_TMOD(timings->tmod), &ddrmr->cr[17]);
|
||||
writel(DDRMC_CR18_TCKESR(timings->tckesr) |
|
||||
DDRMC_CR18_TCKE(timings->tcke), &ddrmr->cr[18]);
|
||||
|
||||
writel(DDRMC_CR20_AP_EN, &ddrmr->cr[20]);
|
||||
writel(DDRMC_CR21_TRCD_INT(timings->trcd_int) |
|
||||
DDRMC_CR21_CCMAP_EN, &ddrmr->cr[21]);
|
||||
|
||||
writel(DDRMC_CR22_TDAL(timings->tdal), &ddrmr->cr[22]);
|
||||
writel(DDRMC_CR23_BSTLEN(3) |
|
||||
DDRMC_CR23_TDLL(timings->tdll), &ddrmr->cr[23]);
|
||||
writel(DDRMC_CR24_TRP_AB(timings->trp_ab), &ddrmr->cr[24]);
|
||||
|
||||
writel(DDRMC_CR25_TREF_EN, &ddrmr->cr[25]);
|
||||
writel(DDRMC_CR26_TREF(timings->tref) |
|
||||
DDRMC_CR26_TRFC(timings->trfc), &ddrmr->cr[26]);
|
||||
writel(DDRMC_CR28_TREF_INT(0), &ddrmr->cr[28]);
|
||||
writel(DDRMC_CR29_TPDEX(timings->tpdex), &ddrmr->cr[29]);
|
||||
|
||||
writel(DDRMC_CR30_TXPDLL(timings->txpdll), &ddrmr->cr[30]);
|
||||
writel(DDRMC_CR31_TXSNR(timings->txsnr) |
|
||||
DDRMC_CR31_TXSR(timings->txsr), &ddrmr->cr[31]);
|
||||
writel(DDRMC_CR33_EN_QK_SREF, &ddrmr->cr[33]);
|
||||
writel(DDRMC_CR34_CKSRX(timings->cksrx) |
|
||||
DDRMC_CR34_CKSRE(timings->cksre), &ddrmr->cr[34]);
|
||||
|
||||
writel(DDRMC_CR38_FREQ_CHG_EN(0), &ddrmr->cr[38]);
|
||||
writel(DDRMC_CR39_PHY_INI_COM(1024) | DDRMC_CR39_PHY_INI_STA(16) |
|
||||
DDRMC_CR39_FRQ_CH_DLLOFF(2), &ddrmr->cr[39]);
|
||||
|
||||
writel(DDRMC_CR41_PHY_INI_STRT_INI_DIS, &ddrmr->cr[41]);
|
||||
writel(DDRMC_CR48_MR1_DA_0(70) |
|
||||
DDRMC_CR48_MR0_DA_0(1056), &ddrmr->cr[48]);
|
||||
|
||||
writel(DDRMC_CR66_ZQCL(timings->zqcl) |
|
||||
DDRMC_CR66_ZQINIT(timings->zqinit), &ddrmr->cr[66]);
|
||||
writel(DDRMC_CR67_ZQCS(timings->zqcs), &ddrmr->cr[67]);
|
||||
writel(DDRMC_CR69_ZQ_ON_SREF_EX(2), &ddrmr->cr[69]);
|
||||
|
||||
writel(DDRMC_CR70_REF_PER_ZQ(timings->ref_per_zq), &ddrmr->cr[70]);
|
||||
writel(DDRMC_CR72_ZQCS_ROTATE(0), &ddrmr->cr[72]);
|
||||
|
||||
writel(DDRMC_CR73_APREBIT(timings->aprebit) |
|
||||
DDRMC_CR73_COL_DIFF(col_diff) |
|
||||
DDRMC_CR73_ROW_DIFF(row_diff), &ddrmr->cr[73]);
|
||||
writel(DDRMC_CR74_BANKSPLT_EN | DDRMC_CR74_ADDR_CMP_EN |
|
||||
DDRMC_CR74_CMD_AGE_CNT(64) | DDRMC_CR74_AGE_CNT(64),
|
||||
&ddrmr->cr[74]);
|
||||
writel(DDRMC_CR75_RW_PG_EN | DDRMC_CR75_RW_EN | DDRMC_CR75_PRI_EN |
|
||||
DDRMC_CR75_PLEN, &ddrmr->cr[75]);
|
||||
writel(DDRMC_CR76_NQENT_ACTDIS(3) | DDRMC_CR76_D_RW_G_BKCN(3) |
|
||||
DDRMC_CR76_W2R_SPLT_EN, &ddrmr->cr[76]);
|
||||
writel(DDRMC_CR77_CS_MAP | DDRMC_CR77_DI_RD_INTLEAVE |
|
||||
DDRMC_CR77_SWAP_EN, &ddrmr->cr[77]);
|
||||
writel(DDRMC_CR78_Q_FULLNESS(7) |
|
||||
DDRMC_CR78_BUR_ON_FLY_BIT(12), &ddrmr->cr[78]);
|
||||
writel(DDRMC_CR79_CTLUPD_AREF(0), &ddrmr->cr[79]);
|
||||
|
||||
writel(DDRMC_CR82_INT_MASK, &ddrmr->cr[82]);
|
||||
|
||||
writel(DDRMC_CR87_ODT_WR_MAPCS0, &ddrmr->cr[87]);
|
||||
writel(DDRMC_CR88_TODTL_CMD(4), &ddrmr->cr[88]);
|
||||
writel(DDRMC_CR89_AODT_RWSMCS(2), &ddrmr->cr[89]);
|
||||
|
||||
writel(DDRMC_CR91_R2W_SMCSDL(2), &ddrmr->cr[91]);
|
||||
writel(DDRMC_CR96_WLMRD(timings->wlmrd) |
|
||||
DDRMC_CR96_WLDQSEN(timings->wldqsen), &ddrmr->cr[96]);
|
||||
|
||||
if (lvl != NULL)
|
||||
ddrmc_ctrl_lvl_init(lvl);
|
||||
|
||||
writel(DDRMC_CR117_AXI0_W_PRI(0) |
|
||||
DDRMC_CR117_AXI0_R_PRI(0), &ddrmr->cr[117]);
|
||||
writel(DDRMC_CR118_AXI1_W_PRI(1) |
|
||||
DDRMC_CR118_AXI1_R_PRI(1), &ddrmr->cr[118]);
|
||||
|
||||
writel(DDRMC_CR120_AXI0_PRI1_RPRI(2) |
|
||||
DDRMC_CR120_AXI0_PRI0_RPRI(2), &ddrmr->cr[120]);
|
||||
writel(DDRMC_CR121_AXI0_PRI3_RPRI(2) |
|
||||
DDRMC_CR121_AXI0_PRI2_RPRI(2), &ddrmr->cr[121]);
|
||||
writel(DDRMC_CR122_AXI1_PRI1_RPRI(1) | DDRMC_CR122_AXI1_PRI0_RPRI(1) |
|
||||
DDRMC_CR122_AXI0_PRIRLX(100), &ddrmr->cr[122]);
|
||||
writel(DDRMC_CR123_AXI1_P_ODR_EN | DDRMC_CR123_AXI1_PRI3_RPRI(1) |
|
||||
DDRMC_CR123_AXI1_PRI2_RPRI(1), &ddrmr->cr[123]);
|
||||
writel(DDRMC_CR124_AXI1_PRIRLX(100), &ddrmr->cr[124]);
|
||||
|
||||
writel(DDRMC_CR126_PHY_RDLAT(8), &ddrmr->cr[126]);
|
||||
writel(DDRMC_CR132_WRLAT_ADJ(5) |
|
||||
DDRMC_CR132_RDLAT_ADJ(6), &ddrmr->cr[132]);
|
||||
writel(DDRMC_CR137_PHYCTL_DL(2), &ddrmr->cr[137]);
|
||||
writel(DDRMC_CR138_PHY_WRLV_MXDL(256) |
|
||||
DDRMC_CR138_PHYDRAM_CK_EN(1), &ddrmr->cr[138]);
|
||||
writel(DDRMC_CR139_PHY_WRLV_RESPLAT(4) | DDRMC_CR139_PHY_WRLV_LOAD(7) |
|
||||
DDRMC_CR139_PHY_WRLV_DLL(3) |
|
||||
DDRMC_CR139_PHY_WRLV_EN(3), &ddrmr->cr[139]);
|
||||
writel(DDRMC_CR140_PHY_WRLV_WW(64), &ddrmr->cr[140]);
|
||||
writel(DDRMC_CR143_RDLV_GAT_MXDL(1536) |
|
||||
DDRMC_CR143_RDLV_MXDL(128), &ddrmr->cr[143]);
|
||||
writel(DDRMC_CR144_PHY_RDLVL_RES(4) | DDRMC_CR144_PHY_RDLV_LOAD(7) |
|
||||
DDRMC_CR144_PHY_RDLV_DLL(3) |
|
||||
DDRMC_CR144_PHY_RDLV_EN(3), &ddrmr->cr[144]);
|
||||
writel(DDRMC_CR145_PHY_RDLV_RR(64), &ddrmr->cr[145]);
|
||||
writel(DDRMC_CR146_PHY_RDLVL_RESP(64), &ddrmr->cr[146]);
|
||||
writel(DDRMC_CR147_RDLV_RESP_MASK(983040), &ddrmr->cr[147]);
|
||||
writel(DDRMC_CR148_RDLV_GATE_RESP_MASK(983040), &ddrmr->cr[148]);
|
||||
writel(DDRMC_CR151_RDLV_GAT_DQ_ZERO_CNT(1) |
|
||||
DDRMC_CR151_RDLVL_DQ_ZERO_CNT(1), &ddrmr->cr[151]);
|
||||
|
||||
writel(DDRMC_CR154_PAD_ZQ_EARLY_CMP_EN_TIMER(13) |
|
||||
DDRMC_CR154_PAD_ZQ_MODE(1) |
|
||||
DDRMC_CR154_DDR_SEL_PAD_CONTR(3) |
|
||||
DDRMC_CR154_PAD_ZQ_HW_FOR(1), &ddrmr->cr[154]);
|
||||
writel(DDRMC_CR155_PAD_ODT_BYTE1(2) |
|
||||
DDRMC_CR155_PAD_ODT_BYTE0(2), &ddrmr->cr[155]);
|
||||
writel(DDRMC_CR158_TWR(6), &ddrmr->cr[158]);
|
||||
writel(DDRMC_CR161_ODT_EN(1) | DDRMC_CR161_TODTH_RD(2) |
|
||||
DDRMC_CR161_TODTH_WR(2), &ddrmr->cr[161]);
|
||||
|
||||
ddrmc_phy_init();
|
||||
|
||||
writel(DDRMC_CR00_DRAM_CLASS_DDR3 | DDRMC_CR00_START, &ddrmr->cr[0]);
|
||||
|
||||
while (!(readl(&ddrmr->cr[80]) && 0x100))
|
||||
udelay(10);
|
||||
}
|
@ -137,14 +137,62 @@ struct pad_signals {
|
||||
int mcasp0_fsr;
|
||||
int mcasp0_axr1;
|
||||
int mcasp0_ahclkx;
|
||||
int xdma_event_intr0;
|
||||
int xdma_event_intr1;
|
||||
int cam0_hd;
|
||||
int cam0_vd;
|
||||
int cam0_field;
|
||||
int cam0_wen;
|
||||
int cam0_pclk;
|
||||
int cam0_data8;
|
||||
int cam0_data9;
|
||||
int cam1_data9;
|
||||
int cam1_data8;
|
||||
int cam1_hd;
|
||||
int cam1_vd;
|
||||
int cam1_pclk;
|
||||
int cam1_field;
|
||||
int cam1_wen;
|
||||
int cam1_data0;
|
||||
int cam1_data1;
|
||||
int cam1_data2;
|
||||
int cam1_data3;
|
||||
int cam1_data4;
|
||||
int cam1_data5;
|
||||
int cam1_data6;
|
||||
int cam1_data7;
|
||||
int cam0_data0;
|
||||
int cam0_data1;
|
||||
int cam0_data2;
|
||||
int cam0_data3;
|
||||
int cam0_data4;
|
||||
int cam0_data5;
|
||||
int cam0_data6;
|
||||
int cam0_data7;
|
||||
int uart3_rxd;
|
||||
int uart3_txd;
|
||||
int uart3_ctsn;
|
||||
int uart3_rtsn;
|
||||
int gpio5_8;
|
||||
int gpio5_9;
|
||||
int gpio5_10;
|
||||
int gpio5_11;
|
||||
int gpio5_12;
|
||||
int gpio5_13;
|
||||
int spi4_sclk;
|
||||
int spi4_d0;
|
||||
int spi4_d1;
|
||||
int spi4_cs0;
|
||||
int spi2_sclk;
|
||||
int spi2_d0;
|
||||
int spi2_d1;
|
||||
int spi2_cs0;
|
||||
int xdma_evt_intr0;
|
||||
int xdma_evt_intr1;
|
||||
int clkreq;
|
||||
int nresetin_out;
|
||||
int porz;
|
||||
int nnmi;
|
||||
int osc0_in;
|
||||
int osc0_out;
|
||||
int rsvd1;
|
||||
int nnmi;
|
||||
int rsvd2;
|
||||
int rsvd3;
|
||||
int tms;
|
||||
int tdi;
|
||||
int tdo;
|
||||
@ -154,34 +202,11 @@ struct pad_signals {
|
||||
int emu1;
|
||||
int osc1_in;
|
||||
int osc1_out;
|
||||
int pmic_power_en;
|
||||
int rtc_porz;
|
||||
int rsvd2;
|
||||
int ext_wakeup;
|
||||
int enz_kaldo_1p8v;
|
||||
int usb0_dm;
|
||||
int usb0_dp;
|
||||
int usb0_ce;
|
||||
int usb0_id;
|
||||
int usb0_vbus;
|
||||
int ext_wakeup0;
|
||||
int pmic_power_en0;
|
||||
int usb0_drvvbus;
|
||||
int usb1_dm;
|
||||
int usb1_dp;
|
||||
int usb1_ce;
|
||||
int usb1_id;
|
||||
int usb1_vbus;
|
||||
int usb1_drvvbus;
|
||||
int ddr_resetn;
|
||||
int ddr_csn0;
|
||||
int ddr_cke;
|
||||
int ddr_ck;
|
||||
int ddr_nck;
|
||||
int ddr_casn;
|
||||
int ddr_rasn;
|
||||
int ddr_wen;
|
||||
int ddr_ba0;
|
||||
int ddr_ba1;
|
||||
int ddr_ba2;
|
||||
};
|
||||
|
||||
#endif /* _MUX_AM43XX_H_ */
|
||||
|
@ -1,17 +0,0 @@
|
||||
#ifndef __ARM7_HW_H
|
||||
#define __ARM7_HW_H
|
||||
|
||||
/*
|
||||
* Copyright (c) 2004 Cucy Systems (http://www.cucy.com)
|
||||
* Curt Brune <curt@cucy.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#if defined(CONFIG_INTEGRATOR) && defined(CONFIG_ARCH_INTEGRATOR)
|
||||
/* include IntegratorCP/CM720T specific hardware file if there was one */
|
||||
#else
|
||||
#error No hardware file defined for this configuration
|
||||
#endif
|
||||
|
||||
#endif /* __ARM7_HW_H */
|
@ -8,6 +8,14 @@
|
||||
#define _ASM_ARMV8_FSL_LSCH3_CONFIG_
|
||||
|
||||
#include <fsl_ddrc_version.h>
|
||||
|
||||
#define CONFIG_SYS_PAGE_SIZE 0x10000
|
||||
|
||||
#ifndef L1_CACHE_BYTES
|
||||
#define L1_CACHE_SHIFT 6
|
||||
#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT)
|
||||
#endif
|
||||
|
||||
#define CONFIG_MP
|
||||
#define CONFIG_SYS_FSL_OCRAM_BASE 0x18000000 /* initial RAM */
|
||||
/* Link Definitions */
|
||||
@ -23,6 +31,7 @@
|
||||
#define CONFIG_SYS_FSL_CH3_CLK_GRPA_ADDR (CONFIG_SYS_IMMR + 0x00300000)
|
||||
#define CONFIG_SYS_FSL_CH3_CLK_GRPB_ADDR (CONFIG_SYS_IMMR + 0x00310000)
|
||||
#define CONFIG_SYS_FSL_CH3_CLK_CTRL_ADDR (CONFIG_SYS_IMMR + 0x00370000)
|
||||
#define CONFIG_SYS_FSL_ESDHC_ADDR (CONFIG_SYS_IMMR + 0x01140000)
|
||||
#define CONFIG_SYS_IFC_ADDR (CONFIG_SYS_IMMR + 0x01240000)
|
||||
#define CONFIG_SYS_NS16550_COM1 (CONFIG_SYS_IMMR + 0x011C0500)
|
||||
#define CONFIG_SYS_NS16550_COM2 (CONFIG_SYS_IMMR + 0x011C0600)
|
||||
@ -30,6 +39,20 @@
|
||||
#define CONFIG_SYS_FSL_PMU_CLTBENR (CONFIG_SYS_FSL_PMU_ADDR + \
|
||||
0x18A0)
|
||||
|
||||
#define CONFIG_SYS_FSL_WRIOP1_ADDR (CONFIG_SYS_IMMR + 0x7B80000)
|
||||
#define CONFIG_SYS_FSL_WRIOP1_MDIO1 (CONFIG_SYS_FSL_WRIOP1_ADDR + 0x16000)
|
||||
#define CONFIG_SYS_FSL_WRIOP1_MDIO2 (CONFIG_SYS_FSL_WRIOP1_ADDR + 0x17000)
|
||||
#define CONFIG_SYS_FSL_LSCH3_SERDES_ADDR (CONFIG_SYS_IMMR + 0xEA0000)
|
||||
|
||||
/* SP (Cortex-A5) related */
|
||||
#define CONFIG_SYS_FSL_SP_ADDR (CONFIG_SYS_IMMR + 0x00F00000)
|
||||
#define CONFIG_SYS_FSL_SP_VSG_GIC_ADDR (CONFIG_SYS_FSL_SP_ADDR)
|
||||
#define CONFIG_SYS_FSL_SP_VSG_GIC_VIGR1 (CONFIG_SYS_FSL_SP_ADDR)
|
||||
#define CONFIG_SYS_FSL_SP_VSG_GIC_VIGR2 \
|
||||
(CONFIG_SYS_FSL_SP_ADDR + 0x0008)
|
||||
#define CONFIG_SYS_FSL_SP_LOOPBACK_DUART \
|
||||
(CONFIG_SYS_FSL_SP_ADDR + 0x1000)
|
||||
|
||||
#define CONFIG_SYS_FSL_DCSR_DDR_ADDR 0x70012c000ULL
|
||||
#define CONFIG_SYS_FSL_DCSR_DDR2_ADDR 0x70012d000ULL
|
||||
#define CONFIG_SYS_FSL_DCSR_DDR3_ADDR 0x700132000ULL
|
||||
@ -88,22 +111,57 @@
|
||||
#define CONFIG_MAX_MEM_MAPPED CONFIG_SYS_LS2_DDR_BLOCK1_SIZE
|
||||
#define CONFIG_SYS_FSL_DDR_VER FSL_DDR_VER_5_0
|
||||
|
||||
|
||||
#define CONFIG_SYS_FSL_ESDHC_LE
|
||||
/* IFC */
|
||||
#define CONFIG_SYS_FSL_IFC_LE
|
||||
#define CONFIG_SYS_MEMAC_LITTLE_ENDIAN
|
||||
|
||||
/* PCIe */
|
||||
#define CONFIG_SYS_PCIE1_ADDR (CONFIG_SYS_IMMR + 0x2400000)
|
||||
#define CONFIG_SYS_PCIE2_ADDR (CONFIG_SYS_IMMR + 0x2500000)
|
||||
#define CONFIG_SYS_PCIE3_ADDR (CONFIG_SYS_IMMR + 0x2600000)
|
||||
#define CONFIG_SYS_PCIE4_ADDR (CONFIG_SYS_IMMR + 0x2700000)
|
||||
#define CONFIG_SYS_PCIE1_PHYS_ADDR 0x1000000000ULL
|
||||
#define CONFIG_SYS_PCIE2_PHYS_ADDR 0x1200000000ULL
|
||||
#define CONFIG_SYS_PCIE3_PHYS_ADDR 0x1400000000ULL
|
||||
#define CONFIG_SYS_PCIE4_PHYS_ADDR 0x1600000000ULL
|
||||
|
||||
/* Cache Coherent Interconnect */
|
||||
#define CCI_MN_BASE 0x04000000
|
||||
#define CCI_MN_RNF_NODEID_LIST 0x180
|
||||
#define CCI_MN_DVM_DOMAIN_CTL 0x200
|
||||
#define CCI_MN_DVM_DOMAIN_CTL_SET 0x210
|
||||
|
||||
/* Device Configuration */
|
||||
#define DCFG_BASE 0x01e00000
|
||||
#define DCFG_PORSR1 0x000
|
||||
#define DCFG_PORSR1_RCW_SRC 0xff800000
|
||||
#define DCFG_PORSR1_RCW_SRC_NOR 0x12f00000
|
||||
|
||||
#define DCFG_DCSR_BASE 0X700100000ULL
|
||||
#define DCFG_DCSR_PORCR1 0x000
|
||||
|
||||
/* Supplemental Configuration */
|
||||
#define SCFG_BASE 0x01fc0000
|
||||
#define SCFG_USB3PRM1CR 0x000
|
||||
|
||||
#ifdef CONFIG_LS2085A
|
||||
#define CONFIG_MAX_CPUS 16
|
||||
#define CONFIG_SYS_FSL_IFC_BANK_COUNT 8
|
||||
#define CONFIG_NUM_DDR_CONTROLLERS 3
|
||||
#define CONFIG_SYS_FSL_CLUSTER_CLOCKS { 1, 1, 4, 4 }
|
||||
#define CONFIG_SYS_FSL_SRDS_1
|
||||
#define CONFIG_SYS_FSL_SRDS_2
|
||||
#else
|
||||
#error SoC not defined
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_LS2085A
|
||||
#define CONFIG_SYS_FSL_ERRATUM_A008336
|
||||
#define CONFIG_SYS_FSL_ERRATUM_A008511
|
||||
#define CONFIG_SYS_FSL_ERRATUM_A008514
|
||||
#define CONFIG_SYS_FSL_ERRATUM_A008585
|
||||
#define CONFIG_SYS_FSL_ERRATUM_A008751
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_ARMV8_FSL_LSCH3_CONFIG_ */
|
||||
|
67
arch/arm/include/asm/arch-fsl-lsch3/fsl_serdes.h
Normal file
67
arch/arm/include/asm/arch-fsl-lsch3/fsl_serdes.h
Normal file
@ -0,0 +1,67 @@
|
||||
/*
|
||||
* Copyright 2015 Freescale Semiconductor, Inc.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#ifndef __FSL_SERDES_H
|
||||
#define __FSL_SERDES_H
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#define SRDS_MAX_LANES 8
|
||||
|
||||
enum srds_prtcl {
|
||||
NONE = 0,
|
||||
PCIE1,
|
||||
PCIE2,
|
||||
PCIE3,
|
||||
PCIE4,
|
||||
SATA1,
|
||||
SATA2,
|
||||
XAUI1,
|
||||
XAUI2,
|
||||
XFI1,
|
||||
XFI2,
|
||||
XFI3,
|
||||
XFI4,
|
||||
XFI5,
|
||||
XFI6,
|
||||
XFI7,
|
||||
XFI8,
|
||||
SGMII1,
|
||||
SGMII2,
|
||||
SGMII3,
|
||||
SGMII4,
|
||||
SGMII5,
|
||||
SGMII6,
|
||||
SGMII7,
|
||||
SGMII8,
|
||||
SGMII9,
|
||||
SGMII10,
|
||||
SGMII11,
|
||||
SGMII12,
|
||||
SGMII13,
|
||||
SGMII14,
|
||||
SGMII15,
|
||||
SGMII16,
|
||||
QSGMII_A, /* A indicates MACs 1-4 */
|
||||
QSGMII_B, /* B indicates MACs 5-8 */
|
||||
QSGMII_C, /* C indicates MACs 9-12 */
|
||||
QSGMII_D, /* D indicates MACs 12-16 */
|
||||
SERDES_PRCTL_COUNT
|
||||
};
|
||||
|
||||
enum srds {
|
||||
FSL_SRDS_1 = 0,
|
||||
FSL_SRDS_2 = 1,
|
||||
};
|
||||
|
||||
int is_serdes_configured(enum srds_prtcl device);
|
||||
void fsl_serdes_init(void);
|
||||
|
||||
int serdes_get_first_lane(u32 sd, enum srds_prtcl device);
|
||||
enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane);
|
||||
int is_serdes_prtcl_valid(int serdes, u32 prtcl);
|
||||
|
||||
#endif /* __FSL_SERDES_H */
|
@ -47,6 +47,30 @@ struct ccsr_gur {
|
||||
u32 devdisr5; /* Device disable control 5 */
|
||||
u32 devdisr6; /* Device disable control 6 */
|
||||
u32 devdisr7; /* Device disable control 7 */
|
||||
#define FSL_CHASSIS3_DEVDISR2_DPMAC1 0x00000001
|
||||
#define FSL_CHASSIS3_DEVDISR2_DPMAC2 0x00000002
|
||||
#define FSL_CHASSIS3_DEVDISR2_DPMAC3 0x00000004
|
||||
#define FSL_CHASSIS3_DEVDISR2_DPMAC4 0x00000008
|
||||
#define FSL_CHASSIS3_DEVDISR2_DPMAC5 0x00000010
|
||||
#define FSL_CHASSIS3_DEVDISR2_DPMAC6 0x00000020
|
||||
#define FSL_CHASSIS3_DEVDISR2_DPMAC7 0x00000040
|
||||
#define FSL_CHASSIS3_DEVDISR2_DPMAC8 0x00000080
|
||||
#define FSL_CHASSIS3_DEVDISR2_DPMAC9 0x00000100
|
||||
#define FSL_CHASSIS3_DEVDISR2_DPMAC10 0x00000200
|
||||
#define FSL_CHASSIS3_DEVDISR2_DPMAC11 0x00000400
|
||||
#define FSL_CHASSIS3_DEVDISR2_DPMAC12 0x00000800
|
||||
#define FSL_CHASSIS3_DEVDISR2_DPMAC13 0x00001000
|
||||
#define FSL_CHASSIS3_DEVDISR2_DPMAC14 0x00002000
|
||||
#define FSL_CHASSIS3_DEVDISR2_DPMAC15 0x00004000
|
||||
#define FSL_CHASSIS3_DEVDISR2_DPMAC16 0x00008000
|
||||
#define FSL_CHASSIS3_DEVDISR2_DPMAC17 0x00010000
|
||||
#define FSL_CHASSIS3_DEVDISR2_DPMAC18 0x00020000
|
||||
#define FSL_CHASSIS3_DEVDISR2_DPMAC19 0x00040000
|
||||
#define FSL_CHASSIS3_DEVDISR2_DPMAC20 0x00080000
|
||||
#define FSL_CHASSIS3_DEVDISR2_DPMAC21 0x00100000
|
||||
#define FSL_CHASSIS3_DEVDISR2_DPMAC22 0x00200000
|
||||
#define FSL_CHASSIS3_DEVDISR2_DPMAC23 0x00400000
|
||||
#define FSL_CHASSIS3_DEVDISR2_DPMAC24 0x00800000
|
||||
u8 res_08c[0x90-0x8c];
|
||||
u32 coredisru; /* uppper portion for support of 64 cores */
|
||||
u32 coredisrl; /* lower portion for support of 64 cores */
|
||||
@ -63,6 +87,11 @@ struct ccsr_gur {
|
||||
#define FSL_CHASSIS3_RCWSR0_MEM_PLL_RAT_MASK 0x3f
|
||||
#define FSL_CHASSIS3_RCWSR0_MEM2_PLL_RAT_SHIFT 18
|
||||
#define FSL_CHASSIS3_RCWSR0_MEM2_PLL_RAT_MASK 0x3f
|
||||
#define FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_MASK 0x00FF0000
|
||||
#define FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_SHIFT 16
|
||||
#define FSL_CHASSIS3_RCWSR28_SRDS2_PRTCL_MASK 0xFF000000
|
||||
#define FSL_CHASSIS3_RCWSR28_SRDS2_PRTCL_SHIFT 24
|
||||
|
||||
u8 res_180[0x200-0x180];
|
||||
u32 scratchrw[32]; /* Scratch Read/Write */
|
||||
u8 res_280[0x300-0x280];
|
||||
|
8
arch/arm/include/asm/arch-fsl-lsch3/soc.h
Normal file
8
arch/arm/include/asm/arch-fsl-lsch3/soc.h
Normal file
@ -0,0 +1,8 @@
|
||||
/*
|
||||
* Copyright 2015 Freescale Semiconductor
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
void fsl_lsch3_early_init_f(void);
|
||||
|
@ -119,10 +119,6 @@
|
||||
|
||||
#define DCU_LAYER_MAX_NUM 16
|
||||
|
||||
#define QE_MURAM_SIZE 0x6000UL
|
||||
#define MAX_QE_RISC 1
|
||||
#define QE_NUM_OF_SNUM 28
|
||||
|
||||
#define CONFIG_SYS_FSL_SRDS_1
|
||||
|
||||
#ifdef CONFIG_LS102XA
|
||||
|
@ -17,6 +17,9 @@
|
||||
#define SOC_VER_LS1021 0x11
|
||||
#define SOC_VER_LS1022 0x12
|
||||
|
||||
#define SOC_MAJOR_VER_1_0 0x1
|
||||
#define SOC_MAJOR_VER_2_0 0x2
|
||||
|
||||
#define CCSR_BRR_OFFSET 0xe4
|
||||
#define CCSR_SCRATCHRW1_OFFSET 0x200
|
||||
|
||||
|
@ -250,6 +250,7 @@ struct mx6_ddr_sysinfo {
|
||||
u8 mif3_mode; /* Command prediction working mode */
|
||||
u8 rst_to_cke; /* Time from SDE enable to CKE rise */
|
||||
u8 sde_to_rst; /* Time from SDE enable until DDR reset# is high */
|
||||
u8 pd_fast_exit;/* enable precharge powerdown fast-exit */
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -15,6 +15,9 @@ void socfpga_bridges_reset(int enable);
|
||||
void socfpga_emac_reset(int enable);
|
||||
void socfpga_watchdog_reset(void);
|
||||
void socfpga_spim_enable(void);
|
||||
void socfpga_uart0_enable(void);
|
||||
void socfpga_sdram_enable(void);
|
||||
void socfpga_osc1timer_enable(void);
|
||||
|
||||
struct socfpga_reset_manager {
|
||||
u32 status;
|
||||
@ -36,7 +39,10 @@ struct socfpga_reset_manager {
|
||||
#define RSTMGR_PERMODRST_EMAC0_LSB 0
|
||||
#define RSTMGR_PERMODRST_EMAC1_LSB 1
|
||||
#define RSTMGR_PERMODRST_L4WD0_LSB 6
|
||||
#define RSTMGR_PERMODRST_OSC1TIMER0_LSB 8
|
||||
#define RSTMGR_PERMODRST_UART0_LSB 16
|
||||
#define RSTMGR_PERMODRST_SPIM0_LSB 18
|
||||
#define RSTMGR_PERMODRST_SPIM1_LSB 19
|
||||
#define RSTMGR_PERMODRST_SDR_LSB 29
|
||||
|
||||
#endif /* _RESET_MANAGER_H_ */
|
||||
|
19
arch/arm/include/asm/arch-socfpga/sdram.h
Normal file
19
arch/arm/include/asm/arch-socfpga/sdram.h
Normal file
@ -0,0 +1,19 @@
|
||||
/*
|
||||
* Copyright (C) 2015 Marek Vasut <marex@denx.de>
|
||||
*
|
||||
* FIXME: This file contains temporary stub functions and is here
|
||||
* only until these functions are properly merged into
|
||||
* mainline.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#ifndef __ARCH_SDRAM_H__
|
||||
#define __ARCH_SDRAM_H__
|
||||
|
||||
/* function declaration */
|
||||
inline unsigned long sdram_calculate_size(void) { return 0; }
|
||||
inline unsigned sdram_mmr_init_full(unsigned int sdr_phy_reg) { return 0; }
|
||||
inline int sdram_calibration_full(void) { return 0; }
|
||||
|
||||
#endif /* __ARCH_SDRAM_H__ */
|
@ -10,6 +10,7 @@
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
void sysmgr_pinmux_init(void);
|
||||
void sysmgr_enable_warmrstcfgio(void);
|
||||
|
||||
/* declaration for handoff table type */
|
||||
extern unsigned long sys_mgr_init_table[CONFIG_HPS_PINMUX_NUM];
|
||||
|
75
arch/arm/include/asm/arch-stm32f4/fmc.h
Normal file
75
arch/arm/include/asm/arch-stm32f4/fmc.h
Normal file
@ -0,0 +1,75 @@
|
||||
/*
|
||||
* (C) Copyright 2013
|
||||
* Pavel Boldin, Emcraft Systems, paboldin@emcraft.com
|
||||
*
|
||||
* (C) Copyright 2015
|
||||
* Kamil Lulko, <rev13@wp.pl>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#ifndef _MACH_FMC_H_
|
||||
#define _MACH_FMC_H_
|
||||
|
||||
struct stm32_fmc_regs {
|
||||
u32 sdcr1; /* Control register 1 */
|
||||
u32 sdcr2; /* Control register 2 */
|
||||
u32 sdtr1; /* Timing register 1 */
|
||||
u32 sdtr2; /* Timing register 2 */
|
||||
u32 sdcmr; /* Mode register */
|
||||
u32 sdrtr; /* Refresh timing register */
|
||||
u32 sdsr; /* Status register */
|
||||
};
|
||||
|
||||
/*
|
||||
* FMC registers base
|
||||
*/
|
||||
#define STM32_SDRAM_FMC_BASE 0xA0000140
|
||||
#define STM32_SDRAM_FMC ((struct stm32_fmc_regs *)STM32_SDRAM_FMC_BASE)
|
||||
|
||||
/* Control register SDCR */
|
||||
#define FMC_SDCR_RPIPE_SHIFT 13 /* RPIPE bit shift */
|
||||
#define FMC_SDCR_RBURST_SHIFT 12 /* RBURST bit shift */
|
||||
#define FMC_SDCR_SDCLK_SHIFT 10 /* SDRAM clock divisor shift */
|
||||
#define FMC_SDCR_WP_SHIFT 9 /* Write protection shift */
|
||||
#define FMC_SDCR_CAS_SHIFT 7 /* CAS latency shift */
|
||||
#define FMC_SDCR_NB_SHIFT 6 /* Number of banks shift */
|
||||
#define FMC_SDCR_MWID_SHIFT 4 /* Memory width shift */
|
||||
#define FMC_SDCR_NR_SHIFT 2 /* Number of row address bits shift */
|
||||
#define FMC_SDCR_NC_SHIFT 0 /* Number of col address bits shift */
|
||||
|
||||
/* Timings register SDTR */
|
||||
#define FMC_SDTR_TMRD_SHIFT 0 /* Load mode register to active */
|
||||
#define FMC_SDTR_TXSR_SHIFT 4 /* Exit self-refresh time */
|
||||
#define FMC_SDTR_TRAS_SHIFT 8 /* Self-refresh time */
|
||||
#define FMC_SDTR_TRC_SHIFT 12 /* Row cycle delay */
|
||||
#define FMC_SDTR_TWR_SHIFT 16 /* Recovery delay */
|
||||
#define FMC_SDTR_TRP_SHIFT 20 /* Row precharge delay */
|
||||
#define FMC_SDTR_TRCD_SHIFT 24 /* Row-to-column delay */
|
||||
|
||||
|
||||
#define FMC_SDCMR_NRFS_SHIFT 5
|
||||
|
||||
#define FMC_SDCMR_MODE_NORMAL 0
|
||||
#define FMC_SDCMR_MODE_START_CLOCK 1
|
||||
#define FMC_SDCMR_MODE_PRECHARGE 2
|
||||
#define FMC_SDCMR_MODE_AUTOREFRESH 3
|
||||
#define FMC_SDCMR_MODE_WRITE_MODE 4
|
||||
#define FMC_SDCMR_MODE_SELFREFRESH 5
|
||||
#define FMC_SDCMR_MODE_POWERDOWN 6
|
||||
|
||||
#define FMC_SDCMR_BANK_1 (1 << 4)
|
||||
#define FMC_SDCMR_BANK_2 (1 << 3)
|
||||
|
||||
#define FMC_SDCMR_MODE_REGISTER_SHIFT 9
|
||||
|
||||
#define FMC_SDSR_BUSY (1 << 5)
|
||||
|
||||
#define FMC_BUSY_WAIT() do { \
|
||||
__asm__ __volatile__ ("dsb" : : : "memory"); \
|
||||
while (STM32_SDRAM_FMC->sdsr & FMC_SDSR_BUSY) \
|
||||
; \
|
||||
} while (0)
|
||||
|
||||
|
||||
#endif /* _MACH_FMC_H_ */
|
116
arch/arm/include/asm/arch-stm32f4/gpio.h
Normal file
116
arch/arm/include/asm/arch-stm32f4/gpio.h
Normal file
@ -0,0 +1,116 @@
|
||||
/*
|
||||
* (C) Copyright 2011
|
||||
* Yuri Tikhonov, Emcraft Systems, yur@emcraft.com
|
||||
*
|
||||
* (C) Copyright 2015
|
||||
* Kamil Lulko, <rev13@wp.pl>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#ifndef _STM32_GPIO_H_
|
||||
#define _STM32_GPIO_H_
|
||||
|
||||
enum stm32_gpio_port {
|
||||
STM32_GPIO_PORT_A = 0,
|
||||
STM32_GPIO_PORT_B,
|
||||
STM32_GPIO_PORT_C,
|
||||
STM32_GPIO_PORT_D,
|
||||
STM32_GPIO_PORT_E,
|
||||
STM32_GPIO_PORT_F,
|
||||
STM32_GPIO_PORT_G,
|
||||
STM32_GPIO_PORT_H,
|
||||
STM32_GPIO_PORT_I
|
||||
};
|
||||
|
||||
enum stm32_gpio_pin {
|
||||
STM32_GPIO_PIN_0 = 0,
|
||||
STM32_GPIO_PIN_1,
|
||||
STM32_GPIO_PIN_2,
|
||||
STM32_GPIO_PIN_3,
|
||||
STM32_GPIO_PIN_4,
|
||||
STM32_GPIO_PIN_5,
|
||||
STM32_GPIO_PIN_6,
|
||||
STM32_GPIO_PIN_7,
|
||||
STM32_GPIO_PIN_8,
|
||||
STM32_GPIO_PIN_9,
|
||||
STM32_GPIO_PIN_10,
|
||||
STM32_GPIO_PIN_11,
|
||||
STM32_GPIO_PIN_12,
|
||||
STM32_GPIO_PIN_13,
|
||||
STM32_GPIO_PIN_14,
|
||||
STM32_GPIO_PIN_15
|
||||
};
|
||||
|
||||
enum stm32_gpio_mode {
|
||||
STM32_GPIO_MODE_IN = 0,
|
||||
STM32_GPIO_MODE_OUT,
|
||||
STM32_GPIO_MODE_AF,
|
||||
STM32_GPIO_MODE_AN
|
||||
};
|
||||
|
||||
enum stm32_gpio_otype {
|
||||
STM32_GPIO_OTYPE_PP = 0,
|
||||
STM32_GPIO_OTYPE_OD
|
||||
};
|
||||
|
||||
enum stm32_gpio_speed {
|
||||
STM32_GPIO_SPEED_2M = 0,
|
||||
STM32_GPIO_SPEED_25M,
|
||||
STM32_GPIO_SPEED_50M,
|
||||
STM32_GPIO_SPEED_100M
|
||||
};
|
||||
|
||||
enum stm32_gpio_pupd {
|
||||
STM32_GPIO_PUPD_NO = 0,
|
||||
STM32_GPIO_PUPD_UP,
|
||||
STM32_GPIO_PUPD_DOWN
|
||||
};
|
||||
|
||||
enum stm32_gpio_af {
|
||||
STM32_GPIO_AF0 = 0,
|
||||
STM32_GPIO_AF1,
|
||||
STM32_GPIO_AF2,
|
||||
STM32_GPIO_AF3,
|
||||
STM32_GPIO_AF4,
|
||||
STM32_GPIO_AF5,
|
||||
STM32_GPIO_AF6,
|
||||
STM32_GPIO_AF7,
|
||||
STM32_GPIO_AF8,
|
||||
STM32_GPIO_AF9,
|
||||
STM32_GPIO_AF10,
|
||||
STM32_GPIO_AF11,
|
||||
STM32_GPIO_AF12,
|
||||
STM32_GPIO_AF13,
|
||||
STM32_GPIO_AF14,
|
||||
STM32_GPIO_AF15
|
||||
};
|
||||
|
||||
struct stm32_gpio_dsc {
|
||||
enum stm32_gpio_port port;
|
||||
enum stm32_gpio_pin pin;
|
||||
};
|
||||
|
||||
struct stm32_gpio_ctl {
|
||||
enum stm32_gpio_mode mode;
|
||||
enum stm32_gpio_otype otype;
|
||||
enum stm32_gpio_speed speed;
|
||||
enum stm32_gpio_pupd pupd;
|
||||
enum stm32_gpio_af af;
|
||||
};
|
||||
|
||||
static inline unsigned stm32_gpio_to_port(unsigned gpio)
|
||||
{
|
||||
return gpio / 16;
|
||||
}
|
||||
|
||||
static inline unsigned stm32_gpio_to_pin(unsigned gpio)
|
||||
{
|
||||
return gpio % 16;
|
||||
}
|
||||
|
||||
int stm32_gpio_config(const struct stm32_gpio_dsc *gpio_dsc,
|
||||
const struct stm32_gpio_ctl *gpio_ctl);
|
||||
int stm32_gpout_set(const struct stm32_gpio_dsc *gpio_dsc, int state);
|
||||
|
||||
#endif /* _STM32_GPIO_H_ */
|
108
arch/arm/include/asm/arch-stm32f4/stm32.h
Normal file
108
arch/arm/include/asm/arch-stm32f4/stm32.h
Normal file
@ -0,0 +1,108 @@
|
||||
/*
|
||||
* (C) Copyright 2011
|
||||
* Yuri Tikhonov, Emcraft Systems, yur@emcraft.com
|
||||
*
|
||||
* (C) Copyright 2015
|
||||
* Kamil Lulko, <rev13@wp.pl>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#ifndef _MACH_STM32_H_
|
||||
#define _MACH_STM32_H_
|
||||
|
||||
/*
|
||||
* Peripheral memory map
|
||||
*/
|
||||
#define STM32_PERIPH_BASE 0x40000000
|
||||
#define STM32_APB1PERIPH_BASE (STM32_PERIPH_BASE + 0x00000000)
|
||||
#define STM32_APB2PERIPH_BASE (STM32_PERIPH_BASE + 0x00010000)
|
||||
#define STM32_AHB1PERIPH_BASE (STM32_PERIPH_BASE + 0x00020000)
|
||||
#define STM32_AHB2PERIPH_BASE (STM32_PERIPH_BASE + 0x10000000)
|
||||
|
||||
#define STM32_BUS_MASK 0xFFFF0000
|
||||
|
||||
/*
|
||||
* Register maps
|
||||
*/
|
||||
struct stm32_rcc_regs {
|
||||
u32 cr; /* RCC clock control */
|
||||
u32 pllcfgr; /* RCC PLL configuration */
|
||||
u32 cfgr; /* RCC clock configuration */
|
||||
u32 cir; /* RCC clock interrupt */
|
||||
u32 ahb1rstr; /* RCC AHB1 peripheral reset */
|
||||
u32 ahb2rstr; /* RCC AHB2 peripheral reset */
|
||||
u32 ahb3rstr; /* RCC AHB3 peripheral reset */
|
||||
u32 rsv0;
|
||||
u32 apb1rstr; /* RCC APB1 peripheral reset */
|
||||
u32 apb2rstr; /* RCC APB2 peripheral reset */
|
||||
u32 rsv1[2];
|
||||
u32 ahb1enr; /* RCC AHB1 peripheral clock enable */
|
||||
u32 ahb2enr; /* RCC AHB2 peripheral clock enable */
|
||||
u32 ahb3enr; /* RCC AHB3 peripheral clock enable */
|
||||
u32 rsv2;
|
||||
u32 apb1enr; /* RCC APB1 peripheral clock enable */
|
||||
u32 apb2enr; /* RCC APB2 peripheral clock enable */
|
||||
u32 rsv3[2];
|
||||
u32 ahb1lpenr; /* RCC AHB1 periph clk enable in low pwr mode */
|
||||
u32 ahb2lpenr; /* RCC AHB2 periph clk enable in low pwr mode */
|
||||
u32 ahb3lpenr; /* RCC AHB3 periph clk enable in low pwr mode */
|
||||
u32 rsv4;
|
||||
u32 apb1lpenr; /* RCC APB1 periph clk enable in low pwr mode */
|
||||
u32 apb2lpenr; /* RCC APB2 periph clk enable in low pwr mode */
|
||||
u32 rsv5[2];
|
||||
u32 bdcr; /* RCC Backup domain control */
|
||||
u32 csr; /* RCC clock control & status */
|
||||
u32 rsv6[2];
|
||||
u32 sscgr; /* RCC spread spectrum clock generation */
|
||||
u32 plli2scfgr; /* RCC PLLI2S configuration */
|
||||
u32 pllsaicfgr;
|
||||
u32 dckcfgr;
|
||||
};
|
||||
|
||||
struct stm32_pwr_regs {
|
||||
u32 cr;
|
||||
u32 csr;
|
||||
};
|
||||
|
||||
struct stm32_flash_regs {
|
||||
u32 acr;
|
||||
u32 key;
|
||||
u32 optkeyr;
|
||||
u32 sr;
|
||||
u32 cr;
|
||||
u32 optcr;
|
||||
u32 optcr1;
|
||||
};
|
||||
|
||||
/*
|
||||
* Registers access macros
|
||||
*/
|
||||
#define STM32_RCC_BASE (STM32_AHB1PERIPH_BASE + 0x3800)
|
||||
#define STM32_RCC ((struct stm32_rcc_regs *)STM32_RCC_BASE)
|
||||
|
||||
#define STM32_PWR_BASE (STM32_APB1PERIPH_BASE + 0x7000)
|
||||
#define STM32_PWR ((struct stm32_pwr_regs *)STM32_PWR_BASE)
|
||||
|
||||
#define STM32_FLASH_BASE (STM32_AHB1PERIPH_BASE + 0x3C00)
|
||||
#define STM32_FLASH ((struct stm32_flash_regs *)STM32_FLASH_BASE)
|
||||
|
||||
#define STM32_FLASH_SR_BSY (1 << 16)
|
||||
|
||||
#define STM32_FLASH_CR_PG (1 << 0)
|
||||
#define STM32_FLASH_CR_SER (1 << 1)
|
||||
#define STM32_FLASH_CR_STRT (1 << 16)
|
||||
#define STM32_FLASH_CR_LOCK (1 << 31)
|
||||
#define STM32_FLASH_CR_SNB_OFFSET 3
|
||||
|
||||
enum clock {
|
||||
CLOCK_CORE,
|
||||
CLOCK_AHB,
|
||||
CLOCK_APB1,
|
||||
CLOCK_APB2
|
||||
};
|
||||
|
||||
int configure_clocks(void);
|
||||
unsigned long clock_get(enum clock clck);
|
||||
|
||||
#endif /* _MACH_STM32_H_ */
|
@ -94,6 +94,13 @@
|
||||
#define SUNXI_TWI0_BASE 0x01c2ac00
|
||||
#define SUNXI_TWI1_BASE 0x01c2b000
|
||||
#define SUNXI_TWI2_BASE 0x01c2b400
|
||||
#ifdef CONFIG_MACH_SUN6I
|
||||
#define SUNXI_TWI3_BASE 0x01c0b800
|
||||
#endif
|
||||
#ifdef CONFIG_MACH_SUN7I
|
||||
#define SUNXI_TWI3_BASE 0x01c2b800
|
||||
#define SUNXI_TWI4_BASE 0x01c2c000
|
||||
#endif
|
||||
|
||||
#define SUNXI_CAN_BASE 0x01c2bc00
|
||||
|
||||
|
@ -84,7 +84,7 @@ struct sunxi_gpio_reg {
|
||||
#define GPIO_CFG_INDEX(pin) (((pin) & 0x1f) >> 3)
|
||||
#define GPIO_CFG_OFFSET(pin) ((((pin) & 0x1f) & 0x7) << 2)
|
||||
|
||||
#define GPIO_DRV_INDEX(pin) (((pin) & 0x1f) >> 4)
|
||||
#define GPIO_DRV_INDEX(pin) (((pin) & 0x1f) >> 4)
|
||||
#define GPIO_DRV_OFFSET(pin) ((((pin) & 0x1f) & 0xf) << 1)
|
||||
|
||||
#define GPIO_PULL_INDEX(pin) (((pin) & 0x1f) >> 4)
|
||||
@ -142,71 +142,77 @@ enum sunxi_gpio_number {
|
||||
#define SUNXI_GPIO_INPUT 0
|
||||
#define SUNXI_GPIO_OUTPUT 1
|
||||
|
||||
#define SUNXI_GPA0_EMAC 2
|
||||
#define SUN6I_GPA0_GMAC 2
|
||||
#define SUN7I_GPA0_GMAC 5
|
||||
#define SUNXI_GPA_EMAC 2
|
||||
#define SUN6I_GPA_GMAC 2
|
||||
#define SUN7I_GPA_GMAC 5
|
||||
#define SUN6I_GPA_SDC2 5
|
||||
#define SUN6I_GPA_SDC3 4
|
||||
|
||||
#define SUNXI_GPB0_TWI0 2
|
||||
#define SUN4I_GPB_TWI0 2
|
||||
#define SUN4I_GPB_TWI1 2
|
||||
#define SUN5I_GPB_TWI1 2
|
||||
#define SUN4I_GPB_TWI2 2
|
||||
#define SUN5I_GPB_TWI2 2
|
||||
#define SUN4I_GPB_UART0 2
|
||||
#define SUN5I_GPB_UART0 2
|
||||
|
||||
#define SUN4I_GPB22_UART0_TX 2
|
||||
#define SUN4I_GPB23_UART0_RX 2
|
||||
#define SUNXI_GPC_SDC2 3
|
||||
#define SUN6I_GPC_SDC3 4
|
||||
|
||||
#define SUN5I_GPB19_UART0_TX 2
|
||||
#define SUN5I_GPB20_UART0_RX 2
|
||||
#define SUN8I_GPD_SDC1 3
|
||||
#define SUNXI_GPD_LCD0 2
|
||||
#define SUNXI_GPD_LVDS0 3
|
||||
|
||||
#define SUNXI_GPC6_SDC2 3
|
||||
#define SUN5I_GPE_SDC2 3
|
||||
#define SUN8I_GPE_TWI2 3
|
||||
|
||||
#define SUNXI_GPD0_LCD0 2
|
||||
#define SUNXI_GPD0_LVDS0 3
|
||||
#define SUNXI_GPF_SDC0 2
|
||||
#define SUNXI_GPF_UART0 4
|
||||
#define SUN8I_GPF_UART0 3
|
||||
|
||||
#define SUNXI_GPF0_SDC0 2
|
||||
#define SUN4I_GPG_SDC1 4
|
||||
#define SUN5I_GPG_SDC1 2
|
||||
#define SUN6I_GPG_SDC1 2
|
||||
#define SUN8I_GPG_SDC1 2
|
||||
#define SUN6I_GPG_TWI3 2
|
||||
#define SUN5I_GPG_UART1 4
|
||||
|
||||
#define SUNXI_GPF2_SDC0 2
|
||||
#define SUN4I_GPH_SDC1 5
|
||||
#define SUN6I_GPH_TWI0 2
|
||||
#define SUN8I_GPH_TWI0 2
|
||||
#define SUN6I_GPH_TWI1 2
|
||||
#define SUN8I_GPH_TWI1 2
|
||||
#define SUN6I_GPH_TWI2 2
|
||||
#define SUN6I_GPH_UART0 2
|
||||
|
||||
#ifdef CONFIG_MACH_SUN8I
|
||||
#define SUNXI_GPF2_UART0_TX 3
|
||||
#define SUNXI_GPF4_UART0_RX 3
|
||||
#else
|
||||
#define SUNXI_GPF2_UART0_TX 4
|
||||
#define SUNXI_GPF4_UART0_RX 4
|
||||
#endif
|
||||
|
||||
#define SUN4I_GPG0_SDC1 4
|
||||
|
||||
#define SUN5I_GPG3_SDC1 2
|
||||
|
||||
#define SUN5I_GPG3_UART1_TX 4
|
||||
#define SUN5I_GPG4_UART1_RX 4
|
||||
|
||||
#define SUN4I_GPH22_SDC1 5
|
||||
|
||||
#define SUN6I_GPH20_UART0_TX 2
|
||||
#define SUN6I_GPH21_UART0_RX 2
|
||||
|
||||
#define SUN4I_GPI4_SDC3 2
|
||||
#define SUNXI_GPI_SDC3 2
|
||||
#define SUN7I_GPI_TWI3 3
|
||||
#define SUN7I_GPI_TWI4 3
|
||||
|
||||
#define SUN6I_GPL0_R_P2WI_SCK 3
|
||||
#define SUN6I_GPL1_R_P2WI_SDA 3
|
||||
|
||||
#define SUN8I_GPL0_R_RSB_SCK 2
|
||||
#define SUN8I_GPL1_R_RSB_SDA 2
|
||||
#define SUN8I_GPL2_R_UART_TX 2
|
||||
#define SUN8I_GPL3_R_UART_RX 2
|
||||
#define SUN8I_GPL_R_RSB 2
|
||||
#define SUN8I_GPL_R_UART 2
|
||||
|
||||
#define SUN9I_GPN0_R_RSB_SCK 3
|
||||
#define SUN9I_GPN1_R_RSB_SDA 3
|
||||
#define SUN9I_GPN_R_RSB 3
|
||||
|
||||
/* GPIO pin pull-up/down config */
|
||||
#define SUNXI_GPIO_PULL_DISABLE 0
|
||||
#define SUNXI_GPIO_PULL_UP 1
|
||||
#define SUNXI_GPIO_PULL_DOWN 2
|
||||
|
||||
/* Virtual AXP0 GPIOs */
|
||||
#define SUNXI_GPIO_AXP0_VBUS_DETECT 8
|
||||
#define SUNXI_GPIO_AXP0_VBUS_ENABLE 9
|
||||
|
||||
void sunxi_gpio_set_cfgbank(struct sunxi_gpio *pio, int bank_offset, u32 val);
|
||||
void sunxi_gpio_set_cfgpin(u32 pin, u32 val);
|
||||
int sunxi_gpio_get_cfgbank(struct sunxi_gpio *pio, int bank_offset);
|
||||
int sunxi_gpio_get_cfgpin(u32 pin);
|
||||
int sunxi_gpio_set_drv(u32 pin, u32 val);
|
||||
int sunxi_gpio_set_pull(u32 pin, u32 val);
|
||||
int sunxi_name_to_gpio_bank(const char *name);
|
||||
int sunxi_name_to_gpio(const char *name);
|
||||
#define name_to_gpio(name) sunxi_name_to_gpio(name)
|
||||
|
||||
|
@ -8,7 +8,22 @@
|
||||
|
||||
#include <asm/arch/cpu.h>
|
||||
|
||||
#define CONFIG_I2C_MVTWSI_BASE SUNXI_TWI0_BASE
|
||||
#ifdef CONFIG_I2C0_ENABLE
|
||||
#define CONFIG_I2C_MVTWSI_BASE0 SUNXI_TWI0_BASE
|
||||
#endif
|
||||
#ifdef CONFIG_I2C1_ENABLE
|
||||
#define CONFIG_I2C_MVTWSI_BASE1 SUNXI_TWI1_BASE
|
||||
#endif
|
||||
#ifdef CONFIG_I2C2_ENABLE
|
||||
#define CONFIG_I2C_MVTWSI_BASE2 SUNXI_TWI2_BASE
|
||||
#endif
|
||||
#ifdef CONFIG_I2C3_ENABLE
|
||||
#define CONFIG_I2C_MVTWSI_BASE3 SUNXI_TWI3_BASE
|
||||
#endif
|
||||
#ifdef CONFIG_I2C4_ENABLE
|
||||
#define CONFIG_I2C_MVTWSI_BASE4 SUNXI_TWI4_BASE
|
||||
#endif
|
||||
|
||||
/* This is abp0-clk on sun4i/5i/7i / abp1-clk on sun6i/sun8i which is 24MHz */
|
||||
#define CONFIG_SYS_TCLK 24000000
|
||||
|
||||
|
@ -20,4 +20,5 @@ void sunxi_usbc_enable(int index);
|
||||
void sunxi_usbc_disable(int index);
|
||||
void sunxi_usbc_vbus_enable(int index);
|
||||
void sunxi_usbc_vbus_disable(int index);
|
||||
int sunxi_usbc_vbus_detect(int index);
|
||||
void sunxi_usbc_enable_squelch_detect(int index, int enable);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user