blob: e941172cd7d1f47dab4a5dd8069320ed95002759 [file] [log] [blame]
rjw6c1fd8f2022-11-30 14:33:01 +08001/*****************************************************************************
2* Copyright Statement:
3* --------------------
4* This software is protected by Copyright and the information contained
5* herein is confidential. The software may not be copied and the information
6* contained herein may not be used or disclosed except with the written
7* permission of MediaTek Inc. (C) 2005
8*
9* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
10* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
11* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
12* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
13* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
14* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
15* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
16* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
17* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
18* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
19* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
20* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
21*
22* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
23* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
24* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
25* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
26* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
27*
28* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
29* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
30* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
31* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
32* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
33*
34*****************************************************************************/
35
36/*******************************************************************************
37 * Filename:
38 * ---------
39 * drv_hisr.c
40 *
41 * Project:
42 * --------
43 * ALL
44 *
45 * Description:
46 * ------------
47 * This file is intends for driver HISR management.
48 *
49 * Author:
50 * -------
51 * -------
52 *
53 *============================================================================
54 * HISTORY
55 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
56 *------------------------------------------------------------------------------
57 * removed!
58 * removed!
59 * removed!
60 *
61 * removed!
62 * removed!
63 * removed!
64 * removed!
65 *
66 * removed!
67 * removed!
68 * removed!
69 *
70 * removed!
71 * removed!
72 * removed!
73 *
74 * removed!
75 * removed!
76 * removed!
77 *
78 * removed!
79 * removed!
80 * removed!
81 *
82 * removed!
83 * removed!
84 * removed!
85 *
86 * removed!
87 * removed!
88 * removed!
89 *
90 * removed!
91 * removed!
92 * removed!
93 *
94 * removed!
95 * removed!
96 * removed!
97 *
98 * removed!
99 * removed!
100 * removed!
101 *
102 * removed!
103 * removed!
104 * removed!
105 *
106 * removed!
107 * removed!
108 * removed!
109 *
110 * removed!
111 * removed!
112 * removed!
113 *
114 * removed!
115 * removed!
116 * removed!
117 *
118 * removed!
119 * removed!
120 * removed!
121 *
122 * removed!
123 * removed!
124 * removed!
125 *
126 * removed!
127 * removed!
128 * removed!
129 *
130 * removed!
131 * removed!
132 * removed!
133 *
134 * removed!
135 * removed!
136 * removed!
137 *
138 * removed!
139 * removed!
140 * removed!
141 *
142 * removed!
143 * removed!
144 * removed!
145 *
146 * removed!
147 * removed!
148 * removed!
149 *
150 * removed!
151 * removed!
152 * removed!
153 *
154 * removed!
155 * removed!
156 * removed!
157 *
158 * removed!
159 * removed!
160 * removed!
161 *
162 * removed!
163 * removed!
164 * removed!
165 *
166 * removed!
167 * removed!
168 * removed!
169 *
170 * removed!
171 * removed!
172 * removed!
173 *
174 * removed!
175 * removed!
176 * removed!
177 *
178 * removed!
179 * removed!
180 * removed!
181 *
182 * removed!
183 * removed!
184 * removed!
185 *
186 * removed!
187 * removed!
188 * removed!
189 *
190 * removed!
191 * removed!
192 * removed!
193 *
194 * removed!
195 * removed!
196 * removed!
197 *
198 * removed!
199 * removed!
200 * removed!
201 *
202 * removed!
203 * removed!
204 * removed!
205 *
206 * removed!
207 * removed!
208 * removed!
209 *
210 *------------------------------------------------------------------------------
211 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
212 *============================================================================
213 ****************************************************************************/
214#include "kal_public_defs.h"
215#include "kal_general_types.h"
216#include "kal_public_api.h"
217#include "drv_comm.h"
218#include "hisr_config.h"
219#include "drv_hisr.h"
220#include "devdrv_ls.h"
221#include "us_timer.h"
222#include "intrCtrl.h"
223#if defined(__DHL_MODULE__)||defined(__TST_MODULE__)
224 #include "devdrv_trace.h"
225#endif /* __DHL_MODULE__ || __TST_MODULE__ */
226
227/* Debug/Log/Record Configuration */
228#define DEVDRV_HISR_TRACE_ENABLE 1
229#define DEVDRV_HISR_MEASURE_TIME 1
230//#define DEVDRV_DEBUG_TRACE 1
231
232#define MAX_DRV_HISR_DBG_INFO_SIZE 64 /*must be 2^n*/
233
234typedef struct{
235 kal_uint32 time_enter;
236 kal_uint32 time_leave;
237 kal_uint16 tag;
238}DRV_HISR_DBG_DATA;
239
240typedef struct{
241 DRV_HISR_DBG_DATA dbg_data[MAX_DRV_HISR_DBG_INFO_SIZE];
242 kal_uint16 dbg_data_idx;
243}DRV_HISR_DBG_STRUCT;
244
245#if defined(_MAUI_SOFTWARE_LA_)
246#define SWLA_ACTION_LABEL (2)
247extern void SLA_CustomLogging(kal_char *customJob, kal_int32 saAction);
248#endif
249
250kal_uint32 drv_hisr_status[(MAX_DRV_HISR_DEVICE+31)/32];
251
252#if defined(DEVDRV_HISR_TRACE_ENABLE) && (defined(__DHL_MODULE__)||defined(__TST_MODULE__))
253 #define DEVDRV_TRC(x...) \
254 do{ \
255 dhl_trace(x); \
256 }while(0)
257
258 //remove us/10ms GPT timer monitor
259 kal_uint32 devdrv_hisr_monitor_mask[] = {0xFFCFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF};
260#else /* DEVDRV_HISR_TRACE_ENABLE && (__DHL_MODULE__ || __TST_MODULE__) */
261 #define DEVDRV_TRC(...)
262#endif /* DEVDRV_HISR_TRACE_ENABLE && (__DHL_MODULE__ || __TST_MODULE__)*/
263#define DEVDRV_TRC_LEVEL TRACE_INFO
264
265/* to measure time */
266#if defined(DEVDRV_HISR_MEASURE_TIME)
267#if defined(__CR4__)
268#include "cp15_int.h"
269#elif defined(__MTK_MMU_V2__)
270#include "mpu_mtk_mmu_v2_int.h"
271#endif
272
273#define IFDEF_DEVDRV_HISR_MEASURE_TIME(x) x
274kal_uint32 drv_hisr_exec_enter_time[MAX_DRV_HISR_DEVICE];
275kal_uint32 drv_hisr_exec_leave_time[MAX_DRV_HISR_DEVICE];
276#else
277#define IFDEF_DEVDRV_HISR_MEASURE_TIME(x)
278#endif /* DEVDRV_HISR_MEASURE_TIME */
279
280void DRV_ERROR_HISR(void);
281
282DRV_HISR_STRUCT DRV_HISR_TABLE[MAX_DRV_HISR_DEVICE];
283DRV_HISR_ID DRV_CURRENT_HISR;
284
285#if defined(DEVDRV_DEBUG_TRACE)
286DRV_HISR_DBG_STRUCT DRV_HISR_DBG_INFO_DATA;
287
288void drv_hisr_dbg_trace(DRV_HISR_ID index, kal_uint32 time)
289{
290 //kal_uint32 savedMask;
291
292 //savedMask = SaveAndSetIRQMask();
293 if (DRV_UNKNOWN_HISR_ID != index) /* Means it's enter. */
294 {
295 DRV_HISR_DBG_INFO_DATA.dbg_data[DRV_HISR_DBG_INFO_DATA.dbg_data_idx&(MAX_DRV_HISR_DBG_INFO_SIZE - 1)].tag = (kal_uint16)index;
296 DRV_HISR_DBG_INFO_DATA.dbg_data[DRV_HISR_DBG_INFO_DATA.dbg_data_idx&(MAX_DRV_HISR_DBG_INFO_SIZE - 1)].time_enter = time;
297 DRV_HISR_DBG_INFO_DATA.dbg_data[DRV_HISR_DBG_INFO_DATA.dbg_data_idx&(MAX_DRV_HISR_DBG_INFO_SIZE - 1)].time_leave = 0;
298 }
299 else /* Means it's leave. */
300 {
301 DRV_HISR_DBG_INFO_DATA.dbg_data[DRV_HISR_DBG_INFO_DATA.dbg_data_idx&(MAX_DRV_HISR_DBG_INFO_SIZE - 1)].time_leave = time;
302 DRV_HISR_DBG_INFO_DATA.dbg_data_idx++;
303 }
304
305 //RestoreIRQMask(savedMask);
306}
307#else /* DEVDRV_DEBUG_TRACE */
308#define drv_hisr_dbg_trace(x...)
309#endif /* DEVDRV_DEBUG_TRACE */
310
311
312void DRV_ERROR_HISR(void)
313{
314 ASSERT(0);
315}
316
317void DRV_Register_HISR(DRV_HISR_ID hisr_id, VOID_FUNC hisr_func)
318{
319 ASSERT(hisr_id < MAX_DRV_HISR_DEVICE);
320 DRV_HISR_TABLE[hisr_id].hisr_func = hisr_func;
321}
322
323// For fix 35 MGM platform over 60 q-bit issue
324DEVDRV_LS_INTERNCODE void DRV_HISR(void)
325{
326 kal_uint16 index;
327 kal_uint32 savedMask;
328#if defined(_MAUI_SOFTWARE_LA_)
329 kal_char swla_label[4] = "DH ";
330#endif
331
332 if (drv_hisr_status[0] != 0)
333 index = 0;
334 else if (drv_hisr_status[1] != 0)
335 index = 32;
336 else
337 return;
338
339 while(index<(kal_uint16)MAX_DRV_HISR_DEVICE)
340 {
341 kal_bool bit_mask;
342 kal_uint32 index_shift;
343 kal_uint32 status_index;
344
345 bit_mask = KAL_FALSE;
346 index_shift = 1<<(index%32);
347 status_index = index>>5;
348 if(drv_hisr_status[status_index] & index_shift)
349 {
350 bit_mask = KAL_TRUE;
351 }
352 if (bit_mask == KAL_TRUE)
353 {
354 DRV_HISR_STRUCT *hisr_pointer;
355
356 hisr_pointer = DRV_HISR_TABLE+index;
357 ASSERT(hisr_pointer->hisr_count!=0);
358 DRV_CURRENT_HISR = (DRV_HISR_ID)index;
359#if defined(DEVDRV_HISR_TRACE_ENABLE)&&(__DHL_MODULE__ || __TST_MODULE__)
360 if(devdrv_hisr_monitor_mask[status_index] & index_shift)
361 {
362 DEVDRV_TRC(DEVDRV_TRC_LEVEL, 0, DEVDRV_CURRENT_HISR_ID, (kal_uint32)index);
363 }
364#endif /* DEVDRV_HISR_TRACE_ENABLE */
365 savedMask = SaveAndSetIRQMask();
366#if defined(_MAUI_SOFTWARE_LA_)
367 swla_label[2] += index;
368 SLA_CustomLogging(swla_label, SWLA_ACTION_LABEL);
369#endif
370 hisr_pointer->hisr_count--;
371 if (hisr_pointer->hisr_count == 0)
372 {
373 drv_hisr_status[status_index] &= ~(index_shift);
374 if (drv_hisr_status[status_index] == 0)
375 {
376 index |= 0x1F;
377 }
378 }
379 RestoreIRQMask(savedMask);
380 drv_hisr_dbg_trace(DRV_CURRENT_HISR, ust_get_current_time());
381#if defined(__CR4__)
382 IFDEF_DEVDRV_HISR_MEASURE_TIME(CP15_PMU_GET_CYCLE_CNT(drv_hisr_exec_enter_time[DRV_CURRENT_HISR]));
383#elif defined(__MTK_MMU_V2__)
384 IFDEF_DEVDRV_HISR_MEASURE_TIME(drv_hisr_exec_enter_time[DRV_CURRENT_HISR]=CACHE_FREE_RUN_CYCLE_COUNTER_GET_CYCLE());
385#endif
386 hisr_pointer->hisr_func();
387#if defined(__CR4__)
388 IFDEF_DEVDRV_HISR_MEASURE_TIME(CP15_PMU_GET_CYCLE_CNT(drv_hisr_exec_leave_time[DRV_CURRENT_HISR]));
389#elif defined(__MTK_MMU_V2__)
390 IFDEF_DEVDRV_HISR_MEASURE_TIME(drv_hisr_exec_leave_time[DRV_CURRENT_HISR]=CACHE_FREE_RUN_CYCLE_COUNTER_GET_CYCLE());
391#endif
392 drv_hisr_dbg_trace(DRV_UNKNOWN_HISR_ID, ust_get_current_time());
393 DRV_CURRENT_HISR = DRV_UNKNOWN_HISR_ID;
394 }//if (bit_mask == KAL_TRUE)
395 index++;
396 } //while(index<(kal_uint16)MAX_DRV_HISR_DEVICE)
397}
398
399void drv_hisr_init(void)
400{
401 kal_uint32 index;
402
403 ASSERT(MAX_DRV_HISR_DEVICE <= (DRV_HISR_ID)64);
404 for(index=0;index<(kal_uint32)MAX_DRV_HISR_DEVICE;index++)
405 {
406 DRV_HISR_TABLE[index].hisr_func = DRV_ERROR_HISR;
407 DRV_HISR_TABLE[index].hisr_count = 0;
408 }
409}
410
411#if !defined(__FUE__) && !defined(__UBL__)
412
413DEVDRV_LS_INTSRAM_ROCODE void drv_active_hisr(DRV_HISR_ID id)
414{
415 kal_uint32 savedMask;
416
417 savedMask = SaveAndSetIRQMask();
418 drv_hisr_status[id>>5] |= 1UL<<(id&0x1FUL);
419
420 DRV_HISR_TABLE[id].hisr_count++;
421
422 RestoreIRQMask(savedMask);
423 kal_activate_hisr_index(DRVHISR);
424}
425#endif
426
427