ctr_firmware/trunk/bootrom/build/libraries/init/ARM9/crt0_pu.c
nakasima 80d7ae1288 MG20EMUのため初期化時にTCMをディセーブルにはしない。
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@236 b871894f-2f95-9b40-918c-086798483c85
2009-01-29 09:20:04 +00:00

262 lines
8.9 KiB
C

/*---------------------------------------------------------------------------*
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 <brom/code32.h>
#include <brom/os.h>
/*---------------------------------------------------------------------------*
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
}