blob: 659540d8497b112779b0ee9172da070e292569bb [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 * nvram_unzip.c
40 *
41 * Project:
42 * --------
43 * MAUI
44 *
45 * Description:
46 * ------------
47 * nvram default value unzip interface, the zilb working buffer is form PLUTOMMI,
48 * so this feature only can be supported on PLUTOMMI right now.
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 *
67 * removed!
68 * removed!
69 * removed!
70 *
71 * removed!
72 * removed!
73 * removed!
74 *
75 * removed!
76 * removed!
77 * removed!
78 *
79 * removed!
80 * removed!
81 * removed!
82 *
83 * removed!
84 * removed!
85 * removed!
86 *
87 * removed!
88 * removed!
89 * removed!
90 *
91 * removed!
92 * removed!
93 * removed!
94 *
95 * removed!
96 * removed!
97 * removed!
98 *
99 * removed!
100 * removed!
101 * removed!
102 *
103 * removed!
104 *
105 *------------------------------------------------------------------------------
106 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
107 *============================================================================
108 ****************************************************************************/
109#ifdef __NVRAM_COMPRESS_SUPPORT__
110
111/*****************************************************************************
112 * Header file
113 *****************************************************************************/
114#include "kal_general_types.h"
115#include "kal_trace.h"
116
117#include "nvram_defs.h"
118#include "nvram_trc.h"
119#include "nvram_util.h"
120
121#include "app_zlib.h"
122#include "simple_memory_manager.h"
123#include "nvram_default_value.h"
124#include "nvram_enums.h"
125#include "nvram_main.h"
126
127/*****************************************************************************
128 * Typedef
129 *****************************************************************************/
130typedef enum{
131 RET_OK,
132 RET_STOP,
133 RET_OOM,
134 RET_TOTAL
135 }Ret;
136
137typedef Ret (*visit_funcptr)(void *data, void* usr_data);
138
139/*****************************************************************************
140 * Define
141 *****************************************************************************/
142#ifndef NVRAM_DEBUG
143#define NVRAM_UNZIP_LOG0(grp) NVRAM_LOG0(TRACE_FUNC, grp);
144#define NVRAM_UNZIP_LOG1(grp, x) NVRAM_LOG1(TRACE_FUNC, grp, x);
145#define NVRAM_UNZIP_LOG3(grp, x1, x2, x3) NVRAM_LOG3(TRACE_FUNC, grp, x1, x2, x3);
146#else
147#define NVRAM_UNZIP_LOG0(grp) nvram_trace_to_file(__LINE__, 0, 0, 308);
148#define NVRAM_UNZIP_LOG1(grp, x) nvram_trace_to_file(__LINE__, x, 0, 308);
149#define NVRAM_UNZIP_LOG3(grp, x1, x2, x3) nvram_trace_to_file(__LINE__, x1, x2, x3);
150#endif
151
152#define NVRAM_ZLIB_BUFF_SIZE (80*1024)
153#define RETURN_IF_FAIL(p) if(!(p)){NVRAM_UNZIP_LOG1(ABNORMAL_RETURN, __LINE__); return;}
154#define RETURN_VAL_IF_FAIL(p, val) if(!(p)){NVRAM_UNZIP_LOG1(ABNORMAL_RETURN, __LINE__); return val;}
155
156#define CONV_4BYTES_TO_INT(b, i) (i = ((b[0] << 24) + (b[1] << 16) + (b[2] << 8) + b[3]))
157#define CONV_INT_TO_4BYTES(b, i) \
158 b[0] = (kal_uint8)(i >> 24); \
159 b[1] = (kal_uint8)(i >> 16); \
160 b[2] = (kal_uint8)(i >> 8); \
161 b[3] = (kal_uint8)i;
162
163
164#define NVRAM_UNZIP_BUFFER_SIZE (NVRAM_MAX_DEFAULE_VALUE_SIZE + 32)
165
166/*****************************************************************************
167 * Global Variables
168 *****************************************************************************/
169
170
171/*****************************************************************************
172 * Global Function
173 *****************************************************************************/
174/* Before MMI task init, we can use this pool */
175extern kal_uint8* mmi_frm_scrmem_get_pool(kal_uint32 *size);
176
177/*****************************************************************************
178 * Local Variables
179 *****************************************************************************/
180
181static STSMM nvram_unzip_smm;
182static kal_uint32 g_nvram_curr_lid;
183
184/*****************************************************************************
185 * Local Function
186 *****************************************************************************/
187static void *nvram_unzip_mem_malloc(void *opaque, kal_uint32 items, kal_uint32 size);
188static void nvram_unzip_mem_free(void *opaque, void *address);
189
190/*****************************************************************************
191 * FUNCTION
192* nvram_unzip_org_size
193 * DESCRIPTION
194* To check whether the entry can be compressed
195 * PARAMETERS
196* entry [IN] the logical table
197 * RETURNS
198 * kal_bool
199 *****************************************************************************/
200kal_uint32 nvram_unzip_org_size(const ltable_entry_struct *entry)
201{
202 /*----------------------------------------------------------------*/
203 /* Local Variables */
204 /*----------------------------------------------------------------*/
205
206 /*----------------------------------------------------------------*/
207 /* Code Body */
208 /*----------------------------------------------------------------*/
209 RETURN_VAL_IF_FAIL(entry != NULL, KAL_FALSE);
210
211 g_nvram_curr_lid = entry->LID;
212 if (NVRAM_IS_ATTR_MULTI_DEFAULT(entry->attr))
213 {
214 return (entry->size * entry->total_records);
215 }
216
217 return entry->size;
218}
219
220/*****************************************************************************
221 * FUNCTION
222 * nvram_unzip_default_value
223 * DESCRIPTION
224 *
225 * PARAMETERS
226 * unzip_buffer [OUT] just a pointer, the memory will be keep at working buffer.
227 * unzip_size [OUT]
228 * buffer [IN]
229 * RETURNS
230 * void
231 *****************************************************************************/
232void nvram_unzip_default_value(kal_uint8 **unzip_buffer, kal_uint32 *unzip_size, kal_uint8 const *buffer)
233{
234 /*----------------------------------------------------------------*/
235 /* Local Variables */
236 /*----------------------------------------------------------------*/
237 kal_uint32 out_size;
238 kal_int32 ret, i;
239 kal_uint32 compress_len;
240 kal_uint32 buffer_len;
241 kal_uint8 *out_ptr;
242
243 /*----------------------------------------------------------------*/
244 /* Code Body */
245 /*----------------------------------------------------------------*/
246 RETURN_IF_FAIL(unzip_buffer != NULL);
247 RETURN_IF_FAIL(buffer != NULL);
248
249 out_ptr = mmi_frm_scrmem_get_pool(&buffer_len);
250 smmInit(&nvram_unzip_smm, out_ptr + NVRAM_UNZIP_BUFFER_SIZE, buffer_len);
251
252 CONV_4BYTES_TO_INT(buffer, compress_len);
253 NVRAM_EXT_ASSERT(buffer_len > compress_len,(kal_uint32)buffer_len,NVRAM_LOC_BUFFER_SIZE_NOT_ENOUGH_4, compress_len);
254
255 out_size = NVRAM_UNZIP_BUFFER_SIZE;
256
257 ret = uncompress_mtk(out_ptr,
258 (uLongf *)&out_size,
259 buffer + 4, /* sizeof(kal_uint32) = 4*/
260 compress_len,
261 nvram_unzip_mem_malloc,
262 nvram_unzip_mem_free);
263
264 NVRAM_UNZIP_LOG3(UNZIP_RESULT, compress_len, out_size, ret);
265
266 NVRAM_EXT_ASSERT (ret == Z_OK, ret, NVRAM_LOC_ACCESS_UNCOMPRESS_FILE_FAIL_1, g_nvram_curr_lid);
267
268 /* user prepare the output buffer by themselves */
269 if (*unzip_size && *unzip_buffer)
270 {
271 NVRAM_EXT_ASSERT(*unzip_size == out_size, *unzip_size, NVRAM_LOC_BUFFER_SIZE_NOT_ENOUGH_5, out_size);
272 kal_mem_cpy(*unzip_buffer, out_ptr, out_size);
273 }
274 else
275 {
276 *unzip_size = out_size;
277 *unzip_buffer = out_ptr;
278 }
279}
280
281
282/*****************************************************************************
283* FUNCTION
284* nvram_unzip_check
285* DESCRIPTION
286* To check whether the entry can be compressed
287* PARAMETERS
288* entry [IN] the logical table
289* RETURNS
290* kal_bool
291*****************************************************************************/
292kal_bool nvram_unzip_check(const ltable_entry_struct *entry)
293{
294 /*----------------------------------------------------------------*/
295 /* Local Variables */
296 /*----------------------------------------------------------------*/
297
298 /*----------------------------------------------------------------*/
299 /* Code Body */
300 /*----------------------------------------------------------------*/
301 RETURN_VAL_IF_FAIL(entry != NULL, KAL_FALSE);
302
303 /* No data */
304 if (entry->LID == 0 ||
305 entry->size == 0 ||
306 entry->total_records == 0)
307 {
308 return KAL_FALSE;
309 }
310
311 /* always compress custpack entry */
312 if (NVRAM_IS_CATEGORY_CUSTPACK(entry->category) ||
313 NVRAM_IS_ATTR_ZIP_DEFAULT(entry->attr))
314 {
315 return KAL_TRUE;
316 }
317
318 return KAL_FALSE;
319}
320
321
322/*****************************************************************************
323 * FUNCTION
324 * nvram_unzip_mem_malloc
325 * DESCRIPTION
326 *
327 * PARAMETERS
328 * opaque [IN]
329 * items [IN]
330 * size [IN]
331 * RETURNS
332 * void
333 *****************************************************************************/
334static void *nvram_unzip_mem_malloc(void *opaque, kal_uint32 items, kal_uint32 size)
335{
336 /*----------------------------------------------------------------*/
337 /* Local Variables */
338 /*----------------------------------------------------------------*/
339 unsigned int total_bytes;
340 void *buffer_ptr;
341
342 /*----------------------------------------------------------------*/
343 /* Code Body */
344 /*----------------------------------------------------------------*/
345 if (opaque)
346 {
347 items += size - size; /// make compiler happy
348 }
349 total_bytes = items * size;
350
351#if 1
352 buffer_ptr = smmMallocAligned(&nvram_unzip_smm, total_bytes, 4);
353#else
354/* under construction !*/
355#endif
356
357 return buffer_ptr;
358}
359
360
361/*****************************************************************************
362 * FUNCTION
363 * nvram_unzip_mem_free
364 * DESCRIPTION
365 *
366 * PARAMETERS
367 * opaque [IN]
368 * address [IN]
369 * RETURNS
370 * void
371 *****************************************************************************/
372static void nvram_unzip_mem_free(void *opaque, void *address)
373{
374 /*----------------------------------------------------------------*/
375 /* Local Variables */
376 /*----------------------------------------------------------------*/
377
378 /*----------------------------------------------------------------*/
379 /* Code Body */
380 /*----------------------------------------------------------------*/
381 return;
382}
383
384#endif /* __NVRAM_COMPRESS_SUPPORT__ */
385