arm: Tegra2: add support for A9 CPU init
PATCH v5 1/1 arm: Tegra2: add support for A9 CPU init
---
Changes for V2:
- Remove returns in void functions
- Move inline assembly code to .S file
- Simplify some if/else code, break out common code
- Minimize the use of local vars
- Inline some single-instance functions
- Remove TRUE/FALSE define, use 1/0 instead
- Replace memset of mem-mapped regs w/loop of writel's
Changes for V3:
- Fix C-style comments in lowlevel_init.S cache_configure
Changes for V4:
- Move cold_boot() from C to assembly
- Fix spacing in cache_configure
Changes for V5:
- Add a timeout and printf msg if CPU never powers up
- Remove redundant is_cpu_powered in start_cpu
arch/arm/cpu/armv7/start.S | 12 + arch/arm/cpu/armv7/tegra2/Makefile | 2 +- arch/arm/cpu/armv7/tegra2/ap20.c | 329 ++++++++++++++++++++++++++++ arch/arm/cpu/armv7/tegra2/ap20.h | 104 +++++++++ arch/arm/cpu/armv7/tegra2/lowlevel_init.S | 94 ++++++++ arch/arm/include/asm/arch-tegra2/clk_rst.h | 27 +++ arch/arm/include/asm/arch-tegra2/pmc.h | 8 + arch/arm/include/asm/arch-tegra2/scu.h | 43 ++++ arch/arm/include/asm/arch-tegra2/tegra2.h | 8 + board/nvidia/common/board.c | 10 + board/nvidia/common/board.h | 29 +++ include/configs/harmony.h | 1 + include/configs/seaboard.h | 1 + include/configs/tegra2-common.h | 2 + 14 files changed, 669 insertions(+), 1 deletions(-) create mode 100644 arch/arm/cpu/armv7/tegra2/ap20.c create mode 100644 arch/arm/cpu/armv7/tegra2/ap20.h create mode 100644 arch/arm/include/asm/arch-tegra2/scu.h create mode 100644 board/nvidia/common/board.h
arch/arm/cpu/armv7/start.S +12 -0
@@ -70,6 +70,18 @@ _end_vect: _TEXT_BASE: .word CONFIG_SYS_TEXT_BASE +#ifdef CONFIG_TEGRA2 +/* + * Tegra2 uses 2 separate CPUs - the AVP (ARM7TDMI) and the CPU (dual A9s). + * U-Boot runs on the AVP first, setting things up for the CPU (PLLs, + * muxes, clocks, clamps, etc.). Then the AVP halts, and expects the CPU + * to pick up its reset vector, which points here. + */ +.globl _armboot_start +_armboot_start: + .word _start +#endif + /* * These are defined in the board-specific linker script. */
arch/arm/cpu/armv7/tegra2/Makefile +1 -1
@@ -28,7 +28,7 @@ include $(TOPDIR)/config.mk LIB = $(obj)lib$(SOC).o SOBJS := lowlevel_init.o -COBJS := board.o sys_info.o timer.o +COBJS := ap20.o board.o sys_info.o timer.o SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) OBJS := $(addprefix $(obj),$(COBJS) $(SOBJS))
arch/arm/cpu/armv7/tegra2/ap20.c new file +329 -0
329 lines not on this page · raw message
arch/arm/cpu/armv7/tegra2/ap20.h new file +104 -0
104 lines not on this page · raw message
arch/arm/cpu/armv7/tegra2/lowlevel_init.S +94 -0
108 lines not on this page · raw message
arch/arm/include/asm/arch-tegra2/clk_rst.h +27 -0
@@ -149,6 +149,9 @@ struct clk_rst_ctlr {uint crc_clk_src_csite;/*_CSITE_0, 0x1D4 */ uint crc_reserved19[9 ];/* 0x1D8-1F8 */ uint crc_clk_src_osc;/*_OSC_0, 0x1FC */ +uint crc_reserved20[80 ];/* 0x200-33C */ +uint crc_cpu_cmplx_set;/* _CPU_CMPLX_SET_0, 0x340 */ +uint crc_cpu_cmplx_clr;/* _CPU_CMPLX_CLR_0, 0x344 */ };#define PLL_BYPASS (1 << 31)
@@ -162,4 +165,28 @@ struct clk_rst_ctlr {#define SWR_UARTA_RST (1 << 6)#define CLK_ENB_UARTA (1 << 6) +#define SWR_CPU_RST (1 << 0) +#define CLK_ENB_CPU (1 << 0) +#define SWR_CSITE_RST (1 << 9) +#define CLK_ENB_CSITE (1 << 9) + +#define SET_CPURESET0 (1 << 0) +#define SET_DERESET0 (1 << 4) +#define SET_DBGRESET0 (1 << 12) + +#define SET_CPURESET1 (1 << 1) +#define SET_DERESET1 (1 << 5) +#define SET_DBGRESET1 (1 << 13) + +#define CLR_CPURESET0 (1 << 0) +#define CLR_DERESET0 (1 << 4) +#define CLR_DBGRESET0 (1 << 12) + +#define CLR_CPURESET1 (1 << 1) +#define CLR_DERESET1 (1 << 5) +#define CLR_DBGRESET1 (1 << 13) + +#define CPU0_CLK_STP (1 << 8) +#define CPU1_CLK_STP (1 << 9) +#endif /* CLK_RST_H */
arch/arm/include/asm/arch-tegra2/pmc.h +8 -0
@@ -121,4 +121,12 @@ struct pmc_ctlr { uint pmc_gate; /* _GATE_0, offset 15C */ }; +#define CPU_PWRED 1 +#define CPU_CLMP 1 + +#define PARTID_CP 0xFFFFFFF8 +#define START_CP (1 << 8) + +#define CPUPWRREQ_OE (1 << 16) +#endif /* PMC_H */
arch/arm/include/asm/arch-tegra2/scu.h new file +43 -0
43 lines not on this page · raw message
arch/arm/include/asm/arch-tegra2/tegra2.h +8 -0
@@ -25,8 +25,12 @@#define _TEGRA2_H_#define NV_PA_SDRAM_BASE 0x00000000 +#define NV_PA_ARM_PERIPHBASE 0x50040000 +#define NV_PA_PG_UP_BASE 0x60000000#define NV_PA_TMRUS_BASE 0x60005010#define NV_PA_CLK_RST_BASE 0x60006000 +#define NV_PA_FLOW_BASE 0x60007000 +#define NV_PA_EVP_BASE 0x6000F000#define NV_PA_APB_MISC_BASE 0x70000000#define NV_PA_APB_UARTA_BASE (NV_PA_APB_MISC_BASE + 0x6000)#define NV_PA_APB_UARTB_BASE (NV_PA_APB_MISC_BASE + 0x6040)
@@ -34,9 +38,13 @@#define NV_PA_APB_UARTD_BASE (NV_PA_APB_MISC_BASE + 0x6300)#define NV_PA_APB_UARTE_BASE (NV_PA_APB_MISC_BASE + 0x6400)#define NV_PA_PMC_BASE 0x7000E400 +#define NV_PA_CSITE_BASE 0x70040000#define TEGRA2_SDRC_CS0 NV_PA_SDRAM_BASE#define LOW_LEVEL_SRAM_STACK 0x4000FFFC +#define EARLY_AVP_STACK (NV_PA_SDRAM_BASE + 0x20000) +#define EARLY_CPU_STACK (EARLY_AVP_STACK - 4096) +#define PG_UP_TAG_AVP 0xAAAAAAAA#ifndef __ASSEMBLY__ struct timerus {
board/nvidia/common/board.c +10 -0
@@ -30,6 +30,7 @@#include <asm/arch/clk_rst.h> #include <asm/arch/pinmux.h> #include <asm/arch/uart.h> +#include "board.h" DECLARE_GLOBAL_DATA_PTR ;
@@ -37,6 +38,15 @@ const struct tegra2_sysinfo sysinfo = { CONFIG_TEGRA2_BOARD_STRING }; +#ifdef CONFIG_BOARD_EARLY_INIT_F +int board_early_init_f (void ) +{ +debug ("Board Early Init\n" ); +tegra2_start (); +return 0 ; +} +#endif /* EARLY_INIT */ +/* * Routine: timer_init * Description: init the timestamp and lastinc value
board/nvidia/common/board.h new file +29 -0
@@ -0,0 +1,29 @@ +/* +* (C) Copyright 2010,2011 +* NVIDIA Corporation <www.nvidia.com> +* +* See file CREDITS for list of people who contributed to this +* project. +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License as +* published by the Free Software Foundation; either version 2 of +* the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place, Suite 330, Boston, +* MA 02111-1307 USA +*/ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +void tegra2_start (void ); + +#endif /* BOARD_H */
include/configs/harmony.h +1 -0
@@ -46,4 +46,5 @@#define CONFIG_MACH_TYPE MACH_TYPE_HARMONY#define CONFIG_SYS_BOARD_ODMDATA 0x300d8011/* lp1, 1GB */ +#define CONFIG_BOARD_EARLY_INIT_F #endif /* __CONFIG_H */
include/configs/seaboard.h +1 -0
@@ -40,4 +40,5 @@#define CONFIG_MACH_TYPE MACH_TYPE_SEABOARD#define CONFIG_SYS_BOARD_ODMDATA 0x300d8011/* lp1, 1GB */ +#define CONFIG_BOARD_EARLY_INIT_F #endif /* __CONFIG_H */
include/configs/tegra2-common.h +2 -0
@@ -33,6 +33,8 @@#define CONFIG_MACH_TEGRA_GENERIC /* which is a Tegra generic machine */ #define CONFIG_L2_OFF /* No L2 cache */ +#define CONFIG_ENABLE_CORTEXA9 /* enable CPU (A9 complex) */ +#include <asm/arch/tegra2.h> /* get chip and board defs */ /*
Signature · 1 line
1.7.4.3
PATCH v5 1/1 arm: Tegra2: add support for A9 CPU init
Hi Tom,
Le 15/04/2011 00:18, Tom Warren a ?crit :
Quoted 34 lines
Signed-off-by Tom Warren<[email protected]>---
Changes for V2:
- Remove returns in void functions
- Move inline assembly code to .S file
- Simplify some if/else code, break out common code
- Minimize the use of local vars
- Inline some single-instance functions
- Remove TRUE/FALSE define, use 1/0 instead
- Replace memset of mem-mapped regs w/loop of writel's
Changes for V3:
- Fix C-style comments inlowlevel_init.Scache_configure
Changes for V4:
- Movecold_boot()from C to assembly
- Fix spacing incache_configure
Changes for V5:
- Add a timeout and printf msg if CPU never powers up
- Remove redundantis_cpu_poweredinstart_cpuarch/arm/cpu/armv7/start.S | 12 + arch/arm/cpu/armv7/tegra2/Makefile | 2 +- arch/arm/cpu/armv7/tegra2/ap20.c | 329 ++++++++++++++++++++++++++++ arch/arm/cpu/armv7/tegra2/ap20.h | 104 +++++++++ arch/arm/cpu/armv7/tegra2/lowlevel_init.S | 94 ++++++++ arch/arm/include/asm/arch-tegra2/clk_rst.h | 27 +++ arch/arm/include/asm/arch-tegra2/pmc.h | 8 + arch/arm/include/asm/arch-tegra2/scu.h | 43 ++++ arch/arm/include/asm/arch-tegra2/tegra2.h | 8 + board/nvidia/common/board.c | 10 + board/nvidia/common/board.h | 29 +++ include/configs/harmony.h | 1 + include/configs/seaboard.h | 1 + include/configs/tegra2-common.h | 2 + 14 files changed, 669 insertions(+), 1 deletions(-)
Quoted 4 lines
create mode 100644
arch/arm/cpu/armv7/tegra2/ap20.ccreate mode 100644arch/arm/cpu/armv7/tegra2/ap20.hcreate mode 100644arch/arm/include/asm/arch-tegra2/scu.hcreate mode 100644board/nvidia/common/board.h
Applied to u-boot-arm, thanks.
Amicalement,
Signature · 1 line
Albert.