mirror of
https://github.com/rvtr/ctr_firmware.git
synced 2025-10-31 07:51:08 -04:00
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@236 b871894f-2f95-9b40-918c-086798483c85
262 lines
8.9 KiB
C
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
|
|
}
|
|
|