1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
237a0c600SAndreas Färber /*
337a0c600SAndreas Färber  * Copyright (c) 2016 Rockchip Electronics Co., Ltd
437a0c600SAndreas Färber  * Copyright (c) 2016 Andreas Färber
537a0c600SAndreas Färber  */
637a0c600SAndreas Färber 
737a0c600SAndreas Färber #include <common.h>
837a0c600SAndreas Färber #include <asm/armv8/mmu.h>
937a0c600SAndreas Färber #include <asm/io.h>
1037a0c600SAndreas Färber #include <asm/arch/clock.h>
1137a0c600SAndreas Färber #include <asm/arch/cru_rk3368.h>
1237a0c600SAndreas Färber #include <asm/arch/grf_rk3368.h>
1337a0c600SAndreas Färber #include <syscon.h>
1437a0c600SAndreas Färber 
15975e4abaSKever Yang DECLARE_GLOBAL_DATA_PTR;
16975e4abaSKever Yang 
1737a0c600SAndreas Färber #define IMEM_BASE                  0xFF8C0000
1837a0c600SAndreas Färber 
1937a0c600SAndreas Färber /* Max MCU's SRAM value is 8K, begin at (IMEM_BASE + 4K) */
2037a0c600SAndreas Färber #define MCU_SRAM_BASE			(IMEM_BASE + 1024 * 4)
2137a0c600SAndreas Färber #define MCU_SRAM_BASE_BIT31_BIT28	((MCU_SRAM_BASE & GENMASK(31, 28)) >> 28)
2237a0c600SAndreas Färber #define MCU_SRAM_BASE_BIT27_BIT12	((MCU_SRAM_BASE & GENMASK(27, 12)) >> 12)
2337a0c600SAndreas Färber /* exsram may using by mcu to accessing dram(0x0-0x20000000) */
2437a0c600SAndreas Färber #define MCU_EXSRAM_BASE    (0)
2537a0c600SAndreas Färber #define MCU_EXSRAM_BASE_BIT31_BIT28       ((MCU_EXSRAM_BASE & GENMASK(31, 28)) >> 28)
2637a0c600SAndreas Färber #define MCU_EXSRAM_BASE_BIT27_BIT12       ((MCU_EXSRAM_BASE & GENMASK(27, 12)) >> 12)
2737a0c600SAndreas Färber /* experi no used, reserved value = 0 */
2837a0c600SAndreas Färber #define MCU_EXPERI_BASE    (0)
2937a0c600SAndreas Färber #define MCU_EXPERI_BASE_BIT31_BIT28       ((MCU_EXPERI_BASE & GENMASK(31, 28)) >> 28)
3037a0c600SAndreas Färber #define MCU_EXPERI_BASE_BIT27_BIT12       ((MCU_EXPERI_BASE & GENMASK(27, 12)) >> 12)
3137a0c600SAndreas Färber 
3237a0c600SAndreas Färber static struct mm_region rk3368_mem_map[] = {
3337a0c600SAndreas Färber 	{
3437a0c600SAndreas Färber 		.virt = 0x0UL,
3537a0c600SAndreas Färber 		.phys = 0x0UL,
3637a0c600SAndreas Färber 		.size = 0x80000000UL,
3737a0c600SAndreas Färber 		.attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
3837a0c600SAndreas Färber 			 PTE_BLOCK_INNER_SHARE
3937a0c600SAndreas Färber 	}, {
4037a0c600SAndreas Färber 		.virt = 0xf0000000UL,
4137a0c600SAndreas Färber 		.phys = 0xf0000000UL,
4237a0c600SAndreas Färber 		.size = 0x10000000UL,
4337a0c600SAndreas Färber 		.attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
4437a0c600SAndreas Färber 			 PTE_BLOCK_NON_SHARE |
4537a0c600SAndreas Färber 			 PTE_BLOCK_PXN | PTE_BLOCK_UXN
4637a0c600SAndreas Färber 	}, {
4737a0c600SAndreas Färber 		/* List terminator */
4837a0c600SAndreas Färber 		0,
4937a0c600SAndreas Färber 	}
5037a0c600SAndreas Färber };
5137a0c600SAndreas Färber 
5237a0c600SAndreas Färber struct mm_region *mem_map = rk3368_mem_map;
5337a0c600SAndreas Färber 
dram_init_banksize(void)54975e4abaSKever Yang int dram_init_banksize(void)
55975e4abaSKever Yang {
56975e4abaSKever Yang 	size_t max_size = min((unsigned long)gd->ram_size, gd->ram_top);
57975e4abaSKever Yang 
58975e4abaSKever Yang 	/* Reserve 0x200000 for ATF bl31 */
59975e4abaSKever Yang 	gd->bd->bi_dram[0].start = 0x200000;
60975e4abaSKever Yang 	gd->bd->bi_dram[0].size = max_size - gd->bd->bi_dram[0].start;
61975e4abaSKever Yang 
62975e4abaSKever Yang 	return 0;
63975e4abaSKever Yang }
64975e4abaSKever Yang 
6537a0c600SAndreas Färber #ifdef CONFIG_ARCH_EARLY_INIT_R
mcu_init(void)6637a0c600SAndreas Färber static int mcu_init(void)
6737a0c600SAndreas Färber {
6837a0c600SAndreas Färber 	struct rk3368_grf *grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
6937a0c600SAndreas Färber 	struct rk3368_cru *cru = rockchip_get_cru();
7037a0c600SAndreas Färber 
7137a0c600SAndreas Färber 	rk_clrsetreg(&grf->soc_con14, MCU_SRAM_BASE_BIT31_BIT28_MASK,
7237a0c600SAndreas Färber 		     MCU_SRAM_BASE_BIT31_BIT28 << MCU_SRAM_BASE_BIT31_BIT28_SHIFT);
7337a0c600SAndreas Färber 	rk_clrsetreg(&grf->soc_con11, MCU_SRAM_BASE_BIT27_BIT12_MASK,
7437a0c600SAndreas Färber 		     MCU_SRAM_BASE_BIT27_BIT12 << MCU_SRAM_BASE_BIT27_BIT12_SHIFT);
7537a0c600SAndreas Färber 	rk_clrsetreg(&grf->soc_con14, MCU_EXSRAM_BASE_BIT31_BIT28_MASK,
7637a0c600SAndreas Färber 		     MCU_EXSRAM_BASE_BIT31_BIT28 << MCU_EXSRAM_BASE_BIT31_BIT28_SHIFT);
7737a0c600SAndreas Färber 	rk_clrsetreg(&grf->soc_con12, MCU_EXSRAM_BASE_BIT27_BIT12_MASK,
7837a0c600SAndreas Färber 		     MCU_EXSRAM_BASE_BIT27_BIT12 << MCU_EXSRAM_BASE_BIT27_BIT12_SHIFT);
7937a0c600SAndreas Färber 	rk_clrsetreg(&grf->soc_con14, MCU_EXPERI_BASE_BIT31_BIT28_MASK,
8037a0c600SAndreas Färber 		     MCU_EXPERI_BASE_BIT31_BIT28 << MCU_EXPERI_BASE_BIT31_BIT28_SHIFT);
8137a0c600SAndreas Färber 	rk_clrsetreg(&grf->soc_con13, MCU_EXPERI_BASE_BIT27_BIT12_MASK,
8237a0c600SAndreas Färber 		     MCU_EXPERI_BASE_BIT27_BIT12 << MCU_EXPERI_BASE_BIT27_BIT12_SHIFT);
8337a0c600SAndreas Färber 
8437a0c600SAndreas Färber 	rk_clrsetreg(&cru->clksel_con[12], MCU_PLL_SEL_MASK | MCU_CLK_DIV_MASK,
8537a0c600SAndreas Färber 		     (MCU_PLL_SEL_GPLL << MCU_PLL_SEL_SHIFT) |
8637a0c600SAndreas Färber 		     (5 << MCU_CLK_DIV_SHIFT));
8737a0c600SAndreas Färber 
8837a0c600SAndreas Färber 	 /* mcu dereset, for start running */
8937a0c600SAndreas Färber 	rk_clrreg(&cru->softrst_con[1], MCU_PO_SRST_MASK | MCU_SYS_SRST_MASK);
9037a0c600SAndreas Färber 
9137a0c600SAndreas Färber 	return 0;
9237a0c600SAndreas Färber }
9337a0c600SAndreas Färber 
arch_early_init_r(void)9437a0c600SAndreas Färber int arch_early_init_r(void)
9537a0c600SAndreas Färber {
9637a0c600SAndreas Färber 	return mcu_init();
9737a0c600SAndreas Färber }
9837a0c600SAndreas Färber #endif
99