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
|
@ -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>;
|
||||
};
|
||||
};
|
|
@ -0,0 +1,10 @@
|
|||
/*
|
||||
* Copyright (c) 2016, NVIDIA CORPORATION.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0
|
||||
*/
|
||||
|
||||
#ifndef _TEGRA186_GPIO_H_
|
||||
#define _TEGRA186_GPIO_H_
|
||||
|
||||
#endif
|
|
@ -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_ARMV8_COMMON
|
||||
|
||||
config TEGRA186
|
||||
bool "Tegra186 family"
|
||||
select TEGRA186_GPIO
|
||||
select TEGRA_ARMV8_COMMON
|
||||
|
||||
endchoice
|
||||
|
||||
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/tegra124/Kconfig"
|
||||
source "arch/arm/mach-tegra/tegra210/Kconfig"
|
||||
source "arch/arm/mach-tegra/tegra186/Kconfig"
|
||||
|
||||
endif
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
|
||||
ifndef CONFIG_TEGRA186
|
||||
ifdef CONFIG_SPL_BUILD
|
||||
obj-y += spl.o
|
||||
obj-y += cpu.o
|
||||
|
@ -30,9 +31,11 @@ obj-$(CONFIG_TEGRA_CLOCK_SCALING) += emc.o
|
|||
ifndef CONFIG_SPL_BUILD
|
||||
obj-$(CONFIG_ARMV7_PSCI) += psci.o
|
||||
endif
|
||||
endif
|
||||
|
||||
obj-$(CONFIG_TEGRA20) += tegra20/
|
||||
obj-$(CONFIG_TEGRA30) += tegra30/
|
||||
obj-$(CONFIG_TEGRA114) += tegra114/
|
||||
obj-$(CONFIG_TEGRA124) += tegra124/
|
||||
obj-$(CONFIG_TEGRA186) += tegra186/
|
||||
obj-$(CONFIG_TEGRA210) += tegra210/
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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
|
|
@ -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
|
|
@ -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…
Reference in New Issue