void main(void) { struct bldr_command_handler handler; blkdev_t *bootdev; u32 addr = 0; char *name; bldr_pre_process(); handler.priv = NULL; handler.attr = 0; handler.cb = bldr_cmd_handler; bldr_handshake(&handler); if (NULL == (bootdev = blkdev_get(CFG_BOOT_DEV))) { print("%s can't find boot device(%d)\n", MOD, CFG_BOOT_DEV); goto error; } #if CFG_LOAD_DSP_ROM /* DSP is no more available in MT6589/MT6583 */ #endif #if CFG_LOAD_MD_FS addr = CFG_MD_FS_MEMADDR; if (bldr_load_part(PART_MD_FS, bootdev, &addr) != 0) goto error; #endif #if CFG_LOAD_MD_ROM if (platform_is_three_g()) { addr = CFG_MD_3G_ROM_MEMADDR; name = PART_MD_3G_ROM; } else { addr = CFG_MD_2G_ROM_MEMADDR; name = PART_MD_2G_ROM; } if (bldr_load_part(name, bootdev, &addr) != 0) goto error; #endif #if CFG_LOAD_AP_ROM addr = CFG_AP_ROM_MEMADDR; if (bldr_load_part(PART_AP_ROM, bootdev, &addr) != 0) goto error; #endif #if CFG_LOAD_UBOOT addr = CFG_UBOOT_MEMADDR; if (bldr_load_part(PART_UBOOT, bootdev, &addr) != 0) goto error; #endif bldr_post_process(); bldr_jump(addr, BOOT_ARGUMENT_ADDR, sizeof(boot_arg_t)); error: platform_error_handler(); }
void main(u32 *arg) { struct bldr_command_handler handler; u32 jump_addr; /* get the bldr argument */ bldr_param = (bl_param_t *)*arg; mtk_uart_init(UART_SRC_CLK_FRQ, CFG_LOG_BAUDRATE); bldr_pre_process(); #ifdef HW_INIT_ONLY bldr_wait_forever(); #endif handler.priv = NULL; handler.attr = 0; handler.cb = bldr_cmd_handler; BOOTING_TIME_PROFILING_LOG("before bldr_handshake"); bldr_handshake(&handler); BOOTING_TIME_PROFILING_LOG("bldr_handshake"); #if !CFG_FPGA_PLATFORM /* security check */ sec_lib_read_secro(); sec_boot_check(); device_APC_dom_setup(); #endif BOOTING_TIME_PROFILING_LOG("sec_boot_check"); #if CFG_ATF_SUPPORT trustzone_pre_init(); #endif if (0 != bldr_load_images(&jump_addr)) { print("%s Second Bootloader Load Failed\n", MOD); goto error; } bldr_post_process(); #ifdef SLT mt_usb_phy_recover(); //mu3d_hal_rst_dev(); #endif #if CFG_ATF_SUPPORT trustzone_post_init(); #endif //Yi-Lung: recover pmic normal reset platform_pmic_full_reset_disable(); #if CFG_LOAD_SLT_AARCH64_KERNEL if (0 == aarch64_slt_done()) { *(unsigned int*) AARCH64_SLT_DONE_ADDRESS = AARCH64_SLT_DONE_MAGIC; jump_addr = CFG_BOOTA64_MEMADDR; //set up slave cpu reset address *(unsigned int*) 0x10200040 = CFG_BOOTA64_MEMADDR; //cpu1 *(unsigned int*) 0x10200048 = CFG_BOOTA64_MEMADDR; //cpu2 *(unsigned int*) 0x10200050 = CFG_BOOTA64_MEMADDR; //cpu3 *(unsigned int*) 0x10200238 = CFG_BOOTA64_MEMADDR; //cpu4 *(unsigned int*) 0x10200240 = CFG_BOOTA64_MEMADDR; //cpu5 *(unsigned int*) 0x10200248 = CFG_BOOTA64_MEMADDR; //cpu6 *(unsigned int*) 0x10200250 = CFG_BOOTA64_MEMADDR; //cpu7 print("%s Aarch64 Kernel SLT , jump to 64 bit kernel, address: 0x%x\n", MOD,jump_addr); bldr_jump64(jump_addr, (u32)&bootarg, sizeof(boot_arg_t)); } #endif /* 64S3,32S1,32S1 (MTK_ATF_BOOT_OPTION = 0) * re-loader jump to LK directly and then LK jump to kernel directly */ #if CFG_ATF_SUPPORT if ( BOOT_OPT_64S3 == bootarg.smc_boot_opt && BOOT_OPT_32S1 == bootarg.lk_boot_opt && BOOT_OPT_32S1 == bootarg.kernel_boot_opt) { print("%s 64S3,32S1,32S1, jump to LK\n", MOD); bldr_jump(jump_addr, (u32)&bootarg, sizeof(boot_arg_t)); } else { print("%s Others, jump to ATF\n", MOD); bldr_jump64(jump_addr, (u32)&bootarg, sizeof(boot_arg_t)); } #else bldr_jump(jump_addr, (u32)&bootarg, sizeof(boot_arg_t)); #endif error: platform_error_handler(); }
void main(void) { #if !defined(CFG_MEM_PRESERVED_MODE) struct bldr_command_handler handler; #endif blkdev_t *bootdev; u32 addr; char *name; #if defined(CFG_SRAM_PRELOADER_MODE) //jump to mem preloader directly //mem_baseaddr is defined in link_sram_descriptor.ld addr = (u32) &mem_baseaddr; jump(addr, BOOT_ARGUMENT_ADDR, sizeof(boot_arg_t)); #else //#if defined(CFG_SRAM_PRELOADER_MODE) #ifdef PL_PROFILING u32 profiling_time; profiling_time = 0; #endif //Change setting to improve L2 CACHE SRAM access stability //CACHE_MEM_DELSEL: 0x10200014 //bit 3:0 l2data_delsel Adjusts memory marco timing //change setting: default=0xA new=0xB *(volatile unsigned int *)0x10200014 = 0xAAAB; addr = 0; bldr_pre_process(); #ifdef TINY_BOOTLOADER while(1); #endif #if !defined(CFG_MEM_PRESERVED_MODE) handler.priv = NULL; handler.attr = 0; handler.cb = bldr_cmd_handler; #ifdef PL_PROFILING profiling_time = get_timer(0); #endif bldr_handshake(&handler); #ifdef PL_PROFILING printf("#T#bldr_hdshk=%d\n", get_timer(profiling_time)); #endif #endif if (NULL == (bootdev = blkdev_get(CFG_BOOT_DEV))) { print("%s can't find boot device(%d)\n", MOD, CFG_BOOT_DEV); goto error; } #if defined(LOAD_NORMAL_BOOT_PRELOADER) #ifdef PL_PROFILING profiling_time = get_timer(0); #endif { volatile u32 cache_cfg; #define L2C_SIZE_CFG_OFF 5 //enable L2 sram for DA cache_cfg = DRV_Reg(APMCUSYS_CONFIG_BASE); cache_cfg &= ~(0x7 << L2C_SIZE_CFG_OFF); DRV_WriteReg(APMCUSYS_CONFIG_BASE, cache_cfg); //enable audio sysram clk for DA *(volatile unsigned int *)(0x10000084) = 0x02000000; } addr = CFG_UBOOT_MEMADDR; printf("load preloader=0x%x\n",addr); if (bldr_load_part(PART_PRELOADER, bootdev, &addr) != 0) goto error; addr = 0x02007200; printf("memcpy preloader=0x%x\n", addr); memcpy((void *)addr,(void *) CFG_UBOOT_MEMADDR,(int) 0x18E00); #ifdef PL_PROFILING printf("#T#ld_lk=%d\n", get_timer(profiling_time)); #endif addr = 0x02007500; apmcu_disable_dcache(); apmcu_dcache_clean_invalidate(); apmcu_dsb(); apmcu_icache_invalidate(); apmcu_disable_icache(); apmcu_isb(); apmcu_disable_smp(); printf("jump to preloader=0x%x\n", addr); // while( *(volatile unsigned int *)(0x10001428) != 0x000000AA) ; jump((u32) addr, BOOT_ARGUMENT_ADDR, sizeof(boot_arg_t)); #endif #if CFG_LOAD_DSP_ROM /* DSP is no more available in MT6589/MT6583 */ #endif #if CFG_LOAD_MD_FS #ifdef PL_PROFILING profiling_time = get_timer(0); #endif addr = CFG_USE_HEADER_MEMADDR; name = PART_BOOTIMG; if (bldr_load_part(name, bootdev, &addr) != 0) ; //goto error; // MD_FS partition may be empty #ifdef PL_PROFILING printf("#T#ld_MDFS=%d\n", get_timer(profiling_time)); #endif #endif #if CFG_LOAD_MD_ROM #ifdef PL_PROFILING profiling_time = get_timer(0); #endif addr = CFG_USE_HEADER_MEMADDR; name = PART_RECOVERY; if (bldr_load_part(name, bootdev, &addr) != 0) goto error; #ifdef PL_PROFILING printf("#T#ld_MDROM=%d\n", get_timer(profiling_time)); #endif #endif #if CFG_LOAD_AP_ROM #ifdef PL_PROFILING profiling_time = get_timer(0); #endif addr = CFG_USE_HEADER_MEMADDR; name = PART_UBOOT; if (bldr_load_part(name, bootdev, &addr) != 0) goto error; #ifdef PL_PROFILING printf("#T#ld_APROM=%d\n", get_timer(profiling_time)); #endif #endif #if CFG_LOAD_UBOOT #ifdef PL_PROFILING profiling_time = get_timer(0); #endif addr = CFG_UBOOT_MEMADDR; if (bldr_load_part(PART_UBOOT, bootdev, &addr) != 0) goto error; #ifdef PL_PROFILING printf("#T#ld_lk=%d\n", get_timer(profiling_time)); #endif #endif bldr_post_process(); bldr_jump(addr, BOOT_ARGUMENT_ADDR, sizeof(boot_arg_t)); error: platform_error_handler(); #endif //end of #if !defined(CFG_SRAM_PRELOADER_MODE) }