static void Boot_Linux(void) { U32 i,j; *((volatile U32 *)(ZPARAMADDR + 4*0)) = 2; *((volatile U32 *)(ZPARAMADDR + 4*1)) = ATAG_CORE; *((volatile U32 *)(ZPARAMADDR + 4*2)) = 4; *((volatile U32 *)(ZPARAMADDR + 4*3)) = ATAG_SERIAL; *((volatile U32 *)(ZPARAMADDR + 4*4)) = board_id_l; *((volatile U32 *)(ZPARAMADDR + 4*5)) = board_id_h; *((volatile U32 *)(ZPARAMADDR + 4*6)) = 3; *((volatile U32 *)(ZPARAMADDR + 4*7)) = ATAG_REVISION; *((volatile U32 *)(ZPARAMADDR + 4*8)) = BOARD_VER; // *((volatile U32 *)(ZPARAMADDR + 4*9)) = (4 + kcmdFileSize + 5) >> 2; // *((volatile U32 *)(ZPARAMADDR + 4*10)) = ATAG_CMDLINE; *((volatile U32 *)(ZPARAMADDR + 4*9)) = 2 + (kcmdFileSize >> 2) + 1; *((volatile U32 *)(ZPARAMADDR + 4*10)) = ATAG_CMDLINE; for(i=0;i<64;i++) for(j=0;j<8;j++) CP15_CleanInvalidateDcacheIndex((i<<26)|(j<<5)); CP15_DisableDcache(); CP15_DisableIcache(); CP15_InvalidateIcache(); CP15_DisableMMU(); CP15_InvalidateTLB(); run = (void (*)(void))ZRELADDR; BootmSet_ParamAddr(ZPARAMADDR); BootmSet_MachineID(LINUX_MACH_ID); run(); }
//---------------------------------------------------------------------------- /// Lock I cache /// \param I cache index //---------------------------------------------------------------------------- void CP15_LockIcache(unsigned int index) { unsigned int victim = 0; // invalidate all the cache (4 ways) CP15_InvalidateIcache(); // lockdown all the ways except this in parameter victim = CP15_ReadIcacheLockdown(); victim = 0; victim |= ~index; victim &= 0xffff; CP15_WriteIcacheLockdown(victim); }