1*09f455dcSMasahiro Yamada /* 2*09f455dcSMasahiro Yamada * (C) Copyright 2010-2014 3*09f455dcSMasahiro Yamada * NVIDIA Corporation <www.nvidia.com> 4*09f455dcSMasahiro Yamada * 5*09f455dcSMasahiro Yamada * SPDX-License-Identifier: GPL-2.0+ 6*09f455dcSMasahiro Yamada */ 7*09f455dcSMasahiro Yamada 8*09f455dcSMasahiro Yamada /* Tegra AP (Application Processor) code */ 9*09f455dcSMasahiro Yamada 10*09f455dcSMasahiro Yamada #include <common.h> 11*09f455dcSMasahiro Yamada #include <asm/io.h> 12*09f455dcSMasahiro Yamada #include <asm/arch/gp_padctrl.h> 13*09f455dcSMasahiro Yamada #include <asm/arch-tegra/ap.h> 14*09f455dcSMasahiro Yamada #include <asm/arch-tegra/clock.h> 15*09f455dcSMasahiro Yamada #include <asm/arch-tegra/fuse.h> 16*09f455dcSMasahiro Yamada #include <asm/arch-tegra/pmc.h> 17*09f455dcSMasahiro Yamada #include <asm/arch-tegra/scu.h> 18*09f455dcSMasahiro Yamada #include <asm/arch-tegra/tegra.h> 19*09f455dcSMasahiro Yamada #include <asm/arch-tegra/warmboot.h> 20*09f455dcSMasahiro Yamada 21*09f455dcSMasahiro Yamada int tegra_get_chip(void) 22*09f455dcSMasahiro Yamada { 23*09f455dcSMasahiro Yamada int rev; 24*09f455dcSMasahiro Yamada struct apb_misc_gp_ctlr *gp = 25*09f455dcSMasahiro Yamada (struct apb_misc_gp_ctlr *)NV_PA_APB_MISC_GP_BASE; 26*09f455dcSMasahiro Yamada 27*09f455dcSMasahiro Yamada /* 28*09f455dcSMasahiro Yamada * This is undocumented, Chip ID is bits 15:8 of the register 29*09f455dcSMasahiro Yamada * APB_MISC + 0x804, and has value 0x20 for Tegra20, 0x30 for 30*09f455dcSMasahiro Yamada * Tegra30, 0x35 for T114, and 0x40 for Tegra124. 31*09f455dcSMasahiro Yamada */ 32*09f455dcSMasahiro Yamada rev = (readl(&gp->hidrev) & HIDREV_CHIPID_MASK) >> HIDREV_CHIPID_SHIFT; 33*09f455dcSMasahiro Yamada debug("%s: CHIPID is 0x%02X\n", __func__, rev); 34*09f455dcSMasahiro Yamada 35*09f455dcSMasahiro Yamada return rev; 36*09f455dcSMasahiro Yamada } 37*09f455dcSMasahiro Yamada 38*09f455dcSMasahiro Yamada int tegra_get_sku_info(void) 39*09f455dcSMasahiro Yamada { 40*09f455dcSMasahiro Yamada int sku_id; 41*09f455dcSMasahiro Yamada struct fuse_regs *fuse = (struct fuse_regs *)NV_PA_FUSE_BASE; 42*09f455dcSMasahiro Yamada 43*09f455dcSMasahiro Yamada sku_id = readl(&fuse->sku_info) & 0xff; 44*09f455dcSMasahiro Yamada debug("%s: SKU info byte is 0x%02X\n", __func__, sku_id); 45*09f455dcSMasahiro Yamada 46*09f455dcSMasahiro Yamada return sku_id; 47*09f455dcSMasahiro Yamada } 48*09f455dcSMasahiro Yamada 49*09f455dcSMasahiro Yamada int tegra_get_chip_sku(void) 50*09f455dcSMasahiro Yamada { 51*09f455dcSMasahiro Yamada uint sku_id, chip_id; 52*09f455dcSMasahiro Yamada 53*09f455dcSMasahiro Yamada chip_id = tegra_get_chip(); 54*09f455dcSMasahiro Yamada sku_id = tegra_get_sku_info(); 55*09f455dcSMasahiro Yamada 56*09f455dcSMasahiro Yamada switch (chip_id) { 57*09f455dcSMasahiro Yamada case CHIPID_TEGRA20: 58*09f455dcSMasahiro Yamada switch (sku_id) { 59*09f455dcSMasahiro Yamada case SKU_ID_T20_7: 60*09f455dcSMasahiro Yamada case SKU_ID_T20: 61*09f455dcSMasahiro Yamada return TEGRA_SOC_T20; 62*09f455dcSMasahiro Yamada case SKU_ID_T25SE: 63*09f455dcSMasahiro Yamada case SKU_ID_AP25: 64*09f455dcSMasahiro Yamada case SKU_ID_T25: 65*09f455dcSMasahiro Yamada case SKU_ID_AP25E: 66*09f455dcSMasahiro Yamada case SKU_ID_T25E: 67*09f455dcSMasahiro Yamada return TEGRA_SOC_T25; 68*09f455dcSMasahiro Yamada } 69*09f455dcSMasahiro Yamada break; 70*09f455dcSMasahiro Yamada case CHIPID_TEGRA30: 71*09f455dcSMasahiro Yamada switch (sku_id) { 72*09f455dcSMasahiro Yamada case SKU_ID_T33: 73*09f455dcSMasahiro Yamada case SKU_ID_T30: 74*09f455dcSMasahiro Yamada case SKU_ID_TM30MQS_P_A3: 75*09f455dcSMasahiro Yamada default: 76*09f455dcSMasahiro Yamada return TEGRA_SOC_T30; 77*09f455dcSMasahiro Yamada } 78*09f455dcSMasahiro Yamada break; 79*09f455dcSMasahiro Yamada case CHIPID_TEGRA114: 80*09f455dcSMasahiro Yamada switch (sku_id) { 81*09f455dcSMasahiro Yamada case SKU_ID_T114_ENG: 82*09f455dcSMasahiro Yamada case SKU_ID_T114_1: 83*09f455dcSMasahiro Yamada default: 84*09f455dcSMasahiro Yamada return TEGRA_SOC_T114; 85*09f455dcSMasahiro Yamada } 86*09f455dcSMasahiro Yamada break; 87*09f455dcSMasahiro Yamada case CHIPID_TEGRA124: 88*09f455dcSMasahiro Yamada switch (sku_id) { 89*09f455dcSMasahiro Yamada case SKU_ID_T124_ENG: 90*09f455dcSMasahiro Yamada default: 91*09f455dcSMasahiro Yamada return TEGRA_SOC_T124; 92*09f455dcSMasahiro Yamada } 93*09f455dcSMasahiro Yamada break; 94*09f455dcSMasahiro Yamada } 95*09f455dcSMasahiro Yamada 96*09f455dcSMasahiro Yamada /* unknown chip/sku id */ 97*09f455dcSMasahiro Yamada printf("%s: ERROR: UNKNOWN CHIP/SKU ID COMBO (0x%02X/0x%02X)\n", 98*09f455dcSMasahiro Yamada __func__, chip_id, sku_id); 99*09f455dcSMasahiro Yamada return TEGRA_SOC_UNKNOWN; 100*09f455dcSMasahiro Yamada } 101*09f455dcSMasahiro Yamada 102*09f455dcSMasahiro Yamada static void enable_scu(void) 103*09f455dcSMasahiro Yamada { 104*09f455dcSMasahiro Yamada struct scu_ctlr *scu = (struct scu_ctlr *)NV_PA_ARM_PERIPHBASE; 105*09f455dcSMasahiro Yamada u32 reg; 106*09f455dcSMasahiro Yamada 107*09f455dcSMasahiro Yamada /* Only enable the SCU on T20/T25 */ 108*09f455dcSMasahiro Yamada if (tegra_get_chip() != CHIPID_TEGRA20) 109*09f455dcSMasahiro Yamada return; 110*09f455dcSMasahiro Yamada 111*09f455dcSMasahiro Yamada /* If SCU already setup/enabled, return */ 112*09f455dcSMasahiro Yamada if (readl(&scu->scu_ctrl) & SCU_CTRL_ENABLE) 113*09f455dcSMasahiro Yamada return; 114*09f455dcSMasahiro Yamada 115*09f455dcSMasahiro Yamada /* Invalidate all ways for all processors */ 116*09f455dcSMasahiro Yamada writel(0xFFFF, &scu->scu_inv_all); 117*09f455dcSMasahiro Yamada 118*09f455dcSMasahiro Yamada /* Enable SCU - bit 0 */ 119*09f455dcSMasahiro Yamada reg = readl(&scu->scu_ctrl); 120*09f455dcSMasahiro Yamada reg |= SCU_CTRL_ENABLE; 121*09f455dcSMasahiro Yamada writel(reg, &scu->scu_ctrl); 122*09f455dcSMasahiro Yamada } 123*09f455dcSMasahiro Yamada 124*09f455dcSMasahiro Yamada static u32 get_odmdata(void) 125*09f455dcSMasahiro Yamada { 126*09f455dcSMasahiro Yamada /* 127*09f455dcSMasahiro Yamada * ODMDATA is stored in the BCT in IRAM by the BootROM. 128*09f455dcSMasahiro Yamada * The BCT start and size are stored in the BIT in IRAM. 129*09f455dcSMasahiro Yamada * Read the data @ bct_start + (bct_size - 12). This works 130*09f455dcSMasahiro Yamada * on BCTs for currently supported SoCs, which are locked down. 131*09f455dcSMasahiro Yamada * If this changes in new chips, we can revisit this algorithm. 132*09f455dcSMasahiro Yamada */ 133*09f455dcSMasahiro Yamada 134*09f455dcSMasahiro Yamada u32 bct_start, odmdata; 135*09f455dcSMasahiro Yamada 136*09f455dcSMasahiro Yamada bct_start = readl(NV_PA_BASE_SRAM + NVBOOTINFOTABLE_BCTPTR); 137*09f455dcSMasahiro Yamada odmdata = readl(bct_start + BCT_ODMDATA_OFFSET); 138*09f455dcSMasahiro Yamada 139*09f455dcSMasahiro Yamada return odmdata; 140*09f455dcSMasahiro Yamada } 141*09f455dcSMasahiro Yamada 142*09f455dcSMasahiro Yamada static void init_pmc_scratch(void) 143*09f455dcSMasahiro Yamada { 144*09f455dcSMasahiro Yamada struct pmc_ctlr *const pmc = (struct pmc_ctlr *)NV_PA_PMC_BASE; 145*09f455dcSMasahiro Yamada u32 odmdata; 146*09f455dcSMasahiro Yamada int i; 147*09f455dcSMasahiro Yamada 148*09f455dcSMasahiro Yamada /* SCRATCH0 is initialized by the boot ROM and shouldn't be cleared */ 149*09f455dcSMasahiro Yamada for (i = 0; i < 23; i++) 150*09f455dcSMasahiro Yamada writel(0, &pmc->pmc_scratch1+i); 151*09f455dcSMasahiro Yamada 152*09f455dcSMasahiro Yamada /* ODMDATA is for kernel use to determine RAM size, LP config, etc. */ 153*09f455dcSMasahiro Yamada odmdata = get_odmdata(); 154*09f455dcSMasahiro Yamada writel(odmdata, &pmc->pmc_scratch20); 155*09f455dcSMasahiro Yamada } 156*09f455dcSMasahiro Yamada 157*09f455dcSMasahiro Yamada void s_init(void) 158*09f455dcSMasahiro Yamada { 159*09f455dcSMasahiro Yamada /* Init PMC scratch memory */ 160*09f455dcSMasahiro Yamada init_pmc_scratch(); 161*09f455dcSMasahiro Yamada 162*09f455dcSMasahiro Yamada enable_scu(); 163*09f455dcSMasahiro Yamada 164*09f455dcSMasahiro Yamada /* init the cache */ 165*09f455dcSMasahiro Yamada config_cache(); 166*09f455dcSMasahiro Yamada 167*09f455dcSMasahiro Yamada /* init vpr */ 168*09f455dcSMasahiro Yamada config_vpr(); 169*09f455dcSMasahiro Yamada } 170