blob: f596e9dea88574b2ba83dcde2c2a975502c1ec3e [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 *
38 * Filename:
39 * ---------
40 * nvram_handler_reset.c
41 *
42 * Project:
43 * --------
44 * MAUI
45 *
46 * Description:
47 * ------------
48 * This is reset handler function of NVRAM module.
49 *
50 * Author:
51 * -------
52 * -------
53 *
54 *============================================================================
55 * HISTORY
56 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
57 *------------------------------------------------------------------------------
58 * removed!
59 *
60 * removed!
61 * removed!
62 * removed!
63 *
64 * removed!
65 * removed!
66 * removed!
67 * removed!
68 * removed!
69 * removed!
70 * removed!
71 * removed!
72 *
73 * removed!
74 * removed!
75 * removed!
76 *
77 * removed!
78 * removed!
79 * removed!
80 *
81 * removed!
82 * removed!
83 * removed!
84 *
85 * removed!
86 * removed!
87 *
88 * removed!
89 * removed!
90 * removed!
91 * removed!
92 *
93 * removed!
94 * removed!
95 * removed!
96 *
97 * removed!
98 * removed!
99 * removed!
100 * removed!
101 * removed!
102 * removed!
103 * removed!
104 * removed!
105 * removed!
106 * removed!
107 * removed!
108 *
109 * removed!
110 * removed!
111 * removed!
112 *
113 * removed!
114 * removed!
115 * removed!
116 *
117 * removed!
118 * removed!
119 * removed!
120 *
121 * removed!
122 * removed!
123 * removed!
124 *
125 * removed!
126 * removed!
127 * removed!
128 *
129 * removed!
130 * removed!
131 * removed!
132 *
133 * removed!
134 * removed!
135 * removed!
136 *
137 * removed!
138 * removed!
139 * removed!
140 *
141 * removed!
142 * removed!
143 * removed!
144 *
145 * removed!
146 * removed!
147 * removed!
148 *
149 * removed!
150 * removed!
151 * removed!
152 *
153 * removed!
154 * removed!
155 * removed!
156 *
157 * removed!
158 * removed!
159 * removed!
160 *
161 * removed!
162 * removed!
163 * removed!
164 *
165 * removed!
166 * removed!
167 * removed!
168 *
169 * removed!
170 * removed!
171 * removed!
172 *
173 * removed!
174 * removed!
175 * removed!
176 *
177 * removed!
178 * removed!
179 * removed!
180 *
181 * removed!
182 * removed!
183 * removed!
184 *
185 * removed!
186 * removed!
187 * removed!
188 *
189 * removed!
190 * removed!
191 * removed!
192 *
193 * removed!
194 * removed!
195 * removed!
196 *
197 * removed!
198 * removed!
199 * removed!
200 *
201 * removed!
202 * removed!
203 * removed!
204 *
205 * removed!
206 * removed!
207 * removed!
208 *
209 * removed!
210 * removed!
211 * removed!
212 *
213 * removed!
214 * removed!
215 * removed!
216 *
217 * removed!
218 * removed!
219 * removed!
220 *
221 * removed!
222 * removed!
223 * removed!
224 *
225 * removed!
226 * removed!
227 * removed!
228 *
229 * removed!
230 * removed!
231 * removed!
232 *
233 * removed!
234 * removed!
235 * removed!
236 *
237 * removed!
238 * removed!
239 * removed!
240 *
241 * removed!
242 * removed!
243 * removed!
244 *
245 * removed!
246 * removed!
247 * removed!
248 *
249 * removed!
250 * removed!
251 * removed!
252 *
253 * removed!
254 * removed!
255 * removed!
256 *
257 *------------------------------------------------------------------------------
258 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
259 *============================================================================
260 ****************************************************************************/
261#include "kal_general_types.h"
262#include "kal_public_api.h"
263#include "kal_public_defs.h"
264#include "kal_trace.h"
265#include "nvram_msgid.h"
266#include "mcf_if.h"
267
268#ifdef __NVRAM_OTP__
269#include "fs_gprot.h"
270#include "fs_iprot.h"
271#endif
272
273//MSBB remove #include "fctycomp_config.h" /* MOD_FT */
274
275#include "nvram_main.h"
276#include "ex_public.h"
277#include "stdio.h"
278#include "stdarg.h"
279#include "us_timer.h"
280
281
282extern kal_mutexid g_nvram_impt_mutex;
283extern nvram_access_trace_information nvram_access_trace;
284extern kal_mutexid g_nvram_trace_mutex;
285
286extern nvram_ee_info_type* nvram_ee_info;
287extern kal_char nvram_trace_dump_temp_buffer[];
288extern kal_char nvram_trace_dump_buffer[];
289extern kal_mutexid g_nvram_dump_trace_mutex;
290extern kal_wchar nvram_trace_filename[];
291extern FS_HANDLE nvram_trace_file_hdl;
292extern kal_uint32 nvram_trace_dump_buffer_offset;
293
294
295static void nvram_reset_confirm(module_type dest_id, nvram_errno_enum result, nvram_reset_req_struct *nvram_reset_req);
296
297static void nvram_set_lock_confirm(
298 module_type dest_id,
299 nvram_errno_enum result,
300 nvram_set_lock_req_struct *nvram_set_lock_req);
301
302extern module_type stack_get_active_module_id( void );
303
304/*****************************************************************************
305 * FUNCTION
306 * nvram_reset_handler
307 * DESCRIPTION
308 * This is nvram_reset_handler() function of NVRAM module.
309 * PARAMETERS
310 * ilm_ptr [IN] The primitives
311 * RETURNS
312 * void
313 *****************************************************************************/
314void nvram_reset_handler(ilm_struct *ilm_ptr)
315{
316 /*----------------------------------------------------------------*/
317 /* Local Variables */
318 /*----------------------------------------------------------------*/
319 nvram_ltable_entry_struct *ldi;
320 nvram_ltable_entry_struct tmp_ldi = {0};
321 nvram_reset_req_struct *nvram_reset_req = (nvram_reset_req_struct*) ilm_ptr->local_para_ptr;
322 kal_uint32 nvram_trace_index = 0;
323 /*----------------------------------------------------------------*/
324 /* Code Body */
325 /*----------------------------------------------------------------*/
326 nvram_util_take_mutex(g_nvram_trace_mutex);
327 nvram_trace_index = nvram_access_trace.reset_trace_index;
328 nvram_access_trace.reset_trace_index = (nvram_access_trace.reset_trace_index + 1) % MAX_TRACE_NUM;
329 nvram_util_give_mutex(g_nvram_trace_mutex);
330
331 MD_TRC_FUNC_NVRAM_RESET();
332 NVRAM_EXT_ASSERT(nvram_reset_req != NULL,(kal_uint32)nvram_reset_req, NVRAM_LOC_RESET_REQ_PTR_IS_NULL_1, 0);
333 kal_mem_set((void *)&(nvram_access_trace.reset_trace[nvram_trace_index]), 0, sizeof(trace_info));
334 nvram_access_trace.reset_trace[nvram_trace_index].access_way = NVRAM_ACCESS_BY_MSG;
335 nvram_access_trace.reset_trace[nvram_trace_index].LID = nvram_reset_req->LID;
336 nvram_access_trace.reset_trace[nvram_trace_index].start_time = ust_get_current_time();
337 if (nvram_ptr->dev_broken)
338 {
339 nvram_access_trace.reset_trace[nvram_trace_index].end_time = ust_get_current_time();
340 nvram_access_trace.reset_trace[nvram_trace_index].ret_value = NVRAM_IO_ERRNO_DRV_BROKEN;
341 nvram_reset_confirm(ilm_ptr->src_mod_id, NVRAM_ERRNO_SUCCESS, nvram_reset_req);
342 }
343 else
344 {
345
346 if (nvram_ptr->state == NVRAM_STATE_READY)
347 {
348 if (!(nvram_reset_req->reset_category & NVRAM_RESET_CERTAIN))
349 {
350 nvram_reset_req->LID = 0;
351 }
352
353 nvram_util_get_data_item(&ldi, nvram_reset_req->LID);
354
355 if (nvram_reset_req->reset_category == NVRAM_RESET_CERTAIN)
356 {
357 if (!NVRAM_IS_LID_VALID(nvram_reset_req->LID))
358 {
359 nvram_access_trace.reset_trace[nvram_trace_index].end_time = ust_get_current_time();
360 nvram_access_trace.reset_trace[nvram_trace_index].ret_value = NVRAM_IO_ERRNO_INVALID_LID;
361 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s->LID 0x%04X NVRAM_IO_ERRNO_INVALID_LID \r\n",__FUNCTION__,nvram_reset_req->LID);
362 nvram_reset_confirm(ilm_ptr->src_mod_id, NVRAM_IO_ERRNO_INVALID_LID, nvram_reset_req);
363 return;
364 }
365
366 /* In Meta mode, we cannot access the data belongs to custom sensitve area
367 we also cannot reset the important data to prevent security problem */
368
369
370 if (NVRAM_IS_CATEGORY_IMPORTANT(ldi->category)
371 || NVRAM_IS_CATEGORY_IMPORTANT_L4(ldi->category)
372 #if defined(__NVRAM_CUSTOM_SENSITIVE__) || defined(__NVRAM_CUSTOM_DISK__)
373 || NVRAM_IS_CATEGORY_CUSTOM_SENSITIVE(ldi->category)
374 || NVRAM_IS_CATEGORY_CUSTOM_DISK(ldi->category)
375 #endif
376 )
377 {
378 if (FACTORY_BOOT == kal_query_boot_mode() && ilm_ptr->src_mod_id == MOD_FT)
379 {
380 nvram_access_trace.reset_trace[nvram_trace_index].end_time = ust_get_current_time();
381 nvram_access_trace.reset_trace[nvram_trace_index].ret_value = NVRAM_IO_ERRNO_ACCESS_DENIED;
382 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s LID 0x%04X NVRAM_IO_ERRNO_ACCESS_DENIED \r\n",__FUNCTION__,nvram_reset_req->LID);
383 nvram_reset_confirm(ilm_ptr->src_mod_id, NVRAM_IO_ERRNO_ACCESS_DENIED, nvram_reset_req);
384 return;
385 }
386 }
387 }
388
389 if (nvram_reset_data_items(nvram_reset_req->reset_category, nvram_reset_req->app_id, ldi, nvram_reset_req->rec_index, nvram_reset_req->rec_amount) == KAL_TRUE)
390 {
391 if(nvram_ptr->state == NVRAM_STATE_READY)
392 {
393 memcpy(&tmp_ldi,ldi,sizeof(nvram_ltable_entry_struct));
394 mcf_do_ota_by_lid(nvram_reset_req->LID,nvram_reset_req->rec_index, nvram_reset_req->rec_amount,&tmp_ldi);
395 }
396 nvram_access_trace.reset_trace[nvram_trace_index].end_time = ust_get_current_time();
397 nvram_access_trace.reset_trace[nvram_trace_index].ret_value = NVRAM_ERRNO_SUCCESS;
398 nvram_reset_confirm(ilm_ptr->src_mod_id, NVRAM_ERRNO_SUCCESS, nvram_reset_req);
399 }
400 else
401 {
402 nvram_access_trace.reset_trace[nvram_trace_index].end_time = ust_get_current_time();
403 nvram_access_trace.reset_trace[nvram_trace_index].ret_value = NVRAM_ERRNO_FAIL;
404 nvram_reset_confirm(ilm_ptr->src_mod_id, NVRAM_ERRNO_FAIL, nvram_reset_req);
405 }
406 }
407 /* State error */
408 else
409 {
410 MD_TRC_ERROR_NVRAM_STATE();
411 nvram_access_trace.reset_trace[nvram_trace_index].end_time = ust_get_current_time();
412 nvram_access_trace.reset_trace[nvram_trace_index].ret_value = NVRAM_ERRNO_NOT_READY;
413 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s->LID 0x%04X NVRAM_ERRNO_NOT_READY \r\n",__FUNCTION__,nvram_reset_req->LID);
414 nvram_reset_confirm(ilm_ptr->src_mod_id, NVRAM_ERRNO_FAIL, nvram_reset_req);
415 }
416 }
417} /* end of nvram_reset_handler */
418
419
420/*****************************************************************************
421 * FUNCTION
422 * nvram_reset_confirm
423 * DESCRIPTION
424 * This is nvram_reset_confirm() function of NVRAM module.
425 * PARAMETERS
426 * dest_id [IN]
427 * result [IN]
428 * nvram_reset_req [?]
429 * ilm_ptr(?) [IN] The primitives
430 * RETURNS
431 * void
432 *****************************************************************************/
433static void nvram_reset_confirm(module_type dest_id, nvram_errno_enum result, nvram_reset_req_struct *nvram_reset_req)
434{
435 /*----------------------------------------------------------------*/
436 /* Local Variables */
437 /*----------------------------------------------------------------*/
438 nvram_reset_cnf_struct *nvram_reset_cnf;
439
440 /*----------------------------------------------------------------*/
441 /* Code Body */
442 /*----------------------------------------------------------------*/
443 MD_TRC_FUNC_NVRAM_RESET_CNF(result);
444 nvram_reset_cnf = (nvram_reset_cnf_struct*) construct_local_para(sizeof(nvram_reset_cnf_struct), TD_CTRL);
445
446
447 nvram_reset_cnf->result = result;
448 nvram_reset_cnf->access_id = nvram_reset_req->access_id;
449
450 nvram_send_ilm(dest_id, MSG_ID_NVRAM_RESET_CNF, nvram_reset_cnf, NULL);
451
452 return;
453} /* end of nvram_reset_confirm */
454
455
456/*****************************************************************************
457 * FUNCTION
458 * nvram_set_lock_handler
459 * DESCRIPTION
460 * This is nvram_set_lock_handler() function of NVRAM module.
461 * PARAMETERS
462 * ilm_ptr [IN] The primitives
463 * RETURNS
464 * void
465 *****************************************************************************/
466void nvram_set_lock_handler(ilm_struct *ilm_ptr)
467{
468 /*----------------------------------------------------------------*/
469 /* Local Variables */
470 /*----------------------------------------------------------------*/
471 kal_bool lock_state = nvram_ptr->lock;
472 nvram_set_lock_req_struct *nvram_set_lock_req = (nvram_set_lock_req_struct*) ilm_ptr->local_para_ptr;
473 #ifdef __NVRAM_OTP__
474 kal_int32 result = 0;
475 #endif
476 /*----------------------------------------------------------------*/
477 /* Code Body */
478 /*----------------------------------------------------------------*/
479 if (nvram_ptr->dev_broken)
480 {
481 nvram_set_lock_confirm(ilm_ptr->src_mod_id, NVRAM_ERRNO_INVALID, nvram_set_lock_req);
482 }
483 else
484 {
485 if ((nvram_set_lock_req->lock_en == NVRAM_LOCK_ENABLE && lock_state == KAL_TRUE) ||
486 (nvram_set_lock_req->lock_en == NVRAM_LOCK_DISABLE && lock_state == KAL_FALSE))
487 {
488 nvram_set_lock_confirm(ilm_ptr->src_mod_id, NVRAM_ERRNO_SUCCESS, nvram_set_lock_req);
489 return;
490 }
491 else if (nvram_set_lock_req->lock_en == NVRAM_LOCK_TEMP_DISABLE)
492 {
493 #ifdef __NVRAM_IMEI_UNLOCK_DISABLE__
494 nvram_set_lock_confirm(ilm_ptr->src_mod_id, NVRAM_ERRNO_FAIL, nvram_set_lock_req);
495 #else
496 nvram_ptr->lock = KAL_FALSE;
497 if(nvram_ee_info != NULL){
498 nvram_ee_info->nvram_init_context.lock = nvram_ptr->lock;
499 }
500 nvram_set_lock_confirm(ilm_ptr->src_mod_id, NVRAM_ERRNO_SUCCESS, nvram_set_lock_req);
501 return;
502 #endif
503 }
504 #ifdef __NVRAM_OTP__
505 else if (nvram_set_lock_req->lock_en == NVRAM_LOCK_OTP)
506 {
507 NVRAM_FS_START(FS_OP_OTPLOCK);
508 result = FS_OTPLock(FS_DEVICE_TYPE_NOR);
509 NVRAM_FS_END(FS_OP_OTPLOCK,result);
510 if(result == FS_NO_ERROR)
511 {
512 nvram_set_lock_confirm(ilm_ptr->src_mod_id, NVRAM_ERRNO_SUCCESS, nvram_set_lock_req);
513 }
514 else
515 {
516 nvram_set_lock_confirm(ilm_ptr->src_mod_id, NVRAM_ERRNO_FAIL, nvram_set_lock_req);
517 }
518 return;
519 }
520 #endif /* __NVRAM_OTP__ */
521
522 if (nvram_set_lock_req->lock_en == NVRAM_LOCK_ENABLE)
523 {
524 nvram_write_system_record(NVRAM_LOCK_ENABLE);
525 nvram_set_lock_confirm(ilm_ptr->src_mod_id, NVRAM_ERRNO_SUCCESS, nvram_set_lock_req);
526 }
527 else if (nvram_set_lock_req->lock_en == NVRAM_LOCK_DISABLE)
528 {
529 #ifdef __NVRAM_IMEI_UNLOCK_DISABLE__
530 nvram_set_lock_confirm(ilm_ptr->src_mod_id, NVRAM_ERRNO_FAIL, nvram_set_lock_req);
531 #else
532 nvram_write_system_record(NVRAM_LOCK_DISABLE);
533 nvram_set_lock_confirm(ilm_ptr->src_mod_id, NVRAM_ERRNO_SUCCESS, nvram_set_lock_req);
534 #endif
535 }
536 else
537 {
538 /* Invalid parameter */
539 nvram_set_lock_confirm(ilm_ptr->src_mod_id, NVRAM_ERRNO_INVALID, nvram_set_lock_req);
540 return;
541 }
542
543 }
544}
545
546
547/*****************************************************************************
548 * FUNCTION
549 * nvram_set_lock_confirm
550 * DESCRIPTION
551 * This is nvram_set_lock_confirm() function of NVRAM module.
552 * PARAMETERS
553 * dest_id [IN]
554 * result [IN]
555 * nvram_set_lock_req [?]
556 * ilm_ptr(?) [IN] The primitives
557 * RETURNS
558 * void
559 *****************************************************************************/
560static void nvram_set_lock_confirm(module_type dest_id,
561 nvram_errno_enum result,
562 nvram_set_lock_req_struct *nvram_set_lock_req)
563{
564 /*----------------------------------------------------------------*/
565 /* Local Variables */
566 /*----------------------------------------------------------------*/
567 nvram_set_lock_cnf_struct *nvram_set_lock_cnf;
568
569 /*----------------------------------------------------------------*/
570 /* Code Body */
571 /*----------------------------------------------------------------*/
572 nvram_set_lock_cnf = (nvram_set_lock_cnf_struct*) construct_local_para(sizeof(nvram_set_lock_cnf_struct), TD_CTRL);
573
574 nvram_set_lock_cnf->result = result;
575
576 nvram_send_ilm(dest_id, MSG_ID_NVRAM_SET_LOCK_CNF, nvram_set_lock_cnf, NULL);
577
578 return;
579
580}
581
582
583/*****************************************************************************
584 * FUNCTION
585 * nvram_suspend_handler
586 * DESCRIPTION
587 * This is the handler to handle MSG_ID_NVRAM_SUSPEND_REQ
588 * After nvram receive this request, it will be suspend forever now.
589 * PARAMETERS
590 * ilm_ptr [IN] the message content
591 * RETURNS
592 * void
593 *****************************************************************************/
594void nvram_suspend_handler(ilm_struct *ilm_ptr)
595{
596 /*----------------------------------------------------------------*/
597 /* Local Variables */
598 /*----------------------------------------------------------------*/
599 nvram_suspend_req_struct *nvram_suspend_req = (nvram_suspend_req_struct*) ilm_ptr->local_para_ptr;
600 nvram_suspend_cnf_struct *nvram_suspend_cnf;
601
602 /*----------------------------------------------------------------*/
603 /* Code Body */
604 /*----------------------------------------------------------------*/
605
606 nvram_suspend_cnf = (nvram_suspend_cnf_struct*) construct_local_para(sizeof(nvram_suspend_cnf_struct), TD_CTRL);
607
608 nvram_suspend_cnf->result = NVRAM_ERRNO_SUCCESS;
609
610 nvram_send_ilm(ilm_ptr->src_mod_id, MSG_ID_NVRAM_SUSPEND_CNF, nvram_suspend_cnf, NULL);
611
612 if (nvram_suspend_req == NULL || nvram_suspend_req->suspend_time == 0)
613 {
614 while(1)
615 {
616 kal_sleep_task(kal_milli_secs_to_ticks(500));
617 }
618 }
619 else
620 {
621 kal_sleep_task(kal_milli_secs_to_ticks(5*nvram_suspend_req->suspend_time));
622 }
623
624 return;
625}