From 5163280d655d95e5ac6f8764dbdef9f10c6578e2 Mon Sep 17 00:00:00 2001 From: Lucas Stach Date: Sun, 29 Sep 2013 21:59:30 +0200 Subject: [PATCH 1/7] tegra: try harder inlining early startup functions It seems GCC 4.8 tries to be clever by not inlining some of those functions. This causes havok, as it's absolutely required to inline the early startup function, otherwise we may end up calling ARMv7 code on the ARMv4 AVP. Signed-off-by: Lucas Stach Signed-off-by: Sascha Hauer --- arch/arm/mach-tegra/include/mach/lowlevel.h | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/arch/arm/mach-tegra/include/mach/lowlevel.h b/arch/arm/mach-tegra/include/mach/lowlevel.h index 071416f74..2d3f31280 100644 --- a/arch/arm/mach-tegra/include/mach/lowlevel.h +++ b/arch/arm/mach-tegra/include/mach/lowlevel.h @@ -40,7 +40,8 @@ #define T20_ODMDATA_UARTID_SHIFT 15 #define T20_ODMDATA_UARTID_MASK (7 << T20_ODMDATA_UARTID_SHIFT) -static inline u32 tegra_get_odmdata(void) +static inline __attribute__((always_inline)) +u32 tegra_get_odmdata(void) { u32 bctsize, bctptr, odmdata; @@ -62,7 +63,8 @@ enum tegra_chiptype { TEGRA20 = 0, }; -static inline enum tegra_chiptype tegra_get_chiptype(void) +static inline __attribute__((always_inline)) +enum tegra_chiptype tegra_get_chiptype(void) { u32 hidrev; @@ -76,7 +78,8 @@ static inline enum tegra_chiptype tegra_get_chiptype(void) } } -static inline int tegra_get_num_cores(void) +static inline __attribute__((always_inline)) +int tegra_get_num_cores(void) { switch (tegra_get_chiptype()) { case TEGRA20: @@ -89,7 +92,8 @@ static inline int tegra_get_num_cores(void) } /* Runtime data */ -static inline int tegra_cpu_is_maincomplex(void) +static inline __attribute__((always_inline)) +int tegra_cpu_is_maincomplex(void) { u32 tag0; @@ -98,7 +102,8 @@ static inline int tegra_cpu_is_maincomplex(void) return (tag0 & 0xff) == 0x55; } -static inline uint32_t tegra20_get_ramsize(void) +static inline __attribute__((always_inline)) +uint32_t tegra20_get_ramsize(void) { switch ((tegra_get_odmdata() & T20_ODMDATA_RAMSIZE_MASK) >> T20_ODMDATA_RAMSIZE_SHIFT) { @@ -120,7 +125,8 @@ static long uart_id_to_base[] = { TEGRA_UARTE_BASE, }; -static inline long tegra20_get_debuguart_base(void) +static inline __attribute__((always_inline)) +long tegra20_get_debuguart_base(void) { u32 odmdata; int id; @@ -146,7 +152,8 @@ static inline long tegra20_get_debuguart_base(void) #define CRC_OSC_CTRL_OSC_FREQ_SHIFT 30 #define CRC_OSC_CTRL_OSC_FREQ_MASK (0x3 << CRC_OSC_CTRL_OSC_FREQ_SHIFT) -static inline unsigned int tegra_get_osc_clock(void) +static inline unsigned __attribute__((always_inline)) +int tegra_get_osc_clock(void) { u32 osc_ctrl = readl(TEGRA_CLK_RESET_BASE + CRC_OSC_CTRL); From 02568520ee4626840f37acfb612e060b13f01dfc Mon Sep 17 00:00:00 2001 From: Lucas Stach Date: Sun, 29 Sep 2013 21:59:31 +0200 Subject: [PATCH 2/7] tegra: start maincomplex execution at correct offset Signed-off-by: Lucas Stach Signed-off-by: Sascha Hauer --- arch/arm/mach-tegra/tegra_avp_init.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/arch/arm/mach-tegra/tegra_avp_init.c b/arch/arm/mach-tegra/tegra_avp_init.c index 5099e913a..ba275ad1f 100644 --- a/arch/arm/mach-tegra/tegra_avp_init.c +++ b/arch/arm/mach-tegra/tegra_avp_init.c @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -194,13 +195,6 @@ void barebox_arm_reset_vector(void) /* minimal initialization, OK for both ARMv4 and ARMv7 */ tegra_cpu_lowlevel_setup(); - /* - * If we are already running on the main CPU complex jump straight - * to the maincomplex entry point. - */ - if (tegra_cpu_is_maincomplex()) - tegra_maincomplex_entry(); - /* get the number of cores in the main CPU complex of the current SoC */ num_cores = tegra_get_num_cores(); if (!num_cores) @@ -212,7 +206,8 @@ void barebox_arm_reset_vector(void) stop_maincomplex_clocks(num_cores); /* set start address for the main CPU complex processors */ - writel(barebox_arm_head, TEGRA_EXCEPTION_VECTORS_BASE + 0x100); + writel(tegra_maincomplex_entry - get_runtime_offset(), + TEGRA_EXCEPTION_VECTORS_BASE + 0x100); /* bring up main CPU complex */ start_cpu0_clocks(); From c05a80c825502b5577ba6d3e014a884181513bad Mon Sep 17 00:00:00 2001 From: Lucas Stach Date: Sun, 29 Sep 2013 21:59:32 +0200 Subject: [PATCH 3/7] tegra: fix PBL build Drop useless BUG(), we are too early for them to be of any use. Make sure we build the AVP code as ARMv4 even in PBL case. Signed-off-by: Lucas Stach Signed-off-by: Sascha Hauer --- arch/arm/mach-tegra/Makefile | 1 + arch/arm/mach-tegra/tegra_avp_init.c | 4 ---- arch/arm/mach-tegra/tegra_maincomplex_init.c | 2 +- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/arch/arm/mach-tegra/Makefile b/arch/arm/mach-tegra/Makefile index fd6a87070..0fa843022 100644 --- a/arch/arm/mach-tegra/Makefile +++ b/arch/arm/mach-tegra/Makefile @@ -1,4 +1,5 @@ CFLAGS_tegra_avp_init.o := -mcpu=arm7tdmi -march=armv4t +CFLAGS_pbl-tegra_avp_init.o := -mcpu=arm7tdmi -march=armv4t lwl-y += tegra_avp_init.o lwl-y += tegra_maincomplex_init.o obj-y += tegra20.o diff --git a/arch/arm/mach-tegra/tegra_avp_init.c b/arch/arm/mach-tegra/tegra_avp_init.c index ba275ad1f..557af666a 100644 --- a/arch/arm/mach-tegra/tegra_avp_init.c +++ b/arch/arm/mach-tegra/tegra_avp_init.c @@ -109,8 +109,6 @@ static void init_pllx(void) return; chiptype = tegra_get_chiptype(); - if (chiptype < 0) - BUG(); osc_freq = (readl(TEGRA_CLK_RESET_BASE + CRC_OSC_CTRL) & CRC_OSC_CTRL_OSC_FREQ_MASK) >> CRC_OSC_CTRL_OSC_FREQ_SHIFT; @@ -197,8 +195,6 @@ void barebox_arm_reset_vector(void) /* get the number of cores in the main CPU complex of the current SoC */ num_cores = tegra_get_num_cores(); - if (!num_cores) - BUG(); /* bring down main CPU complex (this may be a warm boot) */ enable_maincomplex_powerrail(); diff --git a/arch/arm/mach-tegra/tegra_maincomplex_init.c b/arch/arm/mach-tegra/tegra_maincomplex_init.c index dea9c9151..343edd6f9 100644 --- a/arch/arm/mach-tegra/tegra_maincomplex_init.c +++ b/arch/arm/mach-tegra/tegra_maincomplex_init.c @@ -33,7 +33,7 @@ void tegra_maincomplex_entry(void) break; default: /* If we don't know the chiptype, better bail out */ - BUG(); + unreachable(); } /* From c7aa6cc731dba8c4e2e9cfc801a3c4f3b257c382 Mon Sep 17 00:00:00 2001 From: Lucas Stach Date: Sun, 29 Sep 2013 21:59:33 +0200 Subject: [PATCH 4/7] tegra: mandate relocatable binary Allows us to drop some silly code workaround. Signed-off-by: Lucas Stach Signed-off-by: Sascha Hauer --- arch/arm/Kconfig | 1 + arch/arm/mach-tegra/Kconfig | 8 ++++---- arch/arm/mach-tegra/tegra_maincomplex_init.c | 8 +------- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 687acca71..35e7f0be7 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -162,6 +162,7 @@ config ARCH_TEGRA select GPIO_TEGRA select OFDEVICE select OFTREE + select RELOCATABLE config ARCH_ZYNQ bool "Xilinx Zynq-based boards" diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig index e6d53bc95..4164f56bb 100644 --- a/arch/arm/mach-tegra/Kconfig +++ b/arch/arm/mach-tegra/Kconfig @@ -1,5 +1,9 @@ if ARCH_TEGRA +config ARCH_TEXT_BASE + hex + default 0x0 + choice prompt "Tegra processor type" @@ -46,10 +50,6 @@ endchoice if ARCH_TEGRA_2x_SOC -config ARCH_TEXT_BASE - hex - default 0x00108000 - choice prompt "Tegra 20 Board Type" diff --git a/arch/arm/mach-tegra/tegra_maincomplex_init.c b/arch/arm/mach-tegra/tegra_maincomplex_init.c index 343edd6f9..c485760db 100644 --- a/arch/arm/mach-tegra/tegra_maincomplex_init.c +++ b/arch/arm/mach-tegra/tegra_maincomplex_init.c @@ -36,11 +36,5 @@ void tegra_maincomplex_entry(void) unreachable(); } - /* - * The standard load address for Tegra systems is 0x10800 which means - * the barebox binary will always be below the malloc area for all - * reasonable malloc area sizes. We offset the RAM base address by 8MB - * to pretend barebox is in another bank. - */ - barebox_arm_entry(rambase + SZ_8M, ramsize - SZ_8M, 0); + barebox_arm_entry(rambase, ramsize, 0); } From 4581ea746f02cf50d61979f2bb0588c2d8832e66 Mon Sep 17 00:00:00 2001 From: Lucas Stach Date: Sun, 29 Sep 2013 21:59:34 +0200 Subject: [PATCH 5/7] tegra: don't force to choose between Tegra arches There is nothing technically preventing a single Tegra 20/30 image to be built. Don't force this split in Kconfig. Signed-off-by: Lucas Stach Signed-off-by: Sascha Hauer --- arch/arm/mach-tegra/Kconfig | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig index 4164f56bb..90c0c0fe6 100644 --- a/arch/arm/mach-tegra/Kconfig +++ b/arch/arm/mach-tegra/Kconfig @@ -4,15 +4,6 @@ config ARCH_TEXT_BASE hex default 0x0 -choice - prompt "Tegra processor type" - -config ARCH_TEGRA_2x_SOC - bool "Tegra 20" - select PINCTRL_TEGRA20 - -endchoice - choice prompt "Tegra debug UART" help @@ -48,18 +39,22 @@ endchoice # --------------------------------------------------------- -if ARCH_TEGRA_2x_SOC +config ARCH_TEGRA_2x_SOC + bool + select PINCTRL_TEGRA20 choice - prompt "Tegra 20 Board Type" + prompt "select Tegra Board" config MACH_TEGRA20_GENERIC bool "Generic DT based board" + select ARCH_TEGRA_2x_SOC help Say Y here if you are building for a generic DT based board. config MACH_TOSHIBA_AC100 bool "Toshiba AC100" + select ARCH_TEGRA_2x_SOC help Say Y here if you are using Toshiba AC100 smartbook. @@ -71,8 +66,6 @@ endif #MACH_TEGRA20_GENERIC source arch/arm/boards/toshiba-ac100/Kconfig -endif #ARCH_TEGRA_2x_SOC - # --------------------------------------------------------- endif From f3cf0157fb57bdd9f85ce74e95ac5c3fcb19bab9 Mon Sep 17 00:00:00 2001 From: Lucas Stach Date: Sun, 29 Sep 2013 21:59:35 +0200 Subject: [PATCH 6/7] tegra: ac100: delete custom Kconfig Now that tegra arch is both DT only and forced relocatable there is nothing interesting left in here. Signed-off-by: Lucas Stach Signed-off-by: Sascha Hauer --- arch/arm/boards/toshiba-ac100/Kconfig | 7 ------- arch/arm/mach-tegra/Kconfig | 2 -- 2 files changed, 9 deletions(-) delete mode 100644 arch/arm/boards/toshiba-ac100/Kconfig diff --git a/arch/arm/boards/toshiba-ac100/Kconfig b/arch/arm/boards/toshiba-ac100/Kconfig deleted file mode 100644 index 1cc13f01e..000000000 --- a/arch/arm/boards/toshiba-ac100/Kconfig +++ /dev/null @@ -1,7 +0,0 @@ -if MACH_TOSHIBA_AC100 - -config ARCH_TEXT_BASE - hex - default 0x01000000 - -endif diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig index 90c0c0fe6..4363bce76 100644 --- a/arch/arm/mach-tegra/Kconfig +++ b/arch/arm/mach-tegra/Kconfig @@ -64,8 +64,6 @@ if MACH_TEGRA20_GENERIC endif #MACH_TEGRA20_GENERIC -source arch/arm/boards/toshiba-ac100/Kconfig - # --------------------------------------------------------- endif From f93b5f8eb973a62affbaf134f07d367649ed3ae4 Mon Sep 17 00:00:00 2001 From: Lucas Stach Date: Sun, 29 Sep 2013 21:59:36 +0200 Subject: [PATCH 7/7] tegra: switch to multi image To keep things clean I removed all support for the old way to build images. There is now a single tegra_v7 defconfig which builds both supported Tegra boards as images. The new image generation also paves the way for integration of the tegra-cbootimage tool to produce directly flashable images. Signed-off-by: Lucas Stach Signed-off-by: Sascha Hauer --- arch/arm/Kconfig | 3 +- arch/arm/boards/Makefile | 1 + .../boards/toradex-colibri-t20-iris/Makefile | 2 + .../boards/toradex-colibri-t20-iris/entry.c | 36 ++++++++++++++++ arch/arm/boards/toshiba-ac100/Makefile | 2 + arch/arm/boards/toshiba-ac100/entry.c | 36 ++++++++++++++++ ...ibri_iris_defconfig => tegra_v7_defconfig} | 11 +++-- arch/arm/configs/toshiba_ac100_defconfig | 42 ------------------- arch/arm/dts/Makefile | 5 +++ arch/arm/mach-tegra/Kconfig | 20 ++++----- arch/arm/mach-tegra/include/mach/lowlevel.h | 15 +++++++ .../arm/mach-tegra/include/mach/tegra20-pmc.h | 2 + arch/arm/mach-tegra/tegra_avp_init.c | 19 ++------- arch/arm/mach-tegra/tegra_maincomplex_init.c | 4 +- images/Makefile | 1 + images/Makefile.tegra | 14 +++++++ 16 files changed, 137 insertions(+), 76 deletions(-) create mode 100644 arch/arm/boards/toradex-colibri-t20-iris/Makefile create mode 100644 arch/arm/boards/toradex-colibri-t20-iris/entry.c create mode 100644 arch/arm/boards/toshiba-ac100/entry.c rename arch/arm/configs/{tegra20_colibri_iris_defconfig => tegra_v7_defconfig} (72%) delete mode 100644 arch/arm/configs/toshiba_ac100_defconfig create mode 100644 images/Makefile.tegra diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 35e7f0be7..f4f28ef84 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -154,12 +154,13 @@ config ARCH_TEGRA bool "NVIDIA Tegra" select CPU_V7 select HAS_DEBUG_LL - select BUILTIN_DTB select COMMON_CLK select COMMON_CLK_OF_PROVIDER select CLKDEV_LOOKUP select GPIOLIB select GPIO_TEGRA + select HAVE_DEFAULT_ENVIRONMENT_NEW + select HAVE_PBL_MULTI_IMAGES select OFDEVICE select OFTREE select RELOCATABLE diff --git a/arch/arm/boards/Makefile b/arch/arm/boards/Makefile index 38ef512da..cb33736df 100644 --- a/arch/arm/boards/Makefile +++ b/arch/arm/boards/Makefile @@ -78,6 +78,7 @@ obj-$(CONFIG_MACH_SCB9328) += scb9328/ obj-$(CONFIG_MACH_TNY_A9260) += tny-a926x/ obj-$(CONFIG_MACH_TNY_A9263) += tny-a926x/ obj-$(CONFIG_MACH_TNY_A9G20) += tny-a926x/ +obj-$(CONFIG_MACH_TORADEX_COLIBRI_T20_IRIS) += toradex-colibri-t20-iris/ obj-$(CONFIG_MACH_TOSHIBA_AC100) += toshiba-ac100/ obj-$(CONFIG_MACH_TQMA53) += tqma53/ obj-$(CONFIG_MACH_TQMA6X) += tqma6x/ diff --git a/arch/arm/boards/toradex-colibri-t20-iris/Makefile b/arch/arm/boards/toradex-colibri-t20-iris/Makefile new file mode 100644 index 000000000..5be3dd0e7 --- /dev/null +++ b/arch/arm/boards/toradex-colibri-t20-iris/Makefile @@ -0,0 +1,2 @@ +CFLAGS_pbl-entry.o := -mcpu=arm7tdmi -march=armv4t +lwl-y += entry.o diff --git a/arch/arm/boards/toradex-colibri-t20-iris/entry.c b/arch/arm/boards/toradex-colibri-t20-iris/entry.c new file mode 100644 index 000000000..30a13e065 --- /dev/null +++ b/arch/arm/boards/toradex-colibri-t20-iris/entry.c @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2013 Lucas Stach + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope 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, see . + */ + +#include +#include +#include +#include +#include + +extern char __dtb_tegra20_colibri_iris_start[]; + +ENTRY_FUNCTION(start_toradex_colibri_t20_iris)(void) +{ + uint32_t fdt; + + __barebox_arm_head(); + + tegra_cpu_lowlevel_setup(); + + fdt = (uint32_t)__dtb_tegra20_colibri_iris_start - get_runtime_offset(); + + tegra_avp_reset_vector(fdt); +} diff --git a/arch/arm/boards/toshiba-ac100/Makefile b/arch/arm/boards/toshiba-ac100/Makefile index dcfc2937d..4ef18c0ce 100644 --- a/arch/arm/boards/toshiba-ac100/Makefile +++ b/arch/arm/boards/toshiba-ac100/Makefile @@ -1 +1,3 @@ +CFLAGS_pbl-entry.o := -mcpu=arm7tdmi -march=armv4t +lwl-y += entry.o obj-y += board.o diff --git a/arch/arm/boards/toshiba-ac100/entry.c b/arch/arm/boards/toshiba-ac100/entry.c new file mode 100644 index 000000000..372d5969c --- /dev/null +++ b/arch/arm/boards/toshiba-ac100/entry.c @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2013 Lucas Stach + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope 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, see . + */ + +#include +#include +#include +#include +#include + +extern char __dtb_tegra20_paz00_start[]; + +ENTRY_FUNCTION(start_toshiba_ac100)(void) +{ + uint32_t fdt; + + __barebox_arm_head(); + + tegra_cpu_lowlevel_setup(); + + fdt = (uint32_t)__dtb_tegra20_paz00_start - get_runtime_offset(); + + tegra_avp_reset_vector(fdt); +} diff --git a/arch/arm/configs/tegra20_colibri_iris_defconfig b/arch/arm/configs/tegra_v7_defconfig similarity index 72% rename from arch/arm/configs/tegra20_colibri_iris_defconfig rename to arch/arm/configs/tegra_v7_defconfig index 37a0e8ac5..677a955da 100644 --- a/arch/arm/configs/tegra20_colibri_iris_defconfig +++ b/arch/arm/configs/tegra_v7_defconfig @@ -1,18 +1,21 @@ -CONFIG_BUILTIN_DTB_NAME="tegra20-colibri-iris" CONFIG_ARCH_TEGRA=y +CONFIG_MACH_TORADEX_COLIBRI_T20_IRIS=y +CONFIG_MACH_TOSHIBA_AC100=y CONFIG_AEABI=y CONFIG_CMD_ARM_MMUINFO=y CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS=y +CONFIG_ARM_UNWIND=y +CONFIG_MMU=y CONFIG_STACK_SIZE=0x10000 CONFIG_MALLOC_SIZE=0x4000000 CONFIG_LONGHELP=y -CONFIG_GLOB=y -CONFIG_GLOB_SORT=y CONFIG_HUSH_FANCY_PROMPT=y -CONFIG_HUSH_GETOPT=y CONFIG_CMDLINE_EDITING=y CONFIG_AUTO_COMPLETE=y +CONFIG_MENU=y +CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW=y CONFIG_CMD_EDIT=y +CONFIG_CMD_EXPORT=y CONFIG_CMD_MEMINFO=y CONFIG_CMD_IOMEM=y CONFIG_CMD_BOOTZ=y diff --git a/arch/arm/configs/toshiba_ac100_defconfig b/arch/arm/configs/toshiba_ac100_defconfig deleted file mode 100644 index 19039108a..000000000 --- a/arch/arm/configs/toshiba_ac100_defconfig +++ /dev/null @@ -1,42 +0,0 @@ -CONFIG_BUILTIN_DTB_NAME="tegra20-paz00" -CONFIG_ARCH_TEGRA=y -CONFIG_TEGRA_UART_A=y -CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS=y -CONFIG_TEXT_BASE=0x01000000 -CONFIG_BROKEN=y -CONFIG_EXPERIMENTAL=y -CONFIG_PROMPT="toshiba ac100> " -CONFIG_LONGHELP=y -CONFIG_CMDLINE_EDITING=y -CONFIG_AUTO_COMPLETE=y -# CONFIG_ERRNO_MESSAGES is not set -# CONFIG_DEFAULT_ENVIRONMENT is not set -CONFIG_POLLER=y -CONFIG_ENABLE_DEVICE_NOISE=y -CONFIG_CMD_SLEEP=y -# CONFIG_CMD_TRUE is not set -# CONFIG_CMD_FALSE is not set -CONFIG_CMD_TFTP=y -CONFIG_CMD_LOADB=y -CONFIG_CMD_LOADY=y -CONFIG_CMD_LOADS=y -CONFIG_CMD_MEMINFO=y -CONFIG_CMD_MD5SUM=y -CONFIG_CMD_SHA1SUM=y -CONFIG_CMD_BOOTM_SHOW_TYPE=y -CONFIG_CMD_RESET=y -CONFIG_CMD_GO=y -CONFIG_CMD_OFTREE=y -CONFIG_NET=y -CONFIG_NET_DHCP=y -CONFIG_NET_PING=y -CONFIG_NET_NETCONSOLE=y -CONFIG_DRIVER_SERIAL_NS16550=y -CONFIG_NET_USB=y -CONFIG_NET_USB_ASIX=y -# CONFIG_SPI is not set -CONFIG_USB=y -CONFIG_USB_EHCI=y -CONFIG_USB_STORAGE=y -CONFIG_FS_TFTP=y -CONFIG_FS_FAT=y diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile index d57db0e01..1fa78fb97 100644 --- a/arch/arm/dts/Makefile +++ b/arch/arm/dts/Makefile @@ -11,6 +11,9 @@ dtb-$(CONFIG_ARCH_IMX6) += imx6q-gk802.dtb \ imx6q-mba6x.dtb \ imx6q-phytec-pbab01.dtb dtb-$(CONFIG_ARCH_MVEBU) += dove-cubox.dtb +dtb-$(CONFIG_ARCH_TEGRA) += \ + tegra20-colibri-iris.dtb \ + tegra20-paz00.dtb BUILTIN_DTB := $(patsubst "%",%,$(CONFIG_BUILTIN_DTB_NAME)) obj-$(CONFIG_BUILTIN_DTB) += $(BUILTIN_DTB).dtb.o @@ -23,6 +26,8 @@ pbl-$(CONFIG_MACH_PHYTEC_PFLA02) += imx6q-phytec-pbab01.dtb.o pbl-$(CONFIG_MACH_REALQ7) += imx6q-dmo-realq7.dtb.o pbl-$(CONFIG_MACH_SOLIDRUN_CUBOX) += dove-cubox.dtb.o pbl-$(CONFIG_MACH_GK802) += imx6q-gk802.dtb.o +pbl-$(CONFIG_MACH_TORADEX_COLIBRI_T20_IRIS) += tegra20-colibri-iris.dtb.o +pbl-$(CONFIG_MACH_TOSHIBA_AC100) += tegra20-paz00.dtb.o pbl-$(CONFIG_MACH_TQMA6X) += imx6dl-mba6x.dtb.o imx6q-mba6x.dtb.o .SECONDARY: $(obj)/$(BUILTIN_DTB).dtb.S diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig index 4363bce76..3becb84d0 100644 --- a/arch/arm/mach-tegra/Kconfig +++ b/arch/arm/mach-tegra/Kconfig @@ -4,6 +4,9 @@ config ARCH_TEXT_BASE hex default 0x0 +config BOARDINFO + default "" + choice prompt "Tegra debug UART" help @@ -43,26 +46,17 @@ config ARCH_TEGRA_2x_SOC bool select PINCTRL_TEGRA20 -choice - prompt "select Tegra Board" +menu "select Tegra boards to be built" -config MACH_TEGRA20_GENERIC - bool "Generic DT based board" +config MACH_TORADEX_COLIBRI_T20_IRIS + bool "Toradex Colibri T20 on Iris Carrier" select ARCH_TEGRA_2x_SOC - help - Say Y here if you are building for a generic DT based board. config MACH_TOSHIBA_AC100 bool "Toshiba AC100" select ARCH_TEGRA_2x_SOC - help - Say Y here if you are using Toshiba AC100 smartbook. -endchoice - -if MACH_TEGRA20_GENERIC - -endif #MACH_TEGRA20_GENERIC +endmenu # --------------------------------------------------------- diff --git a/arch/arm/mach-tegra/include/mach/lowlevel.h b/arch/arm/mach-tegra/include/mach/lowlevel.h index 2d3f31280..472348aca 100644 --- a/arch/arm/mach-tegra/include/mach/lowlevel.h +++ b/arch/arm/mach-tegra/include/mach/lowlevel.h @@ -172,5 +172,20 @@ int tegra_get_osc_clock(void) } } +static inline __attribute__((always_inline)) +void tegra_cpu_lowlevel_setup(void) +{ + uint32_t r; + + /* set the cpu to SVC32 mode */ + __asm__ __volatile__("mrs %0, cpsr":"=r"(r)); + r &= ~0x1f; + r |= 0xd3; + __asm__ __volatile__("msr cpsr, %0" : : "r"(r)); +} + +/* reset vector for the AVP, to be called from board reset vector */ +void tegra_avp_reset_vector(uint32_t boarddata); + /* reset vector for the main CPU complex */ void tegra_maincomplex_entry(void); diff --git a/arch/arm/mach-tegra/include/mach/tegra20-pmc.h b/arch/arm/mach-tegra/include/mach/tegra20-pmc.h index d56b845b9..3a05e0f10 100644 --- a/arch/arm/mach-tegra/include/mach/tegra20-pmc.h +++ b/arch/arm/mach-tegra/include/mach/tegra20-pmc.h @@ -65,3 +65,5 @@ #define PMC_PWRGATE_STATUS_VE (1 << 2) #define PMC_PWRGATE_STATUS_TD (1 << 1) #define PMC_PWRGATE_STATUS_CPU (1 << 0) + +#define PMC_SCRATCH(i) (0x050 + 0x4*i) diff --git a/arch/arm/mach-tegra/tegra_avp_init.c b/arch/arm/mach-tegra/tegra_avp_init.c index 557af666a..6cabdb3b9 100644 --- a/arch/arm/mach-tegra/tegra_avp_init.c +++ b/arch/arm/mach-tegra/tegra_avp_init.c @@ -24,17 +24,6 @@ #include #include -static inline void tegra_cpu_lowlevel_setup(void) -{ - uint32_t r; - - /* set the cpu to SVC32 mode */ - __asm__ __volatile__("mrs %0, cpsr":"=r"(r)); - r &= ~0x1f; - r |= 0xd3; - __asm__ __volatile__("msr cpsr, %0" : : "r"(r)); -} - /* instruct the PMIC to enable the CPU power rail */ static void enable_maincomplex_powerrail(void) { @@ -186,13 +175,10 @@ static void maincomplex_powerup(void) writel(reg, TEGRA_PMC_BASE + PMC_REMOVE_CLAMPING_CMD); } } -void barebox_arm_reset_vector(void) +void tegra_avp_reset_vector(uint32_t boarddata) { int num_cores; - /* minimal initialization, OK for both ARMv4 and ARMv7 */ - tegra_cpu_lowlevel_setup(); - /* get the number of cores in the main CPU complex of the current SoC */ num_cores = tegra_get_num_cores(); @@ -205,6 +191,9 @@ void barebox_arm_reset_vector(void) writel(tegra_maincomplex_entry - get_runtime_offset(), TEGRA_EXCEPTION_VECTORS_BASE + 0x100); + /* put boarddata in scratch reg, for main CPU to fetch after startup */ + writel(boarddata, TEGRA_PMC_BASE + PMC_SCRATCH(10)); + /* bring up main CPU complex */ start_cpu0_clocks(); maincomplex_powerup(); diff --git a/arch/arm/mach-tegra/tegra_maincomplex_init.c b/arch/arm/mach-tegra/tegra_maincomplex_init.c index c485760db..b3d59abd6 100644 --- a/arch/arm/mach-tegra/tegra_maincomplex_init.c +++ b/arch/arm/mach-tegra/tegra_maincomplex_init.c @@ -19,6 +19,7 @@ #include #include #include +#include void tegra_maincomplex_entry(void) { @@ -36,5 +37,6 @@ void tegra_maincomplex_entry(void) unreachable(); } - barebox_arm_entry(rambase, ramsize, 0); + barebox_arm_entry(rambase, ramsize, + readl(TEGRA_PMC_BASE + PMC_SCRATCH(10))); } diff --git a/images/Makefile b/images/Makefile index b87f522c1..8e126faee 100644 --- a/images/Makefile +++ b/images/Makefile @@ -108,6 +108,7 @@ $(obj)/%.img: $(obj)/$$(FILE_$$(@F)) include $(srctree)/images/Makefile.imx include $(srctree)/images/Makefile.mvebu +include $(srctree)/images/Makefile.tegra targets += $(image-y) pbl.lds barebox.x barebox.z targets += $(patsubst %,%.pblx,$(pblx-y)) diff --git a/images/Makefile.tegra b/images/Makefile.tegra new file mode 100644 index 000000000..1cf1432c9 --- /dev/null +++ b/images/Makefile.tegra @@ -0,0 +1,14 @@ +# +# barebox image generation Makefile for Tegra images +# + +board = $(srctree)/arch/$(ARCH)/boards + +# ----------------------- Tegra20 based boards --------------------------- +pblx-$(CONFIG_MACH_TOSHIBA_AC100) += start_toshiba_ac100 +FILE_barebox-tegra20-toshiba-ac100.img = start_toshiba_ac100.pblx +image-$(CONFIG_MACH_TOSHIBA_AC100) += barebox-tegra20-toshiba-ac100.img + +pblx-$(CONFIG_MACH_TORADEX_COLIBRI_T20_IRIS) += start_toradex_colibri_t20_iris +FILE_barebox-tegra20-toradex-colibri-t20-iris.img = start_toradex_colibri_t20_iris.pblx +image-$(CONFIG_MACH_TORADEX_COLIBRI_T20_IRIS) += barebox-tegra20-toradex-colibri-t20-iris.img