1 /*---------------------------------------------------------------------------*
2   Project:  TwlSDK - OS
3   File:     os_tcm.c
4 
5   Copyright 2003-2008 Nintendo.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Date:: 2008-09-18#$
14   $Rev: 8573 $
15   $Author: okubata_ryoma $
16  *---------------------------------------------------------------------------*/
17 #include <nitro/os.h>
18 #include <nitro/code32.h>
19 
20 //=======================================================================
21 //           ITCM
22 //=======================================================================
23 /*---------------------------------------------------------------------------*
24   Name:         OS_EnableITCM
25 
26   Description:  enable ITCM
27 
28   Arguments:    None.
29 
30   Returns:      None.
31  *---------------------------------------------------------------------------*/
OS_EnableITCM(void)32 asm void OS_EnableITCM( void )
33 {
34     mrc     p15, 0, r0, c1, c0, 0
35     orr     r0, r0, #HW_C1_ITCM_ENABLE
36     mcr     p15, 0, r0, c1, c0, 0
37     bx      lr
38 }
39 
40 /*---------------------------------------------------------------------------*
41   Name:         OS_DisableITCM
42 
43   Description:  disable ITCM
44 
45   Arguments:    None.
46 
47   Returns:      None.
48  *---------------------------------------------------------------------------*/
OS_DisableITCM(void)49 asm void OS_DisableITCM( void )
50 {
51     mrc     p15, 0, r0, c1, c0, 0
52     bic     r0, r0, #HW_C1_ITCM_ENABLE
53     mcr     p15, 0, r0, c1, c0, 0
54     bx      lr
55 }
56 
57 /*---------------------------------------------------------------------------*
58   Name:         OS_SetITCMParam
59 
60   Description:  set parameter to ITCM
61 
62   Arguments:    param :  parameter to be set to ITCM
63 
64   Returns:      None.
65  *---------------------------------------------------------------------------*/
OS_SetITCMParam(register u32 param)66 asm void OS_SetITCMParam( register u32 param )
67 {
68     and     r0, r0, #HW_C9_TCMR_SIZE_MASK
69     mcr     p15, 0, r0, c9, c1, 1
70     bx      lr
71 }
72 
73 /*---------------------------------------------------------------------------*
74   Name:         OS_GetITCMParam
75 
76   Description:  get parameter to ITCM
77 
78   Arguments:    None
79 
80   Returns:      parameter about ITCM
81  *---------------------------------------------------------------------------*/
OS_GetITCMParam(void)82 asm u32 OS_GetITCMParam( void )
83 {
84     mrc     p15, 0, r0, c9, c1, 1
85     and     r0, r0, #HW_C9_TCMR_SIZE_MASK
86     bx      lr
87 }
88 
89 //=======================================================================
90 //           DTCM
91 //=======================================================================
92 /*---------------------------------------------------------------------------*
93   Name:         OS_EnableDTCM
94 
95   Description:  enable DTCM
96 
97   Arguments:    None.
98 
99   Returns:      None.
100  *---------------------------------------------------------------------------*/
OS_EnableDTCM(void)101 asm void OS_EnableDTCM( void )
102 {
103     mrc     p15, 0, r0, c1, c0, 0
104     orr     r0, r0, #HW_C1_DTCM_ENABLE
105     mcr     p15, 0, r0, c1, c0, 0
106     bx      lr
107 }
108 
109 /*---------------------------------------------------------------------------*
110   Name:         OS_DisableDTCM
111 
112   Description:  disable DTCM
113 
114   Arguments:    None.
115 
116   Returns:      None.
117  *---------------------------------------------------------------------------*/
OS_DisableDTCM(void)118 asm void OS_DisableDTCM( void )
119 {
120     mrc     p15, 0, r0, c1, c0, 0
121     bic     r0, r0, #HW_C1_DTCM_ENABLE
122     mcr     p15, 0, r0, c1, c0, 0
123     bx      lr
124 }
125 
126 /*---------------------------------------------------------------------------*
127   Name:         OS_SetDTCMParam
128 
129   Description:  set parameter to DTCM
130 
131   Arguments:    param :  parameter to be set to DTCM
132 
133   Returns:      None.
134  *---------------------------------------------------------------------------*/
OS_SetDTCMParam(register u32 param)135 asm void OS_SetDTCMParam( register u32 param )
136 {
137     ldr     r1, =HW_C9_TCMR_BASE_MASK | HW_C9_TCMR_SIZE_MASK
138     and     r0, r0, r1
139     mcr     p15, 0, r0, c9, c1, 0
140     bx      lr
141 }
142 
143 /*---------------------------------------------------------------------------*
144   Name:         OS_GetDTCMParam
145 
146   Description:  get parameter to DTCM
147 
148   Arguments:    None
149 
150   Returns:      parameter about DTCM
151  *---------------------------------------------------------------------------*/
OS_GetDTCMParam(void)152 asm u32 OS_GetDTCMParam( void )
153 {
154     mrc     p15, 0, r0, c9, c1, 0
155     ldr     r1, =HW_C9_TCMR_BASE_MASK | HW_C9_TCMR_SIZE_MASK
156     and     r0, r0, r1
157     bx      lr
158 }
159 
160 //================================================================================
161 //          SET TCM ADDRESS
162 //================================================================================
163 #define OSi_TCM_REGION_SIZE_MASK  HW_C9_TCMR_SIZE_MASK  // 0x0000003e
164 #define OSi_TCM_REGION_BASE_MASK  HW_C9_TCMR_BASE_MASK  // 0xfffff000
165 
166 /*---------------------------------------------------------------------------*
167   Name:         OS_SetDTCMAddress
168 
169   Description:  Set start address of DTCM
170 
171   Arguments:    start address of DTCM
172 
173   Returns:      None.
174  *---------------------------------------------------------------------------*/
OS_SetDTCMAddress(register u32 address)175 asm void OS_SetDTCMAddress( register u32 address )
176 {
177     mrc      p15, 0, r2, c9, c1, 0
178     and      r2, r2, #OSi_TCM_REGION_SIZE_MASK
179 
180     ldr      r1, =OSi_TCM_REGION_BASE_MASK
181     and      r0, r0, r1
182     orr      r0, r0, r2
183     mcr      p15, 0, r0, c9, c1, 0
184 
185     bx       lr
186 }
187 
188 //================================================================================
189 //          GET TCM ADDRESS
190 //================================================================================
191 /*---------------------------------------------------------------------------*
192   Name:         OS_GetDTCMAddress
193 
194   Description:  Get start address of DTCM
195 
196   Arguments:    None.
197 
198   Returns:      start address of DTCM
199  *---------------------------------------------------------------------------*/
OS_GetDTCMAddress(void)200 asm u32 OS_GetDTCMAddress( void )
201 {
202     mrc      p15, 0, r0, c9, c1, 0
203     ldr      r1, =OSi_TCM_REGION_BASE_MASK
204     and      r0, r0, r1
205 
206     bx       lr
207 }
208 
209 #include <nitro/codereset.h>
210