Exemplo n.º 1
0
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();
}
Exemplo n.º 2
0
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();
}
Exemplo n.º 3
0
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)

}