xref: /utopia/UTPA2-700.0.x/modules/dscmb/utopia_adaption/ca2/CA_adp.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1 #include <linux/kernel.h>
2 #include <linux/string.h>
3 #include <linux/slab.h>
4 
5 #include "MsTypes.h"
6 #include "utopia.h"
7 #include "drvCA.h"
8 #include "drvCA_v2.h"
9 #include "CA_adp.h"
10 
11 #include "utopia_adp.h"
12 
13 #define SPT_TYPE_A_SIZE 2
14 #define SPT_TYPE_B_SIZE 3
15 #define SPT_TYPE_C_SIZE 4
16 #define SPT_TYPE_D_SIZE 5
17 #define SPT_TYPE_E_SIZE 6
18 #define SPT_TYPE_F_SIZE 7
19 
20 #define UADP_SPT_NAME0NXT_SIZE(NAME,SIZE) \
21             UADP_SPT_BGN(&NAME [0],SIZE); \
22             UADP_SPT_FIN(&NAME [1]);
23 
24 #define UADP_SPT_NAME0NXT_TYPE(NAME,TYPE) \
25             UADP_SPT_BGN(&NAME [0],sizeof(TYPE)); \
26             UADP_SPT_FIN(&NAME [1]);
27 
28 #define UADP_SPT_NAME1NXT_TYPE(NAME,TYPE,MB1,MB1NAME) \
29             UADP_SPT_BGN(&NAME [0],sizeof(TYPE)); \
30             UADP_SPT_NXT(&NAME [1],TYPE,MB1,MB1NAME); \
31             UADP_SPT_FIN(&NAME [2]);
32 
33 #define UADP_SPT_NAME2NXT_TYPE(NAME,TYPE,MB1,MB1NAME,MB2,MB2NAME) \
34             UADP_SPT_BGN(&NAME [0],sizeof(TYPE)); \
35             UADP_SPT_NXT(&NAME [1],TYPE,MB1,MB1NAME); \
36             UADP_SPT_NXT(&NAME [2],TYPE,MB2,MB2NAME); \
37             UADP_SPT_FIN(&NAME [3]);
38 
39 #define UADP_SPT_NAME3NXT_TYPE(NAME,TYPE,MB1,MB1NAME,MB2,MB2NAME,MB3,MB3NAME) \
40             UADP_SPT_BGN(&NAME [0],sizeof(TYPE)); \
41             UADP_SPT_NXT(&NAME [1],TYPE,MB1,MB1NAME); \
42             UADP_SPT_NXT(&NAME [2],TYPE,MB2,MB2NAME); \
43             UADP_SPT_NXT(&NAME [3],TYPE,MB3,MB3NAME); \
44             UADP_SPT_FIN(&NAME [4]);
45 
46 #define UADP_SPT_NAME5NXT_TYPE(NAME,TYPE,MB1,MB1NAME,MB2,MB2NAME,MB3,MB3NAME,MB4,MB4NAME,MB5,MB5NAME) \
47             UADP_SPT_BGN(&NAME [0],sizeof(TYPE)); \
48             UADP_SPT_NXT(&NAME [1],TYPE,MB1,MB1NAME); \
49             UADP_SPT_NXT(&NAME [2],TYPE,MB2,MB2NAME); \
50             UADP_SPT_NXT(&NAME [3],TYPE,MB3,MB3NAME); \
51             UADP_SPT_NXT(&NAME [4],TYPE,MB4,MB4NAME); \
52             UADP_SPT_NXT(&NAME [5],TYPE,MB5,MB5NAME); \
53             UADP_SPT_FIN(&NAME [6]);
54 
55 //TOP
56 UADP_STRUCT_POINTER_TABLE spt_CA_OTP_SetBlockLock[SPT_TYPE_A_SIZE];
57 UADP_STRUCT_POINTER_TABLE spt_CA_OTP_GetBlockLock[SPT_TYPE_B_SIZE];
58 UADP_STRUCT_POINTER_TABLE spt_CA_OTP_IsBlank[SPT_TYPE_A_SIZE];
59 UADP_STRUCT_POINTER_TABLE spt_CA_OTP_Read[SPT_TYPE_A_SIZE];
60 UADP_STRUCT_POINTER_TABLE spt_CA_OTP_Write[SPT_TYPE_A_SIZE];
61 UADP_STRUCT_POINTER_TABLE spt_CA_Locked[SPT_TYPE_A_SIZE];
62 UADP_STRUCT_POINTER_TABLE spt_CA_OTP_Lock[SPT_TYPE_A_SIZE];
63 UADP_STRUCT_POINTER_TABLE spt_CA_OTP_SetRSAextID[SPT_TYPE_A_SIZE];
64 UADP_STRUCT_POINTER_TABLE spt_CA_OTP_GetRSAextID[SPT_TYPE_A_SIZE];
65 UADP_STRUCT_POINTER_TABLE spt_CA_OTP_SetHASH1_REF_VER[SPT_TYPE_A_SIZE];
66 UADP_STRUCT_POINTER_TABLE spt_CA_OTP_GetHASH1_REF_VER[SPT_TYPE_B_SIZE];
67 UADP_STRUCT_POINTER_TABLE spt_CA_OTP_SetHASH_REF_VER[SPT_TYPE_A_SIZE];
68 UADP_STRUCT_POINTER_TABLE spt_CA_OTP_GetHASH_REF_VER[SPT_TYPE_C_SIZE];
69 UADP_STRUCT_POINTER_TABLE spt_CA_OTP_SetDebugPortMode[SPT_TYPE_A_SIZE];
70 UADP_STRUCT_POINTER_TABLE spt_CA_OTP_GetDebugPortMode[SPT_TYPE_B_SIZE];
71 UADP_STRUCT_POINTER_TABLE spt_CA_OTP_SetDeviceId[SPT_TYPE_B_SIZE];
72 UADP_STRUCT_POINTER_TABLE spt_CA_OTP_GetDeviceId[SPT_TYPE_B_SIZE];
73 UADP_STRUCT_POINTER_TABLE spt_CA_MaxDeviceIdSize[SPT_TYPE_A_SIZE];
74 UADP_STRUCT_POINTER_TABLE spt_CA_Random[SPT_TYPE_A_SIZE];
75 UADP_STRUCT_POINTER_TABLE spt_CA_OTP_ReadCAVendor[SPT_TYPE_A_SIZE];
76 
77 //BOTTOM
78 UADP_STRUCT_POINTER_TABLE spt_CA_OTP_GetBlockLock_peLockType[SPT_TYPE_A_SIZE];
79 UADP_STRUCT_POINTER_TABLE spt_CA_OTP_GetHASH1_REF_VER_pu32HASH1_REF_VER[SPT_TYPE_A_SIZE];
80 UADP_STRUCT_POINTER_TABLE spt_CA_OTP_GetHASH_REF_VER_pu32HASH0_REF_VER[SPT_TYPE_A_SIZE];
81 UADP_STRUCT_POINTER_TABLE spt_CA_OTP_GetHASH_REF_VER_pu32HASH2_REF_VER[SPT_TYPE_A_SIZE];
82 UADP_STRUCT_POINTER_TABLE spt_CA_OTP_GetDebugPortMode_eMode[SPT_TYPE_A_SIZE];
83 UADP_STRUCT_POINTER_TABLE spt_CA_OTP_SetDeviceId_pu8Did[SPT_TYPE_A_SIZE];
84 UADP_STRUCT_POINTER_TABLE spt_CA_OTP_GetDeviceId_pu8Did[SPT_TYPE_A_SIZE];
85 
DSCMB_adp_Init(FUtopiaIOctl * pIoctl)86 MS_U32 DSCMB_adp_Init(FUtopiaIOctl* pIoctl)
87 {
88     //TOP
89     UADP_SPT_NAME0NXT_TYPE(spt_CA_OTP_SetBlockLock, CA_OTP_SETBLOCKLOCK);
90     UADP_SPT_NAME1NXT_TYPE(spt_CA_OTP_GetBlockLock, CA_OTP_GETBLOCKLOCK, peLockType, spt_CA_OTP_GetBlockLock_peLockType);
91     UADP_SPT_NAME0NXT_TYPE(spt_CA_OTP_IsBlank, CA_OTP_ISBLANK);
92     UADP_SPT_NAME0NXT_TYPE(spt_CA_OTP_Read, CA_OTP_READ);
93     UADP_SPT_NAME0NXT_TYPE(spt_CA_OTP_Write, CA_OTP_WRITE);
94     UADP_SPT_NAME0NXT_TYPE(spt_CA_Locked, CA_OTP_LOCK20);
95     UADP_SPT_NAME0NXT_TYPE(spt_CA_OTP_Lock, CA_OTP_LOCK20);
96     UADP_SPT_NAME0NXT_TYPE(spt_CA_OTP_SetRSAextID, CA_OTP_SETRSAEXTID);
97     UADP_SPT_NAME0NXT_TYPE(spt_CA_OTP_GetRSAextID, CA_OTP_GETRSAEXTID);
98     UADP_SPT_NAME0NXT_TYPE(spt_CA_OTP_SetHASH1_REF_VER, CA_OTP_SETHASH1REFVER);
99     UADP_SPT_NAME1NXT_TYPE(spt_CA_OTP_GetHASH1_REF_VER, CA_OTP_GETHASH1REFVER, pu32HASH1_REF_VER, spt_CA_OTP_GetHASH1_REF_VER_pu32HASH1_REF_VER);
100     UADP_SPT_NAME0NXT_TYPE(spt_CA_OTP_SetHASH_REF_VER, CA_OTP_SETHASHREFVER);
101     UADP_SPT_NAME2NXT_TYPE(spt_CA_OTP_GetHASH_REF_VER, CA_OTP_GETHASHREFVER, pu32HASH0_REF_VER, spt_CA_OTP_GetHASH_REF_VER_pu32HASH0_REF_VER, pu32HASH2_REF_VER, spt_CA_OTP_GetHASH_REF_VER_pu32HASH2_REF_VER);
102     UADP_SPT_NAME0NXT_TYPE(spt_CA_OTP_SetDebugPortMode, CA_OTP_SETDEBUGPORTMODE);
103     UADP_SPT_NAME1NXT_TYPE(spt_CA_OTP_GetDebugPortMode, CA_OTP_GETDEBUGPORTMODE, eMode, spt_CA_OTP_GetDebugPortMode_eMode);
104     UADP_SPT_NAME1NXT_TYPE(spt_CA_OTP_SetDeviceId, CA_OTP_SETDEVICEID, pu8Did, spt_CA_OTP_SetDeviceId_pu8Did);
105     UADP_SPT_NAME1NXT_TYPE(spt_CA_OTP_GetDeviceId, CA_OTP_SETDEVICEID, pu8Did, spt_CA_OTP_GetDeviceId_pu8Did);
106     UADP_SPT_NAME0NXT_TYPE(spt_CA_MaxDeviceIdSize, CA_MAXDEVICEIDSIZE);
107     UADP_SPT_NAME0NXT_TYPE(spt_CA_Random, CA_RANDOM);
108     UADP_SPT_NAME0NXT_TYPE(spt_CA_OTP_ReadCAVendor, CA_OTP_READCAVENDOR);
109 
110     //BOTTOM
111     UADP_SPT_NAME0NXT_TYPE(spt_CA_OTP_GetBlockLock_peLockType, CA_LOCK_TYPE);
112     UADP_SPT_NAME0NXT_TYPE(spt_CA_OTP_GetHASH1_REF_VER_pu32HASH1_REF_VER, MS_U32);
113     UADP_SPT_NAME0NXT_TYPE(spt_CA_OTP_GetHASH_REF_VER_pu32HASH0_REF_VER, MS_U32);
114     UADP_SPT_NAME0NXT_TYPE(spt_CA_OTP_GetHASH_REF_VER_pu32HASH2_REF_VER, MS_U32);
115     UADP_SPT_NAME0NXT_TYPE(spt_CA_OTP_GetDebugPortMode_eMode, CA_DEBUG_PORT_MODE);
116     UADP_SPT_NAME0NXT_SIZE(spt_CA_OTP_SetDeviceId_pu8Did, sizeof(MS_U8)*16);
117     UADP_SPT_NAME0NXT_SIZE(spt_CA_OTP_GetDeviceId_pu8Did, sizeof(MS_U8)*16);
118 
119     *pIoctl = (FUtopiaIOctl)CA_adp_Ioctl;
120 
121     return 0;
122 
123 }
124 
DSCMB_adp_Ioctl(void * pInstanceTmp,MS_U32 u32Cmd,void * const pArgs)125 MS_U32 DSCMB_adp_Ioctl(void* pInstanceTmp, MS_U32 u32Cmd, void* const pArgs)
126 {
127     MS_U32 u32Ret = 0;
128     char buffer_arg[32];
129     UADP_STRUCT_POINTER_TABLE* sptPtr;
130     switch(u32Cmd)
131     {
132         case E_MDRV_CMD_CA_Init:
133             u32Ret = UtopiaIoctl(pInstanceTmp, u32Cmd, pArgs);
134             break;
135         case E_MDRV_CMD_CA_OTP_EnableSecureBoot:
136             u32Ret = UtopiaIoctl(pInstanceTmp, u32Cmd, pArgs);
137             break;
138         case E_MDRV_CMD_CA_OTP_IsSecureBootEnabled:
139             u32Ret = UtopiaIoctl(pInstanceTmp, u32Cmd, pArgs);
140             break;
141         case E_MDRV_CMD_CA_OTP_SetBlockLock:
142             u32Ret = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_CA_OTP_SetBlockLock, NULL, buffer_arg, sizeof(buffer_arg));
143             break;
144         case E_MDRV_CMD_CA_OTP_GetBlockLock:
145             u32Ret = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_CA_OTP_GetBlockLock, NULL, buffer_arg, sizeof(buffer_arg));
146             break;
147         case E_MDRV_CMD_CA_OTP_IsBlank:
148             u32Ret = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_CA_OTP_IsBlank, NULL, buffer_arg, sizeof(buffer_arg));
149             break;
150         case E_MDRV_CMD_CA_OTP_Read:
151             u32Ret = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_CA_OTP_Read, spt_CA_OTP_Read, buffer_arg, sizeof(buffer_arg));
152             break;
153         case E_MDRV_CMD_CA_OTP_Write:
154             u32Ret = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_CA_OTP_Write, NULL, buffer_arg, sizeof(buffer_arg));
155             break;
156         case E_MDRV_CMD_CA_Locked:
157             u32Ret = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_CA_Locked, NULL, buffer_arg, sizeof(buffer_arg));
158             break;
159         case E_MDRV_CMD_CA_OTP_Lock:
160             u32Ret = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_CA_OTP_Lock, NULL, buffer_arg, sizeof(buffer_arg));
161             break;
162         case E_MDRV_CMD_CA_OTP_SetRSAextID:
163             u32Ret = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_CA_OTP_SetRSAextID, NULL, buffer_arg, sizeof(buffer_arg));
164             break;
165         case E_MDRV_CMD_CA_OTP_GetRSAextID:
166             u32Ret = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_CA_OTP_GetRSAextID, NULL, buffer_arg, sizeof(buffer_arg));
167             break;
168         case E_MDRV_CMD_CA_OTP_SetHASH1_REF_VER:
169             u32Ret = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_CA_OTP_SetHASH1_REF_VER, NULL, buffer_arg, sizeof(buffer_arg));
170             break;
171         case E_MDRV_CMD_CA_OTP_GetHASH1_REF_VER:
172             u32Ret = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_CA_OTP_GetHASH1_REF_VER, spt_CA_OTP_GetHASH1_REF_VER, buffer_arg, sizeof(buffer_arg));
173             break;
174         case E_MDRV_CMD_CA_OTP_SetHASH_REF_VER:
175             u32Ret = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_CA_OTP_SetHASH_REF_VER, NULL, buffer_arg, sizeof(buffer_arg));
176             break;
177         case E_MDRV_CMD_CA_OTP_SetDebugPortMode:
178             u32Ret = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_CA_OTP_SetDebugPortMode, NULL, buffer_arg, sizeof(buffer_arg));
179             break;
180         case E_MDRV_CMD_CA_OTP_GetDebugPortMode:
181             u32Ret = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_CA_OTP_GetDebugPortMode, spt_CA_OTP_GetDebugPortMode, buffer_arg, sizeof(buffer_arg));
182             break;
183         case E_MDRV_CMD_CA_OTP_SetDeviceId:
184             u32Ret = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_CA_OTP_SetDeviceId, NULL, buffer_arg, sizeof(buffer_arg));
185             break;
186         case E_MDRV_CMD_CA_MaxDeviceIdSize:
187             u32Ret = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_CA_MaxDeviceIdSize, spt_CA_MaxDeviceIdSize, buffer_arg, sizeof(buffer_arg));
188             break;
189         case E_MDRV_CMD_CA_OTP_EnableSecureCWMode:
190             u32Ret = UtopiaIoctl(pInstanceTmp, u32Cmd, pArgs);
191             break;
192         case E_MDRV_CMD_CA_OTP_IsSecureCWMode:
193             u32Ret = UtopiaIoctl(pInstanceTmp, u32Cmd, pArgs);
194             break;
195         case E_MDRV_CMD_CA_Random:
196             u32Ret = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_CA_Random, spt_CA_Random, buffer_arg, sizeof(buffer_arg));
197             break;
198         case E_MDRV_CMD_CA_OTP_ReadCAVendor:
199             u32Ret = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_CA_OTP_ReadCAVendor, spt_CA_OTP_ReadCAVendor, buffer_arg, sizeof(buffer_arg));
200             break;
201         default:
202             break;
203     }
204 
205     return u32Ret;
206 }
207