1 /*
2  * Copyright (c) 2001-2019, Arm Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <stddef.h>
8 #include <stdint.h>
9 #include <string.h>
10 #include <stdbool.h>
11 
12 #include "cc_otp_defs.h"
13 #include "cc_regs.h"
14 #include "dx_crys_kernel.h"
15 #include "cc_pal_types.h"
16 
17 #include "test_proj_otp.h"
18 #include "test_proj_defs.h"
19 #include "test_proj_otp.h"
20 
21 #include "test_pal_log.h"
22 #include "test_pal_time.h"
23 
Test_ProjWriteOtpWord(uint32_t offsetInWords,uint32_t value)24 void Test_ProjWriteOtpWord(uint32_t offsetInWords, uint32_t value)
25 {
26     TEST_WRITE_OTP_BY_ENV(offsetInWords, value);
27 }
28 
Test_ProjWriteOtpField(uint32_t offsetInWords,uint32_t sizeWords,uint32_t * buff)29 void Test_ProjWriteOtpField(uint32_t offsetInWords, uint32_t sizeWords, uint32_t *buff)
30 {
31     uint32_t i = 0;
32 
33     for (i = 0; i < sizeWords; i++) {
34         Test_ProjWriteOtpWord(offsetInWords + i, buff[i]);
35         Test_PalDelay(1000);
36     }
37 }
38 
Test_ProjReadOtpWord(uint32_t offsetInWords)39 uint32_t Test_ProjReadOtpWord(uint32_t offsetInWords)
40 {
41     uint32_t read_value = 0;
42 
43     read_value = TEST_READ_OTP_BY_ENV(offsetInWords);
44 
45     return read_value;
46 }
47 
Test_ProjSetZeroBitsOtpBuff(uint32_t * otpBuf,uint32_t keyType,uint32_t value)48 uint32_t Test_ProjSetZeroBitsOtpBuff(uint32_t *otpBuf, uint32_t keyType, uint32_t value)
49 {
50     uint32_t hwWord;
51 
52     switch (keyType) {
53         case TEST_KCP_KEY:
54             hwWord = otpBuf[CC_OTP_OEM_FLAG_OFFSET];
55             CC_REG_FLD_SET2(0, OTP_OEM_FLAG, KCP_ZERO_BITS, hwWord, value);
56             otpBuf[CC_OTP_OEM_FLAG_OFFSET] = hwWord;
57             break;
58         case TEST_KCE_KEY:
59             hwWord = otpBuf[CC_OTP_OEM_FLAG_OFFSET];
60             CC_REG_FLD_SET2(0, OTP_OEM_FLAG, KCE_ZERO_BITS, hwWord, value);
61             otpBuf[CC_OTP_OEM_FLAG_OFFSET] = hwWord;
62             break;
63         case TEST_KPICV_KEY:
64             hwWord = otpBuf[CC_OTP_MANUFACTURE_FLAG_OFFSET];
65             CC_REG_FLD_SET2(0, OTP_MANUFACTURE_FLAG, KPICV_ZERO_BITS, hwWord, value);
66             otpBuf[CC_OTP_MANUFACTURE_FLAG_OFFSET] = hwWord;
67             break;
68         case TEST_KCEICV_KEY:
69             hwWord = otpBuf[CC_OTP_MANUFACTURE_FLAG_OFFSET];
70             CC_REG_FLD_SET2(0, OTP_MANUFACTURE_FLAG, KCEICV_ZERO_BITS, hwWord, value);
71             otpBuf[CC_OTP_MANUFACTURE_FLAG_OFFSET] = hwWord;
72             break;
73         case TEST_HUK_KEY:
74             hwWord = otpBuf[CC_OTP_MANUFACTURE_FLAG_OFFSET];
75             CC_REG_FLD_SET2(0, OTP_MANUFACTURE_FLAG, HUK_ZERO_BITS, hwWord, value);
76             otpBuf[CC_OTP_MANUFACTURE_FLAG_OFFSET] = hwWord;
77             break;
78         default:
79             TEST_PRINTF_ERROR("ERROR: can't set zero bits for this type of key\n")
80             ;
81             return TEST_INVALID_PARAM_ERR;
82     }
83     return TEST_OK;
84 }
85 
Test_ProjSetNotInUseOtpBuff(uint32_t * otpBuf,uint32_t keyType,uint32_t value)86 uint32_t Test_ProjSetNotInUseOtpBuff(uint32_t *otpBuf, uint32_t keyType, uint32_t value)
87 {
88     uint32_t hwWord;
89 
90     switch (keyType) {
91         // TBD HBK
92         case TEST_KCP_KEY:
93             hwWord = otpBuf[CC_OTP_OEM_FLAG_OFFSET];
94             CC_REG_FLD_SET2(0, OTP_OEM_FLAG, KCP_NOT_IN_USE, hwWord, value);
95             otpBuf[CC_OTP_OEM_FLAG_OFFSET] = hwWord;
96             break;
97         case TEST_KCE_KEY:
98             hwWord = otpBuf[CC_OTP_OEM_FLAG_OFFSET];
99             CC_REG_FLD_SET2(0, OTP_OEM_FLAG, KCE_NOT_IN_USE, hwWord, value);
100             otpBuf[CC_OTP_OEM_FLAG_OFFSET] = hwWord;
101             break;
102         case TEST_KPICV_KEY:
103             hwWord = otpBuf[CC_OTP_MANUFACTURE_FLAG_OFFSET];
104             CC_REG_FLD_SET2(0, OTP_MANUFACTURE_FLAG, KPICV_NOT_IN_USE, hwWord, value);
105             otpBuf[CC_OTP_MANUFACTURE_FLAG_OFFSET] = hwWord;
106             break;
107         case TEST_KCEICV_KEY:
108             hwWord = otpBuf[CC_OTP_MANUFACTURE_FLAG_OFFSET];
109             CC_REG_FLD_SET2(0, OTP_MANUFACTURE_FLAG, KCEICV_NOT_IN_USE, hwWord, value);
110             otpBuf[CC_OTP_MANUFACTURE_FLAG_OFFSET] = hwWord;
111             break;
112         case TEST_HUK_KEY:
113         default:
114             TEST_PRINTF_ERROR("ERROR: can't set notInUse bit for this type of key\n")
115             ;
116             return TEST_INVALID_PARAM_ERR;
117 
118     }
119     return TEST_OK;
120 }
121 
Test_ProjSetKeyOtpBuff(uint32_t * otpBuf,uint32_t * keyBuff,uint32_t keyType)122 uint32_t Test_ProjSetKeyOtpBuff(uint32_t *otpBuf, uint32_t *keyBuff, uint32_t keyType)
123 {
124     uint32_t zeroCount = 0;
125     uint32_t keySizeInWords = 0;
126     uint32_t keyOffsetInOtp = 0;
127     uint32_t rc = TEST_OK;
128 
129     switch (keyType) {
130         case TEST_HUK_KEY:
131             keySizeInWords = CC_OTP_HUK_SIZE_IN_WORDS;
132             keyOffsetInOtp = CC_OTP_HUK_OFFSET;
133             break;
134         case TEST_KCP_KEY:
135             keySizeInWords = CC_OTP_KCP_SIZE_IN_WORDS;
136             keyOffsetInOtp = CC_OTP_KCP_OFFSET;
137             break;
138         case TEST_KCE_KEY:
139             keySizeInWords = CC_OTP_KCE_SIZE_IN_WORDS;
140             keyOffsetInOtp = CC_OTP_KCE_OFFSET;
141             break;
142         case TEST_KPICV_KEY:
143             keySizeInWords = CC_OTP_KPICV_SIZE_IN_WORDS;
144             keyOffsetInOtp = CC_OTP_KPICV_OFFSET;
145             break;
146         case TEST_KCEICV_KEY:
147             keySizeInWords = CC_OTP_KCEICV_SIZE_IN_WORDS;
148             keyOffsetInOtp = CC_OTP_KCEICV_OFFSET;
149             break;
150         default:
151             TEST_PRINTF_ERROR("ERROR: key type is not supported %d\n", keyType);
152             return TEST_INVALID_PARAM_ERR;
153 
154     }
155 
156     if (keyBuff != NULL) {
157         memcpy((uint8_t *) (otpBuf + keyOffsetInOtp),
158                (uint8_t *) keyBuff,
159                keySizeInWords * sizeof(uint32_t));
160     }
161 
162     TEST_CALC_BUFF_ZEROS((otpBuf + keyOffsetInOtp), keySizeInWords, zeroCount);
163 
164     if (keyType != TEST_HUK_KEY) {
165         rc = Test_ProjSetNotInUseOtpBuff(otpBuf, keyType, 0);
166     }
167 
168     rc = rc & Test_ProjSetZeroBitsOtpBuff(otpBuf, keyType, zeroCount);
169     return rc;
170 }
171 
Test_ProjBurnOtpPlain(uint32_t * otpBuf,uint32_t nextLcs,OtpChipState_t chipIndication)172 uint32_t Test_ProjBurnOtpPlain(uint32_t *otpBuf, uint32_t nextLcs, OtpChipState_t chipIndication)
173 {
174 
175     uint32_t error = 0;
176     uint32_t i = 0;
177 
178     CC_UNUSED_PARAM(chipIndication);
179 
180     /* Clean OTP */
181     for (i = 0; i < TEST_OTP_SIZE_IN_WORDS; i++) {
182         Test_ProjWriteOtpWord(i, 0);
183         Test_PalDelay(1000);
184     }
185     /* Perform SW reset to reach CM LCS */
186     Test_ProjPerformPowerOnReset();
187     Test_PalDelay(1000);
188 
189     /* Copy new OTP buffer */
190     for (i = 0; i < TEST_OTP_SIZE_IN_WORDS; i++) {
191         TEST_PRINTF("writing Otp [0x%X] 0x%X", i, otpBuf[i]);
192         Test_ProjWriteOtpWord(i, otpBuf[i]);
193         Test_PalDelay(1000);
194     }
195 
196     /*  Perform SW reset after writing to OTP new values */
197     Test_ProjPerformPowerOnReset();
198 
199     /* verify LCS */
200     error = Test_ProjCheckLcs(nextLcs);
201     if (error == 0) {
202         TEST_PRINTF(" OTP burn succeeded with new LCS = 0x%02x \n", nextLcs);
203     } else {
204         TEST_PRINTF_ERROR("Error: Failed to burn OTP!!\n");
205     }
206 
207     return error;
208 }
209 
Test_ProjBurnOtp(uint32_t * otpBuf,uint32_t nextLcs,OtpChipState_t chipIndication)210 uint32_t Test_ProjBurnOtp(uint32_t *otpBuf, uint32_t nextLcs, OtpChipState_t chipIndication)
211 {
212 
213     uint32_t error = 0;
214     uint32_t i = 0;
215 
216     if (nextLcs != TEST_PROJ_LCS_CM) {
217         for (i = TEST_HUK_KEY; i <= TEST_KCEICV_KEY; i++) {
218             /* rtl key is not a part of OTP image => skip it */
219             if (i == TEST_RTL_KEY) {
220                 continue;
221             };
222             /* set the the key to OTP buffer*/
223             Test_ProjSetKeyOtpBuff(otpBuf, NULL, i);
224         }
225     }
226 
227     error = Test_ProjBurnOtpPlain(otpBuf, nextLcs, chipIndication);
228 
229     return error;
230 }
231 
Test_ProjBurnCmOtp(OtpChipState_t chipIndication)232 uint32_t Test_ProjBurnCmOtp(OtpChipState_t chipIndication)
233 {
234 
235     uint32_t error = 0;
236     uint32_t i = 0;
237 
238     CC_UNUSED_PARAM(chipIndication);
239 
240     /* Clean OTP */
241     for (i = 0; i < TEST_OTP_SIZE_IN_WORDS; i++) {
242         TEST_WRITE_OTP_BY_ENV(i, 0);
243         Test_PalDelay(1000);
244     }
245 
246     /*  Perform SW reset after writing to OTP new values */
247     Test_ProjPerformPowerOnReset();
248 
249     /* verify LCS */
250     error = Test_ProjCheckLcs(TEST_PROJ_LCS_CM);
251     if (error == 0) {
252         TEST_PRINTF(" OTP burn succeeded with TEST_PROJ_LCS_DM\n");
253     } else {
254         TEST_PRINTF_ERROR("Error: Failed to burn OTP!!\n");
255     }
256 
257     return error;
258 }
259 
Test_ProjBurnDmOtp(uint32_t * otpBuf,OtpChipState_t chipIndication)260 uint32_t Test_ProjBurnDmOtp(uint32_t *otpBuf, OtpChipState_t chipIndication)
261 {
262 
263     uint32_t error = 0;
264     uint32_t i = 0;
265 
266     CC_UNUSED_PARAM(chipIndication);
267 
268     /* Clean OTP */
269     for (i = 0; i < TEST_OTP_SIZE_IN_WORDS; i++) {
270         TEST_WRITE_OTP_BY_ENV(i, 0);
271         Test_PalDelay(1000);
272     }
273 
274     /* Perform SW reset to reach CM LCS */
275     Test_ProjPerformPowerOnReset();
276     Test_PalDelay(1000);
277 
278     /* Prepare OTP */
279     Test_ProjSetKeyOtpBuff(otpBuf, NULL, TEST_HUK_KEY);
280     Test_ProjSetKeyOtpBuff(otpBuf, NULL, TEST_KPICV_KEY);
281     Test_ProjSetKeyOtpBuff(otpBuf, NULL, TEST_KCEICV_KEY);
282 
283     /* Copy new OTP buffer */
284     Test_ProjWriteOtpField(CC_OTP_HUK_OFFSET, CC_OTP_HUK_SIZE_IN_WORDS, &otpBuf[CC_OTP_HUK_OFFSET]);
285     Test_ProjWriteOtpField(CC_OTP_KPICV_OFFSET,
286                            CC_OTP_KPICV_SIZE_IN_WORDS,
287                            &otpBuf[CC_OTP_KPICV_OFFSET]);
288     Test_ProjWriteOtpField(CC_OTP_KCEICV_OFFSET,
289                            CC_OTP_KCEICV_SIZE_IN_WORDS,
290                            &otpBuf[CC_OTP_KCEICV_OFFSET]);
291     Test_ProjWriteOtpField(CC_OTP_MANUFACTURE_FLAG_OFFSET,
292                            1,
293                            &otpBuf[CC_OTP_MANUFACTURE_FLAG_OFFSET]);
294     Test_ProjWriteOtpField(CC_OTP_HBK0_OFFSET,
295                            CC_OTP_HBK0_SIZE_IN_WORDS,
296                            &otpBuf[CC_OTP_HBK0_OFFSET]);
297     Test_ProjWriteOtpField(CC_OTP_HBK0_MIN_VERSION_OFFSET,
298                            CC_OTP_HBK0_MIN_VERSION_SIZE_IN_WORDS,
299                            &otpBuf[CC_OTP_HBK0_MIN_VERSION_OFFSET]);
300     Test_ProjWriteOtpField(CC_OTP_ICV_GENERAL_PURPOSE_FLAG_OFFSET,
301                            CC_OTP_ICV_GENERAL_PURPOSE_FLAG_SIZE_IN_WORDS,
302                            &otpBuf[CC_OTP_ICV_GENERAL_PURPOSE_FLAG_OFFSET]);
303     Test_ProjWriteOtpField(CC_OTP_DCU_OFFSET, CC_OTP_DCU_SIZE_IN_WORDS, &otpBuf[CC_OTP_DCU_OFFSET]);
304 
305     /*  Perform SW reset after writing to OTP new values */
306     Test_ProjPerformPowerOnReset();
307 
308     /* verify LCS */
309     error = Test_ProjCheckLcs(TEST_PROJ_LCS_DM);
310     if (error == 0) {
311         TEST_PRINTF(" OTP burn succeeded with TEST_PROJ_LCS_DM\n");
312     } else {
313         TEST_PRINTF_ERROR("Error: Failed to burn OTP!!\n");
314     }
315 
316     return error;
317 }
318 
Test_ProjSetKdrInOtpBuff(uint32_t * otp,uint8_t * kdrBuff)319 uint32_t Test_ProjSetKdrInOtpBuff(uint32_t *otp, uint8_t *kdrBuff)
320 {
321     int i = 0;
322     int zeroCount = 0;
323     int kdrZeroSize = ((0x1 << CC_OTP_MANUFACTURE_FLAG_HUK_ZERO_BITS_BIT_SIZE) - 1);
324     int kdrZeroMask = (kdrZeroSize << CC_OTP_MANUFACTURE_FLAG_HUK_ZERO_BITS_BIT_SHIFT);
325 
326     if ((NULL == otp) || (NULL == kdrBuff)) {
327         TEST_PRINTF_ERROR(" ilegal params\n");
328         return TEST_INVALID_PARAM_ERR;
329     }
330     for (i = 0; i < CC_OTP_HUK_SIZE_IN_WORDS; i++) {
331         TEST_CONVERT_BYTE_ARR_TO_WORD(&kdrBuff[i * sizeof(uint32_t)], otp[CC_OTP_START_OFFSET+i])
332     }
333 
334     TEST_CALC_BUFF_ZEROS(&otp[CC_OTP_START_OFFSET], CC_OTP_HUK_SIZE_IN_WORDS, zeroCount);
335     otp[CC_OTP_MANUFACTURE_FLAG_OFFSET] &= ~(kdrZeroMask);
336     otp[CC_OTP_MANUFACTURE_FLAG_OFFSET] |= (zeroCount)
337                     << CC_OTP_MANUFACTURE_FLAG_HUK_ZERO_BITS_BIT_SHIFT;
338     return TEST_OK;
339 
340 }
341 
Test_ProjSetHbkInOtpBuff(uint32_t * otp,uint8_t * hbkBuff,OtpHbkTypes_t type,uint8_t isFullHbk)342 uint32_t Test_ProjSetHbkInOtpBuff(uint32_t *otp,
343                                   uint8_t *hbkBuff,
344                                   OtpHbkTypes_t type,
345                                   uint8_t isFullHbk)
346 {
347     uint32_t i = 0;
348     uint32_t zeroCount = 0;
349     uint32_t otpStartOffset =
350                     (type == TEST_OTP_HBK1_TYPE) ? CC_OTP_HBK1_OFFSET : CC_OTP_HBK0_OFFSET;
351     uint32_t hbkStartOffset = (type == TEST_OTP_HBK1_TYPE) ? CC_OTP_HBK0_SIZE_IN_WORDS : 0;
352     uint32_t hbkWordSize;
353     uint32_t hwWord = 0;
354 
355     if ((NULL == otp) || (NULL == hbkBuff)) {
356         TEST_PRINTF_ERROR("ilegal params\n");
357         return TEST_INVALID_PARAM_ERR;
358     }
359 
360     TEST_PRINTF_ERROR("type %d\n", type);
361 
362     if ((type == TEST_OTP_HBK0_TYPE) || (type == TEST_OTP_HBK1_TYPE)) {
363         hbkWordSize = CC_OTP_HBK0_SIZE_IN_WORDS;
364     } else if (type == TEST_OTP_HBK_256_TYPE) {
365         hbkWordSize = CC_OTP_HBK_SIZE_IN_WORDS;
366     } else {
367         TEST_PRINTF_ERROR("ilegal type %d\n", type);
368         return TEST_INVALID_PARAM_ERR;
369     }
370 
371     /* clear OTP HBK value */
372     memset(&otp[otpStartOffset], 0, hbkWordSize * sizeof(uint32_t));
373 
374     if (isFullHbk == 1) {
375         //clear ICV HBK zero count & clear HBK0 usage
376         otp[CC_OTP_MANUFACTURE_FLAG_OFFSET] &= ~(0x7F000000);
377         hwWord = otp[CC_OTP_MANUFACTURE_FLAG_OFFSET];
378         CC_REG_FLD_SET2(0, OTP_MANUFACTURE_FLAG, HBK0_NOT_IN_USE, hwWord, 1);
379     }
380 
381     TEST_PRINTF_ERROR("writing hbk otpStartOffset %d, hbkWordSize %d\n",
382                       otpStartOffset,
383                       hbkWordSize);
384 
385     for (i = 0; i < hbkWordSize; i++) {
386         TEST_CONVERT_BYTE_ARR_TO_WORD(&hbkBuff[(hbkStartOffset + i) * sizeof(uint32_t)],
387                                       otp[otpStartOffset + i]);
388     }
389 
390     TEST_CALC_BUFF_ZEROS(&otp[otpStartOffset], hbkWordSize, zeroCount);
391 
392     if (type == TEST_OTP_HBK0_TYPE) {
393         otp[CC_OTP_MANUFACTURE_FLAG_OFFSET] &= ~(0xFF000000);
394         otp[CC_OTP_MANUFACTURE_FLAG_OFFSET] |= (zeroCount)
395                         << CC_OTP_MANUFACTURE_FLAG_HBK0_ZERO_BITS_BIT_SHIFT;
396         TEST_PRINTF_ERROR("zeros for HBK0 %d\n", zeroCount);
397     } else {
398         otp[CC_OTP_OEM_FLAG_OFFSET] &= ~(0xFF);
399         otp[CC_OTP_OEM_FLAG_OFFSET] |= (zeroCount) << CC_OTP_OEM_FLAG_HBK1_ZERO_BITS_BIT_SHIFT;
400     }
401 
402     TEST_PRINTF_ERROR("otp[0x%lx] 0x%x, otp[0x%lx] 0x%x\n",
403                       CC_OTP_OEM_FLAG_OFFSET,
404                       otp[CC_OTP_OEM_FLAG_OFFSET],
405                       CC_OTP_MANUFACTURE_FLAG_OFFSET,
406                       otp[CC_OTP_MANUFACTURE_FLAG_OFFSET]);
407 
408     return TEST_OK;
409 }
410 
Test_ProjSetKpicvInOtpBuff(uint32_t * otpBuf,uint8_t * kpicvBuff)411 uint32_t Test_ProjSetKpicvInOtpBuff(uint32_t *otpBuf, uint8_t *kpicvBuff)
412 {
413     int zeroCount = 0;
414     uint32_t hwWord = 0;
415 
416     if ((NULL == otpBuf) || (NULL == kpicvBuff)) {
417         TEST_PRINTF_ERROR(" ilegal params\n");
418         return TEST_INVALID_PARAM_ERR;
419     }
420     memcpy((uint8_t *) (otpBuf + CC_OTP_KPICV_OFFSET),
421            (uint8_t *) kpicvBuff,
422            CC_OTP_KPICV_SIZE_IN_WORDS * sizeof(uint32_t));
423 
424     TEST_CALC_BUFF_ZEROS(&otpBuf[CC_OTP_KPICV_OFFSET], CC_OTP_KPICV_SIZE_IN_WORDS, zeroCount);
425     hwWord = otpBuf[CC_OTP_MANUFACTURE_FLAG_OFFSET];
426     CC_REG_FLD_SET2(0, OTP_MANUFACTURE_FLAG, KPICV_ZERO_BITS, hwWord, zeroCount);
427     CC_REG_FLD_SET2(0, OTP_MANUFACTURE_FLAG, KPICV_NOT_IN_USE, hwWord, 0);
428     otpBuf[CC_OTP_MANUFACTURE_FLAG_OFFSET] = hwWord;
429     return TEST_OK;
430 }
431 
Test_ProjSetKceicvOtpBuff(uint32_t * otpBuf,uint8_t * kceicvBuff)432 uint32_t Test_ProjSetKceicvOtpBuff(uint32_t *otpBuf, uint8_t *kceicvBuff)
433 {
434     int zeroCount = 0;
435     uint32_t hwWord = 0;
436 
437     if ((NULL == otpBuf) || (NULL == kceicvBuff)) {
438         TEST_PRINTF_ERROR(" ilegal params\n");
439         return TEST_INVALID_PARAM_ERR;
440     }
441     memcpy((uint8_t *) (otpBuf + CC_OTP_KCEICV_OFFSET),
442            (uint8_t *) kceicvBuff,
443            CC_OTP_KCEICV_SIZE_IN_WORDS * sizeof(uint32_t));
444 
445     TEST_CALC_BUFF_ZEROS(&otpBuf[CC_OTP_KCEICV_OFFSET], CC_OTP_KCEICV_SIZE_IN_WORDS, zeroCount);
446     hwWord = otpBuf[CC_OTP_MANUFACTURE_FLAG_OFFSET];
447     CC_REG_FLD_SET2(0, OTP_MANUFACTURE_FLAG, KCEICV_ZERO_BITS, hwWord, zeroCount);
448     CC_REG_FLD_SET2(0, OTP_MANUFACTURE_FLAG, KCEICV_NOT_IN_USE, hwWord, 0);
449     otpBuf[CC_OTP_MANUFACTURE_FLAG_OFFSET] = hwWord;
450     return TEST_OK;
451 }
452 
Test_ProjSetKcpOtpBuff(uint32_t * otpBuf,uint8_t * kcpBuff)453 uint32_t Test_ProjSetKcpOtpBuff(uint32_t *otpBuf, uint8_t *kcpBuff)
454 {
455     int zeroCount = 0;
456     uint32_t hwWord = 0;
457 
458     if ((NULL == otpBuf) || (NULL == kcpBuff)) {
459         TEST_PRINTF_ERROR(" ilegal params\n");
460         return TEST_INVALID_PARAM_ERR;
461     }
462     memcpy((uint8_t *) (otpBuf + CC_OTP_KCP_OFFSET),
463            (uint8_t *) kcpBuff,
464            CC_OTP_KCP_SIZE_IN_WORDS * sizeof(uint32_t));
465 
466     TEST_CALC_BUFF_ZEROS(&otpBuf[CC_OTP_KCP_OFFSET], CC_OTP_KCP_SIZE_IN_WORDS, zeroCount);
467     hwWord = otpBuf[CC_OTP_OEM_FLAG_OFFSET];
468     CC_REG_FLD_SET2(0, OTP_OEM_FLAG, KCP_ZERO_BITS, hwWord, zeroCount);
469     CC_REG_FLD_SET2(0, OTP_OEM_FLAG, KCP_NOT_IN_USE, hwWord, 0);
470     otpBuf[CC_OTP_OEM_FLAG_OFFSET] = hwWord;
471     return TEST_OK;
472 }
473 
Test_ProjSetKceOtpBuff(uint32_t * otpBuf,uint8_t * kceBuff)474 uint32_t Test_ProjSetKceOtpBuff(uint32_t *otpBuf, uint8_t *kceBuff)
475 {
476     int zeroCount = 0;
477     uint32_t hwWord = 0;
478 
479     if ((NULL == otpBuf) || (NULL == kceBuff)) {
480         TEST_PRINTF_ERROR(" ilegal params\n");
481         return TEST_INVALID_PARAM_ERR;
482     }
483     memcpy((uint8_t *) (otpBuf + CC_OTP_KCE_OFFSET),
484            (uint8_t *) kceBuff,
485            CC_OTP_KCE_SIZE_IN_WORDS * sizeof(uint32_t));
486 
487     TEST_CALC_BUFF_ZEROS(&otpBuf[CC_OTP_KCE_OFFSET], CC_OTP_KCE_SIZE_IN_WORDS, zeroCount);
488     hwWord = otpBuf[CC_OTP_OEM_FLAG_OFFSET];
489     CC_REG_FLD_SET2(0, OTP_OEM_FLAG, KCE_ZERO_BITS, hwWord, zeroCount);
490     CC_REG_FLD_SET2(0, OTP_OEM_FLAG, KCE_NOT_IN_USE, hwWord, 0);
491     otpBuf[CC_OTP_OEM_FLAG_OFFSET] = hwWord;
492     return TEST_OK;
493 }
494 
Test_ProjGetKeySizeInWordsOtp(uint32_t keyType,uint32_t * keySizeInWords)495 uint32_t Test_ProjGetKeySizeInWordsOtp(uint32_t keyType, uint32_t* keySizeInWords)
496 {
497     // TBD HBK??
498     switch (keyType) {
499         case TEST_HUK_KEY:
500             *keySizeInWords = CC_OTP_HUK_SIZE_IN_WORDS;
501             break;
502         case TEST_KCP_KEY:
503             *keySizeInWords = CC_OTP_KCP_SIZE_IN_WORDS;
504             break;
505         case TEST_KCE_KEY:
506             *keySizeInWords = CC_OTP_KCE_SIZE_IN_WORDS;
507             break;
508         case TEST_KPICV_KEY:
509             *keySizeInWords = CC_OTP_KPICV_SIZE_IN_WORDS;
510             break;
511         case TEST_KCEICV_KEY:
512             *keySizeInWords = CC_OTP_KCEICV_SIZE_IN_WORDS;
513             break;
514         default:
515             *keySizeInWords = 0;
516             TEST_PRINTF_ERROR("ERROR: key type %d is not supported\n", keyType)
517             ;
518             return TEST_INVALID_PARAM_ERR;
519 
520     }
521     return 0;
522 }
523 
524 /**
525  * This function gets hw key and its size from otp buffer to user buffer
526  *
527  */
Test_ProjGetKeyOtpBuff(uint32_t * otpBuf,uint32_t keyType,uint32_t * keySizeInWords,uint32_t * keyBuff)528 uint32_t Test_ProjGetKeyOtpBuff(uint32_t *otpBuf,
529                                 uint32_t keyType,
530                                 uint32_t *keySizeInWords,
531                                 uint32_t *keyBuff)
532 {
533     uint32_t keyOffsetInOtp = 0;
534     uint32_t rc = TEST_OK;
535 
536     if ((NULL == otpBuf) || (NULL == keyBuff) || (NULL == keySizeInWords)) {
537         TEST_PRINTF_ERROR(" ilegal params\n");
538         return TEST_INVALID_PARAM_ERR;
539     }
540 
541     // TBD HBK??
542     switch (keyType) {
543         case TEST_HUK_KEY:
544             *keySizeInWords = CC_OTP_HUK_SIZE_IN_WORDS;
545             keyOffsetInOtp = CC_OTP_HUK_OFFSET;
546             break;
547         case TEST_KCP_KEY:
548             *keySizeInWords = CC_OTP_KCP_SIZE_IN_WORDS;
549             keyOffsetInOtp = CC_OTP_KCP_OFFSET;
550             break;
551         case TEST_KCE_KEY:
552             *keySizeInWords = CC_OTP_KCE_SIZE_IN_WORDS;
553             keyOffsetInOtp = CC_OTP_KCE_OFFSET;
554             break;
555         case TEST_KPICV_KEY:
556             *keySizeInWords = CC_OTP_KPICV_SIZE_IN_WORDS;
557             keyOffsetInOtp = CC_OTP_KPICV_OFFSET;
558             break;
559         case TEST_KCEICV_KEY:
560             *keySizeInWords = CC_OTP_KCEICV_SIZE_IN_WORDS;
561             keyOffsetInOtp = CC_OTP_KCEICV_OFFSET;
562             break;
563         default:
564             *keySizeInWords = 0;
565             TEST_PRINTF_ERROR("ERROR: key type is not supported\n")
566             ;
567             return TEST_INVALID_PARAM_ERR;
568 
569     }
570     memcpy((uint8_t *) keyBuff,
571            (uint8_t *) (otpBuf + keyOffsetInOtp),
572            (*keySizeInWords) * sizeof(uint32_t));
573 
574     return rc;
575 }
576 
Test_ProjSetSwVerInOtpBuff(uint32_t * otp,uint32_t offset,uint32_t max_size)577 uint32_t Test_ProjSetSwVerInOtpBuff(uint32_t *otp, uint32_t offset, uint32_t max_size)
578 {
579     uint32_t i;
580 
581     for (i = 0; i < max_size; i++) {
582         if (otp[offset + i] < 0xFFFFFFFF) {
583             memset(&otp[offset + i + 1], 0x0, (max_size - i - 1) * sizeof(uint32_t));
584             break;
585         }
586     }
587 
588     return TEST_OK;
589 }
590 
591