blob: 0427c400cbc339367af252653c0172a28ce6866e [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 MD_DVFS_CON in trace
8
9#if (defined(__MTK_TARGET__) && !defined(__MAUI_BASIC__))
10// for profiling ELM log
11#include "kal_trace.h" //for kal_sys_trace
12#include "TrcMod.h" //for L1 Trace API
13#endif
14
15
16#define REG_MCUSYS_EMI_ELM_CODA_VERSION (BASE_ADDR_MCUSYS_ELM_EMI+0x0)
17#define REG_MCUSYS_EMI_ELM_EN_REG (BASE_ADDR_MCUSYS_ELM_EMI+0x8)
18#define REG_MCUSYS_EMI_ELM_CTRL_REG (BASE_ADDR_MCUSYS_ELM_EMI+0xC)
19#define REG_MCUSYS_EMI_ELM_LAT_CNT_CTRL_REG (BASE_ADDR_MCUSYS_ELM_EMI+0x10)
20#define REG_MCUSYS_EMI_ELM_AXI_ID0_CTRL_REG (BASE_ADDR_MCUSYS_ELM_EMI+0x20)
21#define REG_MCUSYS_EMI_ELM_AXI_ID0_CTRL_MASK (BASE_ADDR_MCUSYS_ELM_EMI+0x24)
22#define REG_MCUSYS_EMI_ELM_AXI_ID1_CTRL_REG (BASE_ADDR_MCUSYS_ELM_EMI+0x28)
23#define REG_MCUSYS_EMI_ELM_AXI_ID1_CTRL_MASK (BASE_ADDR_MCUSYS_ELM_EMI+0x2C)
24#define REG_MCUSYS_EMI_ELM_AXI_ID2_CTRL_REG (BASE_ADDR_MCUSYS_ELM_EMI+0x30)
25#define REG_MCUSYS_EMI_ELM_AXI_ID2_CTRL_MASK (BASE_ADDR_MCUSYS_ELM_EMI+0x34)
26#define REG_MCUSYS_EMI_ELM_AXI_ID3_CTRL_REG (BASE_ADDR_MCUSYS_ELM_EMI+0x38)
27#define REG_MCUSYS_EMI_ELM_AXI_ID3_CTRL_MASK (BASE_ADDR_MCUSYS_ELM_EMI+0x3C)
28#define REG_MCUSYS_EMI_ELM_ID0_TRANS_TH (BASE_ADDR_MCUSYS_ELM_EMI+0x40)
29#define REG_MCUSYS_EMI_ELM_ID1_TRANS_TH (BASE_ADDR_MCUSYS_ELM_EMI+0x44)
30#define REG_MCUSYS_EMI_ELM_CNT0 (BASE_ADDR_MCUSYS_ELM_EMI+0x50)
31#define REG_MCUSYS_EMI_ELM_CNT1 (BASE_ADDR_MCUSYS_ELM_EMI+0x54)
32#define REG_MCUSYS_EMI_ELM_CNT2 (BASE_ADDR_MCUSYS_ELM_EMI+0x58)
33#define REG_MCUSYS_EMI_ELM_CNT3 (BASE_ADDR_MCUSYS_ELM_EMI+0x5C)
34#define REG_MCUSYS_EMI_ELM_OVERRUN_CNT_ST (BASE_ADDR_MCUSYS_ELM_EMI+0x60)
35#define REG_MCUSYS_EMI_ELM_INT_STATUS (BASE_ADDR_MCUSYS_ELM_EMI+0x64)
36#define REG_MCUSYS_EMI_ELM_AO_STATUS0 (BASE_ADDR_MCUSYS_ELM_EMI+0x68)
37#define REG_MCUSYS_EMI_ELM_AO_STATUS1 (BASE_ADDR_MCUSYS_ELM_EMI+0x6C)
38#define REG_MCUSYS_EMI_ELM_ID0_WORST_AVG_LAT (BASE_ADDR_MCUSYS_ELM_EMI+0x70)
39#define REG_MCUSYS_EMI_ELM_ID0_WORST_TOT_LAT (BASE_ADDR_MCUSYS_ELM_EMI+0x74)
40#define REG_MCUSYS_EMI_ELM_ID1_WORST_AVG_LAT (BASE_ADDR_MCUSYS_ELM_EMI+0x78)
41#define REG_MCUSYS_EMI_ELM_ID1_WORST_TOT_LAT (BASE_ADDR_MCUSYS_ELM_EMI+0x7C)
42#define REG_MCUSYS_EMI_ELM_ID0_TRANS_IN_WORST_AVG (BASE_ADDR_MCUSYS_ELM_EMI+0x80)
43#define REG_MCUSYS_EMI_ELM_ID1_TRANS_IN_WORST_AVG (BASE_ADDR_MCUSYS_ELM_EMI+0x84)
44#define REG_MDMCU_ELM_AO_STATUS0_CFG0 (BASE_ADDR_MDPERIMISC+0x70) //0xA0060070
45#define REG_MDMCU_ELM_AO_STATUS0_CFG1 (BASE_ADDR_MDPERIMISC+0x74) //0xA0060074
46
47
48#define REG_MDINFRA_EMI_ELM_CTRL_REG (BASE_ADDR_MDINFRA_ELM+0xC)
49#define REG_MDINFRA_EMI_ELM_INT_STATUS (BASE_ADDR_MDINFRA_ELM+0x64)
50#define REG_MDINFRA_EMI_ELM_ID0_WORST_AVG_LAT (BASE_ADDR_MDINFRA_ELM+0x70)
51#define REG_MDINFRA_EMI_ELM_ID0_WORST_TOT_LAT (BASE_ADDR_MDINFRA_ELM+0x74)
52#define REG_MDINFRA_EMI_ELM_ID1_WORST_AVG_LAT (BASE_ADDR_MDINFRA_ELM+0x78)
53#define REG_MDINFRA_EMI_ELM_ID1_WORST_TOT_LAT (BASE_ADDR_MDINFRA_ELM+0x7C)
54#define REG_MDINFRA_EMI_ELM_ID0_TRANS_IN_WORST_AVG (BASE_ADDR_MDINFRA_ELM+0x80)
55#define REG_MDINFRA_EMI_ELM_ID1_TRANS_IN_WORST_AVG (BASE_ADDR_MDINFRA_ELM+0x84)
56
57#define REG_MDINFRA_EMI_ELM_ID0_TRANS_TH (BASE_ADDR_MDINFRA_ELM+0x40)
58#define REG_MDINFRA_EMI_ELM_ID1_TRANS_TH (BASE_ADDR_MDINFRA_ELM+0x44)
59#define REG_MDINFRA_EMI_ELM_INT_STATUS (BASE_ADDR_MDINFRA_ELM+0x64)
60#define REG_MDINFRA_ELM_AO_STATUS0_CFG0 (BASE_ADDR_MDPERIMISC+0x78) //0xA0060078
61#define REG_MDINFRA_ELM_AO_STATUS0_CFG1 (BASE_ADDR_MDPERIMISC+0x7C) //0xA006007C
62#if defined(MT6771)
63#define AP_VCORE_DVFS_CURRENT (volatile kal_uint32 *)(BASE_ADDR_AP_VCORE_DVFS+0xDC) // current dvfsrc level
64#define AP_VCORE_DVFS_LAST (volatile kal_uint32 *)(BASE_ADDR_AP_VCORE_DVFS+0x308) // last dvfsrc level
65#define AP_VCORE_DVFS_HISTORY_BASE (volatile kal_uint32 *)(BASE_ADDR_AP_VCORE_DVFS+0x400) // dvfsrc history start address, end address should be 0x15C
66#define AP_VCORE_DVFS_HISTORY_SIZE 24
67#else
68#define AP_VCORE_DVFS_CURRENT (volatile kal_uint32 *)(BASE_ADDR_AP_VCORE_DVFS+0x50) // current dvfsrc level
69#define AP_VCORE_DVFS_LAST (volatile kal_uint32 *)(BASE_ADDR_AP_VCORE_DVFS+0x88) // last dvfsrc level
70#define AP_VCORE_DVFS_HISTORY_BASE (volatile kal_uint32 *)(BASE_ADDR_AP_VCORE_DVFS+0x100) // dvfsrc history start address, end address should be 0x13C
71#define AP_VCORE_DVFS_HISTORY_SIZE 16
72#endif
73#define AP_TXZQ_OCCUR_TICK (volatile kal_uint32 *)(BASE_ADDR_AP_SPM+0x65C) // AP TX/ZQ occur time
74#define AP_DVFS_OCCUR_TICK (volatile kal_uint32 *)(BASE_ADDR_AP_SPM+0x658) // AP DVFS occur time
75
76
77#include "sleepdrv_interface.h"
78
79
80
81// ELM Set Mode (HW/SW Mode)
82enum {
83 ELM_MODE_0_LATENCY = 0, //write transaction, write latency, read transaction, read latency
84 ELM_MODE_1_WORD_COUNT = 1, //
85 ELM_MODE_2_SPECIAL = 2,
86
87};
88
89enum {
90 ELM_MASTER_ALL = 0,
91 ELM_MASTER_USIP = 1,
92 ELM_MASTER_MDMCU = 2,
93
94};
95
96#define DECODE_ID0(x) ((x)<<0)
97#define LAT_TH_ID0(x) ((x)<<5)
98#define LAT_TH_ID1(x) ((x)<<15)
99#define ELM_ACCURACY(x) ((x)<<25)
100 #define ELM_unit_1us 0
101 #define ELM_unit_10us 1
102 #define ELM_unit_100us 2
103 #define ELM_unit_1000us 3
104#define ELM_ENABLE (1<<27)
105#define ELM_DISABLE (0<<27)
106
107
108#define ELM_INT_MASK(x) ((x)<<0)
109 #define ID1 (3<<2)
110 #define ID0 (3<<0)
111#define EMI_BLOCK(x) ((x)<<4)
112 #define E_NOT_MASK 0
113 #define E_MASK 1
114#define ELM_DURATION(x) ((x)<<5)
115 #define ELM_200US 1 // need to pair EMI_unit_xxxus 0:means 1, 1:means 2
116 #define ELM_400US 3
117 #define ELM_1000US 0
118#define DECODE_ID1(x) ((x)<<12)
119 #define ELM_READ (0<<4)
120 #define ELM_WRITE (1<<4)
121 #define ELM_ALL_MASTER (0<<2)
122 #define ELM_MDMCU_ONLY (1<<2)
123 #define ELM_USIP_ONLY (2<<2)
124 #define ELM_ALL_PRIO (0<<0)
125 #define ELM_PRE_ULTRA (1<<0)
126 #define ELM_ULTRA (2<<0)
127#define ELM_EMI_TOP_BLOCK(x) ((x)<<24)
128
129#define ELM_AO_DECODE(x) ((x)<<13)
130 #define ELM_DECODE_FROM_AO 1
131 #define ELM_DECODE_FROM_APB 0
132#define ELM_AO_CONTROL_DEFAULT 0x73F73FFF
133
134#define ELM_VPE_SEL(x) ((x)<<28)
135 #define ELM_SEL_VPE0 0x0
136 #define ELM_SEL_VPE1 0x4
137 #define ELM_SEL_VPE2 0x1
138 #define ELM_SEL_VPE3 0x5
139#define ELM_MASTER_SEL(x) ((x)<<0)
140 #define ELM_MASTER_IA_MASK 0x3
141
142#define ELM_USIP_CORE_SEL(x) (((x)<<4)|0x2)
143#define ELM_USIP_PORT_SEL(x) ((x)<<2)
144 #define ELM_USIP_PORT_ENABLE_MASK 0x3
145 #define ELM_USIP_PORT_DISABLE_MASK 0x0
146 #define ELM_SEL_USIP_ALL 0x0
147 #define ELM_SEL_USIP_ICACHE 0x0
148 #define ELM_SEL_USIP_DCACHE 0x1
149 #define ELM_SEL_USIP_DNOCACHE 0x2
150
151
152//MCUSYS fixed clock 208Mhz, 1T = 4.8ns
153#define ELM_TRANS2NS(X) ((((((X)*1000)<<4)/208)>>4))
154#define ELM_NS2TRAN(X) ((((X)*208)/1000))
155
156//MDINFRA fixed clock 100Mhz, 1T = 10ns
157#define ELM_MDIFRA_TRANS2NS(X) (((X)*10))
158#define ELM_MDIFRA_NS2TRAN(X) (((X)/10))
159
160#define ELM_HISTORY_SIZE 64
161
162//for assert information
163#define KAL_ERROR_EMI_ELM_EXCEP 0x4100
164//#define KAL_ERROR_IOCU_ELM_EXCEP 0x4101
165#define KAL_ERROR_DMA_ELM_EXCEP 0x4102
166//#define KAL_ERROR_L1_ELM_EXCEP 0x4103
167
168#define KAL_ERROR_EMI_ELM_CHANGE_THRESHOLD 0x4200
169
170#if (defined(__MTK_TARGET__) && !defined(__MAUI_BASIC__))
171 #define __ELM_TRACE__
172 #define ELM_IF_DEF_TRACE(def_statement, undef_statement) def_statement
173#else /* __MCU_DORMANT_MODE__ */
174 #define ELM_IF_DEF_TRACE(def_statement, undef_statement) undef_statement
175#endif
176
177
178/*
179#define REG_MDINFRA_ELM_CFG0 0xA0060078
180#define REG_MDINFRA_ELM_CFG0 0xA006007C
181*/
182#ifdef __MTK_TARGET__
183
184#ifdef ELM_AMIF_ENABLE
185kal_uint32 elm_read_lat_threshold = 2000;
186kal_uint32 elm_write_lat_threshold = 2000;
187#else
188kal_uint32 elm_read_lat_threshold = 400;
189kal_uint32 elm_write_lat_threshold = 300;
190#endif
191kal_uint32 elm_infra_read_lat_threshold = 2000;
192kal_uint32 elm_infra_write_lat_threshold = 2000;
193
194
195kal_uint32 elm_dynamic_lat_threshold_disable = 0; //0 enable, 1 disable
196kal_uint32 elm_lat_duration = 200;
197kal_uint32 elm_trans_threshold = 100;
198kal_uint32 elm_mode = ELM_MODE_0_LATENCY;
199kal_uint32 elm_id0_master = ELM_ALL_MASTER;
200kal_uint32 elm_id0_rw = ELM_READ;
201kal_uint32 elm_id0_prio = ELM_ALL_PRIO;
202
203kal_uint32 elm_id1_master = ELM_ALL_MASTER;
204kal_uint32 elm_id1_rw = ELM_WRITE;
205kal_uint32 elm_id1_prio = ELM_ALL_PRIO;
206
207kal_uint32 elm_ao_decode_cfg = ELM_DECODE_FROM_AO;
208kal_uint32 elm_ao_id0_value = 0;
209kal_uint32 elm_ao_id0_mask = ELM_AO_CONTROL_DEFAULT;
210kal_uint32 elm_ao_id1_value = 0;
211kal_uint32 elm_ao_id1_mask = ELM_AO_CONTROL_DEFAULT;
212
213
214
215
216#if defined(__PRODUCTION_RELEASE__)
217elm_exception_type EMI_ELM_lat_irq_exception_type = ELM_NONE; //EMI latency irq default use trace
218elm_exception_type L1_DMA_irq_exception_type = ELM_NONE; //L1 and DMA default use trace
219#else
220/* under construction !*/
221/* under construction !*/
222#endif
223
224
225/*--- ELM history variable ---*/
226//EMI ELM
227#define ELM_RUNTIME_HISTORY_SIZE 8
228kal_uint32 emi_elm_runtime_lat_history_idx = 0;
229ELM_RUNTIME_PROFILE_LAT_T emi_elm_runtime_lat_history[ELM_RUNTIME_HISTORY_SIZE];
230
231//DMA ELM
232kal_uint32 dma_elm_runtime_lat_history_idx = 0;
233ELM_RUNTIME_PROFILE_LAT_T dma_elm_runtime_lat_history[ELM_RUNTIME_HISTORY_SIZE];
234
235
236
237
238
239void elmtop_emi_isr_handler();
240void elm_dma_isr_handler();
241
242
243
244kal_uint32 elm_profile_history_idx_0 = 0;
245ELM_FULL_LOG_T elm_profile_history_0[ELM_HISTORY_SIZE];
246
247
248void ELM_INIT(void)
249{
250 /*MDMCU EMI ELM*/
251 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS0_CFG0, ELM_DISABLE);
252 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_INT_STATUS, 0x0F); //clear ELM interrup
253 DRV_ClrReg32(REG_MCUSYS_EMI_ELM_CTRL_REG, (0x3<<4)); // clear ELM mode
254 DRV_SetReg32(REG_MCUSYS_EMI_ELM_CTRL_REG, ((elm_mode&0x3)<<4));//select ELM mode
255
256 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_ID0_TRANS_TH, elm_trans_threshold);
257 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_ID1_TRANS_TH, elm_trans_threshold);
258 DRV_WriteReg32(REG_MDMCU_ELM_AO_STATUS0_CFG1, ELM_EMI_TOP_BLOCK(0xff)|DECODE_ID1(elm_id1_rw|elm_id1_master|elm_id1_prio)| \
259 ELM_DURATION(ELM_200US)|EMI_BLOCK(E_NOT_MASK)|ELM_INT_MASK(0));
260 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS0_CFG0, ELM_ENABLE|ELM_ACCURACY(ELM_unit_100us)| \
261 LAT_TH_ID1(ELM_NS2TRAN(elm_write_lat_threshold))|LAT_TH_ID0(ELM_NS2TRAN(elm_read_lat_threshold))| \
262 DECODE_ID0(elm_id0_rw|elm_id0_master|elm_id0_prio)); //ELM enable for MDMCU Reset
263
264 MDCIRQ_IRQ_Register_LISR(IRQ_ELMTOP_EMI_IRQ_CODE, (void *)elmtop_emi_isr_handler, "ELMTOP_EMI_LISR");
265 MDCIRQ_IRQSensitivity(IRQ_ELMTOP_EMI_IRQ_CODE, KAL_FALSE); // level trigger
266 MDCIRQ_IRQUnmask(IRQ_ELMTOP_EMI_IRQ_CODE);
267
268
269
270 /*MDINFRA EMI ELM*/
271 DRV_WriteReg32_NPW(REG_MDINFRA_ELM_AO_STATUS0_CFG0, ELM_DISABLE);
272 DRV_WriteReg32(REG_MDINFRA_EMI_ELM_INT_STATUS, 0x0F); //clear ELM interrupt
273 DRV_WriteReg32(REG_MDINFRA_EMI_ELM_ID0_TRANS_TH, elm_trans_threshold);
274 DRV_WriteReg32(REG_MDINFRA_EMI_ELM_ID1_TRANS_TH, elm_trans_threshold);
275 DRV_WriteReg32(REG_MDINFRA_ELM_AO_STATUS0_CFG1, ELM_EMI_TOP_BLOCK(0xff)|DECODE_ID1(elm_id1_rw|elm_id1_prio)| \
276 ELM_DURATION(ELM_1000US)|EMI_BLOCK(E_NOT_MASK)|ELM_INT_MASK(0));
277 DRV_WriteReg32_NPW(REG_MDINFRA_ELM_AO_STATUS0_CFG0, ELM_ENABLE|ELM_ACCURACY(ELM_unit_1000us)| \
278 LAT_TH_ID1(ELM_MDIFRA_NS2TRAN(elm_infra_write_lat_threshold))|LAT_TH_ID0(ELM_MDIFRA_NS2TRAN(elm_infra_read_lat_threshold))| \
279 DECODE_ID0(elm_id0_rw|elm_id0_prio)); //ELM enable for MDMCU Reset
280
281 MDCIRQ_IRQ_Register_LISR(IRQ_ELM_DMA_IRQ_CODE, (void *)elm_dma_isr_handler, "ELM_DMA_LISR");
282 MDCIRQ_IRQSensitivity(IRQ_ELM_DMA_IRQ_CODE, KAL_FALSE); // level trigger
283 MDCIRQ_IRQUnmask(IRQ_ELM_DMA_IRQ_CODE);
284
285}
286
287
288void ELM_Config_DormantLeave(void)
289{
290 kal_uint32 vpe_idx;
291 vpe_idx = kal_get_current_vpe_id();
292 if(0 == vpe_idx)
293 {
294 ELM_INIT();
295 emi_elm_runtime_lat_history_idx =0;
296 memset((void*)emi_elm_runtime_lat_history,0, sizeof(ELM_RUNTIME_PROFILE_LAT_T)*ELM_RUNTIME_HISTORY_SIZE);
297 }
298}
299
300void ELM_GET_FULL_LOG(ELM_FULL_LOG_T* data)
301{
302 if(NULL==data)
303 {
304 return;
305 }
306
307#ifdef __ELM_RUNTIME_PROFILE__
308 elm_profile_history_0[elm_profile_history_idx_0].fma_stamp = ust_get_current_time();
309 ELM_GET_LOG(0,elm_profile_history_0[elm_profile_history_idx_0]);
310 elm_profile_history_0[elm_profile_history_idx_0].r_lat_thr = elm_read_lat_threshold;
311 elm_profile_history_0[elm_profile_history_idx_0].w_lat_thr = elm_write_lat_threshold;
312 memcpy(data,&elm_profile_history_0[elm_profile_history_idx_0], sizeof(ELM_FULL_LOG_T));
313 elm_profile_history_idx_0 = (elm_profile_history_idx_0 + 1) % ELM_HISTORY_SIZE ;
314#else
315 data->fma_stamp = ust_get_current_time();
316 ELM_GET_CNT(ELM_WR, ELM_TYPE_TRANS, 0, &(data->w_trans));
317 ELM_GET_CNT(ELM_WR, ELM_TYPE_LATENCY, 0, &(data->w_latency));
318 ELM_GET_CNT(ELM_RD, ELM_TYPE_TRANS, 0, &(data->r_trans));
319 ELM_GET_CNT(ELM_RD, ELM_TYPE_LATENCY, 0, &(data->r_latency));
320#endif
321
322}
323
324kal_uint32 debug_emi_elm_runtime_counter = 0;
325kal_uint32 debug_MDMCU_elm_last_INT_FRC = 0;
326kal_uint32 debug_MDIFRA_elm_last_INT_FRC = 0;
327
328
329#define ID0_AVG_LAT_INT (1<<0)
330#define ID0_TOT_LAT_INT (1<<1)
331#define ID1_AVG_LAT_INT (1<<2)
332#define ID1_TOT_LAT_INT (1<<3)
333
334#define E_MAX16(x) ((x>0xFFFF)? 0xFFFF : x)
335
336//#define MD2SPM_DVFS_CON (volatile kal_uint32 *)(0xF013000 + 0xC00)
337
338kal_uint32 elm_md_dvfs_con = 0;
339kal_uint32 elm_ap_vcore_dvfs_current = 0;
340kal_uint32 elm_ap_vcore_dvfs_last = 0;
341kal_uint32 elm_ap_vcore_dvfs_history[AP_VCORE_DVFS_HISTORY_SIZE] = {0};
342
343void elmtop_emi_isr_handler()
344{
345 // TODO: ELM mutex need here
346
347 kal_uint32 curr_frc = 0;
348 kal_uint32 int_status = 0;
349 kal_uint32 int_Result = 0; //Indicate this irq is caused by whether read(KAL_TRUE) or write(KAL_FALSE)
350 kal_uint32 read_worst_latency_count = 0;
351 kal_uint32 write_worst_latency_count = 0;
352 kal_uint32 read_trans_count = 0;
353 kal_uint32 write_trans_count = 0;
354 kal_uint32 read_worst_latency_ns = 0;
355 kal_uint32 write_worst_latency_ns = 0;
356 kal_uint32 read_total_count = 0;
357 kal_uint32 write_total_count = 0;
358 kal_uint32 ia_13m_tick = 0, txzq_13m_tick = 0, dvfs_13m_tick = 0;
359 debug_emi_elm_runtime_counter++;
360
361
362
363
364 //Mask cirq ELM interrupt
365 MDCIRQ_IRQMask(IRQ_ELMTOP_EMI_IRQ_CODE);
366
367 //DRV_WriteReg32_NPW(REG_MCUSYS_EMI_ELM_ELM_EN_REG, 0); //stop ELM
368 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS0_CFG0, ELM_DISABLE);
369
370 curr_frc = ust_get_current_time();
371 ia_13m_tick = SleepDrv_GetWallClk();
372 txzq_13m_tick = DRV_Reg32(AP_TXZQ_OCCUR_TICK);
373 dvfs_13m_tick = DRV_Reg32(AP_DVFS_OCCUR_TICK);
374
375 //SET_ELM_RW_LAT_FLAG(REG_MCUSYS_EMI_ELM_ELM_INT_STATUS, &lat_flag, &r_flag);
376 int_status = DRV_Reg32(REG_MCUSYS_EMI_ELM_INT_STATUS); //clear ELM interrupt
377
378 read_worst_latency_count = DRV_Reg32(REG_MCUSYS_EMI_ELM_ID0_WORST_AVG_LAT);
379 write_worst_latency_count = DRV_Reg32(REG_MCUSYS_EMI_ELM_ID1_WORST_AVG_LAT);
380 read_worst_latency_ns = ELM_TRANS2NS(read_worst_latency_count);
381 write_worst_latency_ns = ELM_TRANS2NS(write_worst_latency_count);
382
383 read_trans_count = DRV_Reg32(REG_MCUSYS_EMI_ELM_ID0_TRANS_IN_WORST_AVG);
384 write_trans_count = DRV_Reg32(REG_MCUSYS_EMI_ELM_ID1_TRANS_IN_WORST_AVG);
385 read_total_count = DRV_Reg32(REG_MCUSYS_EMI_ELM_ID0_WORST_TOT_LAT);
386 write_total_count = DRV_Reg32(REG_MCUSYS_EMI_ELM_ID1_WORST_TOT_LAT);
387
388
389 emi_elm_runtime_lat_history[emi_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].cur_frc = curr_frc;
390 emi_elm_runtime_lat_history[emi_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].int_status= int_status;
391 emi_elm_runtime_lat_history[emi_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].r_alat = read_worst_latency_ns;
392 emi_elm_runtime_lat_history[emi_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].w_alat = write_worst_latency_ns;//write_worst_latency_count;
393 emi_elm_runtime_lat_history[emi_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].r_trans = read_trans_count;
394 emi_elm_runtime_lat_history[emi_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].w_trans = write_trans_count;
395 emi_elm_runtime_lat_history[emi_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].r_l2_tot_lat = read_total_count;
396 emi_elm_runtime_lat_history[emi_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].w_l2_tot_lat = write_total_count;
397 emi_elm_runtime_lat_history[emi_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].ap_dvfs_tick = dvfs_13m_tick;
398 emi_elm_runtime_lat_history[emi_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].txzq_dvfs_tick = txzq_13m_tick;
399 emi_elm_runtime_lat_history[emi_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].md_tick = ia_13m_tick;
400 emi_elm_runtime_lat_history_idx++;
401
402 if(int_status & (ID0_AVG_LAT_INT|ID0_TOT_LAT_INT))
403 {
404 int_Result= ID0_AVG_LAT_INT; //read latency over criteria
405 }
406 else
407 {
408 int_Result= ID1_AVG_LAT_INT; //write latency over criteria
409 }
410
411 //Clear ELM interrupt after read irq type
412 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_INT_STATUS, 0x0F); //clear ELM interrupt
413 elm_md_dvfs_con = *MD2SPM_DVFS_CON;
414 elm_ap_vcore_dvfs_current = *AP_VCORE_DVFS_CURRENT;
415 elm_ap_vcore_dvfs_last = *AP_VCORE_DVFS_LAST;
416
417
418 // 1000us(Ibit off maximum) + 200us (IRQ priority prempt) + 200us(detect window) = 1400us
419 if(ust_us_duration(txzq_13m_tick, ia_13m_tick) < 18200) //1400us * 13 = 18200 system tick
420 {
421 //debug_MDMCU_elm_last_INT_FRC = 0;
422 ELM_IF_DEF_TRACE(MD_TRC_EMI_TXZQ_WARN(curr_frc, ia_13m_tick, txzq_13m_tick),);
423 }
424 else if(ust_us_duration(dvfs_13m_tick, ia_13m_tick) < 18200) //1400us * 13 = 18200 system tick
425 {
426 //debug_MDMCU_elm_last_INT_FRC = 0;
427 ELM_IF_DEF_TRACE(MD_TRC_EMI_AP_DVFS_WARN(curr_frc, ia_13m_tick, dvfs_13m_tick),);
428 }
429 else
430 {
431 ELM_IF_DEF_TRACE(MD_TRC_EMI_TXZQ_WARN(curr_frc, ia_13m_tick, txzq_13m_tick),);
432 ELM_IF_DEF_TRACE(MD_TRC_EMI_AP_DVFS_WARN(curr_frc, ia_13m_tick, dvfs_13m_tick),);
433 }
434
435
436 switch(EMI_ELM_lat_irq_exception_type)
437 {
438 case ELM_NONE:
439 {
440
441#ifdef __ELM_TRACE__
442
443 if(int_status & (ID0_AVG_LAT_INT|ID0_TOT_LAT_INT))
444 {
445 //US_CNT %l us, R_ave_lat %l ns, R_Threhsold %l ns, R_Latency %l T, R_tran %l, MD_DVFS_CON %xl, AP_VCORE_DVFS %xl"
446 MD_TRC_EMI_ELM_R_LAT_WARN(curr_frc, read_worst_latency_ns, elm_read_lat_threshold, read_total_count, read_trans_count, elm_md_dvfs_con, elm_ap_vcore_dvfs_current, elm_ap_vcore_dvfs_last);
447 }
448 else
449 {
450 //warn EMI_ELM_R_LAT_WARN ELM_Basic_Info_H "[WARN][ELM][MDMCU][EMI][M3][Read Latency Violation] US_CNT %l us, R_ave_lat %l ns, R_Threhsold %l ns, R_Latency %l T, R_tran %l, MD_DVFS_CON %xl, AP_VCORE_DVFS %xl"
451 MD_TRC_EMI_ELM_W_LAT_WARN(curr_frc, write_worst_latency_ns, elm_write_lat_threshold, write_total_count, write_trans_count, elm_md_dvfs_con, elm_ap_vcore_dvfs_current, elm_ap_vcore_dvfs_last);
452 }
453#endif
454 break;
455 }
456
457 case ELM_ASSERT:
458 {
459 if(int_Result == ID0_AVG_LAT_INT) //read latency over criteria
460 {
461 EXT_ASSERT(0,(E_MAX16(elm_read_lat_threshold)<<16)|(E_MAX16(read_worst_latency_ns)), \
462 (E_MAX16(read_trans_count)<<16)|(E_MAX16(read_total_count)), \
463 (E_MAX16(*MD2SPM_DVFS_CON)<<16)|(E_MAX16(int_status)));
464 }
465 else //write latency over criteria
466 {
467 EXT_ASSERT(0,(E_MAX16(elm_write_lat_threshold)<<16)|(E_MAX16(write_worst_latency_ns)), \
468 (E_MAX16(write_trans_count)<<16)|(E_MAX16(write_total_count)), \
469 (E_MAX16(*MD2SPM_DVFS_CON)<<16)|(E_MAX16(int_status)));
470 }
471 break;
472 }
473 case ELM_ASSERT_AT_2nd:
474 {
475 // just show trace on first time over criteria in 300us
476 if(debug_MDMCU_elm_last_INT_FRC == 0)
477 {
478 debug_MDMCU_elm_last_INT_FRC = curr_frc;
479 #ifdef __ELM_TRACE__
480 if(int_status & (ID0_AVG_LAT_INT|ID0_TOT_LAT_INT))
481 {
482 //US_CNT %l us, R_ave_lat %l ns, R_Threhsold %l ns, R_Latency %l T, R_tran %l, MD_DVFS_CON %xl, AP_VCORE_DVFS %xl"
483 MD_TRC_EMI_ELM_R_LAT_WARN(curr_frc, read_worst_latency_ns, elm_read_lat_threshold, read_total_count, read_trans_count, elm_md_dvfs_con, elm_ap_vcore_dvfs_current, elm_ap_vcore_dvfs_last);
484 }
485 else
486 {
487 //warn EMI_ELM_R_LAT_WARN ELM_Basic_Info_H "[WARN][ELM][MDMCU][EMI][M3][Read Latency Violation] US_CNT %l us, R_ave_lat %l ns, R_Threhsold %l ns, R_Latency %l T, R_tran %l, MD_DVFS_CON %xl, AP_VCORE_DVFS %xl"
488 MD_TRC_EMI_ELM_W_LAT_WARN(curr_frc, write_worst_latency_ns, elm_write_lat_threshold, write_total_count, write_trans_count, elm_md_dvfs_con, elm_ap_vcore_dvfs_current, elm_ap_vcore_dvfs_last);
489 }
490 #endif
491 }
492 else
493 {
494 if(ust_us_duration(debug_MDMCU_elm_last_INT_FRC, curr_frc) < 300)
495 {
496 kal_uint32 i;
497 for(i=0;i<AP_VCORE_DVFS_HISTORY_SIZE;i++)
498 {
499 elm_ap_vcore_dvfs_history[i] = *(AP_VCORE_DVFS_HISTORY_BASE + i);
500 }
501
502 if(int_Result == ID0_AVG_LAT_INT) //read latency over criteria
503 {
504 EXT_ASSERT(0,(E_MAX16(elm_read_lat_threshold)<<16)|(E_MAX16(read_worst_latency_ns)), \
505 (E_MAX16(read_trans_count)<<16)|(E_MAX16(read_total_count)), \
506 (E_MAX16(*MD2SPM_DVFS_CON)<<16)|(E_MAX16(int_status)));
507 }
508 else //write latency over criteria
509 {
510 EXT_ASSERT(0,(E_MAX16(elm_write_lat_threshold)<<16)|(E_MAX16(write_worst_latency_ns)), \
511 (E_MAX16(write_trans_count)<<16)|(E_MAX16(write_total_count)), \
512 (E_MAX16(*MD2SPM_DVFS_CON)<<16)|(E_MAX16(int_status)));
513 }
514 }
515 else
516 {
517 debug_MDMCU_elm_last_INT_FRC = curr_frc;
518 #ifdef __ELM_TRACE__
519 if(int_status & (ID0_AVG_LAT_INT|ID0_TOT_LAT_INT))
520 {
521 //US_CNT %l us, R_ave_lat %l ns, R_Threhsold %l ns, R_Latency %l T, R_tran %l, MD_DVFS_CON %xl, AP_VCORE_DVFS %xl"
522 MD_TRC_EMI_ELM_R_LAT_WARN(curr_frc, read_worst_latency_ns, elm_read_lat_threshold, read_total_count, read_trans_count, elm_md_dvfs_con, elm_ap_vcore_dvfs_current, elm_ap_vcore_dvfs_last);
523 }
524 else
525 {
526 //warn EMI_ELM_R_LAT_WARN ELM_Basic_Info_H "[WARN][ELM][MDMCU][EMI][M3][Read Latency Violation] US_CNT %l us, R_ave_lat %l ns, R_Threhsold %l ns, R_Latency %l T, R_tran %l, MD_DVFS_CON %xl, AP_VCORE_DVFS %xl"
527 MD_TRC_EMI_ELM_W_LAT_WARN(curr_frc, write_worst_latency_ns, elm_write_lat_threshold, write_total_count, write_trans_count, elm_md_dvfs_con, elm_ap_vcore_dvfs_current, elm_ap_vcore_dvfs_last);
528 }
529 #endif
530 }
531 }
532 break;
533 }
534 default:
535 break;
536 }
537
538
539 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS0_CFG0, ELM_ENABLE|ELM_ACCURACY(ELM_unit_100us)| \
540 LAT_TH_ID1(ELM_NS2TRAN(elm_write_lat_threshold))|LAT_TH_ID0(ELM_NS2TRAN(elm_read_lat_threshold))| \
541 DECODE_ID0(elm_id0_rw|elm_id0_master|elm_id0_prio)); //ELM enable for MDMCU Reset
542
543 MDCIRQ_IRQUnmask(IRQ_ELMTOP_EMI_IRQ_CODE);
544
545}
546
547void elm_dma_isr_handler()
548{
549
550 // TODO: ELM mutex need here
551
552 kal_uint32 curr_frc = 0;
553 kal_uint32 int_status = 0;
554 kal_uint32 read_worst_latency_count = 0;
555 kal_uint32 write_worst_latency_count = 0;
556 kal_uint32 read_trans_count = 0;
557 kal_uint32 write_trans_count = 0;
558 kal_uint32 read_worst_latency_ns = 0;
559 kal_uint32 write_worst_latency_ns = 0;
560 kal_uint32 read_total_count = 0;
561 kal_uint32 write_total_count = 0;
562
563
564
565
566
567 //Mask cirq ELM interrupt
568 MDCIRQ_IRQMask(IRQ_ELM_DMA_IRQ_CODE);
569
570 //DRV_WriteReg32_NPW(REG_MCUSYS_EMI_ELM_ELM_EN_REG, 0); //stop ELM
571 DRV_WriteReg32_NPW(REG_MDINFRA_ELM_AO_STATUS0_CFG0, ELM_DISABLE);
572
573 curr_frc = ust_get_current_time();
574
575 //SET_ELM_RW_LAT_FLAG(REG_MCUSYS_EMI_ELM_ELM_INT_STATUS, &lat_flag, &r_flag);
576 int_status = DRV_Reg32(REG_MDINFRA_EMI_ELM_INT_STATUS); //clear ELM interrupt
577
578 read_worst_latency_count = DRV_Reg32(REG_MDINFRA_EMI_ELM_ID0_WORST_AVG_LAT);
579 write_worst_latency_count = DRV_Reg32(REG_MDINFRA_EMI_ELM_ID1_WORST_AVG_LAT);
580 read_worst_latency_ns = ELM_MDIFRA_TRANS2NS(read_worst_latency_count);
581 write_worst_latency_ns = ELM_MDIFRA_TRANS2NS(write_worst_latency_count);
582
583 read_trans_count = DRV_Reg32(REG_MDINFRA_EMI_ELM_ID0_TRANS_IN_WORST_AVG);
584 write_trans_count = DRV_Reg32(REG_MDINFRA_EMI_ELM_ID1_TRANS_IN_WORST_AVG);
585 read_total_count = DRV_Reg32(REG_MDINFRA_EMI_ELM_ID0_WORST_TOT_LAT);
586 write_total_count = DRV_Reg32(REG_MDINFRA_EMI_ELM_ID1_WORST_TOT_LAT);
587
588
589 dma_elm_runtime_lat_history[dma_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].cur_frc = curr_frc;
590 dma_elm_runtime_lat_history[dma_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].int_status= int_status;
591 dma_elm_runtime_lat_history[dma_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].r_alat = read_worst_latency_ns;
592 dma_elm_runtime_lat_history[dma_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].w_alat = write_worst_latency_ns;//write_worst_latency_count;
593 dma_elm_runtime_lat_history[dma_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].r_trans = read_trans_count;
594 dma_elm_runtime_lat_history[dma_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].w_trans = write_trans_count;
595 dma_elm_runtime_lat_history[dma_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].r_l2_tot_lat = read_total_count;
596 dma_elm_runtime_lat_history[dma_elm_runtime_lat_history_idx%ELM_RUNTIME_HISTORY_SIZE].w_l2_tot_lat = write_total_count;
597 dma_elm_runtime_lat_history_idx++;
598
599 //Clear ELM interrupt after read irq type
600 DRV_WriteReg32(REG_MDINFRA_EMI_ELM_INT_STATUS, 0x0F); //clear ELM interrupt
601
602 switch(L1_DMA_irq_exception_type)
603 {
604 case ELM_NONE:
605 {
606#ifdef __ELM_TRACE__
607 if(int_status & (ID0_AVG_LAT_INT|ID0_TOT_LAT_INT))
608 {
609 //US_CNT %l us, R_ave_lat %l ns, R_Threhsold %l ns, R_Latency %l T, R_tran %l"
610 MD_TRC_DMA_ELM_R_LAT_WARN(curr_frc, read_worst_latency_ns, elm_infra_read_lat_threshold, read_total_count, read_trans_count);
611 }
612 else
613 {
614 //US_CNT %l us, R_ave_lat %l ns, R_Threhsold %l ns, R_Latency %l T, R_tran %l"
615 MD_TRC_DMA_ELM_W_LAT_WARN(curr_frc, write_worst_latency_ns, elm_infra_write_lat_threshold, write_total_count, write_trans_count);
616 }
617#endif
618 break;
619 }
620
621 default:
622 break;
623 }
624
625
626 DRV_WriteReg32_NPW(REG_MDINFRA_ELM_AO_STATUS0_CFG0, ELM_ENABLE|ELM_ACCURACY(ELM_unit_1000us)| \
627 LAT_TH_ID1(ELM_MDIFRA_NS2TRAN(elm_infra_write_lat_threshold))|LAT_TH_ID0(ELM_MDIFRA_NS2TRAN(elm_infra_read_lat_threshold))| \
628 DECODE_ID0(elm_id0_rw|elm_id0_prio)); //ELM enable for MDMCU Reset
629
630 MDCIRQ_IRQUnmask(IRQ_ELM_DMA_IRQ_CODE);
631
632}
633
634void ELM_MCU_threshold_change(kal_uint32 read_avg_lat_ns, kal_uint32 write_avg_lat_ns, kal_uint32 dur_us)
635{
636 kal_uint32 mask_state=0;
637
638 if(elm_dynamic_lat_threshold_disable)
639 {
640 return;
641 }
642
643 if((read_avg_lat_ns<200) || (write_avg_lat_ns<200) || (dur_us<200))
644 {
645 kal_uint32 lr = 0;
646 kal_uint32 sub_error_code = 0;
647 GET_RETURN_ADDRESS(lr);
648 if(read_avg_lat_ns<200)
649 {
650 sub_error_code = 1;
651 }
652 else if(write_avg_lat_ns<200)
653 {
654 sub_error_code = 2;
655 }
656 else
657 {
658 sub_error_code = 3;
659 }
660 EXT_ASSERT(0, lr, KAL_ERROR_EMI_ELM_CHANGE_THRESHOLD, sub_error_code);
661 }
662
663
664
665 mask_state = IRQMask_Status(IRQ_ELMTOP_EMI_IRQ_CODE);
666
667 //Mask cirq ELM interrupt
668 MDCIRQ_IRQMask(IRQ_ELMTOP_EMI_IRQ_CODE);
669
670 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS0_CFG0, ELM_DISABLE); //disable ELM
671
672 kal_hrt_take_itc_lock(KAL_ITC_ELM_LOCK, KAL_INFINITE_WAIT);
673
674
675 elm_read_lat_threshold = read_avg_lat_ns;
676 elm_write_lat_threshold = write_avg_lat_ns;
677 elm_lat_duration = dur_us;
678
679 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_INT_STATUS, 0x0F); //clear ELM interrupt
680 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS0_CFG0, ELM_ENABLE|ELM_ACCURACY(ELM_unit_100us)| \
681 LAT_TH_ID1(ELM_NS2TRAN(elm_write_lat_threshold))|LAT_TH_ID0(ELM_NS2TRAN(elm_read_lat_threshold))| \
682 DECODE_ID0(elm_id0_rw|elm_id0_master|elm_id0_prio)); //ELM enable for MDMCU Reset
683
684 kal_hrt_give_itc_lock(KAL_ITC_ELM_LOCK);
685
686#ifdef __ELM_TRACE__
687 {
688 // L1 trace
689 kal_uint32 curr_frc = 0;
690 curr_frc = ust_get_current_time();
691 MD_TRC_EMI_ELM_SET_R_TH(curr_frc, elm_read_lat_threshold);
692 MD_TRC_EMI_ELM_SET_W_TH(curr_frc, elm_write_lat_threshold);
693 }
694#endif
695
696 if(!mask_state)
697 {
698 MDCIRQ_IRQUnmask(IRQ_ELMTOP_EMI_IRQ_CODE);
699 }
700
701}
702
703void _ELM_exception_saved(void)
704{
705#if 0//def __ELM_RUNTIME_PROFILE__
706/* under construction !*/
707/* under construction !*/
708/* under construction !*/
709/* under construction !*/
710/* under construction !*/
711/* under construction !*/
712/* under construction !*/
713/* under construction !*/
714/* under construction !*/
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#endif
729}
730
731kal_uint32 g_elm_read_worst_latency_count;
732kal_uint32 g_elm_write_worst_latency_count;
733kal_uint32 g_elm_read_worst_latency_ns;
734kal_uint32 g_elm_write_worst_latency_ns;
735
736kal_uint8 _ELM_latency_status(void)
737{
738#if 1//def __ELM_RUNTIME_PROFILE__
739
740 //if emi_elm_runtime_lat_history_idx == 0, means that it didn't enter ELM isr handler once, it will all be zero
741 if(emi_elm_runtime_lat_history_idx != 0)
742 {
743 kal_uint32 int_status = 0;
744 int_status = emi_elm_runtime_lat_history[(emi_elm_runtime_lat_history_idx-1)%ELM_RUNTIME_HISTORY_SIZE].int_status;
745
746 if(int_status & (ID0_AVG_LAT_INT|ID0_TOT_LAT_INT))
747 {
748 return 0xAE; //EMI read latency may be too long
749 }
750 else
751 {
752 return 0xBE; //EMI write latency may be too long
753 }
754 }
755 return 0xDE; // EMI read/write latency are OK.
756#else
757/* under construction !*/
758#endif
759}
760
761/******************************************************************************
762* Function : void Set_EMI_ELM_ExceptionType(kal_bool lat_flag, kal_uint8 exception_type)
763* Description : this function is called when set EMI ELM Read/Write Latency/WordCount Exception Type
764* Parameter : kal_uint8 exception_type: 0,1,2
765* Return : void
766******************************************************************************/
767kal_bool Set_EMI_ELM_ExceptionType(kal_uint8 exception_type)
768{
769 switch (exception_type)
770 {
771 case ELM_NONE:
772 {
773 EMI_ELM_lat_irq_exception_type = ELM_NONE;
774 break;
775 }
776
777 case ELM_ASSERT:
778 {
779 EMI_ELM_lat_irq_exception_type = ELM_ASSERT;
780 break;
781 }
782 case ELM_ASSERT_AT_2nd:
783 {
784 EMI_ELM_lat_irq_exception_type = ELM_ASSERT_AT_2nd;
785 break;
786 }
787 default:
788 return KAL_FALSE;
789 break;
790 }
791 return KAL_TRUE;
792}
793
794kal_bool Set_EMI_ELM_Threshold(kal_uint8 info, kal_uint32 threshold)
795{
796 ELM_IF_DEF_TRACE(kal_uint32 curr_frc = 0,);
797 ELM_IF_DEF_TRACE(curr_frc = ust_get_current_time(),);
798 elm_dynamic_lat_threshold_disable = 1; //disable dynamic latency threshold
799 if((info&0xF0))
800 { // infra
801 //Disable before re-configure
802 DRV_WriteReg32_NPW(REG_MDINFRA_ELM_AO_STATUS0_CFG0, ELM_DISABLE);
803 if( info & 0x01 )
804 {
805 elm_infra_read_lat_threshold = threshold;
806 ELM_IF_DEF_TRACE(MD_TRC_DMA_ELM_SET_R_TH(curr_frc, threshold),);
807 }
808 else
809 {
810 elm_infra_write_lat_threshold = threshold;
811 ELM_IF_DEF_TRACE(MD_TRC_DMA_ELM_SET_W_TH(curr_frc, threshold),);
812 }
813 DRV_WriteReg32_NPW(REG_MDINFRA_ELM_AO_STATUS0_CFG0, ELM_ENABLE|ELM_ACCURACY(ELM_unit_1000us)| \
814 LAT_TH_ID1(ELM_MDIFRA_NS2TRAN(elm_infra_write_lat_threshold))|LAT_TH_ID0(ELM_MDIFRA_NS2TRAN(elm_infra_read_lat_threshold))| \
815 DECODE_ID0(elm_id0_rw|elm_id0_prio));
816 }
817 else
818 { //mdmcu
819
820 //Disable before re-configure
821 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS0_CFG0, ELM_DISABLE);
822 if( info & 0x01 )
823 {
824 elm_read_lat_threshold = threshold;
825 ELM_IF_DEF_TRACE(MD_TRC_EMI_ELM_SET_R_TH(curr_frc, threshold),);
826 }
827 else
828 {
829 elm_write_lat_threshold = threshold;
830 ELM_IF_DEF_TRACE(MD_TRC_EMI_ELM_SET_W_TH(curr_frc, threshold),);
831 }
832 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS0_CFG0, ELM_ENABLE|ELM_ACCURACY(ELM_unit_100us)| \
833 LAT_TH_ID1(ELM_NS2TRAN(elm_write_lat_threshold))|LAT_TH_ID0(ELM_NS2TRAN(elm_read_lat_threshold))| \
834 DECODE_ID0(elm_id0_rw|elm_id0_master|elm_id0_prio));
835 }
836
837
838 return KAL_TRUE;
839}
840
841kal_bool Set_EMI_ELM_Config(kal_uint8 id, kal_uint8 m_sel, kal_uint8 rw)
842{
843 kal_bool rtn = KAL_TRUE;
844
845 //Disable before re-configure
846 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS0_CFG0, ELM_DISABLE);
847 elm_dynamic_lat_threshold_disable = 1; //disable dynamic latency threshold
848
849 if( id == 1 ) // id 1 (default write)
850 {
851 if(m_sel==0)
852 {
853 elm_id1_master = ELM_ALL_MASTER;
854 }
855 else if(m_sel==1)
856 {
857 elm_id1_master = ELM_MDMCU_ONLY;
858 }
859 else if(m_sel==2)
860 {
861 elm_id1_master = ELM_USIP_ONLY;
862 }
863 else
864 {
865 rtn = KAL_FALSE;
866 }
867
868 if(rw == 0)
869 {
870 elm_id1_rw = ELM_READ;
871 }
872 else if(rw == 1)
873 {
874 elm_id1_rw = ELM_WRITE;
875 }
876 else
877 {
878 rtn = KAL_FALSE;
879 }
880 }
881 else if(id == 0)// id 0
882 {
883 if(m_sel==0)
884 {
885 elm_id0_master = ELM_ALL_MASTER;
886 }
887 else if(m_sel==1)
888 {
889 elm_id0_master = ELM_MDMCU_ONLY;
890 }
891 else if(m_sel==2)
892 {
893 elm_id0_master = ELM_USIP_ONLY;
894 }
895 else
896 {
897 rtn = KAL_FALSE;
898 }
899
900 if(rw == 0)
901 {
902 elm_id0_rw = ELM_READ;
903 }
904 else if(rw == 1)
905 {
906 elm_id0_rw = ELM_WRITE;
907 }
908 else
909 {
910 rtn = KAL_FALSE;
911 }
912
913 }
914 else if(id == 2)// ID 0/1 are the same
915 {
916 if(m_sel==0)
917 {
918 elm_id0_master = ELM_ALL_MASTER;
919 elm_id1_master = ELM_ALL_MASTER;
920 }
921 else if(m_sel==1)
922 {
923 elm_id0_master = ELM_MDMCU_ONLY;
924 elm_id1_master = ELM_MDMCU_ONLY;
925 }
926 else if(m_sel==2)
927 {
928 elm_id0_master = ELM_USIP_ONLY;
929 elm_id1_master = ELM_USIP_ONLY;
930 }
931 else
932 {
933 rtn = KAL_FALSE;
934 }
935 }
936 else
937 {
938 rtn = KAL_FALSE;
939 }
940 DRV_WriteReg32(REG_MDMCU_ELM_AO_STATUS0_CFG1, ELM_EMI_TOP_BLOCK(0xff)|DECODE_ID1(elm_id1_rw|elm_id1_master|elm_id1_prio)| \
941 ELM_DURATION(ELM_200US)|EMI_BLOCK(E_NOT_MASK)|ELM_INT_MASK(0));
942
943 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS0_CFG0, ELM_ENABLE|ELM_ACCURACY(ELM_unit_100us)| \
944 LAT_TH_ID1(ELM_NS2TRAN(elm_write_lat_threshold))|LAT_TH_ID0(ELM_NS2TRAN(elm_read_lat_threshold))| \
945 DECODE_ID0(elm_id0_rw|elm_id0_master|elm_id0_prio)); //ELM enable for MDMCU Reset
946 return rtn;
947
948}
949
950kal_bool Set_EMI_ELM_Mode(kal_uint8 mode)
951{
952 kal_bool rtn = KAL_TRUE;
953 //Disable before re-configure
954 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS0_CFG0, ELM_DISABLE);
955 DRV_WriteReg32_NPW(REG_MDINFRA_ELM_AO_STATUS0_CFG0, ELM_DISABLE);
956 elm_dynamic_lat_threshold_disable = 1; //disable dynamic latency threshold
957
958 if( mode == 0)
959 {
960 elm_mode = ELM_MODE_0_LATENCY;
961 }
962 else if( mode == 1)
963 {
964 elm_mode = ELM_MODE_1_WORD_COUNT;
965 }
966 else if( mode == 2)
967 {
968 elm_mode = ELM_MODE_2_SPECIAL;
969 elm_ao_decode_cfg = ELM_DECODE_FROM_APB;
970 DRV_ClrReg32(REG_MCUSYS_EMI_ELM_CTRL_REG, (ELM_AO_DECODE(ELM_DECODE_FROM_AO))); // clear AO decode
971 DRV_SetReg32(REG_MCUSYS_EMI_ELM_CTRL_REG, (ELM_AO_DECODE(elm_ao_decode_cfg))); // set AO decode
972 DRV_ClrReg32(REG_MDINFRA_EMI_ELM_CTRL_REG, (ELM_AO_DECODE(ELM_DECODE_FROM_AO))); // clear AO decode
973 DRV_SetReg32(REG_MDINFRA_EMI_ELM_CTRL_REG, (ELM_AO_DECODE(elm_ao_decode_cfg))); // set AO decode
974 }
975 else
976 {
977 rtn = KAL_FALSE;
978 }
979 DRV_ClrReg32(REG_MCUSYS_EMI_ELM_CTRL_REG, (0x3<<4)); // clear ELM mode
980 DRV_SetReg32(REG_MCUSYS_EMI_ELM_CTRL_REG, ((elm_mode&0x3)<<4));//select ELM mode
981
982 DRV_WriteReg32(REG_MDMCU_ELM_AO_STATUS0_CFG1, ELM_EMI_TOP_BLOCK(0xff)|DECODE_ID1(elm_id1_rw|elm_id1_master|elm_id1_prio)| \
983 ELM_DURATION(ELM_200US)|EMI_BLOCK(E_NOT_MASK)|ELM_INT_MASK(0));
984
985 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS0_CFG0, ELM_ENABLE|ELM_ACCURACY(ELM_unit_100us)| \
986 LAT_TH_ID1(ELM_NS2TRAN(elm_write_lat_threshold))|LAT_TH_ID0(ELM_NS2TRAN(elm_read_lat_threshold))| \
987 DECODE_ID0(elm_id0_rw|elm_id0_master|elm_id0_prio)); //ELM enable for MDMCU Reset
988
989
990 DRV_ClrReg32(REG_MDINFRA_EMI_ELM_CTRL_REG, (0x3<<4)); // clear ELM mode
991 DRV_SetReg32(REG_MDINFRA_EMI_ELM_CTRL_REG, ((elm_mode&0x3)<<4));//select ELM mode
992
993 DRV_WriteReg32(REG_MDINFRA_ELM_AO_STATUS0_CFG1, ELM_EMI_TOP_BLOCK(0xff)|DECODE_ID1(elm_id1_rw|elm_id1_prio)| \
994 ELM_DURATION(ELM_1000US)|EMI_BLOCK(E_NOT_MASK)|ELM_INT_MASK(0));
995
996 DRV_WriteReg32_NPW(REG_MDINFRA_ELM_AO_STATUS0_CFG0, ELM_ENABLE|ELM_ACCURACY(ELM_unit_1000us)| \
997 LAT_TH_ID1(ELM_MDIFRA_NS2TRAN(elm_infra_write_lat_threshold))|LAT_TH_ID0(ELM_MDIFRA_NS2TRAN(elm_infra_read_lat_threshold))| \
998 DECODE_ID0(elm_id0_rw|elm_id0_prio)); //ELM enable for MDMCU Reset
999 return rtn;
1000}
1001
1002
1003
1004kal_bool Set_EMI_ELM_uSIP_Core(kal_uint8 id, kal_uint8 vpe_sel, kal_uint8 port_sel)
1005{
1006 kal_bool rtn = KAL_TRUE;
1007
1008 //Disable before re-configure
1009 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS0_CFG0, ELM_DISABLE);
1010 elm_dynamic_lat_threshold_disable = 1; //disable dynamic latency threshold
1011
1012 elm_ao_id0_value = 0;
1013 elm_ao_id0_mask = ELM_AO_CONTROL_DEFAULT;
1014 elm_ao_id1_value = 0;
1015 elm_ao_id1_mask = ELM_AO_CONTROL_DEFAULT;
1016
1017 if( id == 1 ) // id 1 (default write)
1018 {
1019 if (port_sel==0)
1020 {
1021 elm_ao_id1_mask &=~ (ELM_USIP_CORE_SEL(1)|ELM_MASTER_SEL(ELM_MASTER_IA_MASK)|ELM_USIP_PORT_SEL(ELM_USIP_PORT_DISABLE_MASK));
1022 }
1023 else
1024 {
1025 elm_ao_id1_mask &=~ (ELM_USIP_CORE_SEL(1)|ELM_MASTER_SEL(ELM_MASTER_IA_MASK)|ELM_USIP_PORT_SEL(ELM_USIP_PORT_ENABLE_MASK));
1026 }
1027
1028 if(vpe_sel==0)
1029 {
1030 if (port_sel == 0)
1031 {
1032 elm_ao_id1_value = ELM_USIP_CORE_SEL(0)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_ALL);
1033 }
1034 else if (port_sel == 1)
1035 {
1036 elm_ao_id1_value = ELM_USIP_CORE_SEL(0)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_ICACHE);
1037 }
1038 else if (port_sel == 2)
1039 {
1040 elm_ao_id1_value = ELM_USIP_CORE_SEL(0)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_DCACHE);
1041 }
1042 else if (port_sel == 3)
1043 {
1044 elm_ao_id1_value = ELM_USIP_CORE_SEL(0)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_DNOCACHE);
1045 }
1046 else
1047 {
1048 rtn = KAL_FALSE;
1049 elm_ao_id1_mask = ELM_AO_CONTROL_DEFAULT;
1050 }
1051 }
1052 else if(vpe_sel==1)
1053 {
1054 if (port_sel == 0)
1055 {
1056 elm_ao_id1_value = ELM_USIP_CORE_SEL(1)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_ALL);
1057 }
1058 else if (port_sel == 1)
1059 {
1060 elm_ao_id1_value = ELM_USIP_CORE_SEL(1)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_ICACHE);
1061 }
1062 else if (port_sel == 2)
1063 {
1064 elm_ao_id1_value = ELM_USIP_CORE_SEL(1)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_DCACHE);
1065 }
1066 else if (port_sel == 3)
1067 {
1068 elm_ao_id1_value = ELM_USIP_CORE_SEL(1)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_DNOCACHE);
1069 }
1070 else
1071 {
1072 rtn = KAL_FALSE;
1073 elm_ao_id1_mask = ELM_AO_CONTROL_DEFAULT;
1074 }
1075 }
1076 else
1077 {
1078 rtn = KAL_FALSE;
1079 elm_ao_id1_mask = ELM_AO_CONTROL_DEFAULT;
1080 }
1081 }
1082 else if(id == 0)// id 0
1083 {
1084 if (port_sel==0)
1085 {
1086 elm_ao_id0_mask &=~ (ELM_USIP_CORE_SEL(1)|ELM_MASTER_SEL(ELM_MASTER_IA_MASK)|ELM_USIP_PORT_SEL(ELM_USIP_PORT_DISABLE_MASK));
1087 }
1088 else
1089 {
1090 elm_ao_id0_mask &=~ (ELM_USIP_CORE_SEL(1)|ELM_MASTER_SEL(ELM_MASTER_IA_MASK)|ELM_USIP_PORT_SEL(ELM_USIP_PORT_ENABLE_MASK));
1091 }
1092
1093 if(vpe_sel==0)
1094 {
1095 if (port_sel == 0)
1096 {
1097 elm_ao_id0_value = ELM_USIP_CORE_SEL(0)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_ALL);
1098 }
1099 else if (port_sel == 1)
1100 {
1101 elm_ao_id0_value = ELM_USIP_CORE_SEL(0)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_ICACHE);
1102 }
1103 else if (port_sel == 2)
1104 {
1105 elm_ao_id0_value = ELM_USIP_CORE_SEL(0)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_DCACHE);
1106 }
1107 else if (port_sel == 3)
1108 {
1109 elm_ao_id0_value = ELM_USIP_CORE_SEL(0)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_DNOCACHE);
1110 }
1111 else
1112 {
1113 rtn = KAL_FALSE;
1114 elm_ao_id0_mask = ELM_AO_CONTROL_DEFAULT;
1115 }
1116 }
1117 else if(vpe_sel==1)
1118 {
1119 if (port_sel == 0)
1120 {
1121 elm_ao_id0_value = ELM_USIP_CORE_SEL(1)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_ALL);
1122 }
1123 else if (port_sel == 1)
1124 {
1125 elm_ao_id0_value = ELM_USIP_CORE_SEL(1)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_ICACHE);
1126 }
1127 else if (port_sel == 2)
1128 {
1129 elm_ao_id0_value = ELM_USIP_CORE_SEL(1)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_DCACHE);
1130 }
1131 else if (port_sel == 3)
1132 {
1133 elm_ao_id0_value = ELM_USIP_CORE_SEL(1)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_DNOCACHE);
1134 }
1135 else
1136 {
1137 rtn = KAL_FALSE;
1138 elm_ao_id0_mask = ELM_AO_CONTROL_DEFAULT;
1139 }
1140 }
1141 else
1142 {
1143 rtn = KAL_FALSE;
1144 elm_ao_id0_mask = ELM_AO_CONTROL_DEFAULT;
1145 }
1146 }
1147 else if(id == 2)// ID 0/1 are the same
1148 {
1149 if (port_sel==0)
1150 {
1151 elm_ao_id0_mask &=~ (ELM_USIP_CORE_SEL(1)|ELM_MASTER_SEL(ELM_MASTER_IA_MASK)|ELM_USIP_PORT_SEL(ELM_USIP_PORT_DISABLE_MASK));
1152 elm_ao_id1_mask &=~ (ELM_USIP_CORE_SEL(1)|ELM_MASTER_SEL(ELM_MASTER_IA_MASK)|ELM_USIP_PORT_SEL(ELM_USIP_PORT_DISABLE_MASK));
1153 }
1154 else
1155 {
1156 elm_ao_id0_mask &=~ (ELM_USIP_CORE_SEL(1)|ELM_MASTER_SEL(ELM_MASTER_IA_MASK)|ELM_USIP_PORT_SEL(ELM_USIP_PORT_ENABLE_MASK));
1157 elm_ao_id1_mask &=~ (ELM_USIP_CORE_SEL(1)|ELM_MASTER_SEL(ELM_MASTER_IA_MASK)|ELM_USIP_PORT_SEL(ELM_USIP_PORT_ENABLE_MASK));
1158 }
1159
1160 if(vpe_sel==0)
1161 {
1162 if (port_sel == 0)
1163 {
1164 elm_ao_id0_value = ELM_USIP_CORE_SEL(0)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_ALL);
1165 elm_ao_id1_value = ELM_USIP_CORE_SEL(0)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_ALL);
1166 }
1167 else if (port_sel == 1)
1168 {
1169 elm_ao_id0_value = ELM_USIP_CORE_SEL(0)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_ICACHE);
1170 elm_ao_id1_value = ELM_USIP_CORE_SEL(0)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_ICACHE);
1171 }
1172 else if (port_sel == 2)
1173 {
1174 elm_ao_id0_value = ELM_USIP_CORE_SEL(0)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_DCACHE);
1175 elm_ao_id1_value = ELM_USIP_CORE_SEL(0)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_DCACHE);
1176 }
1177 else if (port_sel == 3)
1178 {
1179 elm_ao_id0_value = ELM_USIP_CORE_SEL(0)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_DNOCACHE);
1180 elm_ao_id1_value = ELM_USIP_CORE_SEL(0)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_DNOCACHE);
1181 }
1182 else
1183 {
1184 rtn = KAL_FALSE;
1185 elm_ao_id0_mask = ELM_AO_CONTROL_DEFAULT;
1186 elm_ao_id1_mask = ELM_AO_CONTROL_DEFAULT;
1187 }
1188 }
1189 else if(vpe_sel==1)
1190 {
1191 if (port_sel == 0)
1192 {
1193 elm_ao_id0_value = ELM_USIP_CORE_SEL(1)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_ALL);
1194 elm_ao_id1_value = ELM_USIP_CORE_SEL(1)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_ALL);
1195 }
1196 else if (port_sel == 1)
1197 {
1198 elm_ao_id0_value = ELM_USIP_CORE_SEL(1)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_ICACHE);
1199 elm_ao_id1_value = ELM_USIP_CORE_SEL(1)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_ICACHE);
1200 }
1201 else if (port_sel == 2)
1202 {
1203 elm_ao_id0_value = ELM_USIP_CORE_SEL(1)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_DCACHE);
1204 elm_ao_id1_value = ELM_USIP_CORE_SEL(1)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_DCACHE);
1205 }
1206 else if (port_sel == 3)
1207 {
1208 elm_ao_id0_value = ELM_USIP_CORE_SEL(1)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_DNOCACHE);
1209 elm_ao_id1_value = ELM_USIP_CORE_SEL(1)|ELM_USIP_PORT_SEL(ELM_SEL_USIP_DNOCACHE);
1210 }
1211 else
1212 {
1213 rtn = KAL_FALSE;
1214 elm_ao_id0_mask = ELM_AO_CONTROL_DEFAULT;
1215 elm_ao_id1_mask = ELM_AO_CONTROL_DEFAULT;
1216 }
1217 }
1218 else
1219 {
1220 rtn = KAL_FALSE;
1221 elm_ao_id0_mask = ELM_AO_CONTROL_DEFAULT;
1222 elm_ao_id1_mask = ELM_AO_CONTROL_DEFAULT;
1223 }
1224 }
1225 else
1226 {
1227 rtn = KAL_FALSE;
1228 }
1229
1230 if(rtn == KAL_FALSE)
1231 {
1232 elm_ao_decode_cfg = ELM_DECODE_FROM_AO;
1233 }
1234 else
1235 {
1236 elm_ao_decode_cfg = ELM_DECODE_FROM_APB;
1237 }
1238
1239 DRV_ClrReg32(REG_MCUSYS_EMI_ELM_CTRL_REG, (ELM_AO_DECODE(ELM_DECODE_FROM_AO))); // clear AO decode
1240 DRV_SetReg32(REG_MCUSYS_EMI_ELM_CTRL_REG, (ELM_AO_DECODE(elm_ao_decode_cfg))); // set AO decode
1241
1242 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID0_CTRL_REG, elm_ao_id0_value);
1243 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID0_CTRL_MASK, elm_ao_id0_mask);
1244 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID1_CTRL_REG, elm_ao_id1_value);
1245 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID1_CTRL_MASK, elm_ao_id1_mask);
1246
1247 DRV_WriteReg32(REG_MDMCU_ELM_AO_STATUS0_CFG1, ELM_EMI_TOP_BLOCK(0xff)|DECODE_ID1(elm_id1_rw|elm_id1_master|elm_id1_prio)| \
1248 ELM_DURATION(ELM_200US)|EMI_BLOCK(E_NOT_MASK)|ELM_INT_MASK(0));
1249
1250 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS0_CFG0, ELM_ENABLE|ELM_ACCURACY(ELM_unit_100us)| \
1251 LAT_TH_ID1(ELM_NS2TRAN(elm_write_lat_threshold))|LAT_TH_ID0(ELM_NS2TRAN(elm_read_lat_threshold))| \
1252 DECODE_ID0(elm_id0_rw|elm_id0_master|elm_id0_prio)); //ELM enable for MDMCU Reset
1253 return rtn;
1254
1255}
1256
1257kal_bool Set_EMI_ELM_VPE(kal_uint8 id, kal_uint8 vpe_sel)
1258{
1259 kal_bool rtn = KAL_TRUE;
1260
1261 //Disable before re-configure
1262 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS0_CFG0, ELM_DISABLE);
1263 elm_dynamic_lat_threshold_disable = 1; //disable dynamic latency threshold
1264
1265 elm_ao_id0_value = 0;
1266 elm_ao_id0_mask = ELM_AO_CONTROL_DEFAULT;
1267 elm_ao_id1_value = 0;
1268 elm_ao_id1_mask = ELM_AO_CONTROL_DEFAULT;
1269
1270 if( id == 1 ) // id 1 (default write)
1271 {
1272 elm_ao_id1_mask &=~ (ELM_VPE_SEL(0X7)|ELM_MASTER_SEL(ELM_MASTER_IA_MASK));
1273 if(vpe_sel==0)
1274 {
1275 elm_ao_id1_value = ELM_VPE_SEL(ELM_SEL_VPE0);
1276 }
1277 else if(vpe_sel==1)
1278 {
1279 elm_ao_id1_value = ELM_VPE_SEL(ELM_SEL_VPE1);
1280 }
1281 else if(vpe_sel==2)
1282 {
1283 elm_ao_id1_value = ELM_VPE_SEL(ELM_SEL_VPE2);
1284 }
1285 else if(vpe_sel==3)
1286 {
1287 elm_ao_id1_value = ELM_VPE_SEL(ELM_SEL_VPE3);
1288 }
1289 else
1290 {
1291 rtn = KAL_FALSE;
1292 elm_ao_id1_mask = ELM_AO_CONTROL_DEFAULT;
1293 }
1294 }
1295 else if(id == 0)// id 0
1296 {
1297 elm_ao_id0_mask &=~ (ELM_VPE_SEL(0X7)|ELM_MASTER_SEL(ELM_MASTER_IA_MASK));
1298 if(vpe_sel==0)
1299 {
1300 elm_ao_id0_value = ELM_VPE_SEL(ELM_SEL_VPE0);
1301 }
1302 else if(vpe_sel==1)
1303 {
1304 elm_ao_id0_value = ELM_VPE_SEL(ELM_SEL_VPE1);
1305 }
1306 else if(vpe_sel==2)
1307 {
1308 elm_ao_id0_value = ELM_VPE_SEL(ELM_SEL_VPE2);
1309 }
1310 else if(vpe_sel==3)
1311 {
1312 elm_ao_id0_value = ELM_VPE_SEL(ELM_SEL_VPE3);
1313 }
1314 else
1315 {
1316 rtn = KAL_FALSE;
1317 elm_ao_id0_mask = ELM_AO_CONTROL_DEFAULT;
1318 }
1319
1320 }
1321 else if(id == 2)// ID 0/1 are the same
1322 {
1323 elm_ao_id0_mask &=~ (ELM_VPE_SEL(0x7)|ELM_MASTER_SEL(ELM_MASTER_IA_MASK));
1324 elm_ao_id1_mask &=~ (ELM_VPE_SEL(0x7)|ELM_MASTER_SEL(ELM_MASTER_IA_MASK));
1325 if(vpe_sel==0)
1326 {
1327 elm_ao_id0_value = ELM_VPE_SEL(ELM_SEL_VPE0);
1328 elm_ao_id1_value = ELM_VPE_SEL(ELM_SEL_VPE0);
1329 }
1330 else if(vpe_sel==1)
1331 {
1332 elm_ao_id0_value = ELM_VPE_SEL(ELM_SEL_VPE1);
1333 elm_ao_id1_value = ELM_VPE_SEL(ELM_SEL_VPE1);
1334 }
1335 else if(vpe_sel==2)
1336 {
1337 elm_ao_id0_value = ELM_VPE_SEL(ELM_SEL_VPE2);
1338 elm_ao_id1_value = ELM_VPE_SEL(ELM_SEL_VPE2);
1339 }
1340 else if(vpe_sel==3)
1341 {
1342 elm_ao_id0_value = ELM_VPE_SEL(ELM_SEL_VPE3);
1343 elm_ao_id1_value = ELM_VPE_SEL(ELM_SEL_VPE3);
1344 }
1345 else
1346 {
1347 rtn = KAL_FALSE;
1348 elm_ao_id0_mask = ELM_AO_CONTROL_DEFAULT;
1349 elm_ao_id1_mask = ELM_AO_CONTROL_DEFAULT;
1350 }
1351 }
1352 else
1353 {
1354 rtn = KAL_FALSE;
1355 }
1356
1357 if(rtn == KAL_FALSE)
1358 {
1359 elm_ao_decode_cfg = ELM_DECODE_FROM_AO;
1360 }
1361 else
1362 {
1363 elm_ao_decode_cfg = ELM_DECODE_FROM_APB;
1364 }
1365
1366 DRV_ClrReg32(REG_MCUSYS_EMI_ELM_CTRL_REG, (ELM_AO_DECODE(ELM_DECODE_FROM_AO))); // clear AO decode
1367 DRV_SetReg32(REG_MCUSYS_EMI_ELM_CTRL_REG, (ELM_AO_DECODE(elm_ao_decode_cfg))); // set AO decode
1368
1369 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID0_CTRL_REG, elm_ao_id0_value);
1370 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID0_CTRL_MASK, elm_ao_id0_mask);
1371 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID1_CTRL_REG, elm_ao_id1_value);
1372 DRV_WriteReg32(REG_MCUSYS_EMI_ELM_AXI_ID1_CTRL_MASK, elm_ao_id1_mask);
1373
1374 DRV_WriteReg32(REG_MDMCU_ELM_AO_STATUS0_CFG1, ELM_EMI_TOP_BLOCK(0xff)|DECODE_ID1(elm_id1_rw|elm_id1_master|elm_id1_prio)| \
1375 ELM_DURATION(ELM_200US)|EMI_BLOCK(E_NOT_MASK)|ELM_INT_MASK(0));
1376
1377 DRV_WriteReg32_NPW(REG_MDMCU_ELM_AO_STATUS0_CFG0, ELM_ENABLE|ELM_ACCURACY(ELM_unit_100us)| \
1378 LAT_TH_ID1(ELM_NS2TRAN(elm_write_lat_threshold))|LAT_TH_ID0(ELM_NS2TRAN(elm_read_lat_threshold))| \
1379 DECODE_ID0(elm_id0_rw|elm_id0_master|elm_id0_prio)); //ELM enable for MDMCU Reset
1380 return rtn;
1381
1382}
1383
1384
1385
1386#endif
1387
1388