1 /*
2  * Copyright (c) 2001-2019, Arm Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #ifndef _CMPU_HW_DEFS_H
8 #define _CMPU_HW_DEFS_H
9 
10 #include "cc_regs.h"
11 #include "dx_host.h"
12 #include "cc_hal_plat.h"
13 
14 
15 #define CC_PROD_AIB_ADDR_REG_READ_ACCESS_BIT_SHIFT    0x10UL
16 #define CC_PROD_AIB_ADDR_REG_WRITE_ACCESS_BIT_SHIFT   0x11UL
17 
18 #define CC_PROD_ROT32(val) ( (val) >> 16 | (val) << 16 )
19 #define CC_PROD_CONVERT_WORD_END(val) ( ((CC_PROD_ROT32((val)) & 0xff00ff00UL) >> 8) | ((CC_PROD_ROT32((val)) & 0x00ff00ffUL) << 8) )
20 #ifdef BIG__ENDIAN
21 /* inverse the bytes order in a word */
22 #define CC_PROD_SET_WORD_AS_LE(val) ( CC_PROD_CONVERT_WORD_END(val) )
23 #define CC_PROD_SET_WORD_AS_BE(val) (val)
24 #else
25 #define CC_PROD_SET_WORD_AS_LE(val) (val)
26 #define CC_PROD_SET_WORD_AS_BE(val) ( CC_PROD_CONVERT_WORD_END(val) )
27 #endif
28 
29 /* Poll on the AIB bit */
30 #define CC_PROD_WAIT_ON_AIB_PROG_COMP_BIT() \
31 do {\
32     uint32_t regVal;\
33     do {\
34         regVal = CC_HAL_READ_REGISTER(CC_REG_OFFSET(HOST_RGF, AIB_FUSE_PROG_COMPLETED));\
35     }while( !(regVal & 0x1 ));\
36 }while(0)
37 
38 /*******************************************************  OTP defines  ******************************************************/
39 /* read a word directly from OTP memory */
40 #define  CC_PROD_OTP_READ(otpData, otpWordOffset)                           \
41     do {                                                                                \
42         otpData = CC_HAL_READ_REGISTER( CC_OTP_BASE_ADDR + ((otpWordOffset)*CC_32BIT_WORD_SIZE));   \
43     }while(0)
44 
45 /* write a word directly from OTP memory */
46 #define CC_PROD_OTP_WRITE(otpData, otpWordOffset)                           \
47     do {                                                                                \
48         CC_HAL_WRITE_REGISTER(( CC_OTP_BASE_ADDR + ((otpWordOffset)*CC_32BIT_WORD_SIZE)), otpData); \
49         CC_PROD_WAIT_ON_AIB_PROG_COMP_BIT();                                    \
50     }while(0)
51 
52 
53 #define CC_PROD_OTP_WRITE_VERIFY_WORD(otpWordOffset, wordValue, rc) {\
54     uint32_t  otpActualVal = 0;\
55         if (wordValue != 0x0) { \
56                 CC_PROD_OTP_WRITE((wordValue), (otpWordOffset));\
57             CC_PROD_OTP_READ(otpActualVal, (otpWordOffset));\
58                 if (otpActualVal !=(wordValue)) {\
59                         rc = CC_PROD_HAL_FATAL_ERR;\
60                 } else { \
61                      rc = CC_OK;\
62                 }\
63         } \
64         rc = CC_OK;\
65 }
66 
67 #define CC_PROD_OTP_WRITE_VERIFY_WORD_BUFF(otpWordOffset, wordBuff, buffWordSize, rc) {\
68     uint32_t  ii = 0;\
69     for (ii =0; ii < (buffWordSize); ii++) { \
70            CC_PROD_OTP_WRITE_VERIFY_WORD((otpWordOffset+ii), wordBuff[ii], rc); \
71            if (rc != CC_OK) { \
72                 break; \
73            } \
74         } \
75 }
76 
77 
78 #define SET_OTP_MANUFACTURE_FLAG(manufactorWord, bitField, fieldValue)  \
79                         BITFIELD_SET(manufactorWord,                             \
80                                             CC_OTP_MANUFACTURE_FLAG_ ## bitField ## _BIT_SHIFT,  \
81                                             CC_OTP_MANUFACTURE_FLAG_ ## bitField ## _BIT_SIZE,   \
82                                             fieldValue)
83 
84 #define SET_OTP_OEM_FLAG(manufactorWord, bitField, fieldValue)  \
85                         BITFIELD_SET(manufactorWord,                             \
86                                             CC_OTP_OEM_FLAG_ ## bitField ## _BIT_SHIFT,  \
87                                             CC_OTP_OEM_FLAG_ ## bitField ## _BIT_SIZE,   \
88                                             fieldValue)
89 
90 #define IS_HBK0_USED(icvWord)  (BITFIELD_GET(icvWord,      \
91                                                               CC_OTP_MANUFACTURE_FLAG_HBK0_NOT_IN_USE_BIT_SHIFT, \
92                                                               CC_OTP_MANUFACTURE_FLAG_HBK0_NOT_IN_USE_BIT_SIZE) == 0)
93 
94 
95 
96 #endif // _PROD_HW_DEFS_H
97 
98