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