1*4a2b8db4SJoseph Chen /* 2*4a2b8db4SJoseph Chen * (C) Copyright 2020 Rockchip Electronics Co., Ltd. 3*4a2b8db4SJoseph Chen * 4*4a2b8db4SJoseph Chen * SPDX-License-Identifier: GPL-2.0+ 5*4a2b8db4SJoseph Chen */ 6*4a2b8db4SJoseph Chen 7*4a2b8db4SJoseph Chen #include <common.h> 8*4a2b8db4SJoseph Chen #include <mapmem.h> 9*4a2b8db4SJoseph Chen #include <malloc.h> 10*4a2b8db4SJoseph Chen #include <dm/root.h> 11*4a2b8db4SJoseph Chen 12*4a2b8db4SJoseph Chen DECLARE_GLOBAL_DATA_PTR; 13*4a2b8db4SJoseph Chen initr_reloc(void)14*4a2b8db4SJoseph Chenstatic void initr_reloc(void) 15*4a2b8db4SJoseph Chen { 16*4a2b8db4SJoseph Chen /* tell others: relocation done */ 17*4a2b8db4SJoseph Chen gd->flags |= GD_FLG_RELOC | GD_FLG_FULL_MALLOC_INIT; 18*4a2b8db4SJoseph Chen } 19*4a2b8db4SJoseph Chen 20*4a2b8db4SJoseph Chen #ifdef CONFIG_ARM initr_caches(void)21*4a2b8db4SJoseph Chenstatic void initr_caches(void) 22*4a2b8db4SJoseph Chen { 23*4a2b8db4SJoseph Chen icache_enable(); 24*4a2b8db4SJoseph Chen dcache_enable(); 25*4a2b8db4SJoseph Chen } 26*4a2b8db4SJoseph Chen #endif 27*4a2b8db4SJoseph Chen initr_malloc(void)28*4a2b8db4SJoseph Chenstatic void initr_malloc(void) 29*4a2b8db4SJoseph Chen { 30*4a2b8db4SJoseph Chen ulong malloc_start; 31*4a2b8db4SJoseph Chen 32*4a2b8db4SJoseph Chen /* The malloc area is immediately below the monitor copy in DRAM */ 33*4a2b8db4SJoseph Chen malloc_start = gd->relocaddr - TOTAL_MALLOC_LEN; 34*4a2b8db4SJoseph Chen mem_malloc_init((ulong)map_sysmem(malloc_start, TOTAL_MALLOC_LEN), 35*4a2b8db4SJoseph Chen TOTAL_MALLOC_LEN); 36*4a2b8db4SJoseph Chen } 37*4a2b8db4SJoseph Chen 38*4a2b8db4SJoseph Chen #ifdef CONFIG_DM initr_dm(void)39*4a2b8db4SJoseph Chenstatic int initr_dm(void) 40*4a2b8db4SJoseph Chen { 41*4a2b8db4SJoseph Chen /* Save the pre-reloc driver model and start a new one */ 42*4a2b8db4SJoseph Chen gd->dm_root_f = gd->dm_root; 43*4a2b8db4SJoseph Chen gd->dm_root = NULL; 44*4a2b8db4SJoseph Chen 45*4a2b8db4SJoseph Chen return dm_init_and_scan(false); 46*4a2b8db4SJoseph Chen } 47*4a2b8db4SJoseph Chen #endif 48*4a2b8db4SJoseph Chen 49*4a2b8db4SJoseph Chen /* 50*4a2b8db4SJoseph Chen * The below functions are all __weak declared. 51*4a2b8db4SJoseph Chen */ dram_init(void)52*4a2b8db4SJoseph Chenint dram_init(void) 53*4a2b8db4SJoseph Chen { 54*4a2b8db4SJoseph Chen #if CONFIG_SYS_MALLOC_LEN > SZ_64M 55*4a2b8db4SJoseph Chen "CONFIG_SYS_MALLOC_LEN is over 64MB" 56*4a2b8db4SJoseph Chen #endif 57*4a2b8db4SJoseph Chen gd->ram_size = SZ_64M; /* default */ 58*4a2b8db4SJoseph Chen 59*4a2b8db4SJoseph Chen gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE; 60*4a2b8db4SJoseph Chen gd->bd->bi_dram[0].size = gd->ram_size; 61*4a2b8db4SJoseph Chen 62*4a2b8db4SJoseph Chen return 0; 63*4a2b8db4SJoseph Chen } 64*4a2b8db4SJoseph Chen 65*4a2b8db4SJoseph Chen /* Refers to common/board_r.c */ board_init_r(gd_t * new_gd,ulong dest_addr)66*4a2b8db4SJoseph Chenvoid board_init_r(gd_t *new_gd, ulong dest_addr) 67*4a2b8db4SJoseph Chen { 68*4a2b8db4SJoseph Chen initr_reloc(); 69*4a2b8db4SJoseph Chen #ifdef CONFIG_ARM 70*4a2b8db4SJoseph Chen initr_caches(); 71*4a2b8db4SJoseph Chen #endif 72*4a2b8db4SJoseph Chen initr_malloc(); 73*4a2b8db4SJoseph Chen #ifdef CONFIG_DM 74*4a2b8db4SJoseph Chen initr_dm(); 75*4a2b8db4SJoseph Chen #endif 76*4a2b8db4SJoseph Chen /* Setup chipselects, entering usb-plug mode */ 77*4a2b8db4SJoseph Chen board_init(); 78*4a2b8db4SJoseph Chen 79*4a2b8db4SJoseph Chen hang(); 80*4a2b8db4SJoseph Chen } 81*4a2b8db4SJoseph Chen 82