1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Copyright (C) 2020 MediaTek Inc.
5 * Author: Weijie Gao <weijie.gao@mediatek.com>
9 #include <asm-offsets.h>
10 #include <asm/cacheops.h>
11 #include <asm/regdef.h>
12 #include <asm/mipsregs.h>
13 #include <asm/addrspace.h>
17 /* Set temporary stack address range */
18 #ifndef CONFIG_SYS_INIT_SP_ADDR
19 #define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_SDRAM_BASE + \
20 CONFIG_SYS_INIT_SP_OFFSET)
23 #define CACHE_STACK_SIZE 0x4000
24 #define CACHE_STACK_BASE (CONFIG_SYS_INIT_SP_ADDR - CACHE_STACK_SIZE)
26 #define DELAY_USEC(us) ((58 * (us)) / 3)
31 #if !CONFIG_IS_ENABLED(SKIP_LOWLEVEL_INIT)
33 li t0, DELAY_USEC(1000000)
34 li t1, KSEG1ADDR(SYSCTL_BASE + SYSCTL_ROM_STATUS_REG)
35 li t2, KSEG1ADDR(SYSCTL_BASE + SYSCTL_CLKCFG0_REG)
42 bnez t0, _check_rom_status
46 ori t3, (CPU_PLL_FROM_BBP | CPU_PLL_FROM_XTAL)
47 xori t3, CPU_PLL_FROM_BBP
53 ori t3, (CPU_PLL_FROM_BBP | CPU_PLL_FROM_XTAL | \
54 DIS_BBP_SLEEP | EN_BBP_CLK)
55 xori t3, (CPU_PLL_FROM_BBP | CPU_PLL_FROM_XTAL)
60 li t2, KSEG1ADDR(RBUSCTL_BASE + RBUSCTL_DYN_CFG0_REG)
62 ori t3, t3, (CPU_FDIV_M | CPU_FFRAC_M)
63 xori t3, t3, (CPU_FDIV_M | CPU_FFRAC_M)
64 ori t3, t3, ((1 << CPU_FDIV_S) | (1 << CPU_FFRAC_S))
67 /* Clear WST & SPR bits in ErrCtl */
73 /* Simply initialize I-Cache */
75 li a1, CONFIG_SYS_ICACHE_SIZE
77 mtc0 zero, CP0_TAGLO /* Zero to DDataLo */
79 1: cache INDEX_STORE_TAG_I, 0(a0)
80 addiu a0, CONFIG_SYS_ICACHE_LINE_SIZE
84 /* Simply initialize D-Cache */
86 li a1, CONFIG_SYS_DCACHE_SIZE
88 mtc0 zero, CP0_TAGLO, 2
90 2: cache INDEX_STORE_TAG_D, 0(a0)
91 addiu a0, CONFIG_SYS_DCACHE_LINE_SIZE
95 /* Set KSEG0 Cachable */
97 and t0, t0, MIPS_CONF_IMPL
98 or t0, t0, CONF_CM_CACHABLE_NONCOHERENT
103 PTR_LI a0, CACHE_STACK_BASE /* D-Cache lock base */
104 li a1, CACHE_STACK_SIZE /* D-Cache lock size */
105 li a2, 0x1ffff800 /* Mask of DTagLo[PTagLo] */
108 /* Lock one cacheline */
110 ori t0, 0xe0 /* Valid & Dirty & Lock bits */
111 mtc0 t0, CP0_TAGLO, 2 /* Write to DTagLo */
113 cache INDEX_STORE_TAG_D, 0(a0)
115 addiu a0, CONFIG_SYS_DCACHE_LINE_SIZE
116 sub a1, CONFIG_SYS_DCACHE_LINE_SIZE
119 #endif /* CONFIG_IS_ENABLED(SKIP_LOWLEVEL_INIT) */
125 NESTED(lowlevel_init, 0, ra)
126 /* Save ra and do real lowlevel initialization */
129 PTR_LA t9, mt7628_init
135 #if CONFIG_IS_ENABLED(INIT_STACK_WITHOUT_MALLOC_F)
136 /* Set malloc base */
137 li t0, (CONFIG_SYS_INIT_SP_ADDR + 15) & (~15)
138 PTR_S t0, GD_MALLOC_BASE(k0) # gd->malloc_base offset
141 /* Write back data in locked cache to DRAM */
142 PTR_LI a0, CACHE_STACK_BASE /* D-Cache unlock base */
143 li a1, CACHE_STACK_SIZE /* D-Cache unlock size */
146 cache HIT_WRITEBACK_INV_D, 0(a0)
147 addiu a0, CONFIG_SYS_DCACHE_LINE_SIZE
148 sub a1, CONFIG_SYS_DCACHE_LINE_SIZE
152 /* Set KSEG0 Uncached */
154 and t0, t0, MIPS_CONF_IMPL
155 or t0, t0, CONF_CM_UNCACHED