blob: f538c30f1df4022492b00e6402f6943815eb7787 [file] [log] [blame]
yu.dongc33b3072024-08-21 23:14:49 -07001/*****************************************************************************
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) 2012
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 *
38 * Filename:
39 * ---------
40 * hmu.c
41 *
42 * Project:
43 * --------
44 * MOLY
45 *
46 * Description:
47 * ------------
48 * This file implement the function of Host Interface Management Unit.
49 *
50 * Author:
51 * -------
52 * -------
53 *
54 *
55 * ==========================================================================
56 * $Log$
57 *
58 * 11 10 2020 viney.kaushik
59 * [MOLY00539149] [M70][DataCard][HOST_DRIVER_ASYNC_HANDSHAKE][RDIT] MD Crash ffender: MD Offender:HMU
60 *
61 * update timeout to 31s as max sleep time is 29.x(s..
62 *
63 * 12 09 2019 viney.kaushik
64 * [MOLY00399255] HMU log modification
65 *
66 * remove hmu_tick++ from log to ensure always execution.
67 *
68 * 04 16 2019 viney.kaushik
69 * [MOLY00399255] HMU log modification
70 * add log to print every 100ms.
71 *
72 * 08 24 2017 cs.huang
73 * [MOLY00273609] [Zion][MT6739][RDIT][PHONE][MD_Pre-Sanity] sim1 3G web browsing fail
74 * [HMU] Add tg sync
75 *
76 * 08 24 2017 cs.huang
77 * [MOLY00273609] [Zion][MT6739][RDIT][PHONE][MD_Pre-Sanity] sim1 3G web browsing fail
78 * [HMU] Add tg sync
79 *
80 * 08 07 2017 cs.huang
81 * [MOLY00268551] Task batch scheduling for LTE Low power
82 * HMU for TG change
83 *
84 * 06 23 2017 cs.huang
85 * [MOLY00258471] [LHIFCore] Enable LHIF HW log interrupt to reduce polling times
86 * merge HMU part
87 *
88 * 05 09 2017 cs.huang
89 * [MOLY00248075] [HMU] remove call IPCORE reload API
90 * [HMU] remove call IPCORE reload API
91 *
92 * 11 23 2016 ap.wang
93 * [MOLY00210820] [HMU] Add exception step
94 * .
95 *
96 * 11 23 2016 ap.wang
97 * [MOLY00210824] [HMU] Remove PCCIF IRQ VPE5 HRT log
98 * .
99 *
100 * 09 22 2016 ap.wang
101 * [MOLY00204207] [HMU] Fix multi event wait issue
102 * .
103 *
104 * 08 01 2016 ap.wang
105 * [MOLY00194819] [Elbrus][4G FDD][ATE][CMW500][DSP-BRP] Assert fail: ccci_error_code.c 101 0x102 0xcb6a02 0x1 - EL2
106 * Add spinlock for DSP tick switch timing issue
107 *
108 * 07 28 2016 i-wei.tsai
109 * [MOLY00194135] [HMU] Add more debug log for GPT
110 *
111 * .add debug log for GPT timer
112 *
113 * 07 12 2016 ap.wang
114 * [MOLY00190479] [MSH][MT6292][ELBRUS][EVB][Sanity][LWCTG][Lt+C][SIM1 CMCC][SIM2 CT]Externel (EE),0,0,99,/data/core/,1,modem,md1:(MCU_core0,vpe0,tc0(VPE0)) [ASSERT] file:common/service/hif/ccci/src/ccci_error_code.c
115 * Fix hmu fisrt time wait issue
116 *
117 * 05 30 2016 ap.wang
118 * [MOLY00182249] [HMU] Fix build warning
119 * .
120 *
121 * 05 25 2016 ap.wang
122 * [MOLY00181629] [HMU] Fix timer detect
123 * .
124 *
125 * 05 25 2016 ap.wang
126 * [MOLY00180578] [HMU] HMU spinlock for Multi core
127 * .
128 *
129 * 05 19 2016 ap.wang
130 * [MOLY00180578] [HMU] HMU spinlock for Multi core
131 * .
132 *
133 * 01 07 2016 ap.wang
134 * [MOLY00156091] [HMU] Fix USB multi event unsync
135 * .
136 *
137 * 11 17 2015 ap.wang
138 * [MOLY00148746] [HMU] Check timer feature
139 *
140 * Disable Timer check from UMOLY Trunk for 92 FPGA
141 *
142 * 11 10 2015 ap.wang
143 * [MOLY00148746] [HMU] Check timer feature
144 * .
145 *
146 * 11 10 2015 ap.wang
147 * [MOLY00148746] [HMU] Check timer feature
148 *
149 * 01 07 2015 ap.wang
150 * [MOLY00091565] [HMU] Modify assert to fatal for CR dispatch
151 * .
152 *
153 * 12 31 2014 ap.wang
154 * [MOLY00089916] [HMU] HIF ON/OFF for power saving
155 * .
156 *
157 * 11 17 2014 ap.wang
158 * [MOLY00084709] [HMU] Modify for GPT enable on MODIS
159 * .
160 *
161 * 08 06 2014 ap.wang
162 * [MOLY00074692] [HMU] Modify exception init function table
163 * .
164 *
165 * 07 04 2014 ap.wang
166 * [MOLY00071481] [HMU] Add HIF boot init to Application init
167 * .
168 *
169 * 07 01 2014 ap.wang
170 * [MOLY00071092] [HMU] Add tick count
171 * .
172 *
173 * 06 10 2014 ap.wang
174 * [MOLY00067367] [HMU] Modify GPT timer to MS callback for R8 on MOLY
175 * .
176 *
177 * 04 28 2014 ap.wang
178 * [MOLY00063912] [HMU] HMU temp solution for K2 MD2
179 * HMU temp solution for K2 MD2
180 *
181 * 04 17 2014 box.wu
182 * [MOLY00063010] [MT6595] HIF polling timeout check
183 * cldma timeout check
184 *
185 * 03 21 2014 ap.wang
186 * [MOLY00060351] [ETHERCORE] add ethercore enhancement feature
187 * Add ethercore DL retry
188 *
189 * 02 26 2014 ap.wang
190 * [MOLY00057680] [L2][HMU][DHL] L2 trace and L2 timestamp support
191 * Add L2trc_fill_4G_time to HMU GPT for L2 trace
192 *
193 * 11 07 2013 ap.wang
194 * [MOLY00043564] [klocwork_95][LTE] in hmu.c, line 345
195 * Fix Klocwork warning: succeeded might be used uninitialized in this function.
196 *
197 * 08 28 2013 ap.wang
198 * [MOLY00035451] [HMU] Add L2 trace log
199 * [HMU] Add L2 trace for event trigger
200 *
201 * 08 27 2013 ap.wang
202 * [MOLY00035456] [HMU] Modify for multi hif exception init
203 * [HMU] Modify for multi dev type exception init
204 *
205 * 07 31 2013 ap.wang
206 * [MOLY00031843] [HMU] Add trace log
207 * .
208 *
209 * 07 31 2013 ap.wang
210 * [MOLY00031843] [HMU] Add trace log
211 * [HMU] Add trace log
212 *
213 * 03 11 2013 ap.wang
214 * [MOLY00011696] [HMU] HMU code refine and compile warning fix
215 * [HMU] Add copyright header and change ipc_reload condition
216 ****************************************************************************/
217
218/*******************************************************************************
219 * Include header files
220 *******************************************************************************/
221
222#include "kal_general_types.h"
223#include "kal_public_api.h"
224#include "kal_public_defs.h"
225
226#include "nvram_interface.h"
227#include "nvram_data_items.h"
228#include "hmu_conf_data.h"
229#include "hmu.h"
230#include "hmu_debug.h"
231#include "swla_public.h"
232
233#if defined(__IPCORE_SUPPORT__) && !defined(IPCORE_NOT_PRESENT)
234#include "ipc_api.h"
235#endif
236
237#include "dcl_gpt.h"
238#include "kal_internal_api.h" // for fatal error code
239#include "us_timer.h"
240#include "ccci_if.h"
241
242#ifdef __HMU_TG_TIMER_SUPPORT__
243#include "tg_hisr.h"
244#endif
245
246#if defined(__LHIFCORE_SUPPORT__)
247#include "lhif_if.h"
248#endif
249
250#if !defined(_MTK_TARGET_) && defined(_MSC_VER) && (_MSC_VER >= 1500)
251#pragma warning( disable : 4100 )
252#endif
253
254#define HMU_LOCK(_s) _s = SaveAndSetIRQMask()
255#define HMU_UNLOCK(_s) RestoreIRQMask(_s)
256
257#if !defined(__HMU_TG_TIMER_SUPPORT__)
258static DCL_HANDLE hmu_gpt_handle = 0 ;
259#endif /* !__HMU_TG_TIMER_SUPPORT__ */
260
261static kal_spinlockid hmu_spinlock = NULL;
262
263static kal_bool hmu_gpt_enable = KAL_TRUE ;
264
265static kal_uint32 hmu_hifeg_enable = 0 ; // hifeg enable bit mask
266static kal_uint32 hmu_hifeg_enable_mask = 0 ; // use to indicate which hifeg need to enable at first time
267
268static kal_bool hmu_dsp_timer_exist = KAL_FALSE ;
269
270
271static hmu_internal_state_struct hmu_internal_state = {KAL_FALSE, KAL_FALSE, NULL};
272extern hmu_tick_interval hmu_tick_interval_table[];
273
274extern hmu_uldrv_except_initfunc uldrv_except_init_func_table[];
275extern unsigned int uldrv_except_init_func_table_num;
276
277#if defined(__MTK_TARGET__)
278#if defined(__CLDMACORE_SUPPORT__) || defined(__CCIFCORE_SUPPORT__)
279kal_uint32 hmu_trigger_hif_pending_count = 0;
280#endif
281#endif
282
283kal_uint32 hmu_tick = 0;
284
285// Timer source correctness detection
286#define HMU_TIMER_SOURCE_TIMEOUT_ERROR (31 * 1000 * 1000) // us
287#define HMU_TIMER_SOURCE_TIMEOUT_WARNING (5 * 1000) // us
288
289static kal_bool hmu_detect_timer_enable = KAL_TRUE;
290static kal_uint32 hmu_detect_start_time = 0;
291static kal_uint32 duration = 0;
292/*****************************************************************************
293 * @brief hmu_get_current_time is to get current time
294 * @param NA
295 * @return kal_uint32 current time
296 * Unit: micro second
297 *
298 *****************************************************************************/
299kal_uint32 hmu_get_current_time()
300{
301#if defined(__MTK_TARGET__)
302 return ust_get_current_time();
303#else // MODIS
304 return 0;
305#endif
306}
307
308/*****************************************************************************
309 * @brief hmu_get_duration is to calculate the duration between start time and end time
310 * @param start: start time
311 * end: end time
312 * @return kal_uint32 time duration
313 * Unit: micro second
314 *
315 *****************************************************************************/
316kal_uint32 hmu_get_duration(kal_uint32 start, kal_uint32 end)
317{
318#if defined(__MTK_TARGET__)
319 return ust_us_duration(start, end);
320#else // MODIS
321 return 0;
322#endif
323}
324
325/*****************************************************************************
326 * FUNCTION
327 * hmu_hifeg_init
328 * DESCRIPTION
329 *
330 * PARAMETERS
331 *
332 * RETURNS
333 *
334 *****************************************************************************/
335kal_int32 hmu_hifeg_init(){
336 if (hmu_internal_state.hmuHifEgId == NULL){
337 hmu_internal_state.hmuHifEgId = kal_create_event_group(HIF_DRV_EG_NAME) ;
338 }
339 return HMU_OK ;
340}
341
342/*****************************************************************************
343 * FUNCTION
344 * hmu_hifeg_set
345 * DESCRIPTION
346 *
347 * PARAMETERS
348 *
349 * RETURNS
350 *
351 *****************************************************************************/
352#ifdef __CCMNI_IT__
353void ccmni_it_reload_rgpds();
354#endif
355
356#if defined(__ETHERCORE_SUPPORT__) && !defined(ETHERCORE_NOT_PRESENT)
357void ethc_check_dl_handle_packet_retry(void);
358#endif
359
360kal_status hmu_hifeg_set(kal_uint32 events) {
361 kal_int32 index = 0;
362 hmu_tick_interval *hif;
363
364 /*
365 * Check if each uplink IP stream GPD is required to be relaoded or not.
366 * Note that, the uplink GPD realoding will be done in IPCORE context not here.
367 */
368 if (HIF_DRV_EG_HIF_TICK_EVENT_GROUP & events) {
369#if defined(__IPCORE_SUPPORT__) && !defined(IPCORE_NOT_PRESENT) && defined(__CCCICCMNI_SUPPORT__)
370 ipc_check_ul_reload_retry();
371#endif
372#if defined(__ETHERCORE_SUPPORT__) && !defined(ETHERCORE_NOT_PRESENT)
373 ethc_check_dl_handle_packet_retry();
374#endif
375#ifdef __CCMNI_IT__
376 /* Use for CCMNI_IT rgpds reload, move from sdiocore to here*/
377 ccmni_it_reload_rgpds();
378#endif
379 }
380
381 /* Clear events if interval is not reached */
382 for(index = 0; hmu_tick_interval_table[index].hif_event != 0; index++){
383 hif = &(hmu_tick_interval_table[index]);
384 if (hif->hif_current_tick > 0){
385 events &= ~(hif->hif_event);
386 hif->hif_current_tick--;
387 }
388 else{
389 hif->hif_current_tick = hif->hif_event_tick_count;
390 }
391 }
392
393 if (HIF_DRV_EG_HIF_TICK_EVENT_GROUP & events) {
394#if defined(__LHIFCORE_SUPPORT__)
395 lhifcore_task_hmu_wake_up(events);
396#endif
397 }
398
399#if defined(__MTK_TARGET__)
400#if defined(__CLDMACORE_SUPPORT__) || defined(__CCIFCORE_SUPPORT__)
401#define HIF_PENDING_LIMIT (4000)
402 /* add hif pending count and this count should be reset when hif polling task wakes up */
403 if (events & HIF_DRV_EG_HIF_TICK_EVENT_CLDMA){
404 if (hmu_trigger_hif_pending_count++ > HIF_PENDING_LIMIT) {
405 /* assert if over pending limit */
406 kal_fatal_error_handler(KAL_ERROR_HMU_DETECT_LONG_TIME_NO_RESPONSE,0);
407 }
408 }
409 // Check timer
410 hmu_check_timer(events);
411#endif
412#endif
413
414 hmu_data_trace(MD_TRC_HMU_DATA_EVENT_TRIGGER, kal_get_active_module_id(), hmu_gpt_enable, events, hmu_tick, duration);
415 hmu_tick++;
416
417 if(hmu_tick%100 == 0) {
418 hmu_data_trace(MD_TRC_HMU_ALIVE_EVENT, hmu_gpt_enable, events, hmu_tick);
419 }
420
421 return kal_set_eg_events(hmu_internal_state.hmuHifEgId, events, KAL_OR) ;
422}
423
424/*****************************************************************************
425 * FUNCTION
426 * hmu_hifeg_wait
427 * DESCRIPTION
428 *
429 * PARAMETERS
430 *
431 * RETURNS
432 *
433 *****************************************************************************/
434kal_uint32 hmu_hifeg_wait(kal_uint32 events) {
435 kal_uint32 rt_event = 0;
436#if defined(__HMU_TG_TIMER_SUPPORT__)
437 kal_bool tg_start = KAL_FALSE;
438#endif
439
440 kal_take_spinlock(hmu_spinlock, KAL_INFINITE_WAIT);
441 if(((hmu_hifeg_enable_mask | events) ^ hmu_hifeg_enable_mask) != 0){ //HIF first time wait, never start/stop hmu_hifeg
442 hmu_hifeg_enable |= ((hmu_hifeg_enable_mask | events) ^ hmu_hifeg_enable_mask);
443 hmu_hifeg_enable_mask |= events;
444 if (hmu_dsp_timer_exist == KAL_FALSE){ //should have tick source for HIF first time wait
445 hmu_start_hif_sys_timer();
446#if defined(__HMU_TG_TIMER_SUPPORT__)
447 tg_start = KAL_TRUE;
448#endif
449 }
450 }
451 kal_give_spinlock(hmu_spinlock);
452#if defined(__HMU_TG_TIMER_SUPPORT__)
453 if(tg_start == KAL_TRUE)
454 tg_hmu_callback_control_sync();
455#endif
456 kal_retrieve_eg_events(hmu_internal_state.hmuHifEgId, events, KAL_OR_CONSUME, &rt_event, KAL_SUSPEND);
457 return rt_event;
458}
459
460#if !defined(__HMU_TG_TIMER_SUPPORT__)
461static void hmu_gpt_callback(void *data) // HISR level !!
462{
463 SGPT_CTRL_START_T re_schedule;
464
465 if (hmu_gpt_enable == KAL_TRUE){
466 re_schedule.u2Tick=HMU_GPTIMER_PRIODIC_INTERVAL ;
467 re_schedule.pfCallback=hmu_gpt_callback;
468 re_schedule.vPara=NULL;
469 l2trc_fill_4G_time();
470 hmu_hifeg_set(hmu_hifeg_enable & HIF_DRV_EG_HIF_TICK_EVENT_GROUP);
471 DclSGPT_Control(hmu_gpt_handle, SGPT_CMD_START, (DCL_CTRL_DATA_T*)&re_schedule) ;
472 }
473 else
474 {
475 hmu_data_trace(MD_TRC_HMU_GPT_CB_NO_NEXT);
476 }
477}
478#endif /* !__HMU_TG_TIMER_SUPPORT__ */
479
480void hmu_stop_hif_sys_timer(){
481 //kal_take_enh_mutex(hmu_gpt_mutex);
482
483#ifdef __HMU_TG_TIMER_SUPPORT__
484 tg_hmu_callback_control(KAL_FALSE);
485#else
486 hmu_gpt_enable = KAL_FALSE ;
487
488 DclSGPT_Control(hmu_gpt_handle, SGPT_CMD_STOP, (DCL_CTRL_DATA_T*)NULL) ;
489#endif
490 //kal_give_enh_mutex(hmu_gpt_mutex);
491}
492
493void hmu_start_hif_sys_timer(){
494
495#ifdef __HMU_TG_TIMER_SUPPORT__
496 tg_hmu_callback_control(KAL_TRUE);
497#else
498 SGPT_CTRL_START_T start;
499
500 //kal_take_enh_mutex(hmu_gpt_mutex);
501
502 hmu_gpt_enable = KAL_TRUE ;
503
504 start.u2Tick=HMU_GPTIMER_PRIODIC_INTERVAL;
505 start.pfCallback=hmu_gpt_callback;
506 start.vPara=NULL;
507 DclSGPT_Control(hmu_gpt_handle, SGPT_CMD_START, (DCL_CTRL_DATA_T*)&start) ;
508 //kal_give_enh_mutex(hmu_gpt_mutex);
509#endif
510}
511
512void hmu_dsp_timer_kick(){
513 hmu_hifeg_set(hmu_hifeg_enable & HIF_DRV_EG_HIF_TICK_EVENT_GROUP);
514 kal_take_spinlock(hmu_spinlock, KAL_INFINITE_WAIT);
515 if (hmu_dsp_timer_exist == KAL_TRUE){
516 hmu_stop_hif_sys_timer();
517 kal_give_spinlock(hmu_spinlock);
518 hmu_data_trace(MD_TRC_HMU_STOP_GPT, kal_get_active_module_id());
519 }else{
520 kal_give_spinlock(hmu_spinlock);
521 }
522}
523
524static void hmu_init_hif_timer()
525{
526 hmu_dsp_timer_exist = KAL_FALSE ;
527 hmu_gpt_enable = KAL_TRUE ;
528#ifdef __HMU_TG_TIMER_SUPPORT__
529 // Default timer is TRUE
530 // tg_hmu_callback_control(KAL_TRUE);
531#else
532 {
533 SGPT_CTRL_START_T start;
534
535 start.u2Tick=HMU_GPTIMER_PRIODIC_INTERVAL;
536 start.pfCallback=hmu_gpt_callback;
537 start.vPara=NULL;
538 DclSGPT_Control(hmu_gpt_handle, SGPT_CMD_START, (DCL_CTRL_DATA_T*)&start) ;
539 }
540#endif
541}
542
543void hmu_switch_hif_timer(hmuTimerSource_enum source)
544{
545#if !defined(__HMU_TG_TIMER_SUPPORT__)
546 SGPT_CTRL_START_T start;
547
548 start.u2Tick=HMU_GPTIMER_PRIODIC_INTERVAL;
549 start.pfCallback=hmu_gpt_callback;
550 start.vPara=NULL;
551
552 kal_take_spinlock(hmu_spinlock, KAL_INFINITE_WAIT);
553 if (source == HMU_TIMER_SOURCE_DSP){
554 SLA_CustomLogging("DSP", SA_label);
555 hmu_dsp_timer_exist = KAL_TRUE ;
556 kal_give_spinlock(hmu_spinlock);
557 hmu_data_trace(MD_TRC_HMU_CHANGE_TIMER_DSP);
558 }else if(source == HMU_TIMER_SOURCE_SYS){
559 SLA_CustomLogging("GPT", SA_label);
560 hmu_dsp_timer_exist = KAL_FALSE ;
561 if( (hmu_hifeg_enable & HIF_DRV_EG_HIF_TICK_EVENT_GROUP) != 0){
562 hmu_gpt_enable = KAL_TRUE ;
563 DclSGPT_Control(hmu_gpt_handle, SGPT_CMD_START, (DCL_CTRL_DATA_T*)&start) ;
564 }
565 kal_give_spinlock(hmu_spinlock);
566 hmu_data_trace(MD_TRC_HMU_CHANGE_TIMER_GPT);
567 }
568#endif /* !__HMU_TG_TIMER_SUPPORT__ */
569}
570
571kal_int32 hmu_boot_init()
572{
573 if (hmu_internal_state.hmuBootInit == KAL_TRUE) {
574 return HMU_ALREADY_INIT;
575 }
576
577 hmu_hifeg_init() ;
578
579#if !defined(__HMU_TG_TIMER_SUPPORT__)
580 if (hmu_gpt_handle == 0) {
581 hmu_gpt_handle = DclSGPT_Open(DCL_GPT_CB_MS, FLAGS_NONE);
582 if (hmu_gpt_handle == DCL_HANDLE_INVALID || hmu_gpt_handle == DCL_HANDLE_OCCUPIED){
583 ASSERT(0);
584 }
585 }
586#endif /* !__HMU_TG_TIMER_SUPPORT__ */
587
588 if (hmu_spinlock == NULL) {
589 hmu_spinlock = kal_create_spinlock ("hmu_spinlock");
590 if (hmu_spinlock == NULL) {
591 ASSERT(0);
592 }
593 }
594
595 hmu_init_hif_timer() ;
596
597 hmu_internal_state.hmuBootInit = KAL_TRUE ;
598 return 0 ;
599}
600
601
602
603/*****************************************************************************
604 * FUNCTION
605 * hmu_except_init
606 *
607 * DESCRIPTION
608 * Trigger an upper layer device module to hook with TTYCORE and then proceed
609 * exception flow if an exception happens before hmu_init() completes.
610 *
611 * PARAMETERS
612 * N/A
613 *
614 * RETURNS
615 * KAL_TRUE if caller is allowed to proceed the exception flow;
616 * KAL_FALSE if there's no proper callback function registered by
617 * upper layer device modules or something wrong while executing
618 * the callback function.
619 *****************************************************************************/
620#define hmu_except_step_logging_pattern 0x484D5500
621kal_uint32 except_step = hmu_except_step_logging_pattern;
622#if !defined(__HIF_CCCI_SUPPORT__)
623 #define ccci_excep_dbg_logging_InHS2(...)
624#endif
625kal_bool hmu_except_init(void)
626{
627 kal_bool succeeded = KAL_TRUE;
628 kal_bool ret = 0;
629 kal_uint32 idx;
630
631 for (idx = 0; idx < uldrv_except_init_func_table_num; idx++) {
632 except_step = hmu_except_step_logging_pattern | (idx & 0xFF);
633 ccci_excep_dbg_logging_InHS2(CCCI_EXCEP_DBG_STEP, &except_step);
634 if (uldrv_except_init_func_table[idx].except_init_func != NULL){
635 ret = uldrv_except_init_func_table[idx].except_init_func(uldrv_except_init_func_table[idx].port_id, 0, NULL);
636 }
637 if (ret != 0){
638 succeeded = KAL_FALSE;
639 }
640 }
641 except_step = hmu_except_step_logging_pattern | 0xFF;
642 ccci_excep_dbg_logging_InHS2(CCCI_EXCEP_DBG_STEP, &except_step);
643 return succeeded;
644}
645
646/*****************************************************************************
647 * FUNCTION
648 * hif_boot_init
649 * DESCRIPTION
650 * HIF boot init function to initial HIF module without task.
651 * PARAMETERS
652 *
653 * RETURNS
654 * success or fail
655 *****************************************************************************/
656kal_int32 hif_boot_init()
657{
658 hmu_boot_init();
659 return 0 ;
660}
661
662/*****************************************************************************
663 * FUNCTION
664 * hmu_hifeg_stop
665 * DESCRIPTION
666 *
667 * PARAMETERS
668 *
669 * RETURNS
670 *
671 *****************************************************************************/
672kal_uint32 hmu_hifeg_stop(kal_uint32 events) {
673#if defined(__HMU_TG_TIMER_SUPPORT__)
674 kal_bool tg_stop = KAL_FALSE;
675#endif
676 kal_take_spinlock(hmu_spinlock, KAL_INFINITE_WAIT);
677 hmu_hifeg_enable &= ~events;
678 hmu_hifeg_enable_mask |= events;
679 if( (hmu_hifeg_enable & HIF_DRV_EG_HIF_TICK_EVENT_GROUP) == 0){
680 hmu_stop_hif_sys_timer();
681 hmu_check_timer_stop();
682#if defined(__HMU_TG_TIMER_SUPPORT__)
683 tg_stop = KAL_TRUE;
684#endif
685 }
686 kal_give_spinlock(hmu_spinlock);
687#if defined(__HMU_TG_TIMER_SUPPORT__)
688 if(tg_stop == KAL_TRUE)
689 tg_hmu_callback_control_sync();
690#endif /* __HMU_TG_TIMER_SUPPORT__ */
691 hmu_data_trace(MD_TRC_HMU_HIFEG_STOP, kal_get_active_module_id(), events, hmu_hifeg_enable);
692 return hmu_hifeg_enable;
693}
694
695/*****************************************************************************
696 * FUNCTION
697 * hmu_hifeg_stop
698 * DESCRIPTION
699 *
700 * PARAMETERS
701 *
702 * RETURNS
703 *
704 *****************************************************************************/
705kal_uint32 hmu_hifeg_start(kal_uint32 events) {
706#if defined(__HMU_TG_TIMER_SUPPORT__)
707 kal_bool tg_start = KAL_FALSE;
708#endif
709 kal_take_spinlock(hmu_spinlock, KAL_INFINITE_WAIT);
710 hmu_check_timer_start();
711 hmu_hifeg_enable |= events;
712 hmu_hifeg_enable_mask |= events;
713 if (hmu_dsp_timer_exist == KAL_FALSE){
714 hmu_start_hif_sys_timer();
715#if defined(__HMU_TG_TIMER_SUPPORT__)
716 tg_start = KAL_TRUE;
717#endif
718 }
719 kal_give_spinlock(hmu_spinlock);
720#if defined(__HMU_TG_TIMER_SUPPORT__)
721 if(tg_start == KAL_TRUE)
722 tg_hmu_callback_control_sync();
723#endif /* __HMU_TG_TIMER_SUPPORT__ */
724 hmu_data_trace(MD_TRC_HMU_HIFEG_START, kal_get_active_module_id(), events, hmu_hifeg_enable);
725 return hmu_hifeg_enable;
726}
727
728/*****************************************************************************
729 * FUNCTION
730 * hmu_check_timer_start / hmu_check_timer_stop
731 * DESCRIPTION
732 * Start / Stop HMU checking timer
733 * PARAMETERS
734 *
735 * RETURNS
736 *****************************************************************************/
737void hmu_check_timer_start()
738{
739 hmu_detect_timer_enable = KAL_TRUE;
740 /*
741 * Case 1. when stop timer then start, need to get current time again
742 * Case 2. when dsp change to gpt, dsp will call set_eg again, so will get checking timer
743 * So, need to check hmu_hifeg_enable then get current time
744 */
745 if(hmu_detect_start_time == 0 || (hmu_hifeg_enable & HIF_DRV_EG_HIF_TICK_EVENT_GROUP) == 0)
746 hmu_detect_start_time = hmu_get_current_time();
747}
748void hmu_check_timer_stop()
749{
750 hmu_detect_timer_enable = KAL_FALSE;
751 hmu_detect_start_time = 0;
752}
753
754/*****************************************************************************
755 * FUNCTION
756 * hmu_check_timer
757 * DESCRIPTION
758 * Check HMU timer source whether is normal
759 * PARAMETERS
760 *
761 * RETURNS
762 * HMU_CHECK_TIMER_ENUM : return checking result
763 *****************************************************************************/
764kal_uint32 hmu_check_timer(kal_uint32 events)
765{
766 if(hmu_detect_start_time != 0)
767 duration = hmu_get_duration(hmu_detect_start_time, hmu_get_current_time());
768 hmu_detect_start_time = hmu_get_current_time();
769 if(duration > HMU_TIMER_SOURCE_TIMEOUT_ERROR && hmu_detect_timer_enable){ // error log
770 //hmu_data_trace(MD_TRC_HMU_DATA_EVENT_TRIGGER_TIMEOUT_ERROR, hmu_gpt_enable, events, hmu_tick, duration);
771#ifdef __HIF_CCCI_SUPPORT__
772 if(hmu_gpt_enable == KAL_FALSE)
773 CCCI_ERROR_CODE_ASSERT(CCCI_FA_HMU_DSP_TIMER_BROKEN, duration, hmu_gpt_enable);
774 else if(hmu_gpt_enable == KAL_TRUE)
775 CCCI_ERROR_CODE_ASSERT(CCCI_FA_HMU_GPT_TIMER_BROKEN, duration, hmu_gpt_enable);
776#else
777 EXT_ASSERT(KAL_FALSE, hmu_tick, duration, hmu_gpt_enable);
778#endif
779 return HMU_CHECK_TIMER_ERROR;
780 }
781 else if( duration > HMU_TIMER_SOURCE_TIMEOUT_WARNING && hmu_detect_timer_enable){ // warning log
782 hmu_data_trace(MD_TRC_HMU_DATA_EVENT_TRIGGER_TIMEOUT_WARNING, hmu_gpt_enable, events, hmu_tick, duration);
783 return HMU_CHECK_TIMER_WARNING;
784 }
785 else{ // normal log
786 return HMU_CHECK_TIMER_SUCCESS;
787 }
788
789}
790
791/*****************************************************************************
792 * FUNCTION
793 * hmu_tg_callback
794 * DESCRIPTION
795 * Callback from task group hisr
796 * PARAMETERS
797 *
798 * RETURNS
799 *****************************************************************************/
800#ifdef __HMU_TG_TIMER_SUPPORT__
801void hmu_tg_timer_callback()
802{
803#ifndef __MTK_TARGET__ // MoDIS only
804 l2trc_fill_4G_time(); // for DHL polling log in MoDIS
805#endif
806 hmu_hifeg_set(hmu_hifeg_enable & HIF_DRV_EG_HIF_TICK_EVENT_GROUP);
807}
808#endif