1 /*
2  * Copyright (c) 2001-2019, Arm Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 
8 #ifndef __TST_HW_ACCESS_H__
9 #define __TST_HW_ACCESS_H__
10 
11 #include <stdint.h>
12 
13 extern unsigned long    g_testHwRegBaseAddr;
14 extern unsigned long    g_testHwReeRegBaseAddr;
15 extern unsigned long    g_testHwEnvBaseAddr;
16 
17 /* rotate 32-bits word by 16 bits */
18 #define ROT32(x) ( (x) >> 16 | (x) << 16 )
19 
20 /* inverse the bytes order in a word */
21 #define REVERSE32(x)  ( ((ROT32((x)) & 0xff00ff00UL) >> 8) | ((ROT32((x)) & 0x00ff00ffUL) << 8) )
22 
23 #ifndef BIG__ENDIAN
24 /* define word endiannes*/
25 #define  SET_WORD_ENDIANESS
26 #else
27 #define  SET_WORD_ENDIANESS(val) REVERSE32(val)
28 #endif
29 
30 
31 #define SESSION_KEY_LEN_IN_BYTES 16
32 
33 /* LCS */
34 #define TESTS_LCS_CM        0x0
35 #define TESTS_LCS_DM        0x1
36 #define TESTS_LCS_SEC_DISABLED  0x3
37 #define TESTS_LCS_SEC_ENABLED   0x5
38 #define TESTS_LCS_RMA       0x7
39 
40 /* errors */
41 #define TEST_OK         0
42 #define TEST_BURN_OTP_ERR   1
43 #define TEST_BURN_OTP_KDR_ERR   2
44 #define TEST_BURN_OTP_SCP_ERR   3
45 #define TEST_BURN_OTP_LCS_ERR   4
46 #define TEST_INVALID_PARAM_ERR  5
47 
48 
49 /* OTP memeory mapping */
50 
51 #define ENV_OTP_START_OFFSET        0x800UL
52 #define TEST_OTP_SIZE_IN_WORDS      0x25
53 
54 #define OTP_KRD_START_WORD_OFFSET    0x00
55 #define OTP_KRD_SIZE_IN_WORDS        0x08
56 #define OTP_KRD_SIZE_IN_BYTES        (OTP_KRD_SIZE_IN_WORDS * sizeof(uint32_t))
57 #define OTP_SCP_START_WORD_OFFSET    0x08
58 #define OTP_SCP_SIZE_IN_WORDS        0x02
59 
60 #define OTP_MANUFACTOR_FLAG_START_WORD_OFFSET 0x0A
61 #define OTP_MANUFACTOR_FLAG_SIZE_IN_WORDS     0x01
62 #define OTP_MANUFACTOR_FLAG_KDR_ZEROS_BIT_OFFSET 0x00
63 #define OTP_MANUFACTOR_FLAG_KDR_ZEROS_NUM_BITS 0x08
64 #define OTP_MANUFACTOR_FLAG_SCP_ZEROS_BIT_OFFSET 0x08
65 #define OTP_MANUFACTOR_FLAG_SCP_ZEROS_NUM_BITS 0x07
66 #define OTP_MANUFACTOR_FLAG_SEC_EN_BIT_OFFSET 0x10
67 #define OTP_MANUFACTOR_FLAG_SEC_EN_NUM_BITS   0x04
68 #define OTP_MANUFACTOR_FLAG_SEC_ENABLE 0x3
69 #define OTP_MANUFACTOR_FLAG_SEC_DISABLE 0xC
70 
71 
72 #define OTP_DM_DEF_START_WORD_OFFSET 0x0B
73 #define OTP_DM_DEF_SIZE_IN_WORDS     0x02
74 #define OTP_DM_DEF_HBK0_ZEROS_BIT_OFFSET 0x00
75 #define OTP_DM_DEF_HBK0_ZEROS_NUM_BITS 0x08
76 #define OTP_DM_DEF_HBK1_ZEROS_BIT_OFFSET 0x08
77 #define OTP_DM_DEF_HBK1_ZEROS_NUM_BITS 0x08
78 
79 #define OTP_KCE_START_WORD_OFFSET    0x0C
80 #define OTP_KCE_SIZE_IN_WORDS        0x04
81 #define OTP_HBK0_START_WORD_OFFSET   0x10
82 #define OTP_HBK0_SIZE_IN_WORDS       0x04
83 #define OTP_HBK1_START_WORD_OFFSET   0x14
84 #define OTP_HBK1_SIZE_IN_WORDS       0x04
85 #define OTP_SB_VER_START_WORD_OFFSET 0x18
86 #define OTP_SB_VER_SIZE_IN_WORDS     0x01
87 
88 
89 #define AIB_ADDR_REG_READ_ACCESS_BIT_SHIFT    0x10UL
90 #define AIB_ADDR_REG_WRITE_ACCESS_BIT_SHIFT   0x11UL
91 
92 #define OTP_BASE_ADDR                0x00
93 #define OTP_WRITE_ADDR               (0x1 << AIB_ADDR_REG_WRITE_ACCESS_BIT_SHIFT)
94 #define OTP_READ_ADDR                (0x1 << AIB_ADDR_REG_READ_ACCESS_BIT_SHIFT)
95 
96 #ifdef BIG__ENDIAN
97 #define TEST_CONVERT_BYTE_ARR_TO_WORD(inPtr, outWord) {\
98     outWord = (*inPtr<<24);\
99     outWord |= (*(inPtr+1)<<16);\
100     outWord |= (*(inPtr+2)<<8);\
101     outWord |= (*(inPtr+3));\
102 }
103 #else
104 #define TEST_CONVERT_BYTE_ARR_TO_WORD(inPtr, outWord) {\
105     outWord = (*(inPtr+3))<<24;\
106     outWord |= (*(inPtr+2))<<16;\
107     outWord |= (*(inPtr+1))<<8;\
108     outWord |= (*inPtr);\
109 }
110 #endif
111 
112 
113 #define TEST_CALC_BUFF_ZEROS(wordBuf, buffWordSize, zeros) {\
114     int i = 0;\
115     int j = 0;\
116     int mask = 0;\
117     zeros = 0;\
118     for (i = 0; i< buffWordSize; i++) {\
119         for (j = 0; j<32; j++) {\
120             mask = 0x1;\
121             if (!(*(wordBuf+i) & (mask << j))) {\
122                 zeros++;\
123             }\
124         }\
125     }\
126 }
127 
128 
129 #define READ_REG(offset) \
130         *(volatile uint32_t *)(g_testHwRegBaseAddr + (offset))
131 
132 #define WRITE_REG(offset, val)  { \
133     volatile uint32_t ii1; \
134         (*(volatile uint32_t *)(g_testHwRegBaseAddr + (offset))) = (uint32_t)(val); \
135         for(ii1=0; ii1<500; ii1++); \
136 }
137 
138 
139 #define READ_REE_REG(offset) \
140         (*(volatile uint32_t *)(g_testHwReeRegBaseAddr + (offset)));
141 
142 #define WRITE_REE_REG(offset, val)   { \
143     volatile uint32_t ii1; \
144         (*(volatile uint32_t *)(g_testHwReeRegBaseAddr + (offset))) = (uint32_t)(val); \
145         for(ii1=0; ii1<500; ii1++); \
146 }
147 
148 
149 #define GET_LCS(val) {\
150     do {\
151             val = READ_REG(DX_LCS_IS_VALID_REG_OFFSET);\
152     }while( !(val & 0x1));\
153     val = READ_REG(DX_LCS_REG_REG_OFFSET);\
154     val &= 0xFF;\
155     }
156 
157 #define WRITE_ENV(offset, val) { \
158     volatile uint32_t ii1; \
159         (*(volatile uint32_t *)(g_testHwEnvBaseAddr + (offset))) = (uint32_t)(val); \
160         for(ii1=0; ii1<500; ii1++);\
161 }
162 
163 #define READ_ENV(offset) \
164     *(volatile uint32_t *)(g_testHwEnvBaseAddr + (offset))
165 
166 
167 #define WRITE_OTP(wordOffset, val) { \
168     volatile uint32_t ii1; \
169         (*(volatile uint32_t *)(g_testHwEnvBaseAddr + ENV_OTP_START_OFFSET+ ((wordOffset)*sizeof(uint32_t)))) = (uint32_t)(val); \
170         for(ii1=0; ii1<500; ii1++);\
171 }
172 
173 #define READ_OTP(wordOffset) \
174     (*(volatile uint32_t *)(g_testHwEnvBaseAddr + ENV_OTP_START_OFFSET+ ((wordOffset)*sizeof(uint32_t))))
175 
176 
177 
178 /* Poll on the AIB bit */
179 #define WAIT_ON_AIB_PROG_COMP_BIT() \
180 do {\
181     int regVal;\
182     do {\
183         regVal = READ_REG(DX_AIB_FUSE_PROG_COMPLETED_REG_OFFSET);\
184     }while( !(regVal & 0x1 ));\
185 }while(0)
186 
187 /* Poll on the AIB acknowledge bit */
188 #define WAIT_ON_AIB_ACK_BIT() \
189 do {\
190     int regVal;\
191     do {\
192         regVal = READ_REG(DX_AIB_FUSE_ACK_REG_OFFSET);\
193     }while( !(regVal & 0x1));\
194 }while(0)
195 
196 #define WRITE_AIB(addr, val) { \
197             WRITE_REG(DX_HOST_AIB_WDATA_REG_REG_OFFSET, val);\
198             WRITE_REG(DX_HOST_AIB_ADDR_REG_REG_OFFSET, (OTP_BASE_ADDR|OTP_WRITE_ADDR)+addr);\
199             WAIT_ON_AIB_ACK_BIT();\
200             WAIT_ON_AIB_PROG_COMP_BIT();\
201 }
202 
203 #define READ_AIB(addr, val) { \
204         WRITE_REG(DX_HOST_AIB_ADDR_REG_REG_OFFSET, (OTP_BASE_ADDR|OTP_READ_ADDR)+addr); \
205         WAIT_ON_AIB_ACK_BIT(); \
206         val = READ_REG(DX_HOST_AIB_RDATA_REG_REG_OFFSET); \
207 }
208 
209 typedef enum otpHbkTypes_t{
210     TEST_OTP_HBK0_TYPE = 1, //HBK0
211     TEST_OTP_HBK1_TYPE = 2, //HBK1
212     TEST_OTP_HBK_256_TYPE = 4, //HBK
213 }OtpHbkTypes_t;
214 
215 
216 /******************************/
217 /*   function declaration     */
218 /*****************************/
219 
220 unsigned int testBurnOtp(unsigned int  *otp, unsigned int  nextLcs);
221 unsigned int testClearOtp(void);
222 int testReadKdrZeros(void);
223 
224 void performPowerOnReset(void);
225 void performColdReset(void);
226 void performWarmReset(void);
227 unsigned int testCheckLcs(unsigned int  nextLcs);
228 
229 unsigned int testSetKdrInOtpBuff(unsigned int *otp, unsigned char *kdrBuff);
230 unsigned int testSetScpInOtpBuff(unsigned int *otp, unsigned char *scpBuff);
231 unsigned int testSetHbkInOtpBuff(unsigned int *otp, unsigned char *hbkBuff, OtpHbkTypes_t type);
232 unsigned int testSetSecureInOtpBuff(unsigned int *otp, unsigned char enFlag);
233 unsigned int testReadOtp(unsigned int offset, unsigned int size, uint32_t *buff);
234 
235 #endif //__TST_HW_ACCESS_H__
236