/*---------------------------------------------------------------------------* Project: CtrBrom - library - init File: crt0_pu.c Copyright 2009 Nintendo. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Date:: $ $Rev$ $Author$ *---------------------------------------------------------------------------*/ #include #include /*---------------------------------------------------------------------------* Name: i_stupEnableTCM Description: enable ITCM and DTCM Arguments: None Returns: None *---------------------------------------------------------------------------*/ asm void i_stupEnableTCM( void ) { // プロテクションユニット/キャッシュ ディセーブル mrc p15, 0, r0, c1, c0, 0 ldr r1, =HW_C1_IC_ENABLE | HW_C1_DC_ENABLE \ | HW_C1_ITCM_LOAD_MODE | HW_C1_DTCM_LOAD_MODE \ | HW_C1_LD_INTERWORK_DISABLE \ | HW_C1_PROTECT_UNIT_ENABLE bic r0, r0, r1 mcr p15, 0, r0, c1, c0, 0 // キャッシュ無効化 mov r0, #0 mcr p15, 0, r0, c7, c5, 0 // 命令キャッシュ mcr p15, 0, r0, c7, c6, 0 // データキャッシュ // ライトバッファ エンプティ待ち mcr p15, 0, r0, c7, c10, 4 // // 命令TCM 設定 // mov r0, #HW_C9_TCMR_32MB mcr p15, 0, r0, c9, c1, 1 // // データTCM 設定 // ldr r0, =STUPi_HW_DTCM orr r0, r0, #HW_C9_TCMR_16KB mcr p15, 0, r0, c9, c1, 0 // // システム制御コプロセッサ マスター設定 // mrc p15, 0, r0, c1, c0, 0 ldr r1,=0 \ | HW_C1_ITCM_ENABLE | HW_C1_DTCM_ENABLE \ | 0 orr r0, r0, r1 mcr p15, 0, r0, c1, c0, 0 bx lr } //----------------------------------------------------------------------- // システム制御コプロセッサ 初期化 //----------------------------------------------------------------------- asm void i_stupInitCP15(void) { // プロテクションユニット/キャッシュ/TCM ディセーブル mrc p15, 0, r0, c1, c0, 0 ldr r1, =HW_C1_IC_ENABLE | HW_C1_DC_ENABLE \ | HW_C1_ITCM_ENABLE | HW_C1_DTCM_ENABLE \ | HW_C1_ITCM_LOAD_MODE | HW_C1_DTCM_LOAD_MODE \ | HW_C1_LD_INTERWORK_DISABLE \ | HW_C1_PROTECT_UNIT_ENABLE #ifdef SDK_MG20EMU bic r1, r1, #HW_C1_ITCM_ENABLE #endif // SDK_MG20EMU bic r0, r0, r1 mcr p15, 0, r0, c1, c0, 0 // キャッシュ無効化 mov r0, #0 mcr p15, 0, r0, c7, c5, 0 // 命令キャッシュ mcr p15, 0, r0, c7, c6, 0 // データキャッシュ // ライトバッファ エンプティ待ち mcr p15, 0, r0, c7, c10, 4 /* ; Region G: BACK_GROUND: Base = 0x0, Size = 4GB, I:NC NB / D:NC NB, I:NA / D:NA ; Region 0: MAIN_MEM: Base = 0x20000000, Size = 128MB, I:NC NB / D:NC NB, I:NA / D:RW ; Region 1: IO_AXIRAM: Base = 0x10000000, Size = 256MB, I:NC NB / D:NC NB, I:NA / D:RW ; Region 2: PRV_WRAM: Base = 0x08000000, Size = 1MB, I:Cach Buf / D:Cach Buf, I:NA / D:RW ; Region 3: PRV_WRAM_SYSRV:Base = 0x08000000, Size = 4KB, I:Cach Buf / D:Cach Buf, I:RO / D:RW ; Region 4: DTCM: Base = 0xfffe0000, Size = 16KB, I:NC NB / D:NC NB, I:NA / D:RW ; Region 5: ITCM: Base = 0x07ff8000, Size = 32KB, I:Cach Buf / D:NC NB, I:RO / D:RW ; Region 6: BIOS: Base = 0xffff0000, Size = 64KB, I:Cach NB / D:Cach NB, I:RO / D:RO ; Region 7: SHARED_WORK: Base = 0x17fff000, Size = 8KB, I:NC NB / D:NC NB, I:NA / D:RW */ #define SET_PROTECTION_A( id, adr, siz ) ldr r0, =(adr|HW_C6_PR_##siz|HW_C6_PR_ENABLE) #define SET_PROTECTION_B( id, adr, siz ) mcr p15, 0, r0, c6, id, 0 #define REGION_BIT(a,b,c,d,e,f,g,h) (((a)<<0)|((b)<<1)|((c)<<2)|((d)<<3)|((e)<<4)|((f)<<5)|((g)<<6)|((h)<<7)) #define REGION_ACC(a,b,c,d,e,f,g,h) (((a)<<0)|((b)<<4)|((c)<<8)|((d)<<12)|((e)<<16)|((f)<<20)|((g)<<24)|((h)<<28)) #define NA 0 #define RW 3 #define RO 6 // // メモリリージョン初期化 // //---- メインメモリ SET_PROTECTION_A( c0, HW_MAIN_MEM, 128MB ) SET_PROTECTION_B( c0, HW_MAIN_MEM, 128MB ) //---- I/Oレジスタ & VRAM & AXI-WRAM SET_PROTECTION_A( c1, HW_IOREG, 256MB ) SET_PROTECTION_B( c1, HW_IOREG, 256MB ) //---- PRV_WRAM SET_PROTECTION_A( c2, HW_PRV_WRAM, 1MB ) SET_PROTECTION_B( c2, HW_PRV_WRAM, 1MB ) //---- PRV_WRAM_SYSRV #ifndef SDK_MG20EMU SET_PROTECTION_A( c3, HW_PRV_WRAM_SYSRV, 4KB ) SET_PROTECTION_B( c3, HW_PRV_WRAM_SYSRV, 4KB ) #else // SDK_MG20EMU SET_PROTECTION_A( c3, HW_MG20IOP_REG, 1MB ) SET_PROTECTION_B( c3, HW_MG20IOP_REG, 1MB ) #endif // SDK_MG20EMU //---- データ TCM ldr r0, =STUPi_HW_DTCM orr r0, r0, #HW_C6_PR_16KB orr r0, r0, #HW_C6_PR_ENABLE SET_PROTECTION_B( c4, HW_DTCM, 16KB ) //---- 命令 TCM // データ TCM より優先が高い SET_PROTECTION_A( c5, HW_ITCM, 32KB ) SET_PROTECTION_B( c5, HW_ITCM, 32KB ) //---- BIOS SET_PROTECTION_A( c6, HW_BIOS, 64KB ) SET_PROTECTION_B( c6, HW_BIOS, 64KB ) //---- SHARED CPU 間通信ワーク領域 SET_PROTECTION_A( c7, HW_AXI_WRAM_SHARED, 8KB ) SET_PROTECTION_B( c7, HW_AXI_WRAM_SHARED, 8KB ) // // 命令TCM 設定 // mov r0, #HW_C9_TCMR_128MB mcr p15, 0, r0, c9, c1, 1 // // データTCM 設定 // ldr r0, =STUPi_HW_DTCM orr r0, r0, #HW_C9_TCMR_16KB mcr p15, 0, r0, c9, c1, 0 // // 命令キャッシュ イネーブル (リージョン設定) // 6: BIOS // mov r0, #REGION_BIT(0,0,0,0,0,0,1,0) mcr p15, 0, r0, c2, c0, 1 // // データキャッシュ イネーブル (リージョン設定) // 0: HW_MAIN_MEM // 2: PRV_WRAM // 6: BIOS // mov r0, #REGION_BIT(1,0,1,0,0,0,1,0) mcr p15, 0, r0, c2, c0, 0 // // ライトバッファ イネーブル(リージョン設定) // 0: HW_MAIN_MEM // 2: PRV_WRAM // 6: BIOS // mov r0, #REGION_BIT(1,0,1,0,0,0,1,0) mcr p15, 0, r0, c3, c0, 0 // // 命令アクセス許可 (リージョン設定) // MAIN_MEM : NA // IO_AXIRAM : NA // PRV_WRAM : NA // PRV_WRAM_SYSRV: RO // DTCM : NA // ITCM : RO // BIOS : RO // SHARED : NA // #ifndef SDK_MG20EMU ldr r0, =REGION_ACC(NA,NA,NA,RO,NA,RO,RO,NA) #else // SDK_MG20EMU ldr r0, =REGION_ACC(NA,NA,RO,NA,NA,RO,RO,NA) #endif // SDK_MG20EMU mcr p15, 0, r0, c5, c0, 3 // // データアクセス許可(リージョン設定) // MAIN_MEM : RW // IO_AXIRAM : RW // PRV_WRAM : RW // PRV_WRAM_SYSRV: RW // DTCM : RW // ITCM : RW // BIOS : RO // SHARED : RW // #ifdef BROM_ENABLE_BOOTROM_WRITE ldr r0, =REGION_ACC(RW,RW,RW,RW,RW,RW,RW,RW) #else // BROM_ENABLE_BOOTROM_WRITE ldr r0, =REGION_ACC(RW,RW,RW,RW,RW,RW,RO,RW) #endif // BROM_ENABLE_BOOTROM_WRITE mcr p15, 0, r0, c5, c0, 2 // // システム制御コプロセッサ マスター設定 // mrc p15, 0, r0, c1, c0, 0 ldr r1,=HW_C1_IC_ENABLE | HW_C1_DC_ENABLE | HW_C1_CACHE_ROUND_ROBIN \ | HW_C1_ITCM_ENABLE | HW_C1_DTCM_ENABLE \ | HW_C1_SB1_BITSET | HW_C1_EXCEPT_VEC_UPPER \ | HW_C1_PROTECT_UNIT_ENABLE orr r0, r0, r1 #ifdef SDK_MG20EMU bic r0, r0, #HW_C1_EXCEPT_VEC_UPPER #endif // SDK_MG20EMU mcr p15, 0, r0, c1, c0, 0 bx lr LTORG EXPORT i_stupInitCP15_End i_stupInitCP15_End }