mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-21 04:14:34 +00:00
ARM: tegra: add core Tegra186 support
This adds the bare minimum code to support Tegra186, with UART and eMMC working. The empty gpio.h is required because <asm/gpio.h> includes it. A future cleanup round may be able to solve this for all Tegra generations at once. mach-tegra/Makefile is adjusted not to compile anything for Tegra186, but instead to defer everything to mach-tegra/tegra186/Makefile. This allows the SoC code to pick-and-choose which of the C files in the "common" mach-tegra/ directory to compile in based on the SoC's needs. Most of the code is not valid for Tegra186, and this approach removes the need for mach-tegra/Makefile to contain many SoC-specific ifdefs. This approach may be applied to all other Tegra SoCs in a future cleanup round. board186.c is introduced to replace board.c and board2.c. These files currently contain a slew of SoC- and board-specific code that is not valid for Tegra186. This approach avoids adding yet more ifdefs to those files. A future cleanup round may refactor most of board*.c into board-/ SoC-specific functions files thus allowing the top-level functions like board_init_early_f to be shared again. Signed-off-by: Stephen Warren <swarren@nvidia.com> Reviewed-by: Simon Glass <sjg@chromium.org> Signed-off-by: Tom Warren <twarren@nvidia.com>
This commit is contained in:
parent
39f633320c
commit
c7ba99c8c1
9 changed files with 240 additions and 0 deletions
56
arch/arm/dts/tegra186.dtsi
Normal file
56
arch/arm/dts/tegra186.dtsi
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
#include "skeleton.dtsi"
|
||||||
|
#include <dt-bindings/gpio/tegra-gpio.h>
|
||||||
|
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||||
|
|
||||||
|
/ {
|
||||||
|
compatible = "nvidia,tegra186";
|
||||||
|
#address-cells = <2>;
|
||||||
|
#size-cells = <2>;
|
||||||
|
|
||||||
|
gpio@2200000 {
|
||||||
|
compatible = "nvidia,tegra186-gpio";
|
||||||
|
reg-names = "security", "gpio";
|
||||||
|
reg =
|
||||||
|
<0x0 0x2200000 0x0 0x10000>,
|
||||||
|
<0x0 0x2210000 0x0 0x10000>;
|
||||||
|
interrupts =
|
||||||
|
<GIC_SPI 47 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 50 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 59 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 180 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
uarta: serial@3100000 {
|
||||||
|
compatible = "nvidia,tegra186-uart", "nvidia,tegra20-uart";
|
||||||
|
reg = <0x0 0x03100000 0x0 0x10000>;
|
||||||
|
reg-shift = <2>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
sdhci@3460000 {
|
||||||
|
compatible = "nvidia,tegra186-sdhci";
|
||||||
|
reg = <0x0 0x03460000 0x0 0x200>;
|
||||||
|
interrupts = <GIC_SPI 31 0x04>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
gpio@c2f0000 {
|
||||||
|
compatible = "nvidia,tegra186-gpio-aon";
|
||||||
|
reg-names = "security", "gpio";
|
||||||
|
reg =
|
||||||
|
<0x0 0xc2f0000 0x0 0x1000>,
|
||||||
|
<0x0 0xc2f1000 0x0 0x1000>;
|
||||||
|
interrupts =
|
||||||
|
<GIC_SPI 60 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
gpio-controller;
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
};
|
||||||
|
};
|
10
arch/arm/include/asm/arch-tegra186/gpio.h
Normal file
10
arch/arm/include/asm/arch-tegra186/gpio.h
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016, NVIDIA CORPORATION.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _TEGRA186_GPIO_H_
|
||||||
|
#define _TEGRA186_GPIO_H_
|
||||||
|
|
||||||
|
#endif
|
16
arch/arm/include/asm/arch-tegra186/tegra.h
Normal file
16
arch/arm/include/asm/arch-tegra186/tegra.h
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2013-2016, NVIDIA CORPORATION.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _TEGRA186_TEGRA_H_
|
||||||
|
#define _TEGRA186_TEGRA_H_
|
||||||
|
|
||||||
|
#define GICD_BASE 0x03881000 /* Generic Int Cntrlr Distrib */
|
||||||
|
#define GICC_BASE 0x03882000 /* Generic Int Cntrlr CPU I/F */
|
||||||
|
#define NV_PA_SDRAM_BASE 0x80000000
|
||||||
|
|
||||||
|
#include <asm/arch-tegra/tegra.h>
|
||||||
|
|
||||||
|
#endif
|
|
@ -54,6 +54,11 @@ config TEGRA210
|
||||||
select TEGRA_GPIO
|
select TEGRA_GPIO
|
||||||
select TEGRA_ARMV8_COMMON
|
select TEGRA_ARMV8_COMMON
|
||||||
|
|
||||||
|
config TEGRA186
|
||||||
|
bool "Tegra186 family"
|
||||||
|
select TEGRA186_GPIO
|
||||||
|
select TEGRA_ARMV8_COMMON
|
||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
config TEGRA_DISCONNECT_UDC_ON_BOOT
|
config TEGRA_DISCONNECT_UDC_ON_BOOT
|
||||||
|
@ -77,5 +82,6 @@ source "arch/arm/mach-tegra/tegra30/Kconfig"
|
||||||
source "arch/arm/mach-tegra/tegra114/Kconfig"
|
source "arch/arm/mach-tegra/tegra114/Kconfig"
|
||||||
source "arch/arm/mach-tegra/tegra124/Kconfig"
|
source "arch/arm/mach-tegra/tegra124/Kconfig"
|
||||||
source "arch/arm/mach-tegra/tegra210/Kconfig"
|
source "arch/arm/mach-tegra/tegra210/Kconfig"
|
||||||
|
source "arch/arm/mach-tegra/tegra186/Kconfig"
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
# SPDX-License-Identifier: GPL-2.0+
|
# SPDX-License-Identifier: GPL-2.0+
|
||||||
#
|
#
|
||||||
|
|
||||||
|
ifndef CONFIG_TEGRA186
|
||||||
ifdef CONFIG_SPL_BUILD
|
ifdef CONFIG_SPL_BUILD
|
||||||
obj-y += spl.o
|
obj-y += spl.o
|
||||||
obj-y += cpu.o
|
obj-y += cpu.o
|
||||||
|
@ -30,9 +31,11 @@ obj-$(CONFIG_TEGRA_CLOCK_SCALING) += emc.o
|
||||||
ifndef CONFIG_SPL_BUILD
|
ifndef CONFIG_SPL_BUILD
|
||||||
obj-$(CONFIG_ARMV7_PSCI) += psci.o
|
obj-$(CONFIG_ARMV7_PSCI) += psci.o
|
||||||
endif
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
obj-$(CONFIG_TEGRA20) += tegra20/
|
obj-$(CONFIG_TEGRA20) += tegra20/
|
||||||
obj-$(CONFIG_TEGRA30) += tegra30/
|
obj-$(CONFIG_TEGRA30) += tegra30/
|
||||||
obj-$(CONFIG_TEGRA114) += tegra114/
|
obj-$(CONFIG_TEGRA114) += tegra114/
|
||||||
obj-$(CONFIG_TEGRA124) += tegra124/
|
obj-$(CONFIG_TEGRA124) += tegra124/
|
||||||
|
obj-$(CONFIG_TEGRA186) += tegra186/
|
||||||
obj-$(CONFIG_TEGRA210) += tegra210/
|
obj-$(CONFIG_TEGRA210) += tegra210/
|
||||||
|
|
55
arch/arm/mach-tegra/board186.c
Normal file
55
arch/arm/mach-tegra/board186.c
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016, NVIDIA CORPORATION.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
#include <asm/arch/tegra.h>
|
||||||
|
#include <asm/arch-tegra/mmc.h>
|
||||||
|
#include <asm/arch-tegra/tegra_mmc.h>
|
||||||
|
|
||||||
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
int dram_init(void)
|
||||||
|
{
|
||||||
|
gd->ram_size = (1.5 * 1024 * 1024 * 1024);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int board_early_init_f(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int board_init(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int board_late_init(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void dram_init_banksize(void)
|
||||||
|
{
|
||||||
|
gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE;
|
||||||
|
gd->bd->bi_dram[0].size = gd->ram_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
void pad_init_mmc(struct mmc_host *host)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int board_mmc_init(bd_t *bd)
|
||||||
|
{
|
||||||
|
tegra_mmc_init();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ft_system_setup(void *blob, bd_t *bd)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
15
arch/arm/mach-tegra/tegra186/Kconfig
Normal file
15
arch/arm/mach-tegra/tegra186/Kconfig
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
# Copyright (c) 2016, NVIDIA CORPORATION.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
|
if TEGRA186
|
||||||
|
|
||||||
|
choice
|
||||||
|
prompt "Tegra186 board select"
|
||||||
|
|
||||||
|
endchoice
|
||||||
|
|
||||||
|
config SYS_SOC
|
||||||
|
default "tegra186"
|
||||||
|
|
||||||
|
endif
|
8
arch/arm/mach-tegra/tegra186/Makefile
Normal file
8
arch/arm/mach-tegra/tegra186/Makefile
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
# Copyright (c) 2016, NVIDIA CORPORATION.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
|
obj-y += ../arm64-mmu.o
|
||||||
|
obj-y += ../board186.o
|
||||||
|
obj-y += ../lowlevel_init.o
|
||||||
|
obj-$(CONFIG_DISPLAY_CPUINFO) += ../sys_info.o
|
71
include/configs/tegra186-common.h
Normal file
71
include/configs/tegra186-common.h
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2013-2016, NVIDIA CORPORATION.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _TEGRA186_COMMON_H_
|
||||||
|
#define _TEGRA186_COMMON_H_
|
||||||
|
|
||||||
|
#include "tegra-common.h"
|
||||||
|
|
||||||
|
/* Cortex-A57 uses a cache line size of 64 bytes */
|
||||||
|
#define CONFIG_SYS_CACHELINE_SIZE 64
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NS16550 Configuration
|
||||||
|
*/
|
||||||
|
#define V_NS16550_CLK 408000000 /* 408MHz (pllp_out0) */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Miscellaneous configurable options
|
||||||
|
*/
|
||||||
|
#define CONFIG_STACKBASE 0x82800000 /* 40MB */
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------
|
||||||
|
* Physical Memory Map
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define CONFIG_SYS_TEXT_BASE 0x80080000
|
||||||
|
|
||||||
|
/* Generic Interrupt Controller */
|
||||||
|
#define CONFIG_GICV2
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Memory layout for where various images get loaded by boot scripts:
|
||||||
|
*
|
||||||
|
* scriptaddr can be pretty much anywhere that doesn't conflict with something
|
||||||
|
* else. Put it above BOOTMAPSZ to eliminate conflicts.
|
||||||
|
*
|
||||||
|
* pxefile_addr_r can be pretty much anywhere that doesn't conflict with
|
||||||
|
* something else. Put it above BOOTMAPSZ to eliminate conflicts.
|
||||||
|
*
|
||||||
|
* kernel_addr_r must be within the first 128M of RAM in order for the
|
||||||
|
* kernel's CONFIG_AUTO_ZRELADDR option to work. Since the kernel will
|
||||||
|
* decompress itself to 0x8000 after the start of RAM, kernel_addr_r
|
||||||
|
* should not overlap that area, or the kernel will have to copy itself
|
||||||
|
* somewhere else before decompression. Similarly, the address of any other
|
||||||
|
* data passed to the kernel shouldn't overlap the start of RAM. Pushing
|
||||||
|
* this up to 16M allows for a sizable kernel to be decompressed below the
|
||||||
|
* compressed load address.
|
||||||
|
*
|
||||||
|
* fdt_addr_r simply shouldn't overlap anything else. Choosing 32M allows for
|
||||||
|
* the compressed kernel to be up to 16M too.
|
||||||
|
*
|
||||||
|
* ramdisk_addr_r simply shouldn't overlap anything else. Choosing 33M allows
|
||||||
|
* for the FDT/DTB to be up to 1M, which is hopefully plenty.
|
||||||
|
*/
|
||||||
|
#define CONFIG_LOADADDR 0x80080000
|
||||||
|
#define MEM_LAYOUT_ENV_SETTINGS \
|
||||||
|
"scriptaddr=0x90000000\0" \
|
||||||
|
"pxefile_addr_r=0x90100000\0" \
|
||||||
|
"kernel_addr_r=" __stringify(CONFIG_LOADADDR) "\0" \
|
||||||
|
"fdt_addr_r=0x82000000\0" \
|
||||||
|
"ramdisk_addr_r=0x82100000\0"
|
||||||
|
|
||||||
|
/* Defines for SPL */
|
||||||
|
#define CONFIG_SPL_TEXT_BASE 0x80108000
|
||||||
|
#define CONFIG_SYS_SPL_MALLOC_START 0x80090000
|
||||||
|
#define CONFIG_SPL_STACK 0x800ffffc
|
||||||
|
|
||||||
|
#endif
|
Loading…
Add table
Reference in a new issue