1445a886dSMacpaul Lin/* 2445a886dSMacpaul Lin * Copyright (C) 2011 Andes Technology Corporation 3445a886dSMacpaul Lin * Shawn Lin, Andes Technology Corporation <nobuhiro@andestech.com> 4445a886dSMacpaul Lin * Macpaul Lin, Andes Technology Corporation <macpaul@andestech.com> 5445a886dSMacpaul Lin * 61a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 7445a886dSMacpaul Lin */ 8445a886dSMacpaul Lin 9d607f6faSrick.pic 10d607f6faSrick 11445a886dSMacpaul Lin.text 12445a886dSMacpaul Lin 13445a886dSMacpaul Lin#include <common.h> 14445a886dSMacpaul Lin#include <config.h> 15445a886dSMacpaul Lin 16445a886dSMacpaul Lin#include <asm/macro.h> 17445a886dSMacpaul Lin#include <generated/asm-offsets.h> 18445a886dSMacpaul Lin 19445a886dSMacpaul Lin/* 20445a886dSMacpaul Lin * parameters for the SDRAM controller 21445a886dSMacpaul Lin */ 22445a886dSMacpaul Lin#define SDMC_TP1_A (CONFIG_FTSDMC021_BASE + FTSDMC021_TP1) 23445a886dSMacpaul Lin#define SDMC_TP2_A (CONFIG_FTSDMC021_BASE + FTSDMC021_TP2) 24445a886dSMacpaul Lin#define SDMC_CR1_A (CONFIG_FTSDMC021_BASE + FTSDMC021_CR1) 25445a886dSMacpaul Lin#define SDMC_CR2_A (CONFIG_FTSDMC021_BASE + FTSDMC021_CR2) 26445a886dSMacpaul Lin#define SDMC_B0_BSR_A (CONFIG_FTSDMC021_BASE + FTSDMC021_BANK0_BSR) 273c016704Sken kuo#define SDMC_B1_BSR_A (CONFIG_FTSDMC021_BASE + FTSDMC021_BANK1_BSR) 28445a886dSMacpaul Lin 29445a886dSMacpaul Lin#define SDMC_TP1_D CONFIG_SYS_FTSDMC021_TP1 30445a886dSMacpaul Lin#define SDMC_TP2_D CONFIG_SYS_FTSDMC021_TP2 31445a886dSMacpaul Lin#define SDMC_CR1_D CONFIG_SYS_FTSDMC021_CR1 32445a886dSMacpaul Lin#define SDMC_CR2_D CONFIG_SYS_FTSDMC021_CR2 33445a886dSMacpaul Lin 34445a886dSMacpaul Lin#define SDMC_B0_BSR_D CONFIG_SYS_FTSDMC021_BANK0_BSR 353c016704Sken kuo#define SDMC_B1_BSR_D CONFIG_SYS_FTSDMC021_BANK1_BSR 36445a886dSMacpaul Lin 37f889cc81Srick 38f889cc81Srick/* 39f889cc81Srick * for Orca and Emerald 40f889cc81Srick */ 41f889cc81Srick#define BOARD_ID_REG 0x104 42f889cc81Srick#define BOARD_ID_FAMILY_MASK 0xfff000 43f889cc81Srick#define BOARD_ID_FAMILY_V5 0x556000 44f889cc81Srick#define BOARD_ID_FAMILY_K7 0x74b000 45f889cc81Srick 46445a886dSMacpaul Lin/* 47445a886dSMacpaul Lin * parameters for the static memory controller 48445a886dSMacpaul Lin */ 49445a886dSMacpaul Lin#define SMC_BANK0_CR_A (CONFIG_FTSMC020_BASE + FTSMC020_BANK0_CR) 50445a886dSMacpaul Lin#define SMC_BANK0_TPR_A (CONFIG_FTSMC020_BASE + FTSMC020_BANK0_TPR) 51445a886dSMacpaul Lin 52445a886dSMacpaul Lin#define SMC_BANK0_CR_D FTSMC020_BANK0_LOWLV_CONFIG 53445a886dSMacpaul Lin#define SMC_BANK0_TPR_D FTSMC020_BANK0_LOWLV_TIMING 54445a886dSMacpaul Lin 55445a886dSMacpaul Lin/* 56445a886dSMacpaul Lin * parameters for the ahbc controller 57445a886dSMacpaul Lin */ 58445a886dSMacpaul Lin#define AHBC_CR_A (CONFIG_FTAHBC020S_BASE + FTAHBC020S_CR) 59445a886dSMacpaul Lin#define AHBC_BSR6_A (CONFIG_FTAHBC020S_BASE + FTAHBC020S_SLAVE_BSR_6) 60445a886dSMacpaul Lin 61f889cc81Srick/* 62f889cc81Srick * for Orca and Emerald 63f889cc81Srick */ 64f889cc81Srick#define AHBC_BSR4_A (CONFIG_FTAHBC020S_BASE + FTAHBC020S_SLAVE_BSR_4) 65445a886dSMacpaul Lin#define AHBC_BSR6_D CONFIG_SYS_FTAHBC020S_SLAVE_BSR_6 66445a886dSMacpaul Lin 67445a886dSMacpaul Lin/* 68445a886dSMacpaul Lin * parameters for the pmu controoler 69445a886dSMacpaul Lin */ 70445a886dSMacpaul Lin#define PMU_PDLLCR0_A (CONFIG_FTPMU010_BASE + FTPMU010_PDLLCR0) 71445a886dSMacpaul Lin 72445a886dSMacpaul Lin/* 73445a886dSMacpaul Lin * numeric 7 segment display 74445a886dSMacpaul Lin */ 75445a886dSMacpaul Lin.macro led, num 76445a886dSMacpaul Lin write32 CONFIG_DEBUG_LED, \num 77445a886dSMacpaul Lin.endm 78445a886dSMacpaul Lin 79445a886dSMacpaul Lin/* 80445a886dSMacpaul Lin * Waiting for SDRAM to set up 81445a886dSMacpaul Lin */ 82445a886dSMacpaul Lin.macro wait_sdram 83445a886dSMacpaul Lin li $r0, CONFIG_FTSDMC021_BASE 84445a886dSMacpaul Lin1: 85445a886dSMacpaul Lin lwi $r1, [$r0+FTSDMC021_CR2] 86445a886dSMacpaul Lin bnez $r1, 1b 87445a886dSMacpaul Lin.endm 88445a886dSMacpaul Lin 89*b841b6e9Srick.globl mem_init 90445a886dSMacpaul Linmem_init: 91445a886dSMacpaul Lin move $r11, $lp 92445a886dSMacpaul Lin 93445a886dSMacpaul Lin /* 94445a886dSMacpaul Lin * mem_init: 95445a886dSMacpaul Lin * There are 2 bank connected to FTSMC020 on AG101 96445a886dSMacpaul Lin * BANK0: FLASH/ROM (SW5, J16), BANK1: OnBoard SDRAM. 97445a886dSMacpaul Lin * we need to set onboard SDRAM before remap and relocation. 98445a886dSMacpaul Lin */ 99445a886dSMacpaul Lin led 0x01 100f889cc81Srick 101f889cc81Srick /* 102f889cc81Srick * for Orca and Emerald 103f889cc81Srick * disable write protection and reset bank size 104f889cc81Srick */ 105f889cc81Srick li $r0, SMC_BANK0_CR_A 106f889cc81Srick lwi $r1, [$r0+#0x00] 107f889cc81Srick ori $r1, $r1, 0x8f0 108f889cc81Srick xori $r1, $r1, 0x8f0 109*b841b6e9Srick /* check board */ 110f889cc81Srick li $r3, CONFIG_FTPMU010_BASE + BOARD_ID_REG 111f889cc81Srick lwi $r3, [$r3] 112f889cc81Srick li $r4, BOARD_ID_FAMILY_MASK 113f889cc81Srick and $r3, $r3, $r4 114f889cc81Srick li $r4, BOARD_ID_FAMILY_K7 115f889cc81Srick xor $r4, $r3, $r4 116f889cc81Srick beqz $r4, use_flash_16bit_boot 117*b841b6e9Srick /* 32-bit mode */ 118f889cc81Srickuse_flash_32bit_boot: 119f889cc81Srick ori $r1, $r1, 0x50 120f889cc81Srick li $r2, 0x00151151 121f889cc81Srick j sdram_b0_cr 122*b841b6e9Srick /* 16-bit mode */ 123f889cc81Srickuse_flash_16bit_boot: 124f889cc81Srick ori $r1, $r1, 0x60 125f889cc81Srick li $r2, 0x00153153 126*b841b6e9Srick /* SRAM bank0 config */ 127f889cc81Sricksdram_b0_cr: 128f889cc81Srick swi $r1, [$r0+#0x00] 129f889cc81Srick swi $r2, [$r0+#0x04] 130445a886dSMacpaul Lin 131*b841b6e9Srick /* config AHB Controller */ 132445a886dSMacpaul Lin led 0x02 133445a886dSMacpaul Lin 134445a886dSMacpaul Lin /* 135445a886dSMacpaul Lin * config PMU controller 136445a886dSMacpaul Lin */ 137445a886dSMacpaul Lin /* ftpmu010_dlldis_disable, must do it in lowleve_init */ 138445a886dSMacpaul Lin led 0x03 139445a886dSMacpaul Lin setbf32 PMU_PDLLCR0_A, FTPMU010_PDLLCR0_DLLDIS ! 0x00010000 140445a886dSMacpaul Lin 141445a886dSMacpaul Lin /* 142445a886dSMacpaul Lin * config SDRAM controller 143445a886dSMacpaul Lin */ 144445a886dSMacpaul Lin led 0x04 145445a886dSMacpaul Lin write32 SDMC_TP1_A, SDMC_TP1_D ! 0x00011312 146445a886dSMacpaul Lin led 0x05 147445a886dSMacpaul Lin write32 SDMC_TP2_A, SDMC_TP2_D ! 0x00480180 148445a886dSMacpaul Lin led 0x06 149445a886dSMacpaul Lin write32 SDMC_CR1_A, SDMC_CR1_D ! 0x00002326 150445a886dSMacpaul Lin 151445a886dSMacpaul Lin led 0x07 152445a886dSMacpaul Lin write32 SDMC_CR2_A, FTSDMC021_CR2_IPREC ! 0x00000010 153445a886dSMacpaul Lin wait_sdram 154445a886dSMacpaul Lin 155445a886dSMacpaul Lin led 0x08 156445a886dSMacpaul Lin write32 SDMC_CR2_A, FTSDMC021_CR2_ISMR ! 0x00000004 157445a886dSMacpaul Lin wait_sdram 158445a886dSMacpaul Lin 159445a886dSMacpaul Lin led 0x09 160445a886dSMacpaul Lin write32 SDMC_CR2_A, FTSDMC021_CR2_IREF ! 0x00000008 161445a886dSMacpaul Lin wait_sdram 162445a886dSMacpaul Lin 163445a886dSMacpaul Lin led 0x0a 164445a886dSMacpaul Lin move $lp, $r11 165445a886dSMacpaul Lin ret 166445a886dSMacpaul Lin 167*b841b6e9Srick 168*b841b6e9Srick#ifndef CONFIG_SKIP_LOWLEVEL_INIT 169*b841b6e9Srick 170*b841b6e9Srick.globl lowlevel_init 171*b841b6e9Sricklowlevel_init: 172*b841b6e9Srick move $r10, $lp 173*b841b6e9Srick led 0x10 174*b841b6e9Srick jal remap 175*b841b6e9Srick#if (defined(NDS32_EXT_FPU_DP) || defined(NDS32_EXT_FPU_SP)) 176*b841b6e9Srick led 0x1f 177*b841b6e9Srick jal enable_fpu 178*b841b6e9Srick#endif 179*b841b6e9Srick led 0x20 180*b841b6e9Srick ret $r10 181*b841b6e9Srick 182445a886dSMacpaul Linremap: 183445a886dSMacpaul Lin move $r11, $lp 184445a886dSMacpaul Lin#ifdef __NDS32_N1213_43U1H__ /* NDS32 V0 ISA - AG101 Only */ 185445a886dSMacpaul Lin bal 2f 186445a886dSMacpaul Linrelo_base: 187445a886dSMacpaul Lin move $r0, $lp 188445a886dSMacpaul Lin#else 189445a886dSMacpaul Linrelo_base: 190445a886dSMacpaul Lin mfusr $r0, $pc 191445a886dSMacpaul Lin#endif /* __NDS32_N1213_43U1H__ */ 192445a886dSMacpaul Lin 193*b841b6e9Srick /* Remapping */ 194445a886dSMacpaul Lin led 0x1a 1952e88bb28SKun-Hua Huang write32 SDMC_B0_BSR_A, SDMC_B0_BSR_D ! 0x00001800 1962e88bb28SKun-Hua Huang write32 SDMC_B1_BSR_A, SDMC_B1_BSR_D ! 0x00001880 197445a886dSMacpaul Lin 198445a886dSMacpaul Lin /* clear empty BSR registers */ 199445a886dSMacpaul Lin led 0x1b 200445a886dSMacpaul Lin li $r4, CONFIG_FTSDMC021_BASE 201445a886dSMacpaul Lin li $r5, 0x0 202445a886dSMacpaul Lin swi $r5, [$r4 + FTSDMC021_BANK2_BSR] 203445a886dSMacpaul Lin swi $r5, [$r4 + FTSDMC021_BANK3_BSR] 204445a886dSMacpaul Lin 205445a886dSMacpaul Lin#ifdef CONFIG_MEM_REMAP 206445a886dSMacpaul Lin /* 207445a886dSMacpaul Lin * Copy ROM code to SDRAM base for memory remap layout. 208445a886dSMacpaul Lin * This is not the real relocation, the real relocation is the function 209445a886dSMacpaul Lin * relocate_code() is start.S which supports the systems is memory 210445a886dSMacpaul Lin * remapped or not. 211445a886dSMacpaul Lin */ 212445a886dSMacpaul Lin /* 213445a886dSMacpaul Lin * Doing memory remap is essential for preparing some non-OS or RTOS 214445a886dSMacpaul Lin * applications. 215445a886dSMacpaul Lin * 216445a886dSMacpaul Lin * This is also a must on ADP-AG101 board. 217445a886dSMacpaul Lin * The reason is because the ROM/FLASH circuit on PCB board. 218445a886dSMacpaul Lin * AG101-A0 board has 2 jumpers MA17 and SW5 to configure which 219445a886dSMacpaul Lin * ROM/FLASH is used to boot. 220445a886dSMacpaul Lin * 221445a886dSMacpaul Lin * When SW5 = "0101", MA17 = LO, the ROM is connected to BANK0, 222445a886dSMacpaul Lin * and the FLASH is connected to BANK1. 223445a886dSMacpaul Lin * When SW5 = "1010", MA17 = HI, the ROM is disabled (still at BANK0), 224445a886dSMacpaul Lin * and the FLASH is connected to BANK0. 225445a886dSMacpaul Lin * It will occur problem when doing flash probing if the flash is at 226445a886dSMacpaul Lin * BANK0 (0x00000000) while memory remapping was skipped. 227445a886dSMacpaul Lin * 228445a886dSMacpaul Lin * Other board like ADP-AG101P may not enable this since there is only 229445a886dSMacpaul Lin * a FLASH connected to bank0. 230445a886dSMacpaul Lin */ 231445a886dSMacpaul Lin led 0x11 232f889cc81Srick /* 233f889cc81Srick * for Orca and Emerald 234f889cc81Srick * read sdram base address automatically 235f889cc81Srick */ 236f889cc81Srick li $r5, AHBC_BSR6_A 237f889cc81Srick lwi $r8, [$r5] 238d607f6faSrick li $r4, 0xfff00000 /* r4 = bank6 base */ 239f889cc81Srick and $r4, $r4, $r8 240f889cc81Srick 241d607f6faSrick la $r5, _start@GOTOFF 242d607f6faSrick la $r6, _end@GOTOFF 243445a886dSMacpaul Lin1: 244445a886dSMacpaul Lin lwi.p $r7, [$r5], #4 245445a886dSMacpaul Lin swi.p $r7, [$r4], #4 246445a886dSMacpaul Lin blt $r5, $r6, 1b 247445a886dSMacpaul Lin 248445a886dSMacpaul Lin /* set remap bit */ 249445a886dSMacpaul Lin /* 250445a886dSMacpaul Lin * MEM remap bit is operational 251445a886dSMacpaul Lin * - use it to map writeable memory at 0x00000000, in place of flash 252445a886dSMacpaul Lin * - before remap: flash/rom 0x00000000, sdram: 0x10000000-0x4fffffff 253445a886dSMacpaul Lin * - after remap: flash/rom 0x80000000, sdram: 0x00000000 254445a886dSMacpaul Lin */ 255445a886dSMacpaul Lin led 0x1c 2563c016704Sken kuo write32 SDMC_B0_BSR_A, 0x00001000 2572e88bb28SKun-Hua Huang write32 SDMC_B1_BSR_A, 0x00001200 2582e88bb28SKun-Hua Huang li $r5, CONFIG_SYS_TEXT_BASE /* flash base address */ 2592e88bb28SKun-Hua Huang add $r11, $r11, $r5 /* add flash address offset for ret */ 2602e88bb28SKun-Hua Huang add $r10, $r10, $r5 2612e88bb28SKun-Hua Huang move $lp, $r11 262445a886dSMacpaul Lin setbf15 AHBC_CR_A, FTAHBC020S_CR_REMAP ! 0x1 263445a886dSMacpaul Lin 264f889cc81Srick /* 265f889cc81Srick * for Orca and Emerald 266f889cc81Srick * extend sdram size from 256MB to 2GB 267f889cc81Srick */ 268f889cc81Srick li $r5, AHBC_BSR6_A 269f889cc81Srick lwi $r6, [$r5] 270f889cc81Srick li $r4, 0xfff0ffff 271f889cc81Srick and $r6 ,$r4, $r6 272f889cc81Srick li $r4, 0x000b0000 273f889cc81Srick or $r6, $r4, $r6 274f889cc81Srick swi $r6, [$r5] 275f889cc81Srick 276f889cc81Srick /* 277f889cc81Srick * for Orca and Emerald 278f889cc81Srick * extend rom base from 256MB to 2GB 279f889cc81Srick */ 280f889cc81Srick li $r4, AHBC_BSR4_A 281f889cc81Srick lwi $r5, [$r4] 282f889cc81Srick li $r6, 0xffffff 283f889cc81Srick and $r5, $r5, $r6 284f889cc81Srick li $r6, 0x80000000 285f889cc81Srick or $r5, $r5, $r6 286f889cc81Srick swi $r5, [$r4] 287445a886dSMacpaul Lin#endif /* #ifdef CONFIG_MEM_REMAP */ 288445a886dSMacpaul Lin move $lp, $r11 289445a886dSMacpaul Lin2: 290445a886dSMacpaul Lin ret 291445a886dSMacpaul Lin 292c54fd3efSken kuo /* 293c54fd3efSken kuo * enable_fpu: 294c54fd3efSken kuo * Some of Andes CPU version support FPU coprocessor, if so, 295c54fd3efSken kuo * and toolchain support FPU instruction set, we should enable it. 296c54fd3efSken kuo */ 297c54fd3efSken kuo#if (defined(NDS32_EXT_FPU_DP) || defined(NDS32_EXT_FPU_SP)) 298c54fd3efSken kuoenable_fpu: 299c54fd3efSken kuo mfsr $r0, $CPU_VER /* enable FPU if it exists */ 300c54fd3efSken kuo srli $r0, $r0, 3 301c54fd3efSken kuo andi $r0, $r0, 1 302c54fd3efSken kuo beqz $r0, 1f /* skip if no COP */ 303c54fd3efSken kuo mfsr $r0, $FUCOP_EXIST 304c54fd3efSken kuo srli $r0, $r0, 31 305c54fd3efSken kuo beqz $r0, 1f /* skip if no FPU */ 306c54fd3efSken kuo mfsr $r0, $FUCOP_CTL 307c54fd3efSken kuo ori $r0, $r0, 1 308c54fd3efSken kuo mtsr $r0, $FUCOP_CTL 309c54fd3efSken kuo1: 310c54fd3efSken kuo ret 311c54fd3efSken kuo#endif 312c54fd3efSken kuo 313445a886dSMacpaul Lin.globl show_led 314445a886dSMacpaul Linshow_led: 315445a886dSMacpaul Lin li $r8, (CONFIG_DEBUG_LED) 316445a886dSMacpaul Lin swi $r7, [$r8] 317445a886dSMacpaul Lin ret 318445a886dSMacpaul Lin#endif /* #ifndef CONFIG_SKIP_LOWLEVEL_INIT */ 319