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>master
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 |
@ -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