1*4882a593Smuzhiyun/* 2*4882a593Smuzhiyun * Copyright (C) 2011 Andes Technology Corporation 3*4882a593Smuzhiyun * Shawn Lin, Andes Technology Corporation <nobuhiro@andestech.com> 4*4882a593Smuzhiyun * Macpaul Lin, Andes Technology Corporation <macpaul@andestech.com> 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun.pic 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun.text 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun#include <common.h> 14*4882a593Smuzhiyun#include <config.h> 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun#include <asm/macro.h> 17*4882a593Smuzhiyun#include <generated/asm-offsets.h> 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun/* 20*4882a593Smuzhiyun * parameters for the SDRAM controller 21*4882a593Smuzhiyun */ 22*4882a593Smuzhiyun#define SDMC_TP1_A (CONFIG_FTSDMC021_BASE + FTSDMC021_TP1) 23*4882a593Smuzhiyun#define SDMC_TP2_A (CONFIG_FTSDMC021_BASE + FTSDMC021_TP2) 24*4882a593Smuzhiyun#define SDMC_CR1_A (CONFIG_FTSDMC021_BASE + FTSDMC021_CR1) 25*4882a593Smuzhiyun#define SDMC_CR2_A (CONFIG_FTSDMC021_BASE + FTSDMC021_CR2) 26*4882a593Smuzhiyun#define SDMC_B0_BSR_A (CONFIG_FTSDMC021_BASE + FTSDMC021_BANK0_BSR) 27*4882a593Smuzhiyun#define SDMC_B1_BSR_A (CONFIG_FTSDMC021_BASE + FTSDMC021_BANK1_BSR) 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun#define SDMC_TP1_D CONFIG_SYS_FTSDMC021_TP1 30*4882a593Smuzhiyun#define SDMC_TP2_D CONFIG_SYS_FTSDMC021_TP2 31*4882a593Smuzhiyun#define SDMC_CR1_D CONFIG_SYS_FTSDMC021_CR1 32*4882a593Smuzhiyun#define SDMC_CR2_D CONFIG_SYS_FTSDMC021_CR2 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun#define SDMC_B0_BSR_D CONFIG_SYS_FTSDMC021_BANK0_BSR 35*4882a593Smuzhiyun#define SDMC_B1_BSR_D CONFIG_SYS_FTSDMC021_BANK1_BSR 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun/* 39*4882a593Smuzhiyun * for Orca and Emerald 40*4882a593Smuzhiyun */ 41*4882a593Smuzhiyun#define BOARD_ID_REG 0x104 42*4882a593Smuzhiyun#define BOARD_ID_FAMILY_MASK 0xfff000 43*4882a593Smuzhiyun#define BOARD_ID_FAMILY_V5 0x556000 44*4882a593Smuzhiyun#define BOARD_ID_FAMILY_K7 0x74b000 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun/* 47*4882a593Smuzhiyun * parameters for the static memory controller 48*4882a593Smuzhiyun */ 49*4882a593Smuzhiyun#define SMC_BANK0_CR_A (CONFIG_FTSMC020_BASE + FTSMC020_BANK0_CR) 50*4882a593Smuzhiyun#define SMC_BANK0_TPR_A (CONFIG_FTSMC020_BASE + FTSMC020_BANK0_TPR) 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun#define SMC_BANK0_CR_D FTSMC020_BANK0_LOWLV_CONFIG 53*4882a593Smuzhiyun#define SMC_BANK0_TPR_D FTSMC020_BANK0_LOWLV_TIMING 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun/* 56*4882a593Smuzhiyun * parameters for the ahbc controller 57*4882a593Smuzhiyun */ 58*4882a593Smuzhiyun#define AHBC_CR_A (CONFIG_FTAHBC020S_BASE + FTAHBC020S_CR) 59*4882a593Smuzhiyun#define AHBC_BSR6_A (CONFIG_FTAHBC020S_BASE + FTAHBC020S_SLAVE_BSR_6) 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun/* 62*4882a593Smuzhiyun * for Orca and Emerald 63*4882a593Smuzhiyun */ 64*4882a593Smuzhiyun#define AHBC_BSR4_A (CONFIG_FTAHBC020S_BASE + FTAHBC020S_SLAVE_BSR_4) 65*4882a593Smuzhiyun#define AHBC_BSR6_D CONFIG_SYS_FTAHBC020S_SLAVE_BSR_6 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun/* 68*4882a593Smuzhiyun * parameters for the pmu controoler 69*4882a593Smuzhiyun */ 70*4882a593Smuzhiyun#define PMU_PDLLCR0_A (CONFIG_FTPMU010_BASE + FTPMU010_PDLLCR0) 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun/* 73*4882a593Smuzhiyun * numeric 7 segment display 74*4882a593Smuzhiyun */ 75*4882a593Smuzhiyun.macro led, num 76*4882a593Smuzhiyun write32 CONFIG_DEBUG_LED, \num 77*4882a593Smuzhiyun.endm 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun/* 80*4882a593Smuzhiyun * Waiting for SDRAM to set up 81*4882a593Smuzhiyun */ 82*4882a593Smuzhiyun.macro wait_sdram 83*4882a593Smuzhiyun li $r0, CONFIG_FTSDMC021_BASE 84*4882a593Smuzhiyun1: 85*4882a593Smuzhiyun lwi $r1, [$r0+FTSDMC021_CR2] 86*4882a593Smuzhiyun bnez $r1, 1b 87*4882a593Smuzhiyun.endm 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun.globl mem_init 90*4882a593Smuzhiyunmem_init: 91*4882a593Smuzhiyun move $r11, $lp 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun /* 94*4882a593Smuzhiyun * mem_init: 95*4882a593Smuzhiyun * There are 2 bank connected to FTSMC020 on AG101 96*4882a593Smuzhiyun * BANK0: FLASH/ROM (SW5, J16), BANK1: OnBoard SDRAM. 97*4882a593Smuzhiyun * we need to set onboard SDRAM before remap and relocation. 98*4882a593Smuzhiyun */ 99*4882a593Smuzhiyun led 0x01 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun /* 102*4882a593Smuzhiyun * for Orca and Emerald 103*4882a593Smuzhiyun * disable write protection and reset bank size 104*4882a593Smuzhiyun */ 105*4882a593Smuzhiyun li $r0, SMC_BANK0_CR_A 106*4882a593Smuzhiyun lwi $r1, [$r0+#0x00] 107*4882a593Smuzhiyun ori $r1, $r1, 0x8f0 108*4882a593Smuzhiyun xori $r1, $r1, 0x8f0 109*4882a593Smuzhiyun /* check board */ 110*4882a593Smuzhiyun li $r3, CONFIG_FTPMU010_BASE + BOARD_ID_REG 111*4882a593Smuzhiyun lwi $r3, [$r3] 112*4882a593Smuzhiyun li $r4, BOARD_ID_FAMILY_MASK 113*4882a593Smuzhiyun and $r3, $r3, $r4 114*4882a593Smuzhiyun li $r4, BOARD_ID_FAMILY_K7 115*4882a593Smuzhiyun xor $r4, $r3, $r4 116*4882a593Smuzhiyun beqz $r4, use_flash_16bit_boot 117*4882a593Smuzhiyun /* 32-bit mode */ 118*4882a593Smuzhiyunuse_flash_32bit_boot: 119*4882a593Smuzhiyun ori $r1, $r1, 0x50 120*4882a593Smuzhiyun li $r2, 0x00151151 121*4882a593Smuzhiyun j sdram_b0_cr 122*4882a593Smuzhiyun /* 16-bit mode */ 123*4882a593Smuzhiyunuse_flash_16bit_boot: 124*4882a593Smuzhiyun ori $r1, $r1, 0x60 125*4882a593Smuzhiyun li $r2, 0x00153153 126*4882a593Smuzhiyun /* SRAM bank0 config */ 127*4882a593Smuzhiyunsdram_b0_cr: 128*4882a593Smuzhiyun swi $r1, [$r0+#0x00] 129*4882a593Smuzhiyun swi $r2, [$r0+#0x04] 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun /* config AHB Controller */ 132*4882a593Smuzhiyun led 0x02 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun /* 135*4882a593Smuzhiyun * config PMU controller 136*4882a593Smuzhiyun */ 137*4882a593Smuzhiyun /* ftpmu010_dlldis_disable, must do it in lowleve_init */ 138*4882a593Smuzhiyun led 0x03 139*4882a593Smuzhiyun setbf32 PMU_PDLLCR0_A, FTPMU010_PDLLCR0_DLLDIS ! 0x00010000 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun /* 142*4882a593Smuzhiyun * config SDRAM controller 143*4882a593Smuzhiyun */ 144*4882a593Smuzhiyun led 0x04 145*4882a593Smuzhiyun write32 SDMC_TP1_A, SDMC_TP1_D ! 0x00011312 146*4882a593Smuzhiyun led 0x05 147*4882a593Smuzhiyun write32 SDMC_TP2_A, SDMC_TP2_D ! 0x00480180 148*4882a593Smuzhiyun led 0x06 149*4882a593Smuzhiyun write32 SDMC_CR1_A, SDMC_CR1_D ! 0x00002326 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun led 0x07 152*4882a593Smuzhiyun write32 SDMC_CR2_A, FTSDMC021_CR2_IPREC ! 0x00000010 153*4882a593Smuzhiyun wait_sdram 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun led 0x08 156*4882a593Smuzhiyun write32 SDMC_CR2_A, FTSDMC021_CR2_ISMR ! 0x00000004 157*4882a593Smuzhiyun wait_sdram 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun led 0x09 160*4882a593Smuzhiyun write32 SDMC_CR2_A, FTSDMC021_CR2_IREF ! 0x00000008 161*4882a593Smuzhiyun wait_sdram 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun led 0x0a 164*4882a593Smuzhiyun move $lp, $r11 165*4882a593Smuzhiyun ret 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun#ifndef CONFIG_SKIP_LOWLEVEL_INIT 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun.globl lowlevel_init 171*4882a593Smuzhiyunlowlevel_init: 172*4882a593Smuzhiyun move $r10, $lp 173*4882a593Smuzhiyun led 0x10 174*4882a593Smuzhiyun jal remap 175*4882a593Smuzhiyun#if (defined(NDS32_EXT_FPU_DP) || defined(NDS32_EXT_FPU_SP)) 176*4882a593Smuzhiyun led 0x1f 177*4882a593Smuzhiyun jal enable_fpu 178*4882a593Smuzhiyun#endif 179*4882a593Smuzhiyun led 0x20 180*4882a593Smuzhiyun ret $r10 181*4882a593Smuzhiyun 182*4882a593Smuzhiyunremap: 183*4882a593Smuzhiyun move $r11, $lp 184*4882a593Smuzhiyun#ifdef __NDS32_N1213_43U1H__ /* NDS32 V0 ISA - AG101 Only */ 185*4882a593Smuzhiyun bal 2f 186*4882a593Smuzhiyunrelo_base: 187*4882a593Smuzhiyun move $r0, $lp 188*4882a593Smuzhiyun#else 189*4882a593Smuzhiyunrelo_base: 190*4882a593Smuzhiyun mfusr $r0, $pc 191*4882a593Smuzhiyun#endif /* __NDS32_N1213_43U1H__ */ 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun /* Remapping */ 194*4882a593Smuzhiyun led 0x1a 195*4882a593Smuzhiyun write32 SDMC_B0_BSR_A, SDMC_B0_BSR_D ! 0x00001800 196*4882a593Smuzhiyun write32 SDMC_B1_BSR_A, SDMC_B1_BSR_D ! 0x00001880 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun /* clear empty BSR registers */ 199*4882a593Smuzhiyun led 0x1b 200*4882a593Smuzhiyun li $r4, CONFIG_FTSDMC021_BASE 201*4882a593Smuzhiyun li $r5, 0x0 202*4882a593Smuzhiyun swi $r5, [$r4 + FTSDMC021_BANK2_BSR] 203*4882a593Smuzhiyun swi $r5, [$r4 + FTSDMC021_BANK3_BSR] 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun#ifdef CONFIG_MEM_REMAP 206*4882a593Smuzhiyun /* 207*4882a593Smuzhiyun * Copy ROM code to SDRAM base for memory remap layout. 208*4882a593Smuzhiyun * This is not the real relocation, the real relocation is the function 209*4882a593Smuzhiyun * relocate_code() is start.S which supports the systems is memory 210*4882a593Smuzhiyun * remapped or not. 211*4882a593Smuzhiyun */ 212*4882a593Smuzhiyun /* 213*4882a593Smuzhiyun * Doing memory remap is essential for preparing some non-OS or RTOS 214*4882a593Smuzhiyun * applications. 215*4882a593Smuzhiyun * 216*4882a593Smuzhiyun * This is also a must on ADP-AG101 board. 217*4882a593Smuzhiyun * The reason is because the ROM/FLASH circuit on PCB board. 218*4882a593Smuzhiyun * AG101-A0 board has 2 jumpers MA17 and SW5 to configure which 219*4882a593Smuzhiyun * ROM/FLASH is used to boot. 220*4882a593Smuzhiyun * 221*4882a593Smuzhiyun * When SW5 = "0101", MA17 = LO, the ROM is connected to BANK0, 222*4882a593Smuzhiyun * and the FLASH is connected to BANK1. 223*4882a593Smuzhiyun * When SW5 = "1010", MA17 = HI, the ROM is disabled (still at BANK0), 224*4882a593Smuzhiyun * and the FLASH is connected to BANK0. 225*4882a593Smuzhiyun * It will occur problem when doing flash probing if the flash is at 226*4882a593Smuzhiyun * BANK0 (0x00000000) while memory remapping was skipped. 227*4882a593Smuzhiyun * 228*4882a593Smuzhiyun * Other board like ADP-AG101P may not enable this since there is only 229*4882a593Smuzhiyun * a FLASH connected to bank0. 230*4882a593Smuzhiyun */ 231*4882a593Smuzhiyun led 0x11 232*4882a593Smuzhiyun /* 233*4882a593Smuzhiyun * for Orca and Emerald 234*4882a593Smuzhiyun * read sdram base address automatically 235*4882a593Smuzhiyun */ 236*4882a593Smuzhiyun li $r5, AHBC_BSR6_A 237*4882a593Smuzhiyun lwi $r8, [$r5] 238*4882a593Smuzhiyun li $r4, 0xfff00000 /* r4 = bank6 base */ 239*4882a593Smuzhiyun and $r4, $r4, $r8 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun la $r5, _start@GOTOFF 242*4882a593Smuzhiyun la $r6, _end@GOTOFF 243*4882a593Smuzhiyun1: 244*4882a593Smuzhiyun lwi.p $r7, [$r5], #4 245*4882a593Smuzhiyun swi.p $r7, [$r4], #4 246*4882a593Smuzhiyun blt $r5, $r6, 1b 247*4882a593Smuzhiyun 248*4882a593Smuzhiyun /* set remap bit */ 249*4882a593Smuzhiyun /* 250*4882a593Smuzhiyun * MEM remap bit is operational 251*4882a593Smuzhiyun * - use it to map writeable memory at 0x00000000, in place of flash 252*4882a593Smuzhiyun * - before remap: flash/rom 0x00000000, sdram: 0x10000000-0x4fffffff 253*4882a593Smuzhiyun * - after remap: flash/rom 0x80000000, sdram: 0x00000000 254*4882a593Smuzhiyun */ 255*4882a593Smuzhiyun led 0x1c 256*4882a593Smuzhiyun write32 SDMC_B0_BSR_A, 0x00001000 257*4882a593Smuzhiyun write32 SDMC_B1_BSR_A, 0x00001200 258*4882a593Smuzhiyun li $r5, CONFIG_SYS_TEXT_BASE /* flash base address */ 259*4882a593Smuzhiyun add $r11, $r11, $r5 /* add flash address offset for ret */ 260*4882a593Smuzhiyun add $r10, $r10, $r5 261*4882a593Smuzhiyun move $lp, $r11 262*4882a593Smuzhiyun setbf15 AHBC_CR_A, FTAHBC020S_CR_REMAP ! 0x1 263*4882a593Smuzhiyun 264*4882a593Smuzhiyun /* 265*4882a593Smuzhiyun * for Orca and Emerald 266*4882a593Smuzhiyun * extend sdram size from 256MB to 2GB 267*4882a593Smuzhiyun */ 268*4882a593Smuzhiyun li $r5, AHBC_BSR6_A 269*4882a593Smuzhiyun lwi $r6, [$r5] 270*4882a593Smuzhiyun li $r4, 0xfff0ffff 271*4882a593Smuzhiyun and $r6 ,$r4, $r6 272*4882a593Smuzhiyun li $r4, 0x000b0000 273*4882a593Smuzhiyun or $r6, $r4, $r6 274*4882a593Smuzhiyun swi $r6, [$r5] 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun /* 277*4882a593Smuzhiyun * for Orca and Emerald 278*4882a593Smuzhiyun * extend rom base from 256MB to 2GB 279*4882a593Smuzhiyun */ 280*4882a593Smuzhiyun li $r4, AHBC_BSR4_A 281*4882a593Smuzhiyun lwi $r5, [$r4] 282*4882a593Smuzhiyun li $r6, 0xffffff 283*4882a593Smuzhiyun and $r5, $r5, $r6 284*4882a593Smuzhiyun li $r6, 0x80000000 285*4882a593Smuzhiyun or $r5, $r5, $r6 286*4882a593Smuzhiyun swi $r5, [$r4] 287*4882a593Smuzhiyun#endif /* #ifdef CONFIG_MEM_REMAP */ 288*4882a593Smuzhiyun move $lp, $r11 289*4882a593Smuzhiyun2: 290*4882a593Smuzhiyun ret 291*4882a593Smuzhiyun 292*4882a593Smuzhiyun /* 293*4882a593Smuzhiyun * enable_fpu: 294*4882a593Smuzhiyun * Some of Andes CPU version support FPU coprocessor, if so, 295*4882a593Smuzhiyun * and toolchain support FPU instruction set, we should enable it. 296*4882a593Smuzhiyun */ 297*4882a593Smuzhiyun#if (defined(NDS32_EXT_FPU_DP) || defined(NDS32_EXT_FPU_SP)) 298*4882a593Smuzhiyunenable_fpu: 299*4882a593Smuzhiyun mfsr $r0, $CPU_VER /* enable FPU if it exists */ 300*4882a593Smuzhiyun srli $r0, $r0, 3 301*4882a593Smuzhiyun andi $r0, $r0, 1 302*4882a593Smuzhiyun beqz $r0, 1f /* skip if no COP */ 303*4882a593Smuzhiyun mfsr $r0, $FUCOP_EXIST 304*4882a593Smuzhiyun srli $r0, $r0, 31 305*4882a593Smuzhiyun beqz $r0, 1f /* skip if no FPU */ 306*4882a593Smuzhiyun mfsr $r0, $FUCOP_CTL 307*4882a593Smuzhiyun ori $r0, $r0, 1 308*4882a593Smuzhiyun mtsr $r0, $FUCOP_CTL 309*4882a593Smuzhiyun1: 310*4882a593Smuzhiyun ret 311*4882a593Smuzhiyun#endif 312*4882a593Smuzhiyun 313*4882a593Smuzhiyun.globl show_led 314*4882a593Smuzhiyunshow_led: 315*4882a593Smuzhiyun li $r8, (CONFIG_DEBUG_LED) 316*4882a593Smuzhiyun swi $r7, [$r8] 317*4882a593Smuzhiyun ret 318*4882a593Smuzhiyun#endif /* #ifndef CONFIG_SKIP_LOWLEVEL_INIT */ 319