1 /*---------------------------------------------------------------------------*
2   Project:  TwlSDK - CP - include
3   File:     sqrt.h
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 
18 #ifndef NITRO_CP_SQRT_H_
19 #define NITRO_CP_SQRT_H_
20 
21 #ifdef __cplusplus
22 extern "C" {
23 #endif
24 
25 #include <nitro/cp/context.h>
26 
27 //---- sqrt calculation mode
28 #define CP_SQRT_32BIT_MODE         (0UL << REG_CP_SQRTCNT_MODE_SHIFT)   // 32bit mode
29 #define CP_SQRT_64BIT_MODE         (1UL << REG_CP_SQRTCNT_MODE_SHIFT)   // 64bit mode
30 
31 
32 //================================================================================
33 //            sqrt control register setting
34 //================================================================================
35 /*---------------------------------------------------------------------------*
36   Name:         CP_SetSqrtControl
37 
38   Description:  set value to sqrt control register
39 
40   Arguments:    param : value to set
41 
42   Returns:      None
43  *---------------------------------------------------------------------------*/
CP_SetSqrtControl(u16 param)44 static inline void CP_SetSqrtControl(u16 param)
45 {
46     reg_CP_SQRTCNT = param;
47 }
48 
49 
50 //================================================================================
51 //            sqrt parameter setting
52 //================================================================================
53 /*---------------------------------------------------------------------------*
54   Name:         CP_SetSqrtImm64_NS_
55                 CP_SetSqrtImm32_NS_
56 
57   Description:  set value to sqrt parameter.
58                 not set bit-mode.
59                 not thread safe.
60 
61   Arguments:    param : parameter to set
62 
63   Returns:      None
64  *---------------------------------------------------------------------------*/
CP_SetSqrtImm64_NS_(u64 param)65 static inline void CP_SetSqrtImm64_NS_(u64 param)
66 {
67     *((REGType64 *)REG_SQRT_PARAM_ADDR) = param;
68 }
CP_SetSqrtImm32_NS_(u32 param)69 static inline void CP_SetSqrtImm32_NS_(u32 param)
70 {
71     *((REGType32 *)REG_SQRT_PARAM_ADDR) = param;
72 }
73 
74 /*---------------------------------------------------------------------------*
75   Name:         CP_SetSqrtImm64
76                 CP_SetSqrtImm32
77 
78   Description:  set value to sqrt parameter.
79                 not set bit-mode.
80 
81   Arguments:    param : parameter to set
82 
83   Returns:      None
84  *---------------------------------------------------------------------------*/
CP_SetSqrtImm64(u64 param)85 static inline void CP_SetSqrtImm64(u64 param)
86 {
87     *((REGType64 *)REG_SQRT_PARAM_ADDR) = param;
88 }
89 
CP_SetSqrtImm32(u32 param)90 static inline void CP_SetSqrtImm32(u32 param)
91 {
92     *((REGType32 *)REG_SQRT_PARAM_ADDR) = param;
93 }
94 
95 /*---------------------------------------------------------------------------*
96   Name:         CP_SetSqrt64
97                 CP_SetSqrt32
98 
99   Description:  set value to sqrt parameter.
100                 set bit-mode.
101 
102   Arguments:    param : parameter to set
103 
104   Returns:      None
105  *---------------------------------------------------------------------------*/
CP_SetSqrt64(u64 param)106 static inline void CP_SetSqrt64(u64 param)
107 {
108     reg_CP_SQRTCNT = CP_SQRT_64BIT_MODE;
109     CP_SetSqrtImm64_NS_(param);
110 }
111 
CP_SetSqrt32(u32 param)112 static inline void CP_SetSqrt32(u32 param)
113 {
114     reg_CP_SQRTCNT = CP_SQRT_32BIT_MODE;
115     CP_SetSqrtImm32_NS_(param);
116 }
117 
118 
119 //================================================================================
120 //            wait to finish
121 //================================================================================
122 /*---------------------------------------------------------------------------*
123   Name:         CP_IsSqrtBusy
124 
125   Description:  check sqrt calculation finished
126 
127   Arguments:    None.
128 
129   Returns:      non-0 if busy, 0 if finish
130  *---------------------------------------------------------------------------*/
CP_IsSqrtBusy(void)131 static inline s32 CP_IsSqrtBusy(void)
132 {
133     return (reg_CP_SQRTCNT & REG_CP_SQRTCNT_BUSY_MASK);
134 }
135 
136 /*---------------------------------------------------------------------------*
137   Name:         CP_WaitSqrt
138 
139   Description:  wait till sqrt calculation finish
140 
141   Arguments:    None.
142 
143   Returns:      None.
144  *---------------------------------------------------------------------------*/
CP_WaitSqrt(void)145 static inline void CP_WaitSqrt(void)
146 {
147     while (CP_IsSqrtBusy())
148     {
149     }
150 }
151 
152 //================================================================================
153 //            getting result
154 //================================================================================
155 /*---------------------------------------------------------------------------*
156   Name:         CP_GetSqrtResultImm8 / 16 / 32
157 
158   Description:  read result.
159                 not make sure to finish.
160 
161   Arguments:    None.
162 
163   Returns:      result
164  *---------------------------------------------------------------------------*/
CP_GetSqrtResultImm32(void)165 static inline u32 CP_GetSqrtResultImm32(void)
166 {
167     return (u32)(*((REGType32 *)REG_SQRT_RESULT_ADDR));
168 }
CP_GetSqrtResultImm16(void)169 static inline u16 CP_GetSqrtResultImm16(void)
170 {
171     return (u16)(*((REGType16 *)REG_SQRT_RESULT_ADDR));
172 }
CP_GetSqrtResultImm8(void)173 static inline u8 CP_GetSqrtResultImm8(void)
174 {
175     return (u8)(*((REGType8 *)REG_SQRT_RESULT_ADDR));
176 }
177 
178 /*---------------------------------------------------------------------------*
179   Name:         CP_GetSqrtResult8 / 16 / 32
180 
181   Description:  wait till finish, and read result.
182 
183   Arguments:    None.
184 
185   Returns:      result
186  *---------------------------------------------------------------------------*/
CP_GetSqrtResult32(void)187 static inline u32 CP_GetSqrtResult32(void)
188 {
189     CP_WaitSqrt();
190     return CP_GetSqrtResultImm32();
191 }
CP_GetSqrtResult16(void)192 static inline u16 CP_GetSqrtResult16(void)
193 {
194     CP_WaitSqrt();
195     return CP_GetSqrtResultImm16();
196 }
CP_GetSqrtResult8(void)197 static inline u8 CP_GetSqrtResult8(void)
198 {
199     CP_WaitSqrt();
200     return CP_GetSqrtResultImm8();
201 }
202 
203 #ifdef __cplusplus
204 } /* extern "C" */
205 #endif
206 
207 
208 /* NITRO_CP_SQRT_H_ */
209 #endif
210