blob: fe9b2e6f2d9d7747a6e2c9407b670fde481f8d40 [file] [log] [blame]
rjw6c1fd8f2022-11-30 14:33:01 +08001#include "elm.h"
2#include "drv_comm.h"
3#include "us_timer.h"
4#include "kal_public_api.h"
5#include "kal_hrt_api.h"
6#include "intrCtrl.h"
7#include "drv_mdap_interface.h" //for show AMIF scenario register in trace
8
9#if (defined(__MTK_TARGET__) && !defined(__MAUI_BASIC__))
10// for profiling ELM log
11#include "TrcMod.h" //for L1 Trace API
12#endif
13
14/** ----- Register definition ------ **/
15
16// MDMCU ELM
17#define REG_MCUSYS_EMI_ELM_CODA_VERSION (BASE_ADDR_MCUSYS_ELM_EMI+0x0)
18#define REG_MCUSYS_EMI_ELM_EN_REG (BASE_ADDR_MCUSYS_ELM_EMI+0x8)
19#define REG_MCUSYS_EMI_ELM_CTRL_REG (BASE_ADDR_MCUSYS_ELM_EMI+0xC)
20 #define ELM_MODE(x) ((x)<<4)
21 #define ELM_MODE_MASK 0x3
22 #define ELM_AO_DECODE(x) ((x)<<13)
23 #define ELM_DECODE_FROM_AO 1
24 #define ELM_DECODE_FROM_APB 0
25 #define ELM_MODE_ID_SEL(x) (x<<8)
26 #define ELM_MODE_ID_MASK 0xC //clear ID2/3 only
27 #define ELM_ID_RW(rw, id) (rw<<id) //rw: 0->r; 1->w; id: 0, 1, 2, 3
28#define REG_MCUSYS_EMI_ELM_LAT_CNT_CTRL_REG (BASE_ADDR_MCUSYS_ELM_EMI+0x10)
29#define REG_MCUSYS_EMI_ELM_AXI_ID0_CTRL_REG (BASE_ADDR_MCUSYS_ELM_EMI+0x20)
30 //Note: For "MDMCU" ELM support all in Mode 0 & Mode 2. For "MDINFRA" ELM only support AXI ID in mode 0, support all in mode 2.
31 #define AUSER(x) ((x)<<24) //7'h7F
32 #define AUSER_MASK 0x7F
33 #define USER_SOURCE(x) (x<<0)
34 #define US_MASK 0x3
35 #define US_USIP 0x0
36 #define US_IA 0x1
37 #define US_SFU 0x2
38 #define US_SPU 0x3
39 #define USER_ID(x) (x<<2)
40 #define UI_MASK 0x3
41 #define UI_VPE0 0x0
42 #define UI_VPE1 0x1
43 #define UI_THREAD0 0x0
44 #define UI_THREAD1 0x1
45 #define USER_CORE(x) (x<<4)
46 #define UC_MASK 0x7
47 #define UC_CORE0 0x0
48 #define UC_CORE1 0x1
49 #define UC_CORE2 0x2
50 #define UC_CORE3 0x3
51 #define UC_IOCU 0x4
52 #define UC_USIP0 0x5
53 #define UC_USIP1 0x6
54 #define ELM_SEL_VPE0 USER_SOURCE(US_IA)|USER_CORE(UC_CORE0)|USER_ID(UI_VPE0)
55 #define ELM_SEL_VPE1 USER_SOURCE(US_IA)|USER_CORE(UC_CORE0)|USER_ID(UI_VPE1)
56 #define ELM_SEL_VPE2 USER_SOURCE(US_IA)|USER_CORE(UC_CORE1)|USER_ID(UI_VPE0)
57 #define ELM_SEL_VPE3 USER_SOURCE(US_IA)|USER_CORE(UC_CORE1)|USER_ID(UI_VPE1)
58 #define ELM_SEL_VPE4 USER_SOURCE(US_IA)|USER_CORE(UC_CORE2)|USER_ID(UI_VPE0)
59 #define ELM_SEL_VPE5 USER_SOURCE(US_IA)|USER_CORE(UC_CORE2)|USER_ID(UI_VPE1)
60 #define ELM_SEL_USIP0_TH0 USER_SOURCE(US_USIP)|USER_CORE(UC_USIP0)|USER_ID(UI_THREAD0)
61 #define ELM_SEL_USIP0_TH1 USER_SOURCE(US_USIP)|USER_CORE(UC_USIP0)|USER_ID(UI_THREAD1)
62 #define ELM_SEL_USIP1_TH0 USER_SOURCE(US_USIP)|USER_CORE(UC_USIP1)|USER_ID(UI_THREAD0)
63 #define ELM_SEL_USIP1_TH1 USER_SOURCE(US_USIP)|USER_CORE(UC_USIP1)|USER_ID(UI_THREAD1)
64 #define ALEN(x) ((x)<<20) //4'hf
65 #define ASIZE(x) ((x)<<16) //3'h7
66 #define AULTRA(x) ((x)<<14) //2'h3
67 #define ABUST(x) ((x)<<12) //2'h3
68 #define AID(x) ((x)<<0) //12'hFFF
69 #define MASTER_DEFAULT_MASK 0xFFF //defualt value
70 #define MASTER_ALL_MASK 0x3 //IA: 0x0, MMU: 0x1, USIP: 0x2
71 #define MASTER_MDMCU 0x0 //MDMCU(Incluing IA & MMU)
72 #define MASTER_MDMCU_MASK 0xFFD
73 #define MASTER_USIP 0x2 //USIP -> 0x2
74 #define MASTER_USIP_MASK 0xFFC
75 #define MASTER_USIP_PORT(x) (x<<2)
76 #define MUP_ALL_MASK 0x3FF
77 #define MUP_PM_MASK 0x3FA
78 #define MUP_PM 0x0
79 #define MUP_DC_MASK 0x3FA
80 #define MUP_DC 0x4
81 #define MUP_DP_ALL_MASK 0x3FE
82 #define MUP_DP_ALL 0x1
83 #define MUP_DP_MASK 0x3EE
84 #define MUP_DP_CACHE 0x11
85 #define MUP_DP_NONCACHE 0x1
86/*
87#define ELM_USIP_CORE_SEL(x) (((x)<<4)|0x2)
88#define ELM_USIP_PORT_SEL(x) ((x)<<2)
89 #define ELM_USIP_PORT_ENABLE_MASK 0x3
90 #define ELM_USIP_PORT_DISABLE_MASK 0x0
91 #define ELM_SEL_USIP_ALL 0x0
92 #define ELM_SEL_USIP_ICACHE 0x0
93 #define ELM_SEL_USIP_DCACHE 0x1
94 #define ELM_SEL_USIP_DNOCACHE 0x2
95*/
96#define REG_MCUSYS_EMI_ELM_AXI_ID0_CTRL_MASK (BASE_ADDR_MCUSYS_ELM_EMI+0x24)
97 #define ELM_AO_CONTROL_DEFAULT 0x7FF7FFFF
98#define REG_MCUSYS_EMI_ELM_AXI_ID1_CTRL_REG (BASE_ADDR_MCUSYS_ELM_EMI+0x28)
99#define REG_MCUSYS_EMI_ELM_AXI_ID1_CTRL_MASK (BASE_ADDR_MCUSYS_ELM_EMI+0x2C)
100#define REG_MCUSYS_EMI_ELM_AXI_ID2_CTRL_REG (BASE_ADDR_MCUSYS_ELM_EMI+0x30)
101#define REG_MCUSYS_EMI_ELM_AXI_ID2_CTRL_MASK (BASE_ADDR_MCUSYS_ELM_EMI+0x34)
102#define REG_MCUSYS_EMI_ELM_AXI_ID3_CTRL_REG (BASE_ADDR_MCUSYS_ELM_EMI+0x38)
103#define REG_MCUSYS_EMI_ELM_AXI_ID3_CTRL_MASK (BASE_ADDR_MCUSYS_ELM_EMI+0x3C)
104#define REG_MCUSYS_EMI_ELM_ID0_TRANS_TH (BASE_ADDR_MCUSYS_ELM_EMI+0x40)
105#define REG_MCUSYS_EMI_ELM_ID1_TRANS_TH (BASE_ADDR_MCUSYS_ELM_EMI+0x44)
106#define REG_MCUSYS_EMI_ELM_CNT0 (BASE_ADDR_MCUSYS_ELM_EMI+0x50)
107#define REG_MCUSYS_EMI_ELM_CNT1 (BASE_ADDR_MCUSYS_ELM_EMI+0x54)
108#define REG_MCUSYS_EMI_ELM_CNT2 (BASE_ADDR_MCUSYS_ELM_EMI+0x58)
109#define REG_MCUSYS_EMI_ELM_CNT3 (BASE_ADDR_MCUSYS_ELM_EMI+0x5C)
110#define REG_MCUSYS_EMI_ELM_OVERRUN_CNT_ST (BASE_ADDR_MCUSYS_ELM_EMI+0x60)
111#define REG_MCUSYS_EMI_ELM_INT_STATUS (BASE_ADDR_MCUSYS_ELM_EMI+0x64)
112 #define INT_MASK_ALL 0x3F
113 #define INT_MASK_LAT 0xF
114 #define INT_MASK_WC 0x30
115 #define ID0_AVG_LAT_INT (1<<0)
116 #define ID0_TOT_LAT_INT (1<<1)
117 #define ID1_AVG_LAT_INT (1<<2)
118 #define ID1_TOT_LAT_INT (1<<3)
119 #define ID2_TOT_WC_INT (1<<4)
120 #define ID3_TOT_WC_INT (1<<5)
121#define REG_MCUSYS_EMI_ELM_AO_STATUS0 (BASE_ADDR_MCUSYS_ELM_EMI+0x68)
122 #define DECODE_ID0(x) ((x)<<0)
123 #define ELM_READ (0<<4)
124 #define ELM_WRITE (1<<4)
125 #define ELM_ALL_MASTER (0<<2)
126 #define ELM_MDMCU_ONLY (1<<2)
127 #define ELM_USIP_ONLY (2<<2)
128 #define ELM_ALL_PRIO (0<<0)
129 #define ELM_PRE_ULTRA (1<<0)
130 #define ELM_ULTRA (2<<0)
131 #define LAT_TH_ID0_NORMAL(x) ((x)<<5)
132 #define LAT_TH_ID1_NORMAL(x) ((x)<<15)
133 #define ELM_ACCURACY(x) ((x)<<25)
134 #define ELM_unit_100us 2
135 #define ELM_ENABLE (1<<27)
136 #define ELM_DISABLE (0<<27)
137 #define ELM_IDLE_ENABLE (1<<28)
138 #define ELM_IDLE_DISABLE (0<<28)
139#define REG_MCUSYS_EMI_ELM_AO_STATUS1 (BASE_ADDR_MCUSYS_ELM_EMI+0x6C)
140 #define ELM_INT_MASK(x) ((x)<<0)
141 #define LAT_INT_MASK_ALL 0xF
142 #define LAT_INT_UNMASK_ALL 0x0
143 #define EMI_BLOCK(x) ((x)<<4)
144 #define E_NOT_MASK 0
145 #define E_MASK 1
146 #define ELM_DURATION(x) ((x-1)<<5) // (x-1+1)*(ELM_ACCURACY), ELM_ACCURACY = 100us
147 #define DECODE_ID1(x) ((x)<<12)
148 /* #define usage same as DECODE_ID0 */
149 #define ELM_EMI_TOP_BLOCK(x) ((x)<<31)
150 #define E_TOP_MASK 1
151 #define E_TOP_NOT_MASK 0
152#define REG_MCUSYS_EMI_ELM_ID0_WORST_AVG_LAT_NORMAL (BASE_ADDR_MCUSYS_ELM_EMI+0x70)
153#define REG_MCUSYS_EMI_ELM_ID0_WORST_TOT_LAT_NORMAL (BASE_ADDR_MCUSYS_ELM_EMI+0x74)
154#define REG_MCUSYS_EMI_ELM_ID1_WORST_AVG_LAT_NORMAL (BASE_ADDR_MCUSYS_ELM_EMI+0x78)
155#define REG_MCUSYS_EMI_ELM_ID1_WORST_TOT_LAT_NORMAL (BASE_ADDR_MCUSYS_ELM_EMI+0x7C)
156#define REG_MCUSYS_EMI_ELM_ID0_TRANS_IN_WORST_AVG_NORMAL (BASE_ADDR_MCUSYS_ELM_EMI+0x80)
157#define REG_MCUSYS_EMI_ELM_ID1_TRANS_IN_WORST_AVG_NORMAL (BASE_ADDR_MCUSYS_ELM_EMI+0x84)
158#define REG_MCUSYS_EMI_ELM_ID0_MAXOST_IN_WORST_AVG_NORMAL (BASE_ADDR_MCUSYS_ELM_EMI+0x88)
159#define REG_MCUSYS_EMI_ELM_ID1_MAXOST_IN_WORST_AVG_NORMAL (BASE_ADDR_MCUSYS_ELM_EMI+0x8C)
160#define REG_MCUSYS_EMI_ELM_ID0_WORST_AVG_LAT_BLOCK (BASE_ADDR_MCUSYS_ELM_EMI+0x90)
161#define REG_MCUSYS_EMI_ELM_ID0_WORST_TOT_LAT_BLOCK (BASE_ADDR_MCUSYS_ELM_EMI+0x94)
162#define REG_MCUSYS_EMI_ELM_ID1_WORST_AVG_LAT_BLOCK (BASE_ADDR_MCUSYS_ELM_EMI+0x98)
163#define REG_MCUSYS_EMI_ELM_ID1_WORST_TOT_LAT_BLOCK (BASE_ADDR_MCUSYS_ELM_EMI+0x9C)
164#define REG_MCUSYS_EMI_ELM_ID0_TRANS_IN_WORST_AVG_BLOCK (BASE_ADDR_MCUSYS_ELM_EMI+0xA0)
165#define REG_MCUSYS_EMI_ELM_ID1_TRANS_IN_WORST_AVG_BLOCK (BASE_ADDR_MCUSYS_ELM_EMI+0xA4)
166#define REG_MCUSYS_EMI_ELM_ID0_MAXOST_IN_WORST_AVG_BLOCK (BASE_ADDR_MCUSYS_ELM_EMI+0xA8)
167#define REG_MCUSYS_EMI_ELM_ID1_MAXOST_IN_WORST_AVG_BLOCK (BASE_ADDR_MCUSYS_ELM_EMI+0xAC)
168#define REG_MCUSYS_EMI_ELM_ID2_WORST_WORD_CNT (BASE_ADDR_MCUSYS_ELM_EMI+0xB0)
169#define REG_MCUSYS_EMI_ELM_ID3_WORST_WORD_CNT (BASE_ADDR_MCUSYS_ELM_EMI+0xB4)
170#define REG_MCUSYS_EMI_ELM_ID0_LAST_FLAG (BASE_ADDR_MCUSYS_ELM_EMI+0xC0)
171#define REG_MCUSYS_EMI_ELM_ID0_LAST_AVG_LAT (BASE_ADDR_MCUSYS_ELM_EMI+0xC4)
172#define REG_MCUSYS_EMI_ELM_ID0_LAST_TRANS_CNT (BASE_ADDR_MCUSYS_ELM_EMI+0xC8)
173#define REG_MCUSYS_EMI_ELM_ID0_LAST_MAXOST (BASE_ADDR_MCUSYS_ELM_EMI+0xCC)
174#define REG_MCUSYS_EMI_ELM_ID1_LAST_FLAG (BASE_ADDR_MCUSYS_ELM_EMI+0xD0)
175#define REG_MCUSYS_EMI_ELM_ID1_LAST_AVG_LAT (BASE_ADDR_MCUSYS_ELM_EMI+0xD4)
176#define REG_MCUSYS_EMI_ELM_ID1_LAST_TRANS_CNT (BASE_ADDR_MCUSYS_ELM_EMI+0xD8)
177#define REG_MCUSYS_EMI_ELM_ID1_LAST_MAXOST (BASE_ADDR_MCUSYS_ELM_EMI+0xDC)
178#define REG_MCUSYS_EMI_ELM_CNT4 (BASE_ADDR_MCUSYS_ELM_EMI+0xE0)
179#define REG_MCUSYS_EMI_ELM_CNT5 (BASE_ADDR_MCUSYS_ELM_EMI+0xE4)
180#define REG_MCUSYS_EMI_ELM_AO_STATUS2 (BASE_ADDR_MCUSYS_ELM_EMI+0xF0)
181 #define ELM_WC_INT_MASK(x) ((x)<<0)
182 #define WC_INT_MASK_ALL 0x3
183 #define WC_INT_UNMASK_ALL 0x0
184 #define LAT_TH_ID0_BLOCK(x) ((x)<<4)
185 #define LAT_TH_ID1_BLOCK(x) ((x)<<16)
186#if 0
187/* under construction !*/
188/* under construction !*/
189/* under construction !*/
190/* under construction !*/
191/* under construction !*/
192/* under construction !*/
193/* under construction !*/
194#endif
195#define REG_MCUSYS_EMI_ELM_ID2_WORDCNT_TH (BASE_ADDR_MCUSYS_ELM_EMI+0x510)
196#define REG_MCUSYS_EMI_ELM_ID3_WORDCNT_TH (BASE_ADDR_MCUSYS_ELM_EMI+0x514)
197#define REG_MCUSYS_EMI_ELM_WORDCNT_DURATION (BASE_ADDR_MCUSYS_ELM_EMI+0x528)
198 #define ELM_WC_DURATION(x) (x-1) // (x-1+1) us
199
200
201// MDINFRA ELM
202#define REG_MDINFRA_ELM_CTRL_REG (BASE_ADDR_MDINFRA_ELM+0xC)
203#define REG_MDINFRA_ELM_AXI_ID0_CTRL_REG (BASE_ADDR_MDINFRA_ELM+0x20)
204#define REG_MDINFRA_ELM_AXI_ID0_CTRL_MASK (BASE_ADDR_MDINFRA_ELM+0x24)
205#define REG_MDINFRA_ELM_AXI_ID1_CTRL_REG (BASE_ADDR_MDINFRA_ELM+0x28)
206#define REG_MDINFRA_ELM_AXI_ID1_CTRL_MASK (BASE_ADDR_MDINFRA_ELM+0x2C)
207#define REG_MDINFRA_ELM_AXI_ID2_CTRL_REG (BASE_ADDR_MDINFRA_ELM+0x30)
208#define REG_MDINFRA_ELM_AXI_ID2_CTRL_MASK (BASE_ADDR_MDINFRA_ELM+0x34)
209#define REG_MDINFRA_ELM_AXI_ID3_CTRL_REG (BASE_ADDR_MDINFRA_ELM+0x38)
210#define REG_MDINFRA_ELM_AXI_ID3_CTRL_MASK (BASE_ADDR_MDINFRA_ELM+0x3C)
211#define REG_MDINFRA_ELM_INT_STATUS (BASE_ADDR_MDINFRA_ELM+0x64)
212#define REG_MDINFRA_ELM_ID0_WORST_AVG_LAT_NORMAL (BASE_ADDR_MDINFRA_ELM+0x70)
213#define REG_MDINFRA_ELM_ID0_WORST_TOT_LAT_NORMAL (BASE_ADDR_MDINFRA_ELM+0x74)
214#define REG_MDINFRA_ELM_ID1_WORST_AVG_LAT_NORMAL (BASE_ADDR_MDINFRA_ELM+0x78)
215#define REG_MDINFRA_ELM_ID1_WORST_TOT_LAT_NORMAL (BASE_ADDR_MDINFRA_ELM+0x7C)
216#define REG_MDINFRA_ELM_ID0_TRANS_IN_WORST_AVG_NORMAL (BASE_ADDR_MDINFRA_ELM+0x80)
217#define REG_MDINFRA_ELM_ID1_TRANS_IN_WORST_AVG_NORMAL (BASE_ADDR_MDINFRA_ELM+0x84)
218#define REG_MDINFRA_ELM_ID0_MAXOST_IN_WORST_AVG_NORMAL (BASE_ADDR_MDINFRA_ELM+0x88)
219#define REG_MDINFRA_ELM_ID1_MAXOST_IN_WORST_AVG_NORMAL (BASE_ADDR_MDINFRA_ELM+0x8C)
220#define REG_MDINFRA_ELM_ID2_WORST_WORD_CNT (BASE_ADDR_MDINFRA_ELM+0xB0)
221#define REG_MDINFRA_ELM_ID3_WORST_WORD_CNT (BASE_ADDR_MDINFRA_ELM+0xB4)
222#define REG_MDINFRA_ELM_ID0_TRANS_TH (BASE_ADDR_MDINFRA_ELM+0x40)
223#define REG_MDINFRA_ELM_ID1_TRANS_TH (BASE_ADDR_MDINFRA_ELM+0x44)
224#define REG_MDINFRA_ELM_INT_STATUS (BASE_ADDR_MDINFRA_ELM+0x64)
225#define REG_MDINFRA_ELM_ID2_WORDCNT_TH (BASE_ADDR_MDINFRA_ELM+0x510)
226#define REG_MDINFRA_ELM_ID3_WORDCNT_TH (BASE_ADDR_MDINFRA_ELM+0x514)
227#define REG_MDINFRA_ELM_WORDCNT_DURATION (BASE_ADDR_MDINFRA_ELM+0x528)
228 #define ELM_WC_DURATION(x) (x-1) // (x-1+1) us
229
230//AO Register in MDPERIMISC
231#define REG_MDMCU_ELM_AO_STATUS_CFG0 (BASE_ADDR_MDPERIMISC+0x70) //0xA0060070
232#define REG_MDMCU_ELM_AO_STATUS_CFG1 (BASE_ADDR_MDPERIMISC+0x74) //0xA0060074
233#define REG_MDMCU_ELM_AO_STATUS_CFG2 (BASE_ADDR_MDPERIMISC+0x90) //0xA0060090
234#define REG_MDINFRA_ELM_AO_STATUS_CFG0 (BASE_ADDR_MDPERIMISC+0x78) //0xA0060078
235#define REG_MDINFRA_ELM_AO_STATUS_CFG1 (BASE_ADDR_MDPERIMISC+0x7C) //0xA006007C
236#define REG_MDINFRA_ELM_AO_STATUS_CFG2 (BASE_ADDR_MDPERIMISC+0x94) //0xA0060094
237
238/** ----- AP debugging register definition ------ **/
239#if 1 //defined(MT3967)
240#define AP_VCORE_DVFS_CURRENT (volatile kal_uint32 *)(BASE_ADDR_AP_VCORE_DVFS+0xFC) // current dvfsrc level
241#define AP_VCORE_DVFS_LAST (volatile kal_uint32 *)(BASE_ADDR_AP_VCORE_DVFS+0x308) // last dvfsrc level
242#define AP_VCORE_DVFS_HISTORY_BASE (volatile kal_uint32 *)(BASE_ADDR_AP_VCORE_DVFS+0x400) // dvfsrc history start address, end address should be 0x45C
243#define AP_VCORE_DVFS_HISTORY_SIZE 24
244#define AP_DVFS_OCCUR_TICK (volatile kal_uint32 *)(BASE_ADDR_AP_SPM+0x624)
245#endif
246
247#include "sleepdrv_interface.h"
248
249// ELM Set Mode (HW/SW Mode)
250enum {
251 ELM_MODE_0 = 0, // ID0 trans_cnt, ID1 trans_cnt, ID0_lat_cnt, ID1_lat_cnt, id2_word_cnt, id3_word_cnt
252 ELM_MODE_2 = 2, // ID0 trans_cnt, ID1 trans_cnt, ID2 trans_cnt, ID3 trans_cnt, NA, NA
253};
254
255//MCUSYS fixed clock 208Mhz, 1T = 4.8ns
256#define ELM_TRANS2NS(X) ((((((X)*1000)<<4)/208)>>4))
257#define ELM_NS2TRAN(X) ((((X)*208)/1000))
258
259//MDINFRA fixed clock 100Mhz, 1T = 10ns
260#define ELM_MDINFRA_TRANS2NS(X) (((X)*10))
261#define ELM_MDINFRA_NS2TRAN(X) (((X)/10))
262
263
264//for assert information
265#define KAL_ERROR_EMI_ELM_EXCEP 0x4100
266#define KAL_ERROR_INFRA_ELM_EXCEP 0x4102
267
268#define KAL_ERROR_EMI_ELM_CHANGE_THRESHOLD 0x4200
269
270#if (defined(__MTK_TARGET__) && !defined(__MAUI_BASIC__))
271 #define __ELM_TRACE__
272 #define ELM_IF_DEF_TRACE(def_statement, undef_statement) def_statement
273#else /* __MCU_DORMANT_MODE__ */
274 #define ELM_IF_DEF_TRACE(def_statement, undef_statement) undef_statement
275#endif
276
277
278#ifdef __MTK_TARGET__
279
280kal_uint32 elm_dynamic_lat_threshold_disable = 0; //0 enable, 1 disable
281
282/*--- MDMCU global variable ---*/
283kal_uint32 elm_mode = ELM_MODE_0;
284// latency criteria
285kal_uint32 elm_trans_threshold = 100;
286kal_uint32 elm_lat_dur_100us = 2; //2*100us = 200us
287#ifdef ELM_AMIF_ENABLE
288kal_uint32 elm_read_lat_threshold = 2000;
289kal_uint32 elm_write_lat_threshold = 2000;
290#else
291kal_uint32 elm_read_lat_threshold = 450;
292kal_uint32 elm_write_lat_threshold = 300;
293#endif
294// word count criteria
295kal_uint32 elm_wc_dur_in_us = 200; // 2*100us = 200us
296kal_uint32 elm_read_wc_threshold = 2*1024*1024*256; // 2*1024*1024*1024/4 * 4 = 2GB
297kal_uint32 elm_write_wc_threshold = 2*1024*1024*256; // 2*1024*1024*1024/4 * 4 = 2GB
298// AO decode setting
299kal_uint32 elm_ao_decode_cfg = ELM_DECODE_FROM_AO;
300kal_uint32 elm_id0_master = ELM_ALL_MASTER;
301kal_uint32 elm_id0_rw = ELM_READ;
302kal_uint32 elm_id0_prio = ELM_ALL_PRIO;
303kal_uint32 elm_id1_master = ELM_ALL_MASTER;
304kal_uint32 elm_id1_rw = ELM_WRITE;
305kal_uint32 elm_id1_prio = ELM_ALL_PRIO;
306// IDx cnt default value target all transaction
307kal_uint32 elm_id0_value = 0;
308kal_uint32 elm_id0_mask = ELM_AO_CONTROL_DEFAULT;
309kal_uint32 elm_id1_value = 0;
310kal_uint32 elm_id1_mask = ELM_AO_CONTROL_DEFAULT;
311kal_uint32 elm_id2_value = 0;
312kal_uint32 elm_id2_mask = ELM_AO_CONTROL_DEFAULT;
313kal_uint32 elm_id3_value = 0;
314kal_uint32 elm_id3_mask = ELM_AO_CONTROL_DEFAULT;
315kal_uint32 elm_id2_rw = ELM_RD;
316kal_uint32 elm_id3_rw = ELM_WR;
317
318/*--- MDINFRA global variable ---*/
319// latency criteria
320kal_uint32 elm_infra_lat_dur_100us = 10; //10*100us = 1000us = 1ms
321kal_uint32 elm_infra_read_lat_threshold = 2000;
322kal_uint32 elm_infra_write_lat_threshold = 2000;
323// word count criteria
324kal_uint32 elm_infra_wc_dur_in_us = 10000; // 10*1000us = 10ms
325kal_uint32 elm_infra_read_wc_threshold = 2*1024*1024*256;
326kal_uint32 elm_infra_write_wc_threshold = 2*1024*1024*256;
327// ID2/3 cnt default value target all transaction
328kal_uint32 elm_infra_ao_decode_cfg = ELM_DECODE_FROM_AO;
329kal_uint32 elm_infra_id0_value = 0;
330kal_uint32 elm_infra_id0_mask = ELM_AO_CONTROL_DEFAULT;
331kal_uint32 elm_infra_id1_value = 0;
332kal_uint32 elm_infra_id1_mask = ELM_AO_CONTROL_DEFAULT;
333kal_uint32 elm_infra_id2_value = 0;
334kal_uint32 elm_infra_id2_mask = ELM_AO_CONTROL_DEFAULT;
335kal_uint32 elm_infra_id3_value = 0;
336kal_uint32 elm_infra_id3_mask = ELM_AO_CONTROL_DEFAULT;
337kal_uint32 elm_infra_id2_rw = ELM_RD;
338kal_uint32 elm_infra_id3_rw = ELM_WR;
339
340
341#if defined(__PRODUCTION_RELEASE__)
342elm_exception_type EMI_ELM_lat_irq_exception_type = ELM_NONE; //EMI latency irq default use trace
343elm_exception_type EMI_ELM_wc_irq_exception_type = ELM_NONE; //EMI wc irq default use trace
344elm_exception_type INFRA_ELM_lat_irq_exception_type = ELM_NONE; //INFRA latency irq default use trace
345elm_exception_type INFRA_ELM_wc_irq_exception_type = ELM_NONE; //INFRA wc irq default use trace
346#else
347/* under construction !*/
348/* under construction !*/
349/* under construction !*/
350/* under construction !*/
351#endif
352
353
354/*--- ELM history variable ---*/
355#define ELM_RUNTIME_HISTORY_SIZE 8
356
357//EMI ELM
358kal_uint32 emi_elm_runtime_lat_history_idx = 0;
359ELM_RUNTIME_PROFILE_LAT_T emi_elm_runtime_lat_history[ELM_RUNTIME_HISTORY_SIZE];
360kal_uint32 emi_elm_runtime_wc_history_idx = 0;
361ELM_RUNTIME_PROFILE_WC_T emi_elm_runtime_wc_history[ELM_RUNTIME_HISTORY_SIZE];
362//INFRA ELM
363kal_uint32 infra_elm_runtime_lat_history_idx = 0;
364ELM_RUNTIME_PROFILE_LAT_T infra_elm_runtime_lat_history[ELM_RUNTIME_HISTORY_SIZE];
365kal_uint32 infra_elm_runtime_wc_history_idx = 0;
366ELM_RUNTIME_PROFILE_WC_T infra_elm_runtime_wc_history[ELM_RUNTIME_HISTORY_SIZE];
367
368
369
370
371void elmtop_emi_isr_handler();
372void elm_infra_isr_handler();
373
374
375
376#define ELM_HISTORY_SIZE 64
377kal_uint32 elm_profile_history_idx_0 = 0;
378ELM_FULL_LOG_T elm_profile_history_0[ELM_HISTORY_SIZE];
379
380
381void ELM_INIT(void)
382{
383 /*MDMCU EMI ELM*/
384 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS_CFG0, ELM_DISABLE);
385 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_INT_STATUS, INT_MASK_ALL); // clear ELM interrupt
386 DRV_ClrReg32(REG_MCUSYS_EMI_ELM_CTRL_REG, ELM_MODE(ELM_MODE_MASK)); // clear ELM mode
387 DRV_SetReg32(REG_MCUSYS_EMI_ELM_CTRL_REG, ELM_MODE(ELM_MODE_MASK & elm_mode)); // select ELM mode
388 DRV_ClrReg32(REG_MCUSYS_EMI_ELM_CTRL_REG, ELM_MODE_ID_SEL(ELM_MODE_ID_MASK)); // clear ELM_MODE_ID_SEL
389 DRV_SetReg32(REG_MCUSYS_EMI_ELM_CTRL_REG, ELM_MODE_ID_SEL(ELM_ID_RW(elm_id2_rw, 2)|ELM_ID_RW(elm_id3_rw, 3))); // set ELM_MODE_ID_SEL
390 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_ID0_TRANS_TH, elm_trans_threshold);
391 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_ID1_TRANS_TH, elm_trans_threshold);
392 // config id2/3 setting
393 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID2_CTRL_REG, elm_id2_value);
394 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID2_CTRL_MASK, elm_id2_mask);
395 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID3_CTRL_REG, elm_id3_value);
396 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID3_CTRL_MASK, elm_id3_mask);
397 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_ID2_WORDCNT_TH, elm_read_wc_threshold);
398 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_ID3_WORDCNT_TH, elm_write_wc_threshold);
399 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_WORDCNT_DURATION, ELM_WC_DURATION(elm_wc_dur_in_us));
400
401 DRV_WriteReg32(REG_MDMCU_ELM_AO_STATUS_CFG1, ELM_EMI_TOP_BLOCK(E_TOP_MASK)|DECODE_ID1(elm_id1_rw|elm_id1_master|elm_id1_prio)| \
402 ELM_DURATION(elm_lat_dur_100us)|EMI_BLOCK(E_NOT_MASK)|ELM_INT_MASK(LAT_INT_UNMASK_ALL));
403 DRV_WriteReg32(REG_MDMCU_ELM_AO_STATUS_CFG2, LAT_TH_ID1_BLOCK(ELM_NS2TRAN((kal_uint32)(1.5*elm_write_lat_threshold)))| \
404 LAT_TH_ID0_BLOCK(ELM_NS2TRAN((kal_uint32)(1.5*elm_read_lat_threshold)))|ELM_WC_INT_MASK(WC_INT_UNMASK_ALL));
405 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS_CFG0, ELM_IDLE_ENABLE|ELM_ENABLE|ELM_ACCURACY(ELM_unit_100us)| \
406 LAT_TH_ID1_NORMAL(ELM_NS2TRAN(elm_write_lat_threshold))|LAT_TH_ID0_NORMAL(ELM_NS2TRAN(elm_read_lat_threshold))| \
407 DECODE_ID0(elm_id0_rw|elm_id0_master|elm_id0_prio)); //ELM enable for MDMCU Reset
408#if 0 //IRQ register is done by IRQ centralization
409/* under construction !*/
410/* under construction !*/
411/* under construction !*/
412#endif
413 /*MDINFRA EMI ELM*/
414 DRV_WriteReg32_NPW(REG_MDINFRA_ELM_AO_STATUS_CFG0, ELM_DISABLE);
415 DRV_WriteReg32(REG_MDINFRA_ELM_INT_STATUS, INT_MASK_ALL); //clear ELM interrupt
416 DRV_ClrReg32(REG_MDINFRA_ELM_CTRL_REG, ELM_MODE_ID_SEL(ELM_MODE_ID_MASK)); // clear ELM_MODE_ID_SEL
417 DRV_SetReg32(REG_MDINFRA_ELM_CTRL_REG, ELM_MODE_ID_SEL(ELM_ID_RW(elm_infra_id2_rw, 2)|ELM_ID_RW(elm_infra_id3_rw, 3))); // set ELM_MODE_ID_SEL
418 DRV_WriteReg32(REG_MDINFRA_ELM_ID0_TRANS_TH, elm_trans_threshold);
419 DRV_WriteReg32(REG_MDINFRA_ELM_ID1_TRANS_TH, elm_trans_threshold);
420 // config word_cnt window setting
421 DRV_WriteReg32(REG_MDINFRA_ELM_AXI_ID2_CTRL_REG, elm_infra_id2_value);
422 DRV_WriteReg32(REG_MDINFRA_ELM_AXI_ID2_CTRL_MASK, elm_infra_id2_mask);
423 DRV_WriteReg32(REG_MDINFRA_ELM_AXI_ID3_CTRL_REG, elm_infra_id3_value);
424 DRV_WriteReg32(REG_MDINFRA_ELM_AXI_ID3_CTRL_MASK, elm_infra_id3_mask);
425 DRV_WriteReg32(REG_MDINFRA_ELM_ID2_WORDCNT_TH, elm_infra_read_wc_threshold);
426 DRV_WriteReg32(REG_MDINFRA_ELM_ID3_WORDCNT_TH, elm_infra_write_wc_threshold);
427 DRV_WriteReg32(REG_MDINFRA_ELM_WORDCNT_DURATION, ELM_WC_DURATION(elm_infra_wc_dur_in_us));
428
429 DRV_WriteReg32(REG_MDINFRA_ELM_AO_STATUS_CFG1, ELM_EMI_TOP_BLOCK(E_TOP_MASK)|DECODE_ID1(elm_id1_rw|elm_id1_prio)| \
430 ELM_DURATION(elm_infra_lat_dur_100us)|EMI_BLOCK(E_NOT_MASK)|ELM_INT_MASK(LAT_INT_UNMASK_ALL));
431 DRV_WriteReg32(REG_MDINFRA_ELM_AO_STATUS_CFG2, LAT_TH_ID1_BLOCK(ELM_MDINFRA_NS2TRAN((kal_uint32)(1.5*elm_infra_write_lat_threshold)))| \
432 LAT_TH_ID0_BLOCK(ELM_MDINFRA_NS2TRAN((kal_uint32)(1.5*elm_infra_read_lat_threshold)))|ELM_WC_INT_MASK(WC_INT_UNMASK_ALL));
433 DRV_WriteReg32_NPW(REG_MDINFRA_ELM_AO_STATUS_CFG0, ELM_IDLE_ENABLE|ELM_ENABLE|ELM_ACCURACY(ELM_unit_100us)| \
434 LAT_TH_ID1_NORMAL(ELM_MDINFRA_NS2TRAN(elm_infra_write_lat_threshold))|LAT_TH_ID0_NORMAL(ELM_MDINFRA_NS2TRAN(elm_infra_read_lat_threshold))| \
435 DECODE_ID0(elm_id0_rw|elm_id0_prio)); //ELM enable for MDMCU Reset
436
437#if 0 //IRQ register is done by IRQ centralization
438/* under construction !*/
439/* under construction !*/
440/* under construction !*/
441#endif
442}
443
444void ELM_Config_DormantLeave(void)
445{
446 kal_uint32 vpe_idx;
447 vpe_idx = kal_get_current_vpe_id();
448 if(0 == vpe_idx)
449 {
450 ELM_INIT();
451 emi_elm_runtime_lat_history_idx =0;
452 memset((void*)emi_elm_runtime_lat_history,0, sizeof(ELM_RUNTIME_PROFILE_LAT_T)*ELM_RUNTIME_HISTORY_SIZE);
453 }
454}
455
456void ELM_Config_DormantEnter(void)
457{
458
459}
460
461void ELM_GET_FULL_LOG(ELM_FULL_LOG_T* data)
462{
463 if(NULL==data)
464 {
465 return;
466 }
467
468#ifdef __ELM_RUNTIME_PROFILE__
469 elm_profile_history_0[elm_profile_history_idx_0].fma_stamp = ust_get_current_time();
470 ELM_GET_ALL_LOG(0,elm_profile_history_0[elm_profile_history_idx_0]);
471 elm_profile_history_0[elm_profile_history_idx_0].r_lat_thr = elm_read_lat_threshold;
472 elm_profile_history_0[elm_profile_history_idx_0].w_lat_thr = elm_write_lat_threshold;
473 memcpy(data,&elm_profile_history_0[elm_profile_history_idx_0], sizeof(ELM_FULL_LOG_T));
474 elm_profile_history_idx_0 = (elm_profile_history_idx_0 + 1) % ELM_HISTORY_SIZE ;
475#else
476 data->fma_stamp = ust_get_current_time();
477 ELM_GET_CNT(ELM_WR, ELM_TYPE_TRANS, 0, &(data->w_trans));
478 ELM_GET_CNT(ELM_WR, ELM_TYPE_LATENCY, 0, &(data->w_latency));
479 ELM_GET_WC_CNT(ELM_WR, 0, &(data->w_wordcount));
480 ELM_GET_CNT(ELM_RD, ELM_TYPE_TRANS, 0, &(data->r_trans));
481 ELM_GET_CNT(ELM_RD, ELM_TYPE_LATENCY, 0, &(data->r_latency));
482 ELM_GET_WC_CNT(ELM_RD, 0, &(data->r_wordcount));
483#endif
484
485}
486
487kal_uint32 debug_emi_elm_runtime_counter = 0;
488kal_uint32 debug_MDMCU_elm_last_INT_FRC = 0;
489kal_uint32 debug_MDIFRA_elm_last_INT_FRC = 0;
490
491
492
493#define E_MAX16(x) ((x>0xFFFF)? 0xFFFF : x)
494
495kal_uint32 elm_md_dvfs_con = 0;
496kal_uint32 elm_ap_vcore_dvfs_current = 0;
497kal_uint32 elm_ap_vcore_dvfs_last = 0;
498kal_uint32 elm_ap_vcore_dvfs_history[AP_VCORE_DVFS_HISTORY_SIZE] = {0};
499
500void elmtop_emi_isr_handler()
501{
502 // TODO: ELM mutex need here
503
504 kal_uint32 curr_frc = 0;
505 kal_uint32 int_status = 0;
506 kal_uint32 read_trans_count = 0, write_trans_count = 0;
507 kal_uint32 read_worst_latency_ns = 0, write_worst_latency_ns = 0;
508 kal_uint32 read_worst_alat_maxost = 0, write_worst_alat_maxost = 0;
509 kal_uint32 read_worst_wc = 0, write_worst_wc = 0;
510 kal_uint32 read_total_latency_ns = 0, write_total_latency_ns = 0;
511 kal_uint32 ia_13m_tick = 0, dvfs_13m_tick = 0;
512 debug_emi_elm_runtime_counter++;
513
514 //Mask cirq ELM interrupt
515 IRQMask(IRQ_ELMTOP_EMI_IRQ_CODE);
516
517 //DRV_WriteReg32_NPW(REG_MCUSYS_EMI_ELM_ELM_EN_REG, 0); //stop ELM
518 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS_CFG0, ELM_DISABLE);
519
520 curr_frc = ust_get_current_time();
521#if 1
522 ia_13m_tick = SleepDrv_GetWallClk();
523 dvfs_13m_tick = DRV_Reg32(AP_DVFS_OCCUR_TICK);
524#endif
525 int_status = DRV_Reg32(REG_MCUSYS_EMI_ELM_INT_STATUS); //Read ELM interrupt status
526
527 // Check latency or word count interrupt first
528
529 /* Handling latency interrupt */
530 if(int_status & INT_MASK_LAT)
531 {
532 read_worst_latency_ns = ELM_TRANS2NS( DRV_Reg32(REG_MCUSYS_EMI_ELM_ID0_WORST_AVG_LAT_NORMAL) );
533 read_total_latency_ns = ELM_TRANS2NS( DRV_Reg32(REG_MCUSYS_EMI_ELM_ID0_WORST_TOT_LAT_NORMAL) );
534 write_worst_latency_ns = ELM_TRANS2NS( DRV_Reg32(REG_MCUSYS_EMI_ELM_ID1_WORST_AVG_LAT_NORMAL) );
535 write_total_latency_ns = ELM_TRANS2NS( DRV_Reg32(REG_MCUSYS_EMI_ELM_ID1_WORST_TOT_LAT_NORMAL) );
536 read_trans_count = DRV_Reg32(REG_MCUSYS_EMI_ELM_ID0_TRANS_IN_WORST_AVG_NORMAL);
537 write_trans_count = DRV_Reg32(REG_MCUSYS_EMI_ELM_ID1_TRANS_IN_WORST_AVG_NORMAL);
538 read_worst_alat_maxost = DRV_Reg32(REG_MCUSYS_EMI_ELM_ID0_MAXOST_IN_WORST_AVG_NORMAL);
539 write_worst_alat_maxost = DRV_Reg32(REG_MCUSYS_EMI_ELM_ID1_MAXOST_IN_WORST_AVG_NORMAL);
540
541 emi_elm_runtime_lat_history[emi_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].cur_frc = curr_frc;
542 emi_elm_runtime_lat_history[emi_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].int_status= int_status;
543 emi_elm_runtime_lat_history[emi_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].r_trans = read_trans_count;
544 emi_elm_runtime_lat_history[emi_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].w_trans = write_trans_count;
545 emi_elm_runtime_lat_history[emi_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].r_alat = read_worst_latency_ns;
546 emi_elm_runtime_lat_history[emi_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].r_alat_maxost = read_worst_alat_maxost;
547 emi_elm_runtime_lat_history[emi_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].w_alat = write_worst_latency_ns;
548 emi_elm_runtime_lat_history[emi_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].w_alat_maxost = write_worst_alat_maxost;
549 emi_elm_runtime_lat_history[emi_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].r_l2_tot_lat = read_total_latency_ns;
550 emi_elm_runtime_lat_history[emi_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].w_l2_tot_lat = write_total_latency_ns;
551 emi_elm_runtime_lat_history[emi_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].ap_dvfs_tick = dvfs_13m_tick;
552 emi_elm_runtime_lat_history[emi_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].md_tick = ia_13m_tick;
553 emi_elm_runtime_lat_history_idx++;
554
555 elm_md_dvfs_con = drv_mdap_interface_hw_get_curr_scenario_reg();
556 // Read AP side debugging register
557 elm_ap_vcore_dvfs_current = *AP_VCORE_DVFS_CURRENT;
558 elm_ap_vcore_dvfs_last = *AP_VCORE_DVFS_LAST;
559#if defined(MT3967)
560#if 0
561/* under construction !*/
562/* under construction !*/
563/* under construction !*/
564/* under construction !*/
565/* under construction !*/
566/* under construction !*/
567/* under construction !*/
568/* under construction !*/
569/* under construction !*/
570/* under construction !*/
571#endif
572 // only dvfs tick information, no need to use if/else.
573 ELM_IF_DEF_TRACE(MD_TRC_EMI_AP_DVFS_WARN(curr_frc, ia_13m_tick, dvfs_13m_tick),);
574#endif
575 switch(EMI_ELM_lat_irq_exception_type)
576 {
577 case ELM_NONE:
578 {
579 //read latency over criteria
580 if(int_status & (ID0_AVG_LAT_INT|ID0_TOT_LAT_INT))
581 {
582 ELM_IF_DEF_TRACE( \
583 MD_TRC_EMI_ELM_R_LAT_WARN(curr_frc, read_worst_latency_ns, elm_read_lat_threshold, read_total_latency_ns, read_trans_count, \
584 elm_md_dvfs_con, elm_ap_vcore_dvfs_current, elm_ap_vcore_dvfs_last), \
585 );
586 }
587 //write latency over criteria
588 else
589 {
590 ELM_IF_DEF_TRACE( \
591 MD_TRC_EMI_ELM_W_LAT_WARN(curr_frc, write_worst_latency_ns, elm_write_lat_threshold, write_total_latency_ns, write_trans_count, \
592 elm_md_dvfs_con, elm_ap_vcore_dvfs_current, elm_ap_vcore_dvfs_last), \
593 );
594 }
595 break;
596 }
597 case ELM_ASSERT:
598 {
599 if(int_status & (ID0_AVG_LAT_INT|ID0_TOT_LAT_INT))
600 {
601 EXT_ASSERT(0,(E_MAX16(elm_read_lat_threshold)<<16)|(E_MAX16(read_worst_latency_ns)), \
602 (E_MAX16(read_trans_count)<<16)|(E_MAX16(read_total_latency_ns)), \
603 (E_MAX16(0)<<16)|(E_MAX16(int_status)));
604 }
605 else
606 {
607 EXT_ASSERT(0,(E_MAX16(elm_write_lat_threshold)<<16)|(E_MAX16(write_worst_latency_ns)), \
608 (E_MAX16(write_trans_count)<<16)|(E_MAX16(write_total_latency_ns)), \
609 (E_MAX16(0)<<16)|(E_MAX16(int_status)));
610 }
611 break;
612 }
613 case ELM_ASSERT_AT_2nd:
614 {
615 // just show trace on first time over criteria in 300us
616 if(debug_MDMCU_elm_last_INT_FRC == 0)
617 {
618 debug_MDMCU_elm_last_INT_FRC = curr_frc;
619 if(int_status & (ID0_AVG_LAT_INT|ID0_TOT_LAT_INT))
620 {
621 ELM_IF_DEF_TRACE( \
622 MD_TRC_EMI_ELM_R_LAT_WARN(curr_frc, read_worst_latency_ns, elm_read_lat_threshold, read_total_latency_ns, read_trans_count, \
623 elm_md_dvfs_con, elm_ap_vcore_dvfs_current, elm_ap_vcore_dvfs_last), \
624 );
625 }
626 else
627 {
628 ELM_IF_DEF_TRACE( \
629 MD_TRC_EMI_ELM_W_LAT_WARN(curr_frc, write_worst_latency_ns, elm_write_lat_threshold, write_total_latency_ns, write_trans_count, \
630 elm_md_dvfs_con, elm_ap_vcore_dvfs_current, elm_ap_vcore_dvfs_last), \
631 );
632 }
633 }
634 else
635 {
636 if(ust_us_duration(debug_MDMCU_elm_last_INT_FRC, curr_frc) < 300)
637 {
638 kal_uint32 i;
639 for(i=0;i<AP_VCORE_DVFS_HISTORY_SIZE;i++)
640 {
641 elm_ap_vcore_dvfs_history[i] = *(AP_VCORE_DVFS_HISTORY_BASE + i);
642 }
643
644 if(int_status & (ID0_AVG_LAT_INT|ID0_TOT_LAT_INT))
645 {
646 EXT_ASSERT(0,(E_MAX16(elm_read_lat_threshold)<<16)|(E_MAX16(read_worst_latency_ns)), \
647 (E_MAX16(read_trans_count)<<16)|(E_MAX16(read_total_latency_ns)), \
648 (E_MAX16(0)<<16)|(E_MAX16(int_status)));
649 }
650 else
651 {
652 EXT_ASSERT(0,(E_MAX16(elm_write_lat_threshold)<<16)|(E_MAX16(write_worst_latency_ns)), \
653 (E_MAX16(write_trans_count)<<16)|(E_MAX16(write_total_latency_ns)), \
654 (E_MAX16(0)<<16)|(E_MAX16(int_status)));
655 }
656 }
657 else
658 {
659 debug_MDMCU_elm_last_INT_FRC = curr_frc;
660 if(int_status & (ID0_AVG_LAT_INT|ID0_TOT_LAT_INT))
661 {
662 ELM_IF_DEF_TRACE( \
663 MD_TRC_EMI_ELM_R_LAT_WARN(curr_frc, read_worst_latency_ns, elm_read_lat_threshold, read_total_latency_ns, read_trans_count, \
664 elm_md_dvfs_con, elm_ap_vcore_dvfs_current, elm_ap_vcore_dvfs_last), \
665 );
666 }
667 else
668 {
669 ELM_IF_DEF_TRACE( \
670 MD_TRC_EMI_ELM_W_LAT_WARN(curr_frc, write_worst_latency_ns, elm_write_lat_threshold, write_total_latency_ns, write_trans_count, \
671 elm_md_dvfs_con, elm_ap_vcore_dvfs_current, elm_ap_vcore_dvfs_last), \
672 );
673 }
674 }
675 }
676 break;
677 }
678 default:
679 break;
680 }
681
682 }
683 /* Handling word count interrupt */
684 else
685 {
686 read_worst_wc = DRV_Reg32(REG_MCUSYS_EMI_ELM_ID2_WORST_WORD_CNT);
687 write_worst_wc = DRV_Reg32(REG_MCUSYS_EMI_ELM_ID3_WORST_WORD_CNT);
688
689 emi_elm_runtime_wc_history[emi_elm_runtime_wc_history_idx%ELM_RUNTIME_HISTORY_SIZE].cur_frc = curr_frc;
690 emi_elm_runtime_wc_history[emi_elm_runtime_wc_history_idx%ELM_RUNTIME_HISTORY_SIZE].int_status= int_status;
691 emi_elm_runtime_wc_history[emi_elm_runtime_wc_history_idx%ELM_RUNTIME_HISTORY_SIZE].r_wc = read_worst_wc;
692 emi_elm_runtime_wc_history[emi_elm_runtime_wc_history_idx%ELM_RUNTIME_HISTORY_SIZE].w_wc = write_worst_wc;
693 emi_elm_runtime_wc_history_idx++;
694
695 switch(EMI_ELM_wc_irq_exception_type)
696 {
697 case ELM_NONE:
698 {
699 // Read wordcount violation
700 if(int_status & ID2_TOT_WC_INT)
701 {
702 ELM_IF_DEF_TRACE( \
703 MD_TRC_EMI_ELM_R_BW_WARN(curr_frc, read_worst_wc, elm_read_wc_threshold), \
704 );
705 }
706 else
707 {
708 ELM_IF_DEF_TRACE( \
709 MD_TRC_EMI_ELM_W_BW_WARN(curr_frc, write_worst_wc, elm_write_wc_threshold), \
710 );
711 }
712 break;
713 }
714#if 0
715/* under construction !*/
716/* under construction !*/
717/* under construction !*/
718/* under construction !*/
719/* under construction !*/
720/* under construction !*/
721/* under construction !*/
722/* under construction !*/
723/* under construction !*/
724/* under construction !*/
725/* under construction !*/
726/* under construction !*/
727/* under construction !*/
728/* under construction !*/
729#endif
730 default:
731 break;
732 }
733 }
734
735
736 //Clear ELM interrupt after read irq type
737 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_INT_STATUS, INT_MASK_ALL); //clear ELM interrupt
738
739 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS_CFG0, ELM_IDLE_ENABLE|ELM_ENABLE|ELM_ACCURACY(ELM_unit_100us)| \
740 LAT_TH_ID1_NORMAL(ELM_NS2TRAN(elm_write_lat_threshold))|LAT_TH_ID0_NORMAL(ELM_NS2TRAN(elm_read_lat_threshold))| \
741 DECODE_ID0(elm_id0_rw|elm_id0_master|elm_id0_prio)); //ELM enable for MDMCU Reset
742
743 IRQUnmask(IRQ_ELMTOP_EMI_IRQ_CODE);
744
745}
746
747void elm_infra_isr_handler()
748{
749
750 // TODO: ELM mutex need here
751
752 kal_uint32 curr_frc = 0;
753 kal_uint32 int_status = 0;
754 kal_uint32 read_trans_count = 0, write_trans_count = 0;
755 kal_uint32 read_worst_latency_ns = 0, write_worst_latency_ns = 0;
756 kal_uint32 read_total_latency_ns = 0, write_total_latency_ns = 0;
757 kal_uint32 read_worst_alat_maxost = 0, write_worst_alat_maxost = 0;
758 kal_uint32 read_worst_wc = 0, write_worst_wc = 0;
759 kal_uint32 ia_13m_tick = 0, dvfs_13m_tick = 0;
760
761 //Mask cirq ELM interrupt
762 IRQMask(IRQ_ELM_DMA_IRQ_CODE);
763
764 //DRV_WriteReg32_NPW(REG_MCUSYS_EMI_ELM_ELM_EN_REG, 0); //stop ELM
765 DRV_WriteReg32_NPW(REG_MDINFRA_ELM_AO_STATUS_CFG0, ELM_DISABLE);
766#if 1
767 ia_13m_tick = SleepDrv_GetWallClk();
768 dvfs_13m_tick = DRV_Reg32(AP_DVFS_OCCUR_TICK);
769#endif
770 curr_frc = ust_get_current_time();
771
772 //SET_ELM_RW_LAT_FLAG(REG_MCUSYS_EMI_ELM_ELM_INT_STATUS, &lat_flag, &r_flag);
773 int_status = DRV_Reg32(REG_MDINFRA_ELM_INT_STATUS); //Read ELM interrupt status
774
775
776
777 /* Handling latency interrupt */
778 if(int_status & INT_MASK_LAT)
779 {
780 read_worst_latency_ns = ELM_MDINFRA_TRANS2NS(DRV_Reg32(REG_MDINFRA_ELM_ID0_WORST_AVG_LAT_NORMAL));
781 read_total_latency_ns = ELM_MDINFRA_TRANS2NS(DRV_Reg32(REG_MDINFRA_ELM_ID0_WORST_TOT_LAT_NORMAL));
782 write_worst_latency_ns = ELM_MDINFRA_TRANS2NS(DRV_Reg32(REG_MDINFRA_ELM_ID1_WORST_AVG_LAT_NORMAL));
783 write_total_latency_ns = ELM_MDINFRA_TRANS2NS(DRV_Reg32(REG_MDINFRA_ELM_ID1_WORST_TOT_LAT_NORMAL));
784 read_trans_count = DRV_Reg32(REG_MDINFRA_ELM_ID0_TRANS_IN_WORST_AVG_NORMAL);
785 write_trans_count = DRV_Reg32(REG_MDINFRA_ELM_ID1_TRANS_IN_WORST_AVG_NORMAL);
786 read_worst_alat_maxost = DRV_Reg32(REG_MDINFRA_ELM_ID0_MAXOST_IN_WORST_AVG_NORMAL);
787 write_worst_alat_maxost = DRV_Reg32(REG_MDINFRA_ELM_ID1_MAXOST_IN_WORST_AVG_NORMAL);
788
789 infra_elm_runtime_lat_history[infra_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].cur_frc = curr_frc;
790 infra_elm_runtime_lat_history[infra_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].int_status= int_status;
791 infra_elm_runtime_lat_history[infra_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].r_trans = read_trans_count;
792 infra_elm_runtime_lat_history[infra_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].w_trans = write_trans_count;
793 infra_elm_runtime_lat_history[infra_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].r_alat = read_worst_latency_ns;
794 infra_elm_runtime_lat_history[infra_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].r_alat_maxost = read_worst_alat_maxost;
795 infra_elm_runtime_lat_history[infra_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].w_alat = write_worst_latency_ns;
796 infra_elm_runtime_lat_history[infra_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].w_alat_maxost = write_worst_alat_maxost;
797 infra_elm_runtime_lat_history[infra_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].r_l2_tot_lat = read_total_latency_ns;
798 infra_elm_runtime_lat_history[infra_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].w_l2_tot_lat = write_total_latency_ns;
799 infra_elm_runtime_lat_history[infra_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].ap_dvfs_tick = dvfs_13m_tick;
800 infra_elm_runtime_lat_history[infra_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].md_tick = ia_13m_tick;
801
802 infra_elm_runtime_lat_history_idx++;
803
804 ELM_IF_DEF_TRACE(MD_TRC_EMI_AP_DVFS_WARN(curr_frc, ia_13m_tick, dvfs_13m_tick),);
805
806 switch(INFRA_ELM_lat_irq_exception_type)
807 {
808 case ELM_NONE:
809 {
810#ifdef __ELM_TRACE__
811 if(int_status & (ID0_AVG_LAT_INT|ID0_TOT_LAT_INT))
812 {
813 //US_CNT %l us, R_ave_lat %l ns, R_Threhsold %l ns, R_Latency %l T, R_tran %l"
814 MD_TRC_INFRA_ELM_R_LAT_WARN(curr_frc, read_worst_latency_ns, elm_infra_read_lat_threshold, read_total_latency_ns, read_trans_count, int_status);
815 }
816 else
817 {
818 //US_CNT %l us, R_ave_lat %l ns, R_Threhsold %l ns, R_Latency %l T, R_tran %l"
819 MD_TRC_INFRA_ELM_W_LAT_WARN(curr_frc, write_worst_latency_ns, elm_infra_write_lat_threshold, write_total_latency_ns, write_trans_count, int_status);
820 }
821#endif
822 break;
823 }
824 default:
825 break;
826 }
827 }
828 /* Handling word count interrupt */
829 else
830 {
831 /* do nothing */
832 read_worst_wc = DRV_Reg32(REG_MDINFRA_ELM_ID2_WORST_WORD_CNT);
833 write_worst_wc = DRV_Reg32(REG_MDINFRA_ELM_ID3_WORST_WORD_CNT);
834
835 infra_elm_runtime_wc_history[infra_elm_runtime_wc_history_idx%ELM_RUNTIME_HISTORY_SIZE].cur_frc = curr_frc;
836 infra_elm_runtime_wc_history[infra_elm_runtime_wc_history_idx%ELM_RUNTIME_HISTORY_SIZE].int_status= int_status;
837 infra_elm_runtime_wc_history[infra_elm_runtime_wc_history_idx%ELM_RUNTIME_HISTORY_SIZE].r_wc = read_worst_wc;
838 infra_elm_runtime_wc_history[infra_elm_runtime_wc_history_idx%ELM_RUNTIME_HISTORY_SIZE].w_wc = write_worst_wc;
839 infra_elm_runtime_wc_history_idx++;
840
841 switch(INFRA_ELM_wc_irq_exception_type)
842 {
843 case ELM_NONE:
844 {
845 // Read wordcount violation
846 if(int_status & ID2_TOT_WC_INT)
847 {
848 ELM_IF_DEF_TRACE( \
849 MD_TRC_INFRA_ELM_R_BW_WARN(curr_frc, read_worst_wc, elm_infra_read_wc_threshold), \
850 );
851 }
852 else
853 {
854 ELM_IF_DEF_TRACE( \
855 MD_TRC_INFRA_ELM_W_BW_WARN(curr_frc, write_worst_wc, elm_infra_write_wc_threshold), \
856 );
857 }
858 break;
859 }
860 default:
861 break;
862 }
863 }
864 //Clear ELM interrupt after read irq type
865 DRV_WriteReg32(REG_MDINFRA_ELM_INT_STATUS, INT_MASK_ALL); //clear ELM interrupt
866
867 DRV_WriteReg32_NPW(REG_MDINFRA_ELM_AO_STATUS_CFG0, ELM_IDLE_ENABLE|ELM_ENABLE|ELM_ACCURACY(ELM_unit_100us)| \
868 LAT_TH_ID1_NORMAL(ELM_MDINFRA_NS2TRAN(elm_infra_write_lat_threshold))|LAT_TH_ID0_NORMAL(ELM_MDINFRA_NS2TRAN(elm_infra_read_lat_threshold))| \
869 DECODE_ID0(elm_id0_rw|elm_id0_prio)); //ELM enable for MDMCU Reset
870
871 IRQUnmask(IRQ_ELM_DMA_IRQ_CODE);
872
873}
874
875/* Lightweight version for AMIF using in dormant backup/restore */
876void ELM_MCU_threshold_change_lightweight(kal_uint32 read_avg_lat_ns, kal_uint32 write_avg_lat_ns, kal_uint32 dur_us)
877{
878 kal_uint32 mask_state=0;
879
880 if(elm_dynamic_lat_threshold_disable)
881 {
882 return;
883 }
884
885 mask_state = IRQMask_Status(IRQ_ELMTOP_EMI_IRQ_CODE);
886
887 //Mask cirq ELM interrupt
888 IRQMask(IRQ_ELMTOP_EMI_IRQ_CODE);
889 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS_CFG0, ELM_DISABLE); //disable ELM
890
891 kal_hrt_take_itc_lock(KAL_ITC_ELM_LOCK, KAL_INFINITE_WAIT);
892
893 elm_read_lat_threshold = read_avg_lat_ns;
894 elm_write_lat_threshold = write_avg_lat_ns;
895 elm_lat_dur_100us = (kal_uint32)(dur_us/100);
896
897 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_INT_STATUS, INT_MASK_ALL); //clear ELM interrupt
898 DRV_WriteReg32(REG_MDMCU_ELM_AO_STATUS_CFG1, ELM_EMI_TOP_BLOCK(E_TOP_MASK)|DECODE_ID1(elm_id1_rw|elm_id1_master|elm_id1_prio)| \
899 ELM_DURATION(elm_lat_dur_100us)|EMI_BLOCK(E_NOT_MASK)|ELM_INT_MASK(LAT_INT_UNMASK_ALL));
900
901 DRV_WriteReg32(REG_MDMCU_ELM_AO_STATUS_CFG0, ELM_IDLE_ENABLE|ELM_DISABLE|ELM_ACCURACY(ELM_unit_100us)| \
902 LAT_TH_ID1_NORMAL(ELM_NS2TRAN(elm_write_lat_threshold))|LAT_TH_ID0_NORMAL(ELM_NS2TRAN(elm_read_lat_threshold))| \
903 DECODE_ID0(elm_id0_rw|elm_id0_master|elm_id0_prio));
904
905 /* Set AO_ELM_EN bit should be last step. */
906 DRV_SetReg32_NPW(REG_MDMCU_ELM_AO_STATUS_CFG0, ELM_ENABLE);
907
908 kal_hrt_give_itc_lock(KAL_ITC_ELM_LOCK);
909
910 if(!mask_state)
911 {
912 IRQUnmask(IRQ_ELMTOP_EMI_IRQ_CODE);
913 }
914
915}
916
917void ELM_MCU_threshold_change(kal_uint32 read_avg_lat_ns, kal_uint32 write_avg_lat_ns, kal_uint32 dur_us)
918{
919 kal_uint32 mask_state=0;
920
921 if(elm_dynamic_lat_threshold_disable)
922 {
923 return;
924 }
925
926 if((read_avg_lat_ns<200) || (write_avg_lat_ns<200) || (dur_us<200))
927 {
928 kal_uint32 lr = 0;
929 kal_uint32 sub_error_code = 0;
930 GET_RETURN_ADDRESS(lr);
931 if(read_avg_lat_ns<200)
932 {
933 sub_error_code = 1;
934 }
935 else if(write_avg_lat_ns<200)
936 {
937 sub_error_code = 2;
938 }
939 else
940 {
941 sub_error_code = 3;
942 }
943 EXT_ASSERT(0, lr, KAL_ERROR_EMI_ELM_CHANGE_THRESHOLD, sub_error_code);
944 }
945
946
947
948 mask_state = IRQMask_Status(IRQ_ELMTOP_EMI_IRQ_CODE);
949
950 //Mask cirq ELM interrupt
951 IRQMask(IRQ_ELMTOP_EMI_IRQ_CODE);
952
953 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS_CFG0, ELM_DISABLE); //disable ELM
954
955 kal_hrt_take_itc_lock(KAL_ITC_ELM_LOCK, KAL_INFINITE_WAIT);
956
957
958 elm_read_lat_threshold = read_avg_lat_ns;
959 elm_write_lat_threshold = write_avg_lat_ns;
960 elm_lat_dur_100us = (kal_uint32)(dur_us/100);
961
962 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_INT_STATUS, INT_MASK_ALL); //clear ELM interrupt
963 DRV_WriteReg32(REG_MDMCU_ELM_AO_STATUS_CFG1, ELM_EMI_TOP_BLOCK(E_TOP_MASK)|DECODE_ID1(elm_id1_rw|elm_id1_master|elm_id1_prio)| \
964 ELM_DURATION(elm_lat_dur_100us)|EMI_BLOCK(E_NOT_MASK)|ELM_INT_MASK(LAT_INT_UNMASK_ALL));
965 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS_CFG0, ELM_IDLE_ENABLE|ELM_ENABLE|ELM_ACCURACY(ELM_unit_100us)| \
966 LAT_TH_ID1_NORMAL(ELM_NS2TRAN(elm_write_lat_threshold))|LAT_TH_ID0_NORMAL(ELM_NS2TRAN(elm_read_lat_threshold))| \
967 DECODE_ID0(elm_id0_rw|elm_id0_master|elm_id0_prio)); //ELM enable for MDMCU Reset
968
969 kal_hrt_give_itc_lock(KAL_ITC_ELM_LOCK);
970
971#ifdef __ELM_TRACE__
972 {
973 // L1 trace
974 kal_uint32 curr_frc = 0;
975 curr_frc = ust_get_current_time();
976 MD_TRC_EMI_ELM_SET_R_TH(curr_frc, elm_read_lat_threshold);
977 MD_TRC_EMI_ELM_SET_W_TH(curr_frc, elm_write_lat_threshold);
978 }
979#endif
980
981 if(!mask_state)
982 {
983 IRQUnmask(IRQ_ELMTOP_EMI_IRQ_CODE);
984 }
985
986}
987
988#if 0//def __ELM_RUNTIME_PROFILE__
989/* under construction !*/
990/* under construction !*/
991/* under construction !*/
992/* under construction !*/
993#endif
994
995void _ELM_exception_saved(void)
996{
997#if 0//def __ELM_RUNTIME_PROFILE__
998/* under construction !*/
999/* under construction !*/
1000/* under construction !*/
1001/* under construction !*/
1002/* under construction !*/
1003/* under construction !*/
1004/* under construction !*/
1005/* under construction !*/
1006/* under construction !*/
1007/* under construction !*/
1008/* under construction !*/
1009/* under construction !*/
1010/* under construction !*/
1011/* under construction !*/
1012/* under construction !*/
1013/* under construction !*/
1014/* under construction !*/
1015/* under construction !*/
1016/* under construction !*/
1017/* under construction !*/
1018/* under construction !*/
1019/* under construction !*/
1020#endif
1021}
1022
1023
1024kal_uint8 _ELM_latency_status(void)
1025{
1026#if 1//def __ELM_RUNTIME_PROFILE__
1027
1028 //if emi_elm_runtime_lat_history_idx == 0, means that it didn't enter ELM isr handler once, it will all be zero
1029 if(emi_elm_runtime_lat_history_idx != 0)
1030 {
1031 kal_uint32 int_status = 0;
1032 int_status = emi_elm_runtime_lat_history[(emi_elm_runtime_lat_history_idx-1)%ELM_RUNTIME_HISTORY_SIZE].int_status;
1033
1034 if(int_status & (ID0_AVG_LAT_INT|ID0_TOT_LAT_INT))
1035 {
1036 return 0xAE; //EMI read latency may be too long
1037 }
1038 else
1039 {
1040 return 0xBE; //EMI write latency may be too long
1041 }
1042 }
1043 return 0xDE; // EMI read/write latency are OK.
1044#else
1045/* under construction !*/
1046#endif
1047}
1048
1049/******************************************************************************
1050* function : void set_emi_elm_exceptiontype(kal_bool lat_flag, kal_uint8 exception_type)
1051* description : this function is called when set emi elm read/write latency/wordcount exception type
1052* parameter : kal_uint8 exception_type: 0,1,2
1053* return : void
1054******************************************************************************/
1055kal_bool Set_EMI_ELM_ExceptionType(kal_uint8 exception_type)
1056{
1057 switch (exception_type)
1058 {
1059 case ELM_NONE:
1060 {
1061 EMI_ELM_lat_irq_exception_type = ELM_NONE;
1062 break;
1063 }
1064
1065 case ELM_ASSERT:
1066 {
1067 EMI_ELM_lat_irq_exception_type = ELM_ASSERT;
1068 break;
1069 }
1070 case ELM_ASSERT_AT_2nd:
1071 {
1072 EMI_ELM_lat_irq_exception_type = ELM_ASSERT_AT_2nd;
1073 break;
1074 }
1075 default:
1076 return KAL_FALSE;
1077 break;
1078 }
1079 return KAL_TRUE;
1080}
1081
1082kal_bool Set_EMI_ELM_Threshold(kal_uint8 info, kal_uint32 threshold)
1083{
1084 ELM_IF_DEF_TRACE(kal_uint32 curr_frc = 0,);
1085 ELM_IF_DEF_TRACE(curr_frc = ust_get_current_time(),);
1086 elm_dynamic_lat_threshold_disable = 1; //disable dynamic latency threshold
1087 if((info&0xF0))
1088 { // infra
1089 //Disable before re-configure
1090 DRV_WriteReg32_NPW(REG_MDINFRA_ELM_AO_STATUS_CFG0, ELM_DISABLE);
1091 if( info & 0x01 )
1092 {
1093 elm_infra_read_lat_threshold = threshold;
1094 ELM_IF_DEF_TRACE(MD_TRC_INFRA_ELM_SET_R_TH(curr_frc, threshold),);
1095 }
1096 else
1097 {
1098 elm_infra_write_lat_threshold = threshold;
1099 ELM_IF_DEF_TRACE(MD_TRC_INFRA_ELM_SET_W_TH(curr_frc, threshold),);
1100 }
1101 DRV_WriteReg32_NPW(REG_MDINFRA_ELM_AO_STATUS_CFG0, ELM_IDLE_ENABLE|ELM_ENABLE|ELM_ACCURACY(ELM_unit_100us)| \
1102 LAT_TH_ID1_NORMAL(ELM_MDINFRA_NS2TRAN(elm_infra_write_lat_threshold))|LAT_TH_ID0_NORMAL(ELM_MDINFRA_NS2TRAN(elm_infra_read_lat_threshold))| \
1103 DECODE_ID0(elm_id0_rw|elm_id0_prio));
1104 }
1105 else
1106 { //mdmcu
1107
1108 //Disable before re-configure
1109 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS_CFG0, ELM_DISABLE);
1110 if( info & 0x01 )
1111 {
1112 elm_read_lat_threshold = threshold;
1113 ELM_IF_DEF_TRACE(MD_TRC_EMI_ELM_SET_R_TH(curr_frc, threshold),);
1114 }
1115 else
1116 {
1117 elm_write_lat_threshold = threshold;
1118 ELM_IF_DEF_TRACE(MD_TRC_EMI_ELM_SET_W_TH(curr_frc, threshold),);
1119 }
1120 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS_CFG0, ELM_IDLE_ENABLE|ELM_ENABLE|ELM_ACCURACY(ELM_unit_100us)| \
1121 LAT_TH_ID1_NORMAL(ELM_NS2TRAN(elm_write_lat_threshold))|LAT_TH_ID0_NORMAL(ELM_NS2TRAN(elm_read_lat_threshold))| \
1122 DECODE_ID0(elm_id0_rw|elm_id0_master|elm_id0_prio));
1123 }
1124
1125
1126 return KAL_TRUE;
1127}
1128
1129/******************************************************************************
1130* function : kal_bool Set_EMI_ELM_Config(kal_uint8 id, kal_uint8 m_sel, kal_uint8 rw)
1131* description : ELM has 4 counters(ID 0,1,2,3), this function is used to set EMI ELM's
1132* counter to monitro read or write transaction and master.
1133* parameter :
1134* kal_uint8 id: 0, 1, 0xFF;
1135* -> Assume id 0,2 use same configuration(so does id 1,3), including read/write and masters.
1136* -> 0xFF is used for let all ID monitor same masters.
1137* return : void
1138******************************************************************************/
1139kal_bool Set_EMI_ELM_Config(kal_uint8 id, kal_uint8 m_sel, kal_uint8 rw)
1140{
1141 kal_bool rtn = KAL_TRUE;
1142
1143 //Disable before re-configure
1144 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS_CFG0, ELM_DISABLE);
1145 elm_dynamic_lat_threshold_disable = 1; //disable dynamic latency threshold
1146
1147 if(id == 0) // id 0 (default read), assume id2 use same master as id 0
1148 {
1149 elm_id2_mask = (ELM_AO_CONTROL_DEFAULT & ~AID((MASTER_ALL_MASK)));
1150 if(m_sel==0)
1151 {
1152 elm_id0_master = ELM_ALL_MASTER;
1153
1154 elm_id2_value = 0;
1155 elm_id2_mask |= AID(MASTER_DEFAULT_MASK);
1156 }
1157 else if(m_sel==1)
1158 {
1159 elm_id0_master = ELM_MDMCU_ONLY;
1160
1161 elm_id2_value = AID(MASTER_MDMCU);
1162 elm_id2_mask |= AID(MASTER_MDMCU_MASK);
1163 }
1164 else if(m_sel==2)
1165 {
1166 elm_id0_master = ELM_USIP_ONLY;
1167
1168 elm_id2_value = AID(MASTER_USIP);
1169 elm_id2_mask |= AID(MASTER_USIP_MASK);
1170 }
1171 else
1172 {
1173 rtn = KAL_FALSE;
1174 }
1175
1176 if(rw == 0)
1177 {
1178 elm_id0_rw = ELM_READ;
1179 elm_id2_rw = ELM_RD;
1180 }
1181 else if(rw == 1)
1182 {
1183 elm_id0_rw = ELM_WRITE;
1184 elm_id2_rw = ELM_WR;
1185 }
1186 else
1187 {
1188 rtn = KAL_FALSE;
1189 }
1190 }
1191 else if( id == 1 ) // id 1 (default write), assume id3 use same master as id 1
1192 {
1193 elm_id3_mask = (ELM_AO_CONTROL_DEFAULT & ~AID((MASTER_ALL_MASK)));
1194 if(m_sel==0)
1195 {
1196 elm_id1_master = ELM_ALL_MASTER;
1197
1198 elm_id3_value = 0;
1199 elm_id3_mask |= AID(MASTER_DEFAULT_MASK);
1200 }
1201 else if(m_sel==1)
1202 {
1203 elm_id1_master = ELM_MDMCU_ONLY;
1204
1205 elm_id3_value = AID(MASTER_MDMCU);
1206 elm_id3_mask |= AID(MASTER_MDMCU_MASK);
1207 }
1208 else if(m_sel==2)
1209 {
1210 elm_id1_master = ELM_USIP_ONLY;
1211
1212 elm_id3_value = AID(MASTER_USIP);
1213 elm_id3_mask |= AID(MASTER_USIP_MASK);
1214 }
1215 else
1216 {
1217 rtn = KAL_FALSE;
1218 }
1219
1220 if(rw == 0)
1221 {
1222 elm_id1_rw = ELM_READ;
1223 elm_id3_rw = ELM_RD;
1224 }
1225 else if(rw == 1)
1226 {
1227 elm_id1_rw = ELM_WRITE;
1228 elm_id3_rw = ELM_WR;
1229 }
1230 else
1231 {
1232 rtn = KAL_FALSE;
1233 }
1234 }
1235 else if(id == 0xFF) // ID 0/1/2/3 are the same master, 0,2 for read, 1,3 for write
1236 {
1237 elm_id2_mask = (ELM_AO_CONTROL_DEFAULT & ~AID((MASTER_ALL_MASK)));
1238 elm_id3_mask = (ELM_AO_CONTROL_DEFAULT & ~AID((MASTER_ALL_MASK)));
1239
1240 elm_id0_rw = ELM_READ;
1241 elm_id1_rw = ELM_WRITE;
1242 elm_id2_rw = ELM_RD;
1243 elm_id3_rw = ELM_WR;
1244 if(m_sel==0)
1245 {
1246 elm_id0_master = ELM_ALL_MASTER;
1247 elm_id1_master = ELM_ALL_MASTER;
1248
1249 elm_id2_value = 0;
1250 elm_id2_mask |= AID(MASTER_DEFAULT_MASK);
1251 elm_id3_value = 0;
1252 elm_id3_mask |= AID(MASTER_DEFAULT_MASK);
1253 }
1254 else if(m_sel==1)
1255 {
1256 elm_id0_master = ELM_MDMCU_ONLY;
1257 elm_id1_master = ELM_MDMCU_ONLY;
1258
1259 elm_id2_value = AID(MASTER_MDMCU);
1260 elm_id2_mask |= AID(MASTER_MDMCU_MASK);
1261 elm_id3_value = AID(MASTER_MDMCU);
1262 elm_id3_mask |= AID(MASTER_MDMCU_MASK);
1263 }
1264 else if(m_sel==2)
1265 {
1266 elm_id0_master = ELM_USIP_ONLY;
1267 elm_id1_master = ELM_USIP_ONLY;
1268
1269 elm_id2_value = AID(MASTER_USIP);
1270 elm_id2_mask |= AID(MASTER_USIP_MASK);
1271 elm_id3_value = AID(MASTER_USIP);
1272 elm_id3_mask |= AID(MASTER_USIP_MASK);
1273 }
1274 else
1275 {
1276 rtn = KAL_FALSE;
1277 }
1278 }
1279 else
1280 {
1281 rtn = KAL_FALSE;
1282 }
1283
1284 DRV_ClrReg32(REG_MCUSYS_EMI_ELM_CTRL_REG, ELM_MODE_ID_SEL(ELM_MODE_ID_MASK)); // clear ELM_MODE_ID_SEL
1285 DRV_SetReg32(REG_MCUSYS_EMI_ELM_CTRL_REG, ELM_MODE_ID_SEL(ELM_ID_RW(elm_id2_rw, 2)|ELM_ID_RW(elm_id3_rw, 3))); // set ELM_MODE_ID_SEL
1286 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID2_CTRL_REG, elm_id2_value);
1287 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID2_CTRL_MASK, elm_id2_mask);
1288 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID3_CTRL_REG, elm_id3_value);
1289 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID3_CTRL_MASK, elm_id3_mask);
1290
1291 DRV_WriteReg32(REG_MDMCU_ELM_AO_STATUS_CFG1, ELM_EMI_TOP_BLOCK(E_TOP_MASK)|DECODE_ID1(elm_id1_rw|elm_id1_master|elm_id1_prio)| \
1292 ELM_DURATION(elm_lat_dur_100us)|EMI_BLOCK(E_NOT_MASK)|ELM_INT_MASK(LAT_INT_UNMASK_ALL));
1293
1294 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS_CFG0, ELM_IDLE_ENABLE|ELM_ENABLE|ELM_ACCURACY(ELM_unit_100us)| \
1295 LAT_TH_ID1_NORMAL(ELM_NS2TRAN(elm_write_lat_threshold))|LAT_TH_ID0_NORMAL(ELM_NS2TRAN(elm_read_lat_threshold))| \
1296 DECODE_ID0(elm_id0_rw|elm_id0_master|elm_id0_prio)); //ELM enable for MDMCU Reset
1297 return rtn;
1298}
1299
1300kal_bool Set_EMI_ELM_Mode(kal_uint8 mode)
1301{
1302 kal_bool rtn = KAL_TRUE;
1303 //Disable before re-configure
1304 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS_CFG0, ELM_DISABLE);
1305 DRV_WriteReg32_NPW(REG_MDINFRA_ELM_AO_STATUS_CFG0, ELM_DISABLE);
1306 elm_dynamic_lat_threshold_disable = 1; //disable dynamic latency threshold
1307
1308 if( mode == 0)
1309 {
1310 elm_mode = ELM_MODE_0;
1311 }
1312#if 0
1313/* under construction !*/
1314/* under construction !*/
1315/* under construction !*/
1316/* under construction !*/
1317#endif
1318 else if( mode == 2)
1319 {
1320 elm_mode = ELM_MODE_2;
1321 elm_ao_decode_cfg = ELM_DECODE_FROM_APB;
1322 DRV_ClrReg32(REG_MCUSYS_EMI_ELM_CTRL_REG, (ELM_AO_DECODE(ELM_DECODE_FROM_AO))); // clear AO decode
1323 DRV_SetReg32(REG_MCUSYS_EMI_ELM_CTRL_REG, (ELM_AO_DECODE(elm_ao_decode_cfg))); // set AO decode
1324 DRV_ClrReg32(REG_MDINFRA_ELM_CTRL_REG, (ELM_AO_DECODE(ELM_DECODE_FROM_AO))); // clear AO decode
1325 DRV_SetReg32(REG_MDINFRA_ELM_CTRL_REG, (ELM_AO_DECODE(elm_ao_decode_cfg))); // set AO decode
1326 }
1327 else
1328 {
1329 rtn = KAL_FALSE;
1330 }
1331 DRV_ClrReg32(REG_MCUSYS_EMI_ELM_CTRL_REG, (ELM_MODE(ELM_MODE_MASK))); // clear ELM mode
1332 DRV_SetReg32(REG_MCUSYS_EMI_ELM_CTRL_REG, (ELM_MODE(ELM_MODE_MASK & elm_mode)));//select ELM mode
1333
1334 DRV_WriteReg32(REG_MDMCU_ELM_AO_STATUS_CFG1, ELM_EMI_TOP_BLOCK(E_TOP_MASK)|DECODE_ID1(elm_id1_rw|elm_id1_master|elm_id1_prio)| \
1335 ELM_DURATION(elm_lat_dur_100us)|EMI_BLOCK(E_NOT_MASK)|ELM_INT_MASK(LAT_INT_UNMASK_ALL));
1336
1337 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS_CFG0, ELM_IDLE_ENABLE|ELM_ENABLE|ELM_ACCURACY(ELM_unit_100us)| \
1338 LAT_TH_ID1_NORMAL(ELM_NS2TRAN(elm_write_lat_threshold))|LAT_TH_ID0_NORMAL(ELM_NS2TRAN(elm_read_lat_threshold))| \
1339 DECODE_ID0(elm_id0_rw|elm_id0_master|elm_id0_prio)); //ELM enable for MDMCU Reset
1340
1341 DRV_ClrReg32(REG_MDINFRA_ELM_CTRL_REG, (ELM_MODE(ELM_MODE_MASK))); // clear ELM mode
1342 DRV_SetReg32(REG_MDINFRA_ELM_CTRL_REG, (ELM_MODE(ELM_MODE_MASK & elm_mode)));//select ELM mode
1343
1344 DRV_WriteReg32(REG_MDINFRA_ELM_AO_STATUS_CFG1, ELM_EMI_TOP_BLOCK(E_TOP_MASK)|DECODE_ID1(elm_id1_rw|elm_id1_prio)| \
1345 ELM_DURATION(elm_infra_lat_dur_100us)|EMI_BLOCK(E_NOT_MASK)|ELM_INT_MASK(LAT_INT_UNMASK_ALL));
1346
1347 DRV_WriteReg32_NPW(REG_MDINFRA_ELM_AO_STATUS_CFG0, ELM_IDLE_ENABLE|ELM_ENABLE|ELM_ACCURACY(ELM_unit_100us)| \
1348 LAT_TH_ID1_NORMAL(ELM_MDINFRA_NS2TRAN(elm_infra_write_lat_threshold))|LAT_TH_ID0_NORMAL(ELM_MDINFRA_NS2TRAN(elm_infra_read_lat_threshold))| \
1349 DECODE_ID0(elm_id0_rw|elm_id0_prio)); //ELM enable for MDMCU Reset
1350 return rtn;
1351}
1352
1353
1354
1355kal_bool Set_EMI_ELM_uSIP_Core(kal_uint8 id, kal_uint8 core_th_sel, kal_uint8 port_sel)
1356{
1357 kal_bool rtn = KAL_TRUE;
1358 //Disable before re-configure
1359 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS_CFG0, ELM_DISABLE);
1360 elm_dynamic_lat_threshold_disable = 1; //disable dynamic latency threshold
1361
1362#if 0
1363/* under construction !*/
1364/* under construction !*/
1365/* under construction !*/
1366/* under construction !*/
1367/* under construction !*/
1368/* under construction !*/
1369/* under construction !*/
1370/* under construction !*/
1371#endif
1372
1373 if(id == 0)// id 0
1374 {
1375 elm_id0_value = 0;
1376 elm_id0_mask = ELM_AO_CONTROL_DEFAULT & (~(AUSER(AUSER_MASK)) & ~(AID(MASTER_USIP_PORT(MUP_ALL_MASK))));
1377 elm_id2_value = 0;
1378 elm_id2_mask = ELM_AO_CONTROL_DEFAULT & (~(AUSER(AUSER_MASK)) & ~(AID(MASTER_USIP_PORT(MUP_ALL_MASK))));
1379
1380 if(core_th_sel==0x00)
1381 {
1382 elm_id0_value = AUSER(ELM_SEL_USIP0_TH0);
1383 elm_id2_value = AUSER(ELM_SEL_USIP0_TH0);
1384 }
1385 else if(core_th_sel==0x01)
1386 {
1387 elm_id0_value = AUSER(ELM_SEL_USIP0_TH1);
1388 elm_id2_value = AUSER(ELM_SEL_USIP0_TH1);
1389 }
1390 else if(core_th_sel==0x10)
1391 {
1392 elm_id0_value = AUSER(ELM_SEL_USIP1_TH0);
1393 elm_id2_value = AUSER(ELM_SEL_USIP1_TH0);
1394 }
1395 else if(core_th_sel==0x11)
1396 {
1397 elm_id0_value = AUSER(ELM_SEL_USIP1_TH1);
1398 elm_id2_value = AUSER(ELM_SEL_USIP1_TH1);
1399 }
1400 else
1401 {
1402 rtn = KAL_FALSE;
1403 elm_id0_mask = ELM_AO_CONTROL_DEFAULT;
1404 elm_id2_mask = ELM_AO_CONTROL_DEFAULT;
1405 }
1406 // Port select
1407 if(port_sel==0x0) // All master
1408 {
1409 elm_id0_mask |= AID(MASTER_DEFAULT_MASK);
1410 elm_id2_mask |= AID(MASTER_DEFAULT_MASK);
1411 }
1412 else if(port_sel==0x1) // PM port
1413 {
1414 elm_id0_mask |= AID(MASTER_USIP_PORT(MUP_PM_MASK));
1415 elm_id2_mask |= AID(MASTER_USIP_PORT(MUP_PM_MASK));
1416 elm_id0_value |= AID(MASTER_USIP_PORT(MUP_PM));
1417 elm_id2_value |= AID(MASTER_USIP_PORT(MUP_PM));
1418 }
1419 else if(port_sel==0x2) // DC port
1420 {
1421 elm_id0_mask |= AID(MASTER_USIP_PORT(MUP_DC_MASK));
1422 elm_id2_mask |= AID(MASTER_USIP_PORT(MUP_DC_MASK));
1423 elm_id0_value |= AID(MASTER_USIP_PORT(MUP_DC));
1424 elm_id2_value |= AID(MASTER_USIP_PORT(MUP_DC));
1425 }
1426 else if(port_sel==0x3) // DP port all
1427 {
1428 elm_id0_mask |= AID(MASTER_USIP_PORT(MUP_DP_ALL_MASK));
1429 elm_id2_mask |= AID(MASTER_USIP_PORT(MUP_DP_ALL_MASK));
1430 elm_id0_value |= AID(MASTER_USIP_PORT(MUP_DP_ALL));
1431 elm_id2_value |= AID(MASTER_USIP_PORT(MUP_DP_ALL));
1432 }
1433 else if(port_sel==0x4) // DP port cachable
1434 {
1435 elm_id0_mask |= AID(MASTER_USIP_PORT(MUP_DP_MASK));
1436 elm_id2_mask |= AID(MASTER_USIP_PORT(MUP_DP_MASK));
1437 elm_id0_value |= AID(MASTER_USIP_PORT(MUP_DP_CACHE));
1438 elm_id2_value |= AID(MASTER_USIP_PORT(MUP_DP_CACHE));
1439 }
1440 else if(port_sel==0x5) // DP port non-cachable
1441 {
1442 elm_id0_mask |= AID(MASTER_USIP_PORT(MUP_DP_MASK));
1443 elm_id2_mask |= AID(MASTER_USIP_PORT(MUP_DP_MASK));
1444 elm_id0_value |= AID(MASTER_USIP_PORT(MUP_DP_NONCACHE));
1445 elm_id2_value |= AID(MASTER_USIP_PORT(MUP_DP_NONCACHE));
1446 }
1447 else
1448 {
1449 rtn = KAL_FALSE;
1450 elm_id0_mask = ELM_AO_CONTROL_DEFAULT;
1451 elm_id2_mask = ELM_AO_CONTROL_DEFAULT;
1452 }
1453
1454 }
1455 else if(id == 1)// id 1
1456 {
1457 elm_id1_value = 0;
1458 elm_id1_mask = ELM_AO_CONTROL_DEFAULT & (~(AUSER(AUSER_MASK)) & ~(AID(MASTER_USIP_PORT(MUP_ALL_MASK))));
1459 elm_id3_value = 0;
1460 elm_id3_mask = ELM_AO_CONTROL_DEFAULT & (~(AUSER(AUSER_MASK)) & ~(AID(MASTER_USIP_PORT(MUP_ALL_MASK))));
1461
1462 if(core_th_sel==0x00)
1463 {
1464 elm_id1_value = AUSER(ELM_SEL_USIP0_TH0);
1465 elm_id3_value = AUSER(ELM_SEL_USIP0_TH0);
1466 }
1467 else if(core_th_sel==0x01)
1468 {
1469 elm_id1_value = AUSER(ELM_SEL_USIP0_TH1);
1470 elm_id3_value = AUSER(ELM_SEL_USIP0_TH1);
1471 }
1472 else if(core_th_sel==0x10)
1473 {
1474 elm_id1_value = AUSER(ELM_SEL_USIP1_TH0);
1475 elm_id3_value = AUSER(ELM_SEL_USIP1_TH0);
1476 }
1477 else if(core_th_sel==0x11)
1478 {
1479 elm_id1_value = AUSER(ELM_SEL_USIP1_TH1);
1480 elm_id3_value = AUSER(ELM_SEL_USIP1_TH1);
1481 }
1482 else
1483 {
1484 rtn = KAL_FALSE;
1485 elm_id1_mask = ELM_AO_CONTROL_DEFAULT;
1486 elm_id3_mask = ELM_AO_CONTROL_DEFAULT;
1487 }
1488 // Port select
1489 if(port_sel==0x0) // All master
1490 {
1491 elm_id1_mask |= AID(MASTER_DEFAULT_MASK);
1492 elm_id3_mask |= AID(MASTER_DEFAULT_MASK);
1493 }
1494 else if(port_sel==0x1) // PM port
1495 {
1496 elm_id1_mask |= AID(MASTER_USIP_PORT(MUP_PM_MASK));
1497 elm_id3_mask |= AID(MASTER_USIP_PORT(MUP_PM_MASK));
1498 elm_id1_value |= AID(MASTER_USIP_PORT(MUP_PM));
1499 elm_id3_value |= AID(MASTER_USIP_PORT(MUP_PM));
1500 }
1501 else if(port_sel==0x2) // DC port
1502 {
1503 elm_id1_mask |= AID(MASTER_USIP_PORT(MUP_DC_MASK));
1504 elm_id3_mask |= AID(MASTER_USIP_PORT(MUP_DC_MASK));
1505 elm_id1_value |= AID(MASTER_USIP_PORT(MUP_DC));
1506 elm_id3_value |= AID(MASTER_USIP_PORT(MUP_DC));
1507 }
1508 else if(port_sel==0x3) // DP port all
1509 {
1510 elm_id1_mask |= AID(MASTER_USIP_PORT(MUP_DP_ALL_MASK));
1511 elm_id3_mask |= AID(MASTER_USIP_PORT(MUP_DP_ALL_MASK));
1512 elm_id1_value |= AID(MASTER_USIP_PORT(MUP_DP_ALL));
1513 elm_id3_value |= AID(MASTER_USIP_PORT(MUP_DP_ALL));
1514 }
1515 else if(port_sel==0x4) // DP port cachable
1516 {
1517 elm_id1_mask |= AID(MASTER_USIP_PORT(MUP_DP_MASK));
1518 elm_id3_mask |= AID(MASTER_USIP_PORT(MUP_DP_MASK));
1519 elm_id1_value |= AID(MASTER_USIP_PORT(MUP_DP_CACHE));
1520 elm_id3_value |= AID(MASTER_USIP_PORT(MUP_DP_CACHE));
1521 }
1522 else if(port_sel==0x5) // DP port non-cachable
1523 {
1524 elm_id1_mask |= AID(MASTER_USIP_PORT(MUP_DP_MASK));
1525 elm_id3_mask |= AID(MASTER_USIP_PORT(MUP_DP_MASK));
1526 elm_id1_value |= AID(MASTER_USIP_PORT(MUP_DP_NONCACHE));
1527 elm_id3_value |= AID(MASTER_USIP_PORT(MUP_DP_NONCACHE));
1528 }
1529 else
1530 {
1531 rtn = KAL_FALSE;
1532 elm_id1_mask = ELM_AO_CONTROL_DEFAULT;
1533 elm_id3_mask = ELM_AO_CONTROL_DEFAULT;
1534 }
1535
1536 }
1537 else if(id == 0xFF) // ID 0/1 are the same
1538 {
1539 elm_id0_value = 0;
1540 elm_id0_mask = ELM_AO_CONTROL_DEFAULT & (~(AUSER(AUSER_MASK)) & ~(AID(MASTER_USIP_PORT(MUP_ALL_MASK))));
1541 elm_id1_value = 0;
1542 elm_id1_mask = ELM_AO_CONTROL_DEFAULT & (~(AUSER(AUSER_MASK)) & ~(AID(MASTER_USIP_PORT(MUP_ALL_MASK))));
1543 elm_id2_value = 0;
1544 elm_id2_mask = ELM_AO_CONTROL_DEFAULT & (~(AUSER(AUSER_MASK)) & ~(AID(MASTER_USIP_PORT(MUP_ALL_MASK))));
1545 elm_id3_value = 0;
1546 elm_id3_mask = ELM_AO_CONTROL_DEFAULT & (~(AUSER(AUSER_MASK)) & ~(AID(MASTER_USIP_PORT(MUP_ALL_MASK))));
1547
1548 if(core_th_sel==0x00)
1549 {
1550 elm_id0_value = AUSER(ELM_SEL_USIP0_TH0);
1551 elm_id1_value = AUSER(ELM_SEL_USIP0_TH0);
1552 elm_id2_value = AUSER(ELM_SEL_USIP0_TH0);
1553 elm_id3_value = AUSER(ELM_SEL_USIP0_TH0);
1554 }
1555 else if(core_th_sel==0x01)
1556 {
1557 elm_id0_value = AUSER(ELM_SEL_USIP0_TH1);
1558 elm_id1_value = AUSER(ELM_SEL_USIP0_TH1);
1559 elm_id2_value = AUSER(ELM_SEL_USIP0_TH1);
1560 elm_id3_value = AUSER(ELM_SEL_USIP0_TH1);
1561 }
1562 else if(core_th_sel==0x10)
1563 {
1564 elm_id0_value = AUSER(ELM_SEL_USIP1_TH0);
1565 elm_id1_value = AUSER(ELM_SEL_USIP1_TH0);
1566 elm_id2_value = AUSER(ELM_SEL_USIP1_TH0);
1567 elm_id3_value = AUSER(ELM_SEL_USIP1_TH0);
1568 }
1569 else if(core_th_sel==0x11)
1570 {
1571 elm_id0_value = AUSER(ELM_SEL_USIP1_TH1);
1572 elm_id1_value = AUSER(ELM_SEL_USIP1_TH1);
1573 elm_id2_value = AUSER(ELM_SEL_USIP1_TH1);
1574 elm_id3_value = AUSER(ELM_SEL_USIP1_TH1);
1575 }
1576 else
1577 {
1578 rtn = KAL_FALSE;
1579 elm_id0_mask = ELM_AO_CONTROL_DEFAULT;
1580 elm_id1_mask = ELM_AO_CONTROL_DEFAULT;
1581 elm_id2_mask = ELM_AO_CONTROL_DEFAULT;
1582 elm_id3_mask = ELM_AO_CONTROL_DEFAULT;
1583 }
1584 // Port select
1585 if(port_sel==0x0) // All master
1586 {
1587 elm_id0_mask |= AID(MASTER_DEFAULT_MASK);
1588 elm_id1_mask |= AID(MASTER_DEFAULT_MASK);
1589 elm_id2_mask |= AID(MASTER_DEFAULT_MASK);
1590 elm_id3_mask |= AID(MASTER_DEFAULT_MASK);
1591 }
1592 else if(port_sel==0x1) // PM port
1593 {
1594 elm_id0_mask |= AID(MASTER_USIP_PORT(MUP_PM_MASK));
1595 elm_id1_mask |= AID(MASTER_USIP_PORT(MUP_PM_MASK));
1596 elm_id2_mask |= AID(MASTER_USIP_PORT(MUP_PM_MASK));
1597 elm_id3_mask |= AID(MASTER_USIP_PORT(MUP_PM_MASK));
1598 elm_id0_value |= AID(MASTER_USIP_PORT(MUP_PM));
1599 elm_id1_value |= AID(MASTER_USIP_PORT(MUP_PM));
1600 elm_id2_value |= AID(MASTER_USIP_PORT(MUP_PM));
1601 elm_id3_value |= AID(MASTER_USIP_PORT(MUP_PM));
1602 }
1603 else if(port_sel==0x2) // DC port
1604 {
1605 elm_id0_mask |= AID(MASTER_USIP_PORT(MUP_DC_MASK));
1606 elm_id1_mask |= AID(MASTER_USIP_PORT(MUP_DC_MASK));
1607 elm_id2_mask |= AID(MASTER_USIP_PORT(MUP_DC_MASK));
1608 elm_id3_mask |= AID(MASTER_USIP_PORT(MUP_DC_MASK));
1609 elm_id0_value |= AID(MASTER_USIP_PORT(MUP_DC));
1610 elm_id1_value |= AID(MASTER_USIP_PORT(MUP_DC));
1611 elm_id2_value |= AID(MASTER_USIP_PORT(MUP_DC));
1612 elm_id3_value |= AID(MASTER_USIP_PORT(MUP_DC));
1613 }
1614 else if(port_sel==0x3) // DP port all
1615 {
1616 elm_id0_mask |= AID(MASTER_USIP_PORT(MUP_DP_ALL_MASK));
1617 elm_id1_mask |= AID(MASTER_USIP_PORT(MUP_DP_ALL_MASK));
1618 elm_id2_mask |= AID(MASTER_USIP_PORT(MUP_DP_ALL_MASK));
1619 elm_id3_mask |= AID(MASTER_USIP_PORT(MUP_DP_ALL_MASK));
1620 elm_id0_value |= AID(MASTER_USIP_PORT(MUP_DP_ALL));
1621 elm_id1_value |= AID(MASTER_USIP_PORT(MUP_DP_ALL));
1622 elm_id2_value |= AID(MASTER_USIP_PORT(MUP_DP_ALL));
1623 elm_id3_value |= AID(MASTER_USIP_PORT(MUP_DP_ALL));
1624 }
1625 else if(port_sel==0x4) // DP port cachable
1626 {
1627 elm_id0_mask |= AID(MASTER_USIP_PORT(MUP_DP_MASK));
1628 elm_id1_mask |= AID(MASTER_USIP_PORT(MUP_DP_MASK));
1629 elm_id2_mask |= AID(MASTER_USIP_PORT(MUP_DP_MASK));
1630 elm_id3_mask |= AID(MASTER_USIP_PORT(MUP_DP_MASK));
1631 elm_id0_value |= AID(MASTER_USIP_PORT(MUP_DP_CACHE));
1632 elm_id1_value |= AID(MASTER_USIP_PORT(MUP_DP_CACHE));
1633 elm_id2_value |= AID(MASTER_USIP_PORT(MUP_DP_CACHE));
1634 elm_id3_value |= AID(MASTER_USIP_PORT(MUP_DP_CACHE));
1635 }
1636 else if(port_sel==0x5) // DP port non-cachable
1637 {
1638 elm_id0_mask |= AID(MASTER_USIP_PORT(MUP_DP_MASK));
1639 elm_id1_mask |= AID(MASTER_USIP_PORT(MUP_DP_MASK));
1640 elm_id2_mask |= AID(MASTER_USIP_PORT(MUP_DP_MASK));
1641 elm_id3_mask |= AID(MASTER_USIP_PORT(MUP_DP_MASK));
1642 elm_id0_value |= AID(MASTER_USIP_PORT(MUP_DP_NONCACHE));
1643 elm_id1_value |= AID(MASTER_USIP_PORT(MUP_DP_NONCACHE));
1644 elm_id2_value |= AID(MASTER_USIP_PORT(MUP_DP_NONCACHE));
1645 elm_id3_value |= AID(MASTER_USIP_PORT(MUP_DP_NONCACHE));
1646 }
1647 else
1648 {
1649 rtn = KAL_FALSE;
1650 elm_id0_mask = ELM_AO_CONTROL_DEFAULT;
1651 elm_id1_mask = ELM_AO_CONTROL_DEFAULT;
1652 elm_id2_mask = ELM_AO_CONTROL_DEFAULT;
1653 elm_id3_mask = ELM_AO_CONTROL_DEFAULT;
1654 }
1655
1656 }
1657 else
1658 {
1659 rtn = KAL_FALSE;
1660 }
1661
1662 if(rtn == KAL_FALSE)
1663 {
1664 elm_ao_decode_cfg = ELM_DECODE_FROM_AO;
1665 }
1666 else
1667 {
1668 elm_ao_decode_cfg = ELM_DECODE_FROM_APB;
1669 }
1670
1671 DRV_ClrReg32(REG_MCUSYS_EMI_ELM_CTRL_REG, (ELM_AO_DECODE(ELM_DECODE_FROM_AO))); // clear AO decode
1672 DRV_SetReg32(REG_MCUSYS_EMI_ELM_CTRL_REG, (ELM_AO_DECODE(elm_ao_decode_cfg))); // set AO decode
1673
1674 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID0_CTRL_REG, elm_id0_value);
1675 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID0_CTRL_MASK, elm_id0_mask);
1676 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID1_CTRL_REG, elm_id1_value);
1677 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID1_CTRL_MASK, elm_id1_mask);
1678 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID2_CTRL_REG, elm_id2_value);
1679 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID2_CTRL_MASK, elm_id2_mask);
1680 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID3_CTRL_REG, elm_id3_value);
1681 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID3_CTRL_MASK, elm_id3_mask);
1682
1683 DRV_WriteReg32(REG_MDMCU_ELM_AO_STATUS_CFG1, ELM_EMI_TOP_BLOCK(E_TOP_MASK)|DECODE_ID1(elm_id1_rw|elm_id1_master|elm_id1_prio)| \
1684 ELM_DURATION(elm_lat_dur_100us)|EMI_BLOCK(E_NOT_MASK)|ELM_INT_MASK(LAT_INT_UNMASK_ALL));
1685
1686 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS_CFG0, ELM_IDLE_ENABLE|ELM_ENABLE|ELM_ACCURACY(ELM_unit_100us)| \
1687 LAT_TH_ID1_NORMAL(ELM_NS2TRAN(elm_write_lat_threshold))|LAT_TH_ID0_NORMAL(ELM_NS2TRAN(elm_read_lat_threshold))| \
1688 DECODE_ID0(elm_id0_rw|elm_id0_master|elm_id0_prio)); //ELM enable for MDMCU Reset
1689 return rtn;
1690}
1691
1692kal_bool Set_EMI_ELM_VPE(kal_uint8 id, kal_uint8 vpe_sel)
1693{
1694 kal_bool rtn = KAL_TRUE;
1695 //Disable before re-configure
1696 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS_CFG0, ELM_DISABLE);
1697 elm_dynamic_lat_threshold_disable = 1; //disable dynamic latency threshold
1698
1699#if 0
1700/* under construction !*/
1701/* under construction !*/
1702/* under construction !*/
1703/* under construction !*/
1704/* under construction !*/
1705/* under construction !*/
1706/* under construction !*/
1707/* under construction !*/
1708#endif
1709
1710 if(id == 0)// id 0
1711 {
1712 elm_id0_mask &= ~(AUSER(AUSER_MASK));
1713 elm_id2_mask &= ~(AUSER(AUSER_MASK));
1714 if(vpe_sel==0)
1715 {
1716 elm_id0_value = AUSER(ELM_SEL_VPE0);
1717 elm_id2_value = AUSER(ELM_SEL_VPE0);
1718 }
1719 else if(vpe_sel==1)
1720 {
1721 elm_id0_value = AUSER(ELM_SEL_VPE1);
1722 elm_id2_value = AUSER(ELM_SEL_VPE1);
1723 }
1724 else if(vpe_sel==2)
1725 {
1726 elm_id0_value = AUSER(ELM_SEL_VPE2);
1727 elm_id2_value = AUSER(ELM_SEL_VPE2);
1728 }
1729 else if(vpe_sel==3)
1730 {
1731 elm_id0_value = AUSER(ELM_SEL_VPE3);
1732 elm_id2_value = AUSER(ELM_SEL_VPE3);
1733 }
1734 else if(vpe_sel==4)
1735 {
1736 elm_id0_value = AUSER(ELM_SEL_VPE4);
1737 elm_id2_value = AUSER(ELM_SEL_VPE4);
1738 }
1739 else if(vpe_sel==5)
1740 {
1741 elm_id0_value = AUSER(ELM_SEL_VPE5);
1742 elm_id2_value = AUSER(ELM_SEL_VPE5);
1743 }
1744 else
1745 {
1746 rtn = KAL_FALSE;
1747 elm_id0_mask = ELM_AO_CONTROL_DEFAULT;
1748 }
1749
1750 }
1751 else if(id == 1) // id 1 (default write)
1752 {
1753 elm_id1_mask &= ~(AUSER(AUSER_MASK));
1754 elm_id3_mask &= ~(AUSER(AUSER_MASK));
1755 if(vpe_sel==0)
1756 {
1757 elm_id1_value = AUSER(ELM_SEL_VPE0);
1758 elm_id3_value = AUSER(ELM_SEL_VPE0);
1759 }
1760 else if(vpe_sel==1)
1761 {
1762 elm_id1_value = AUSER(ELM_SEL_VPE1);
1763 elm_id3_value = AUSER(ELM_SEL_VPE1);
1764 }
1765 else if(vpe_sel==2)
1766 {
1767 elm_id1_value = AUSER(ELM_SEL_VPE2);
1768 elm_id3_value = AUSER(ELM_SEL_VPE2);
1769 }
1770 else if(vpe_sel==3)
1771 {
1772 elm_id1_value = AUSER(ELM_SEL_VPE3);
1773 elm_id3_value = AUSER(ELM_SEL_VPE3);
1774 }
1775 else if(vpe_sel==4)
1776 {
1777 elm_id1_value = AUSER(ELM_SEL_VPE4);
1778 elm_id3_value = AUSER(ELM_SEL_VPE4);
1779 }
1780 else if(vpe_sel==5)
1781 {
1782 elm_id1_value = AUSER(ELM_SEL_VPE5);
1783 elm_id3_value = AUSER(ELM_SEL_VPE5);
1784 }
1785 else
1786 {
1787 rtn = KAL_FALSE;
1788 elm_id1_mask = ELM_AO_CONTROL_DEFAULT;
1789 }
1790 }
1791 else if(id == 0xFF)// ID 0/1 are the same
1792 {
1793 elm_id0_mask &= ~(AUSER(AUSER_MASK));
1794 elm_id1_mask &= ~(AUSER(AUSER_MASK));
1795 elm_id2_mask &= ~(AUSER(AUSER_MASK));
1796 elm_id3_mask &= ~(AUSER(AUSER_MASK));
1797 if(vpe_sel==0)
1798 {
1799 elm_id0_value = AUSER(ELM_SEL_VPE0);
1800 elm_id1_value = AUSER(ELM_SEL_VPE0);
1801 elm_id2_value = AUSER(ELM_SEL_VPE0);
1802 elm_id3_value = AUSER(ELM_SEL_VPE0);
1803 }
1804 else if(vpe_sel==1)
1805 {
1806 elm_id0_value = AUSER(ELM_SEL_VPE1);
1807 elm_id1_value = AUSER(ELM_SEL_VPE1);
1808 elm_id2_value = AUSER(ELM_SEL_VPE1);
1809 elm_id3_value = AUSER(ELM_SEL_VPE1);
1810 }
1811 else if(vpe_sel==2)
1812 {
1813 elm_id0_value = AUSER(ELM_SEL_VPE2);
1814 elm_id1_value = AUSER(ELM_SEL_VPE2);
1815 elm_id2_value = AUSER(ELM_SEL_VPE2);
1816 elm_id3_value = AUSER(ELM_SEL_VPE2);
1817 }
1818 else if(vpe_sel==3)
1819 {
1820 elm_id0_value = AUSER(ELM_SEL_VPE3);
1821 elm_id1_value = AUSER(ELM_SEL_VPE3);
1822 elm_id2_value = AUSER(ELM_SEL_VPE3);
1823 elm_id3_value = AUSER(ELM_SEL_VPE3);
1824 }
1825 else if(vpe_sel==4)
1826 {
1827 elm_id0_value = AUSER(ELM_SEL_VPE4);
1828 elm_id1_value = AUSER(ELM_SEL_VPE4);
1829 elm_id2_value = AUSER(ELM_SEL_VPE4);
1830 elm_id3_value = AUSER(ELM_SEL_VPE4);
1831 }
1832 else if(vpe_sel==5)
1833 {
1834 elm_id0_value = AUSER(ELM_SEL_VPE5);
1835 elm_id1_value = AUSER(ELM_SEL_VPE5);
1836 elm_id2_value = AUSER(ELM_SEL_VPE5);
1837 elm_id3_value = AUSER(ELM_SEL_VPE5);
1838 }
1839 else
1840 {
1841 rtn = KAL_FALSE;
1842 elm_id0_mask = ELM_AO_CONTROL_DEFAULT;
1843 elm_id1_mask = ELM_AO_CONTROL_DEFAULT;
1844 elm_id2_mask = ELM_AO_CONTROL_DEFAULT;
1845 elm_id3_mask = ELM_AO_CONTROL_DEFAULT;
1846 }
1847 }
1848 else
1849 {
1850 rtn = KAL_FALSE;
1851 }
1852
1853 if(rtn == KAL_FALSE)
1854 {
1855 elm_ao_decode_cfg = ELM_DECODE_FROM_AO;
1856 }
1857 else
1858 {
1859 elm_ao_decode_cfg = ELM_DECODE_FROM_APB;
1860 }
1861
1862 DRV_ClrReg32(REG_MCUSYS_EMI_ELM_CTRL_REG, (ELM_AO_DECODE(ELM_DECODE_FROM_AO))); // clear AO decode
1863 DRV_SetReg32(REG_MCUSYS_EMI_ELM_CTRL_REG, (ELM_AO_DECODE(elm_ao_decode_cfg))); // set AO decode
1864
1865 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID0_CTRL_REG, elm_id0_value);
1866 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID0_CTRL_MASK, elm_id0_mask);
1867 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID1_CTRL_REG, elm_id1_value);
1868 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID1_CTRL_MASK, elm_id1_mask);
1869 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID2_CTRL_REG, elm_id2_value);
1870 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID2_CTRL_MASK, elm_id2_mask);
1871 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID3_CTRL_REG, elm_id3_value);
1872 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID3_CTRL_MASK, elm_id3_mask);
1873
1874 DRV_WriteReg32(REG_MDMCU_ELM_AO_STATUS_CFG1, ELM_EMI_TOP_BLOCK(E_TOP_MASK)|DECODE_ID1(elm_id1_rw|elm_id1_master|elm_id1_prio)| \
1875 ELM_DURATION(elm_lat_dur_100us)|EMI_BLOCK(E_NOT_MASK)|ELM_INT_MASK(LAT_INT_UNMASK_ALL));
1876
1877 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS_CFG0, ELM_IDLE_ENABLE|ELM_ENABLE|ELM_ACCURACY(ELM_unit_100us)| \
1878 LAT_TH_ID1_NORMAL(ELM_NS2TRAN(elm_write_lat_threshold))|LAT_TH_ID0_NORMAL(ELM_NS2TRAN(elm_read_lat_threshold))| \
1879 DECODE_ID0(elm_id0_rw|elm_id0_master|elm_id0_prio)); //ELM enable for MDMCU Reset
1880 return rtn;
1881}
1882
1883kal_bool ELM_INFRA_set_master(kal_uint8 id, kal_uint8 m_sel)
1884{
1885 kal_bool rtn = KAL_TRUE;
1886#if 0
1887/* under construction !*/
1888/* under construction !*/
1889/* under construction !*/
1890/* under construction !*/
1891/* under construction !*/
1892/* under construction !*/
1893/* under construction !*/
1894/* under construction !*/
1895/* under construction !*/
1896/* under construction !*/
1897/* under construction !*/
1898/* under construction !*/
1899/* under construction !*/
1900/* under construction !*/
1901/* under construction !*/
1902/* under construction !*/
1903/* under construction !*/
1904/* under construction !*/
1905/* under construction !*/
1906/* under construction !*/
1907/* under construction !*/
1908/* under construction !*/
1909/* under construction !*/
1910/* under construction !*/
1911/* under construction !*/
1912/* under construction !*/
1913/* under construction !*/
1914/* under construction !*/
1915/* under construction !*/
1916/* under construction !*/
1917/* under construction !*/
1918/* under construction !*/
1919/* under construction !*/
1920/* under construction !*/
1921/* under construction !*/
1922/* under construction !*/
1923/* under construction !*/
1924/* under construction !*/
1925/* under construction !*/
1926/* under construction !*/
1927/* under construction !*/
1928/* under construction !*/
1929/* under construction !*/
1930/* under construction !*/
1931/* under construction !*/
1932/* under construction !*/
1933/* under construction !*/
1934/* under construction !*/
1935/* under construction !*/
1936/* under construction !*/
1937/* under construction !*/
1938/* under construction !*/
1939/* under construction !*/
1940/* under construction !*/
1941/* under construction !*/
1942/* under construction !*/
1943/* under construction !*/
1944/* under construction !*/
1945/* under construction !*/
1946/* under construction !*/
1947/* under construction !*/
1948/* under construction !*/
1949/* under construction !*/
1950/* under construction !*/
1951/* under construction !*/
1952/* under construction !*/
1953/* under construction !*/
1954/* under construction !*/
1955/* under construction !*/
1956/* under construction !*/
1957/* under construction !*/
1958/* under construction !*/
1959/* under construction !*/
1960/* under construction !*/
1961/* under construction !*/
1962/* under construction !*/
1963/* under construction !*/
1964/* under construction !*/
1965/* under construction !*/
1966/* under construction !*/
1967/* under construction !*/
1968/* under construction !*/
1969/* under construction !*/
1970/* under construction !*/
1971/* under construction !*/
1972/* under construction !*/
1973/* under construction !*/
1974/* under construction !*/
1975/* under construction !*/
1976/* under construction !*/
1977/* under construction !*/
1978/* under construction !*/
1979/* under construction !*/
1980/* under construction !*/
1981/* under construction !*/
1982/* under construction !*/
1983/* under construction !*/
1984/* under construction !*/
1985/* under construction !*/
1986/* under construction !*/
1987/* under construction !*/
1988/* under construction !*/
1989/* under construction !*/
1990/* under construction !*/
1991/* under construction !*/
1992/* under construction !*/
1993/* under construction !*/
1994/* under construction !*/
1995/* under construction !*/
1996/* under construction !*/
1997/* under construction !*/
1998/* under construction !*/
1999/* under construction !*/
2000/* under construction !*/
2001/* under construction !*/
2002/* under construction !*/
2003/* under construction !*/
2004/* under construction !*/
2005/* under construction !*/
2006/* under construction !*/
2007/* under construction !*/
2008/* under construction !*/
2009/* under construction !*/
2010/* under construction !*/
2011/* under construction !*/
2012/* under construction !*/
2013/* under construction !*/
2014/* under construction !*/
2015/* under construction !*/
2016/* under construction !*/
2017/* under construction !*/
2018/* under construction !*/
2019/* under construction !*/
2020/* under construction !*/
2021/* under construction !*/
2022/* under construction !*/
2023/* under construction !*/
2024/* under construction !*/
2025/* under construction !*/
2026/* under construction !*/
2027/* under construction !*/
2028/* under construction !*/
2029/* under construction !*/
2030/* under construction !*/
2031/* under construction !*/
2032/* under construction !*/
2033/* under construction !*/
2034/* under construction !*/
2035/* under construction !*/
2036/* under construction !*/
2037/* under construction !*/
2038/* under construction !*/
2039/* under construction !*/
2040/* under construction !*/
2041/* under construction !*/
2042/* under construction !*/
2043/* under construction !*/
2044/* under construction !*/
2045/* under construction !*/
2046/* under construction !*/
2047/* under construction !*/
2048/* under construction !*/
2049/* under construction !*/
2050/* under construction !*/
2051/* under construction !*/
2052/* under construction !*/
2053/* under construction !*/
2054/* under construction !*/
2055/* under construction !*/
2056/* under construction !*/
2057/* under construction !*/
2058/* under construction !*/
2059/* under construction !*/
2060/* under construction !*/
2061/* under construction !*/
2062/* under construction !*/
2063/* under construction !*/
2064/* under construction !*/
2065/* under construction !*/
2066/* under construction !*/
2067/* under construction !*/
2068/* under construction !*/
2069/* under construction !*/
2070/* under construction !*/
2071#endif
2072 return rtn;
2073}
2074#endif