emmc_rpmb.c 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624
  1. #include <linux/kernel.h>
  2. #include <linux/module.h>
  3. #include <linux/init.h>
  4. #include <linux/moduleparam.h>
  5. #include <linux/slab.h>
  6. #include <linux/unistd.h>
  7. #include <linux/sched.h>
  8. #include <linux/fs.h>
  9. #include <linux/uaccess.h>
  10. #include <linux/version.h>
  11. #include <linux/spinlock.h>
  12. #include <linux/semaphore.h>
  13. #include <linux/delay.h>
  14. #include <linux/kthread.h>
  15. #include <linux/errno.h>
  16. #include <linux/cdev.h>
  17. #include <linux/device.h>
  18. #include <linux/mutex.h>
  19. #include <linux/string.h>
  20. #include <linux/random.h>
  21. #include <linux/memory.h>
  22. #include <linux/io.h>
  23. #include <linux/proc_fs.h>
  24. #include <crypto/hash.h>
  25. #include <linux/scatterlist.h>
  26. #include <linux/mmc/card.h>
  27. #include <linux/mmc/host.h>
  28. #include <linux/mmc/mmc.h>
  29. #include <linux/mmc/core.h>
  30. #include <linux/mmc/sd.h>
  31. #include "drivers/mmc/card/queue.h"
  32. #include "drivers/mmc/core/core.h"
  33. #include "emmc_rpmb.h"
  34. #include "mt_sd.h"
  35. /* TEE usage */
  36. #ifdef CONFIG_TRUSTONIC_TEE_SUPPORT
  37. #include "mobicore_driver_api.h"
  38. #include "drrpmb_Api.h"
  39. #include "drrpmb_gp_Api.h"
  40. static struct mc_uuid_t rpmb_uuid = RPMB_UUID;
  41. static struct mc_session_handle rpmb_session = {0};
  42. static u32 rpmb_devid = MC_DEVICE_ID_DEFAULT;
  43. static dciMessage_t *rpmb_dci;
  44. static struct mc_uuid_t rpmb_gp_uuid = RPMB_GP_UUID;
  45. static struct mc_session_handle rpmb_gp_session = {0};
  46. static u32 rpmb_gp_devid = MC_DEVICE_ID_DEFAULT;
  47. static dciMessage_t *rpmb_gp_dci;
  48. #endif
  49. #define RPMB_NAME "emmcrpmb"
  50. #define DEFAULT_HANDLES_NUM (64)
  51. #define MAX_OPEN_SESSIONS (0xffffffff - 1)
  52. /* Debug message event */
  53. #define DBG_EVT_NONE (0) /* No event */
  54. #define DBG_EVT_CMD (1 << 0)/* SEC CMD related event */
  55. #define DBG_EVT_FUNC (1 << 1)/* SEC function event */
  56. #define DBG_EVT_INFO (1 << 2)/* SEC information event */
  57. #define DBG_EVT_WRN (1 << 30) /* Warning event */
  58. #define DBG_EVT_ERR (1 << 31) /* Error event */
  59. #define DBG_EVT_ALL (0xffffffff)
  60. #define DBG_EVT_MASK (DBG_EVT_ERR)
  61. #define MSG(evt, fmt, args...) \
  62. do {\
  63. if ((DBG_EVT_##evt) & DBG_EVT_MASK) { \
  64. pr_err("[%s] "fmt, RPMB_NAME, ##args); \
  65. } \
  66. } while (0)
  67. #if (defined(CONFIG_MICROTRUST_TZ_DRIVER))
  68. #define RPMB_DATA_BUFF_SIZE (1024 * 33)
  69. static unsigned char *rpmb_buffer;
  70. #endif
  71. struct task_struct *open_th;
  72. struct task_struct *rpmbDci_th;
  73. struct task_struct *rpmb_gp_Dci_th;
  74. static struct cdev rpmb_dev;
  75. static struct class *rpmb_class;
  76. static DEFINE_MUTEX(rpmb_lock);
  77. /*
  78. * This is an alternative way to get mmc_card strcuture from mmc_host which set from msdc driver with
  79. * this callback function.
  80. * The strength is we don't have to extern msdc_host_host global variable, extern global is very bad...
  81. * The weakness is every platform driver needs to add this callback to give rpmb driver the mmc_host
  82. * structure and then we could know card.
  83. *
  84. * Finally, I decide to ignore its strength, because the weakness is more important.
  85. * If every projects have to add this callback, the operation is complicated.
  86. */
  87. #if 0
  88. struct mmc_host *emmc_rpmb_host;
  89. void emmc_rpmb_set_host(void *mmc_host)
  90. {
  91. emmc_rpmb_host = mmc_host;
  92. }
  93. #endif
  94. int hmac_sha256(const char *key, u32 klen, const char *str, u32 len, u8 *hmac)
  95. {
  96. struct shash_desc *shash;
  97. struct crypto_shash *hmacsha256 = crypto_alloc_shash("hmac(sha256)", 0, 0);
  98. u32 size = 0;
  99. int err = 0;
  100. if (IS_ERR(hmacsha256))
  101. return -1;
  102. size = sizeof(struct shash_desc) + crypto_shash_descsize(hmacsha256);
  103. shash = kmalloc(size, GFP_KERNEL);
  104. if (!shash) {
  105. err = -1;
  106. goto malloc_err;
  107. }
  108. shash->tfm = hmacsha256;
  109. shash->flags = 0x0;
  110. err = crypto_shash_setkey(hmacsha256, key, klen);
  111. if (err) {
  112. err = -1;
  113. goto hash_err;
  114. }
  115. err = crypto_shash_init(shash);
  116. if (err) {
  117. err = -1;
  118. goto hash_err;
  119. }
  120. crypto_shash_update(shash, str, len);
  121. err = crypto_shash_final(shash, hmac);
  122. hash_err:
  123. kfree(shash);
  124. malloc_err:
  125. crypto_free_shash(hmacsha256);
  126. return err;
  127. }
  128. /*
  129. * CHECK THIS!!! Copy from block.c mmc_blk_data structure.
  130. */
  131. struct emmc_rpmb_blk_data {
  132. spinlock_t lock;
  133. struct gendisk *disk;
  134. struct mmc_queue queue;
  135. struct list_head part;
  136. unsigned int flags;
  137. unsigned int usage;
  138. unsigned int read_only;
  139. unsigned int part_type;
  140. unsigned int name_idx;
  141. unsigned int reset_done;
  142. /*
  143. * Only set in main mmc_blk_data associated
  144. * with mmc_card with mmc_set_drvdata, and keeps
  145. * track of the current selected device partition.
  146. */
  147. unsigned int part_curr;
  148. struct device_attribute force_ro;
  149. struct device_attribute power_ro_lock;
  150. int area_type;
  151. };
  152. /*
  153. * CHECK THIS!!! Copy from block.c mmc_blk_part_switch.
  154. * Since it is static inline function, we cannot extern to use it.
  155. * For syncing block data, this is the only way.
  156. */
  157. int emmc_rpmb_switch(struct mmc_card *card, struct emmc_rpmb_blk_data *md)
  158. {
  159. int ret;
  160. struct emmc_rpmb_blk_data *main_md = mmc_get_drvdata(card);
  161. if (main_md->part_curr == md->part_type)
  162. return 0;
  163. if (mmc_card_mmc(card)) {
  164. u8 part_config = card->ext_csd.part_config;
  165. part_config &= ~EXT_CSD_PART_CONFIG_ACC_MASK;
  166. part_config |= md->part_type;
  167. ret = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
  168. EXT_CSD_PART_CONFIG, part_config,
  169. card->ext_csd.part_time);
  170. if (ret)
  171. return ret;
  172. card->ext_csd.part_config = part_config;
  173. }
  174. main_md->part_curr = md->part_type;
  175. return 0;
  176. }
  177. static void emmc_rpmb_dump_frame(u8 *data_frame)
  178. {
  179. MSG(INFO, "mac, frame[196]=%x\n", data_frame[196]);
  180. MSG(INFO, "mac, frame[197]=%x\n", data_frame[197]);
  181. MSG(INFO, "mac, frame[198]=%x\n", data_frame[198]);
  182. MSG(INFO, "data,frame[228]=%x\n", data_frame[228]);
  183. MSG(INFO, "data,frame[229]=%x\n", data_frame[229]);
  184. MSG(INFO, "nonce, frame[484]=%x\n", data_frame[484]);
  185. MSG(INFO, "nonce, frame[485]=%x\n", data_frame[485]);
  186. MSG(INFO, "nonce, frame[486]=%x\n", data_frame[486]);
  187. MSG(INFO, "nonce, frame[487]=%x\n", data_frame[487]);
  188. MSG(INFO, "wc, frame[500]=%x\n", data_frame[500]);
  189. MSG(INFO, "wc, frame[501]=%x\n", data_frame[501]);
  190. MSG(INFO, "wc, frame[502]=%x\n", data_frame[502]);
  191. MSG(INFO, "wc, frame[503]=%x\n", data_frame[503]);
  192. MSG(INFO, "addr, frame[504]=%x\n", data_frame[504]);
  193. MSG(INFO, "addr, frame[505]=%x\n", data_frame[505]);
  194. MSG(INFO, "blkcnt,frame[506]=%x\n", data_frame[506]);
  195. MSG(INFO, "blkcnt,frame[507]=%x\n", data_frame[507]);
  196. MSG(INFO, "result, frame[508]=%x\n", data_frame[508]);
  197. MSG(INFO, "result, frame[509]=%x\n", data_frame[509]);
  198. MSG(INFO, "type, frame[510]=%x\n", data_frame[510]);
  199. MSG(INFO, "type, frame[511]=%x\n", data_frame[511]);
  200. }
  201. static int emmc_rpmb_send_command(
  202. struct mmc_card *card,
  203. u8 *buf,
  204. __u16 blks,
  205. __u16 type,
  206. u8 req_type
  207. )
  208. {
  209. struct mmc_request mrq = {NULL};
  210. struct mmc_command cmd = {0};
  211. struct mmc_command sbc = {0};
  212. struct mmc_data data = {0};
  213. struct scatterlist sg;
  214. u8 *transfer_buf = NULL;
  215. mrq.sbc = &sbc;
  216. mrq.cmd = &cmd;
  217. mrq.data = &data;
  218. mrq.stop = NULL;
  219. transfer_buf = kzalloc(512 * blks, GFP_KERNEL);
  220. if (!transfer_buf)
  221. return -ENOMEM;
  222. /*
  223. * set CMD23
  224. */
  225. sbc.opcode = MMC_SET_BLOCK_COUNT;
  226. sbc.arg = blks;
  227. if ((req_type == RPMB_REQ && type == RPMB_WRITE_DATA) || type == RPMB_PROGRAM_KEY)
  228. sbc.arg |= 1 << 31;
  229. sbc.flags = MMC_RSP_R1 | MMC_CMD_AC;
  230. /*
  231. * set CMD25/18
  232. */
  233. sg_init_one(&sg, transfer_buf, 512 * blks);
  234. if (req_type == RPMB_REQ) {
  235. cmd.opcode = MMC_WRITE_MULTIPLE_BLOCK;
  236. sg_copy_from_buffer(&sg, 1, buf, 512 * blks);
  237. data.flags |= MMC_DATA_WRITE;
  238. } else {
  239. cmd.opcode = MMC_READ_MULTIPLE_BLOCK;
  240. data.flags |= MMC_DATA_READ;
  241. }
  242. cmd.arg = 0;
  243. cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC;
  244. data.blksz = 512;
  245. data.blocks = blks;
  246. data.sg = &sg;
  247. data.sg_len = 1;
  248. mmc_set_data_timeout(&data, card);
  249. mmc_wait_for_req(card->host, &mrq);
  250. if (req_type != RPMB_REQ)
  251. sg_copy_to_buffer(&sg, 1, buf, 512 * blks);
  252. kfree(transfer_buf);
  253. if (cmd.error)
  254. return cmd.error;
  255. if (data.error)
  256. return data.error;
  257. return 0;
  258. }
  259. int emmc_rpmb_req_start(struct mmc_card *card, struct emmc_rpmb_req *req)
  260. {
  261. int err = 0;
  262. u16 blks = req->blk_cnt;
  263. u16 type = req->type;
  264. u8 *data_frame = req->data_frame;
  265. MSG(INFO, "%s, start\n", __func__);
  266. /*
  267. * STEP 1: send request to RPMB partition.
  268. */
  269. if (type == RPMB_WRITE_DATA)
  270. err = emmc_rpmb_send_command(card, data_frame, blks, type, RPMB_REQ);
  271. else
  272. err = emmc_rpmb_send_command(card, data_frame, 1, type, RPMB_REQ);
  273. if (err) {
  274. MSG(ERR, "%s step 1, request failed (%d)\n", __func__, err);
  275. goto out;
  276. }
  277. /*
  278. * STEP 2: check write result. Only for WRITE_DATA or Program key.
  279. */
  280. memset(data_frame, 0, 512 * blks);
  281. if (type == RPMB_WRITE_DATA || type == RPMB_PROGRAM_KEY) {
  282. data_frame[RPMB_TYPE_BEG + 1] = RPMB_RESULT_READ;
  283. err = emmc_rpmb_send_command(card, data_frame, 1, RPMB_RESULT_READ, RPMB_REQ);
  284. if (err) {
  285. MSG(ERR, "%s step 2, request result failed (%d)\n", __func__, err);
  286. goto out;
  287. }
  288. }
  289. /*
  290. * STEP 3: get response from RPMB partition
  291. */
  292. data_frame[RPMB_TYPE_BEG] = 0;
  293. data_frame[RPMB_TYPE_BEG + 1] = type;
  294. if (type == RPMB_READ_DATA)
  295. err = emmc_rpmb_send_command(card, data_frame, blks, type, RPMB_RESP);
  296. else
  297. err = emmc_rpmb_send_command(card, data_frame, 1, type, RPMB_RESP);
  298. if (err)
  299. MSG(ERR, "%s step 3, response failed (%d)\n", __func__, err);
  300. MSG(INFO, "%s, end\n", __func__);
  301. out:
  302. return err;
  303. }
  304. int emmc_rpmb_req_handle(struct mmc_card *card, struct emmc_rpmb_req *rpmb_req)
  305. {
  306. struct emmc_rpmb_blk_data *md = NULL, *part_md;
  307. int ret;
  308. emmc_rpmb_dump_frame(rpmb_req->data_frame);
  309. md = mmc_get_drvdata(card);
  310. list_for_each_entry(part_md, &md->part, part) {
  311. if (part_md->part_type == EXT_CSD_PART_CONFIG_ACC_RPMB)
  312. break;
  313. }
  314. MSG(INFO, "%s start.\n", __func__);
  315. mmc_claim_host(card->host);
  316. /*
  317. * STEP1: Switch to RPMB partition.
  318. */
  319. ret = emmc_rpmb_switch(card, part_md);
  320. if (ret) {
  321. MSG(ERR, "%s emmc_rpmb_switch failed. (%x)\n", __func__, ret);
  322. goto error;
  323. }
  324. MSG(INFO, "%s, emmc_rpmb_switch success.\n", __func__);
  325. /*
  326. * STEP2: Start request. (CMD23, CMD25/18 procedure)
  327. */
  328. ret = emmc_rpmb_req_start(card, rpmb_req);
  329. if (ret) {
  330. MSG(ERR, "%s emmc_rpmb_req_start failed!! (%x)\n", __func__, ret);
  331. goto error;
  332. }
  333. MSG(INFO, "%s end.\n", __func__);
  334. error:
  335. mmc_release_host(card->host);
  336. emmc_rpmb_dump_frame(rpmb_req->data_frame);
  337. return ret;
  338. }
  339. /* ********************************************************************************
  340. *
  341. * Following are internal APIs. Stand-alone driver without TEE.
  342. *
  343. *
  344. **********************************************************************************/
  345. int emmc_rpmb_req_set_key(struct mmc_card *card, u8 *key)
  346. {
  347. struct emmc_rpmb_req rpmb_req;
  348. struct s_rpmb *rpmb_frame;
  349. int ret;
  350. MSG(INFO, "%s start!!!\n", __func__);
  351. rpmb_frame = kzalloc(sizeof(struct s_rpmb), 0);
  352. if (rpmb_frame == NULL)
  353. return RPMB_ALLOC_ERROR;
  354. memcpy(rpmb_frame->mac, key, RPMB_SZ_MAC);
  355. rpmb_req.type = RPMB_PROGRAM_KEY;
  356. rpmb_req.blk_cnt = 1;
  357. rpmb_req.data_frame = (u8 *)rpmb_frame;
  358. rpmb_frame->request = cpu_to_be16p(&rpmb_req.type);
  359. ret = emmc_rpmb_req_handle(card, &rpmb_req);
  360. if (ret) {
  361. MSG(ERR, "%s, emmc_rpmb_req_handle IO error!!!(%x)\n", __func__, ret);
  362. goto free;
  363. }
  364. if (rpmb_frame->result) {
  365. MSG(ERR, "%s, result error!!! (%x)\n", __func__, cpu_to_be16p(&rpmb_frame->result));
  366. ret = RPMB_RESULT_ERROR;
  367. }
  368. MSG(INFO, "%s end!!!\n", __func__);
  369. free:
  370. kfree(rpmb_frame);
  371. return ret;
  372. }
  373. int emmc_rpmb_req_get_wc(struct mmc_card *card, u8 *key, u32 *wc)
  374. {
  375. struct emmc_rpmb_req rpmb_req;
  376. struct s_rpmb *rpmb_frame;
  377. u8 nonce[RPMB_SZ_NONCE] = {0};
  378. u8 hmac[RPMB_SZ_MAC];
  379. int ret;
  380. MSG(INFO, "%s start!!!\n", __func__);
  381. do {
  382. rpmb_frame = kzalloc(sizeof(struct s_rpmb), 0);
  383. if (rpmb_frame == NULL)
  384. return RPMB_ALLOC_ERROR;
  385. get_random_bytes(nonce, RPMB_SZ_NONCE);
  386. /*
  387. * Prepare request. Get write counter.
  388. */
  389. rpmb_req.type = RPMB_GET_WRITE_COUNTER;
  390. rpmb_req.blk_cnt = 1;
  391. rpmb_req.data_frame = (u8 *)rpmb_frame;
  392. /*
  393. * Prepare get write counter frame. only need nonce.
  394. */
  395. rpmb_frame->request = cpu_to_be16p(&rpmb_req.type);
  396. memcpy(rpmb_frame->nonce, nonce, RPMB_SZ_NONCE);
  397. ret = emmc_rpmb_req_handle(card, &rpmb_req);
  398. if (ret) {
  399. MSG(ERR, "%s, emmc_rpmb_req_handle IO error!!!(%x)\n", __func__, ret);
  400. break;
  401. }
  402. /*
  403. * Authenticate response write counter frame.
  404. */
  405. hmac_sha256(key, 32, rpmb_frame->data, 284, hmac);
  406. if (memcmp(hmac, rpmb_frame->mac, RPMB_SZ_MAC) != 0) {
  407. MSG(ERR, "%s, hmac compare error!!!\n", __func__);
  408. ret = RPMB_HMAC_ERROR;
  409. break;
  410. }
  411. if (memcmp(nonce, rpmb_frame->nonce, RPMB_SZ_NONCE) != 0) {
  412. MSG(ERR, "%s, nonce compare error!!!\n", __func__);
  413. ret = RPMB_NONCE_ERROR;
  414. break;
  415. }
  416. if (rpmb_frame->result) {
  417. MSG(ERR, "%s, result error!!! (%x)\n", __func__, cpu_to_be16p(&rpmb_frame->result));
  418. ret = RPMB_RESULT_ERROR;
  419. break;
  420. }
  421. *wc = cpu_to_be32p(&rpmb_frame->write_counter);
  422. } while (0);
  423. MSG(INFO, "%s end!!!\n", __func__);
  424. kfree(rpmb_frame);
  425. return ret;
  426. }
  427. int emmc_rpmb_req_write_data(struct mmc_card *card, struct rpmb_ioc_param *param)
  428. {
  429. struct emmc_rpmb_req rpmb_req;
  430. struct s_rpmb *rpmb_frame;
  431. u32 tran_size, left_size = param->data_len;
  432. u32 wc = 0xFFFFFFFF;
  433. u16 iCnt, total_blkcnt, tran_blkcnt, left_blkcnt;
  434. u16 blkaddr;
  435. u8 hmac[RPMB_SZ_MAC];
  436. u8 *dataBuf, *dataBuf_start;
  437. int i, ret = 0;
  438. MSG(INFO, "%s start!!!\n", __func__);
  439. i = 0;
  440. tran_blkcnt = 0;
  441. dataBuf = NULL;
  442. dataBuf_start = NULL;
  443. left_blkcnt = total_blkcnt = ((param->data_len % RPMB_SZ_DATA) ?
  444. (param->data_len / RPMB_SZ_DATA + 1) :
  445. (param->data_len / RPMB_SZ_DATA));
  446. #ifdef RPMB_MULTI_BLOCK_ACCESS
  447. /*
  448. * For RPMB write data, the elements we need in the data frame is
  449. * 1. address.
  450. * 2. write counter.
  451. * 3. data.
  452. * 4. block count.
  453. * 5. MAC
  454. *
  455. */
  456. blkaddr = param->addr;
  457. while (left_blkcnt) {
  458. if (left_blkcnt >= MAX_RPMB_TRANSFER_BLK)
  459. tran_blkcnt = MAX_RPMB_TRANSFER_BLK;
  460. else
  461. tran_blkcnt = left_blkcnt;
  462. MSG(INFO, "%s, total_blkcnt=%x, tran_blkcnt=%x\n", __func__, left_blkcnt, tran_blkcnt);
  463. ret = emmc_rpmb_req_get_wc(card, param->key, &wc);
  464. if (ret) {
  465. MSG(ERR, "%s, emmc_rpmb_req_get_wc error!!!(%x)\n", __func__, ret);
  466. return ret;
  467. }
  468. rpmb_frame = kzalloc(tran_blkcnt * sizeof(struct s_rpmb) + tran_blkcnt * 512, 0);
  469. if (rpmb_frame == NULL)
  470. return RPMB_ALLOC_ERROR;
  471. dataBuf_start = dataBuf = (u8 *)(rpmb_frame + tran_blkcnt);
  472. /*
  473. * Prepare request. write data.
  474. */
  475. rpmb_req.type = RPMB_WRITE_DATA;
  476. rpmb_req.blk_cnt = tran_blkcnt;
  477. rpmb_req.data_frame = (u8 *)rpmb_frame;
  478. /*
  479. * STEP 3(data), prepare every data frame one by one and hook HMAC to the last.
  480. */
  481. for (iCnt = 0; iCnt < tran_blkcnt; iCnt++) {
  482. /*
  483. * Prepare write data frame. need addr, wc, blkcnt, data and mac.
  484. */
  485. rpmb_frame[iCnt].request = cpu_to_be16p(&rpmb_req.type);
  486. rpmb_frame[iCnt].address = cpu_to_be16p(&blkaddr);
  487. rpmb_frame[iCnt].write_counter = cpu_to_be32p(&wc);
  488. rpmb_frame[iCnt].block_count = cpu_to_be16p(&rpmb_req.blk_cnt);
  489. if (left_size >= RPMB_SZ_DATA)
  490. tran_size = RPMB_SZ_DATA;
  491. else
  492. tran_size = left_size;
  493. memcpy(rpmb_frame[iCnt].data,
  494. param->data + i * MAX_RPMB_TRANSFER_BLK * RPMB_SZ_DATA + (iCnt * RPMB_SZ_DATA),
  495. tran_size);
  496. left_size -= tran_size;
  497. memcpy(dataBuf, rpmb_frame[iCnt].data, 284);
  498. dataBuf += 284;
  499. }
  500. iCnt--;
  501. hmac_sha256(param->key, 32, dataBuf_start, 284 * tran_blkcnt, rpmb_frame[iCnt].mac);
  502. /*
  503. * STEP 4, send write data request.
  504. */
  505. ret = emmc_rpmb_req_handle(card, &rpmb_req);
  506. if (ret) {
  507. MSG(ERR, "%s, emmc_rpmb_req_handle IO error!!!(%x)\n", __func__, ret);
  508. break;
  509. }
  510. /*
  511. * STEP 5. authenticate write result response.
  512. * 1. authenticate hmac.
  513. * 2. check result.
  514. * 3. compare write counter is increamented.
  515. */
  516. hmac_sha256(param->key, 32, rpmb_frame->data, 284, hmac);
  517. if (memcmp(hmac, rpmb_frame->mac, RPMB_SZ_MAC) != 0) {
  518. MSG(ERR, "%s, hmac compare error!!!\n", __func__);
  519. ret = RPMB_HMAC_ERROR;
  520. break;
  521. }
  522. if (rpmb_frame->result) {
  523. MSG(ERR, "%s, result error!!! (%x)\n", __func__, cpu_to_be16p(&rpmb_frame->result));
  524. ret = RPMB_RESULT_ERROR;
  525. break;
  526. }
  527. if (cpu_to_be32p(&rpmb_frame->write_counter) != wc + 1) {
  528. MSG(ERR, "%s, write counter error!!! (%x)\n", __func__,
  529. cpu_to_be32p(&rpmb_frame->write_counter));
  530. ret = RPMB_WC_ERROR;
  531. break;
  532. }
  533. blkaddr += tran_blkcnt;
  534. left_blkcnt -= tran_blkcnt;
  535. i++;
  536. kfree(rpmb_frame);
  537. };
  538. if (ret)
  539. kfree(rpmb_frame);
  540. if (left_blkcnt || left_size) {
  541. MSG(ERR, "left_blkcnt or left_size is not empty!!!!!!\n");
  542. return RPMB_TRANSFER_NOT_COMPLETE;
  543. }
  544. #else
  545. rpmb_frame = kzalloc(sizeof(struct s_rpmb), 0);
  546. if (rpmb_frame == NULL)
  547. return RPMB_ALLOC_ERROR;
  548. blkaddr = param->addr;
  549. for (iCnt = 0; iCnt < total_blkcnt; iCnt++) {
  550. ret = emmc_rpmb_req_get_wc(card, param->key, &wc);
  551. if (ret)
  552. break;
  553. memset(rpmb_frame, 0, sizeof(struct s_rpmb));
  554. /*
  555. * Prepare request. write data.
  556. */
  557. rpmb_req.type = RPMB_WRITE_DATA;
  558. rpmb_req.blk_cnt = 1;
  559. rpmb_req.data_frame = (u8 *)rpmb_frame;
  560. /*
  561. * Prepare write data frame. need addr, wc, blkcnt, data and mac.
  562. */
  563. rpmb_frame->request = cpu_to_be16p(&rpmb_req.type);
  564. rpmb_frame->address = cpu_to_be16p(&blkaddr);
  565. rpmb_frame->write_counter = cpu_to_be32p(&wc);
  566. rpmb_frame->block_count = cpu_to_be16p(&rpmb_req.blk_cnt);
  567. if (left_size >= RPMB_SZ_DATA)
  568. tran_size = RPMB_SZ_DATA;
  569. else
  570. tran_size = left_size;
  571. memcpy(rpmb_frame->data, param->data + iCnt * RPMB_SZ_DATA, tran_size);
  572. hmac_sha256(param->key, 32, rpmb_frame->data, 284, rpmb_frame->mac);
  573. ret = emmc_rpmb_req_handle(card, &rpmb_req);
  574. if (ret) {
  575. MSG(ERR, "%s, emmc_rpmb_req_handle IO error!!!(%x)\n", __func__, ret);
  576. break;
  577. }
  578. /*
  579. * Authenticate response write data frame.
  580. */
  581. hmac_sha256(param->key, 32, rpmb_frame->data, 284, hmac);
  582. if (memcmp(hmac, rpmb_frame->mac, RPMB_SZ_MAC) != 0) {
  583. MSG(ERR, "%s, hmac compare error!!!\n", __func__);
  584. ret = RPMB_HMAC_ERROR;
  585. break;
  586. }
  587. if (rpmb_frame->result) {
  588. MSG(ERR, "%s, result error!!! (%x)\n", __func__, cpu_to_be16p(&rpmb_frame->result));
  589. ret = RPMB_RESULT_ERROR;
  590. break;
  591. }
  592. if (cpu_to_be32p(&rpmb_frame->write_counter) != wc + 1) {
  593. MSG(ERR, "%s, write counter error!!! (%x)\n", __func__,
  594. cpu_to_be32p(&rpmb_frame->write_counter));
  595. ret = RPMB_WC_ERROR;
  596. break;
  597. }
  598. left_size -= tran_size;
  599. blkaddr++;
  600. }
  601. kfree(rpmb_frame);
  602. #endif
  603. MSG(INFO, "%s end!!!\n", __func__);
  604. return ret;
  605. }
  606. int emmc_rpmb_req_read_data(struct mmc_card *card, struct rpmb_ioc_param *param)
  607. {
  608. struct emmc_rpmb_req rpmb_req;
  609. /* //if we put a large static buffer here, it will build fail.
  610. * rpmb_frame[MAX_RPMB_TRANSFER_BLK];
  611. * so I use dynamic alloc.
  612. */
  613. struct s_rpmb *rpmb_frame;
  614. u32 tran_size, left_size = param->data_len;
  615. u16 iCnt, total_blkcnt, tran_blkcnt, left_blkcnt;
  616. u16 blkaddr;
  617. u8 nonce[RPMB_SZ_NONCE] = {0};
  618. u8 hmac[RPMB_SZ_MAC];
  619. u8 *dataBuf, *dataBuf_start;
  620. int i, ret = 0;
  621. MSG(INFO, "%s start!!!\n", __func__);
  622. i = 0;
  623. tran_blkcnt = 0;
  624. dataBuf = NULL;
  625. dataBuf_start = NULL;
  626. left_blkcnt = total_blkcnt = ((param->data_len % RPMB_SZ_DATA) ?
  627. (param->data_len / RPMB_SZ_DATA + 1) :
  628. (param->data_len / RPMB_SZ_DATA));
  629. #ifdef RPMB_MULTI_BLOCK_ACCESS
  630. blkaddr = param->addr;
  631. while (left_blkcnt) {
  632. if (left_blkcnt >= MAX_RPMB_TRANSFER_BLK)
  633. tran_blkcnt = MAX_RPMB_TRANSFER_BLK;
  634. else
  635. tran_blkcnt = left_blkcnt;
  636. MSG(INFO, "%s, left_blkcnt=%x, tran_blkcnt=%x\n", __func__, left_blkcnt, tran_blkcnt);
  637. /*
  638. * initial buffer. (since HMAC computation of multi block needs multi buffer, pre-alloced it)
  639. */
  640. rpmb_frame = kzalloc(tran_blkcnt * sizeof(struct s_rpmb) + tran_blkcnt * 512, 0);
  641. if (rpmb_frame == NULL)
  642. return RPMB_ALLOC_ERROR;
  643. dataBuf_start = dataBuf = (u8 *)(rpmb_frame + tran_blkcnt);
  644. get_random_bytes(nonce, RPMB_SZ_NONCE);
  645. /*
  646. * Prepare request.
  647. */
  648. rpmb_req.type = RPMB_READ_DATA;
  649. rpmb_req.blk_cnt = tran_blkcnt;
  650. rpmb_req.data_frame = (u8 *)rpmb_frame;
  651. /*
  652. * Prepare request read data frame. only need addr and nonce.
  653. */
  654. rpmb_frame->request = cpu_to_be16p(&rpmb_req.type);
  655. rpmb_frame->address = cpu_to_be16p(&blkaddr);
  656. memcpy(rpmb_frame->nonce, nonce, RPMB_SZ_NONCE);
  657. ret = emmc_rpmb_req_handle(card, &rpmb_req);
  658. if (ret) {
  659. MSG(ERR, "%s, emmc_rpmb_req_handle IO error!!!(%x)\n", __func__, ret);
  660. break;
  661. }
  662. /*
  663. * STEP 3, retrieve every data frame one by one.
  664. */
  665. for (iCnt = 0; iCnt < tran_blkcnt; iCnt++) {
  666. if (left_size >= RPMB_SZ_DATA)
  667. tran_size = RPMB_SZ_DATA;
  668. else
  669. tran_size = left_size;
  670. /*
  671. * dataBuf used for hmac calculation. we need to aggregate each block's data till to type field.
  672. * each block has 284 bytes need to aggregate.
  673. */
  674. memcpy(dataBuf, rpmb_frame[iCnt].data, 284);
  675. dataBuf = dataBuf + 284;
  676. /*
  677. * sorry, I shouldn't copy read data to user's buffer now, it should be later
  678. * after checking no problem,
  679. * but for convenience...you know...
  680. */
  681. memcpy(param->data + i * MAX_RPMB_TRANSFER_BLK * RPMB_SZ_DATA + (iCnt * RPMB_SZ_DATA),
  682. rpmb_frame[iCnt].data,
  683. tran_size);
  684. left_size -= tran_size;
  685. }
  686. iCnt--;
  687. /*
  688. * Authenticate response read data frame.
  689. */
  690. hmac_sha256(param->key, 32, dataBuf_start, 284 * tran_blkcnt, hmac);
  691. if (memcmp(hmac, rpmb_frame[iCnt].mac, RPMB_SZ_MAC) != 0) {
  692. MSG(ERR, "%s, hmac compare error!!!\n", __func__);
  693. ret = RPMB_HMAC_ERROR;
  694. break;
  695. }
  696. if (memcmp(nonce, rpmb_frame[iCnt].nonce, RPMB_SZ_NONCE) != 0) {
  697. MSG(ERR, "%s, nonce compare error!!!\n", __func__);
  698. ret = RPMB_NONCE_ERROR;
  699. break;
  700. }
  701. if (rpmb_frame[iCnt].result) {
  702. MSG(ERR, "%s, result error!!! (%x)\n", __func__, cpu_to_be16p(&rpmb_frame[iCnt].result));
  703. ret = RPMB_RESULT_ERROR;
  704. break;
  705. }
  706. blkaddr += tran_blkcnt;
  707. left_blkcnt -= tran_blkcnt;
  708. i++;
  709. kfree(rpmb_frame);
  710. };
  711. if (ret)
  712. kfree(rpmb_frame);
  713. if (left_blkcnt || left_size) {
  714. MSG(ERR, "left_blkcnt or left_size is not empty!!!!!!\n");
  715. return RPMB_TRANSFER_NOT_COMPLETE;
  716. }
  717. #else
  718. rpmb_frame = kzalloc(sizeof(struct s_rpmb), 0);
  719. if (rpmb_frame == NULL)
  720. return RPMB_ALLOC_ERROR;
  721. blkaddr = param->addr;
  722. for (iCnt = 0; iCnt < total_blkcnt; iCnt++) {
  723. memset(rpmb_frame, 0, sizeof(struct s_rpmb));
  724. get_random_bytes(nonce, RPMB_SZ_NONCE);
  725. /*
  726. * Prepare request.
  727. */
  728. rpmb_req.type = RPMB_READ_DATA;
  729. rpmb_req.blk_cnt = 1;
  730. rpmb_req.data_frame = (u8 *)rpmb_frame;
  731. /*
  732. * Prepare request read data frame. only need addr and nonce.
  733. */
  734. rpmb_frame->request = cpu_to_be16p(&rpmb_req.type);
  735. rpmb_frame->address = cpu_to_be16p(&blkaddr);
  736. memcpy(rpmb_frame->nonce, nonce, RPMB_SZ_NONCE);
  737. ret = emmc_rpmb_req_handle(card, &rpmb_req);
  738. if (ret) {
  739. MSG(ERR, "%s, emmc_rpmb_req_handle IO error!!!(%x)\n", __func__, ret);
  740. break;
  741. }
  742. /*
  743. * Authenticate response read data frame.
  744. */
  745. hmac_sha256(param->key, 32, rpmb_frame->data, 284, hmac);
  746. if (memcmp(hmac, rpmb_frame->mac, RPMB_SZ_MAC) != 0) {
  747. MSG(ERR, "%s, hmac compare error!!!\n", __func__);
  748. ret = RPMB_HMAC_ERROR;
  749. break;
  750. }
  751. if (memcmp(nonce, rpmb_frame->nonce, RPMB_SZ_NONCE) != 0) {
  752. MSG(ERR, "%s, nonce compare error!!!\n", __func__);
  753. ret = RPMB_NONCE_ERROR;
  754. break;
  755. }
  756. if (rpmb_frame->result) {
  757. MSG(ERR, "%s, result error!!! (%x)\n", __func__, cpu_to_be16p(&rpmb_frame->result));
  758. ret = RPMB_RESULT_ERROR;
  759. break;
  760. }
  761. if (left_size >= RPMB_SZ_DATA)
  762. tran_size = RPMB_SZ_DATA;
  763. else
  764. tran_size = left_size;
  765. memcpy(param->data + RPMB_SZ_DATA * iCnt, rpmb_frame->data, tran_size);
  766. left_size -= tran_size;
  767. blkaddr++;
  768. }
  769. kfree(rpmb_frame);
  770. #endif
  771. MSG(INFO, "%s end!!!\n", __func__);
  772. return ret;
  773. }
  774. #if (defined(CONFIG_MICROTRUST_TZ_DRIVER))
  775. int neu_rpmb_req_get_wc(struct mmc_card *card, unsigned int *wc)
  776. {
  777. struct emmc_rpmb_req rpmb_req;
  778. struct s_rpmb rpmb_frame;
  779. u8 nonce[RPMB_SZ_NONCE] = {0};
  780. int ret;
  781. memset(&rpmb_frame, 0, sizeof(rpmb_frame));
  782. get_random_bytes(nonce, RPMB_SZ_NONCE);
  783. /*
  784. * Prepare request. Get write counter.
  785. */
  786. rpmb_req.type = RPMB_GET_WRITE_COUNTER;
  787. rpmb_req.blk_cnt = 1;
  788. rpmb_req.data_frame = (u8 *)&rpmb_frame;
  789. /*
  790. * Prepare get write counter frame. only need nonce.
  791. */
  792. rpmb_frame.request = cpu_to_be16p(&rpmb_req.type);
  793. memcpy(rpmb_frame.nonce, nonce, RPMB_SZ_NONCE);
  794. ret = emmc_rpmb_req_handle(card, &rpmb_req);
  795. if (ret) {
  796. MSG(ERR, "%s, emmc_rpmb_req_handle IO error!!!(%x)\n", __func__, ret);
  797. return ret;
  798. }
  799. if (memcmp(nonce, rpmb_frame.nonce, RPMB_SZ_NONCE) != 0) {
  800. MSG(ERR, "%s, nonce compare error!!!\n", __func__);
  801. ret = RPMB_NONCE_ERROR;
  802. return ret;
  803. }
  804. if (rpmb_frame.result) {
  805. MSG(ERR, "%s, result error!!! (%x)\n", __func__, cpu_to_be16p(&rpmb_frame.result));
  806. ret = RPMB_RESULT_ERROR;
  807. return cpu_to_be16p(&rpmb_frame.result);
  808. }
  809. *wc = cpu_to_be32p(&rpmb_frame.write_counter);
  810. return ret;
  811. }
  812. EXPORT_SYMBOL(neu_rpmb_req_get_wc);
  813. int neu_rpmb_req_read_data(struct mmc_card *card, struct s_rpmb *param, u32 blk_cnt)/*struct mmc_card *card, */
  814. {
  815. struct emmc_rpmb_req rpmb_req;
  816. int ret;
  817. rpmb_req.type = RPMB_READ_DATA;
  818. rpmb_req.blk_cnt = blk_cnt;
  819. rpmb_req.data_frame = (u8 *)param;
  820. ret = emmc_rpmb_req_handle(card, &rpmb_req);
  821. if (ret)
  822. MSG(ERR, "%s, emmc_rpmb_req_handle IO error!!!(%x)\n", __func__, ret);
  823. return ret;
  824. }
  825. EXPORT_SYMBOL(neu_rpmb_req_read_data);
  826. int neu_rpmb_req_write_data(struct mmc_card *card, struct s_rpmb *param, u32 blk_cnt)/*struct mmc_card *card, */
  827. {
  828. struct emmc_rpmb_req rpmb_req;
  829. int ret;
  830. rpmb_req.type = RPMB_WRITE_DATA;
  831. rpmb_req.blk_cnt = blk_cnt;
  832. rpmb_req.data_frame = (u8 *)param;
  833. ret = emmc_rpmb_req_handle(card, &rpmb_req);
  834. if (ret)
  835. MSG(ERR, "%s, emmc_rpmb_req_handle IO error!!!(%x)\n", __func__, ret);
  836. return ret;
  837. }
  838. EXPORT_SYMBOL(neu_rpmb_req_write_data);
  839. #endif
  840. /*
  841. * End of above.
  842. *
  843. **********************************************************************************/
  844. #ifdef CONFIG_TRUSTONIC_TEE_SUPPORT
  845. static int emmc_rpmb_execute(u32 cmdId)
  846. {
  847. int ret;
  848. struct mmc_card *card = mtk_msdc_host[0]->mmc->card;
  849. struct emmc_rpmb_req rpmb_req;
  850. switch (cmdId) {
  851. case DCI_RPMB_CMD_READ_DATA:
  852. MSG(INFO, "%s: DCI_RPMB_CMD_READ_DATA.\n", __func__);
  853. rpmb_req.type = RPMB_READ_DATA;
  854. rpmb_req.blk_cnt = rpmb_dci->request.blks;
  855. rpmb_req.addr = rpmb_dci->request.addr;
  856. rpmb_req.data_frame = rpmb_dci->request.frame;
  857. ret = emmc_rpmb_req_handle(card, &rpmb_req);
  858. if (ret)
  859. MSG(ERR, "%s, emmc_rpmb_req_read_data failed!!(%x)\n", __func__, ret);
  860. break;
  861. case DCI_RPMB_CMD_GET_WCNT:
  862. MSG(INFO, "%s: DCI_RPMB_CMD_GET_WCNT.\n", __func__);
  863. rpmb_req.type = RPMB_GET_WRITE_COUNTER;
  864. rpmb_req.blk_cnt = rpmb_dci->request.blks;
  865. rpmb_req.addr = rpmb_dci->request.addr;
  866. rpmb_req.data_frame = rpmb_dci->request.frame;
  867. ret = emmc_rpmb_req_handle(card, &rpmb_req);
  868. if (ret)
  869. MSG(ERR, "%s, emmc_rpmb_req_handle failed!!(%x)\n", __func__, ret);
  870. break;
  871. case DCI_RPMB_CMD_WRITE_DATA:
  872. MSG(INFO, "%s: DCI_RPMB_CMD_WRITE_DATA.\n", __func__);
  873. rpmb_req.type = RPMB_WRITE_DATA;
  874. rpmb_req.blk_cnt = rpmb_dci->request.blks;
  875. rpmb_req.addr = rpmb_dci->request.addr;
  876. rpmb_req.data_frame = rpmb_dci->request.frame;
  877. ret = emmc_rpmb_req_handle(card, &rpmb_req);
  878. if (ret)
  879. MSG(ERR, "%s, emmc_rpmb_req_handle failed!!(%x)\n", __func__, ret);
  880. break;
  881. default:
  882. MSG(ERR, "%s: receive an unknown command id(%d).\n", __func__, cmdId);
  883. break;
  884. }
  885. return 0;
  886. }
  887. int emmc_rpmb_listenDci(void *data)
  888. {
  889. enum mc_result mc_ret;
  890. u32 cmdId;
  891. MSG(INFO, "%s: DCI listener.\n", __func__);
  892. for (;;) {
  893. MSG(INFO, "%s: Waiting for notification\n", __func__);
  894. /* Wait for notification from SWd */
  895. mc_ret = mc_wait_notification(&rpmb_session, MC_INFINITE_TIMEOUT);
  896. if (mc_ret != MC_DRV_OK) {
  897. MSG(ERR, "%s: mcWaitNotification failed, mc_ret=%d\n", __func__, mc_ret);
  898. break;
  899. }
  900. cmdId = rpmb_dci->command.header.commandId;
  901. MSG(INFO, "%s: wait notification done!! cmdId = %x\n", __func__, cmdId);
  902. /* Received exception. */
  903. mc_ret = emmc_rpmb_execute(cmdId);
  904. /* Notify the STH*/
  905. mc_ret = mc_notify(&rpmb_session);
  906. if (mc_ret != MC_DRV_OK) {
  907. MSG(ERR, "%s: mcNotify returned: %d\n", __func__, mc_ret);
  908. break;
  909. }
  910. }
  911. return 0;
  912. }
  913. static int emmc_rpmb_open_session(void)
  914. {
  915. int cnt = 0;
  916. enum mc_result mc_ret = MC_DRV_ERR_UNKNOWN;
  917. MSG(INFO, "%s start\n", __func__);
  918. do {
  919. msleep(2000);
  920. /* open device */
  921. mc_ret = mc_open_device(rpmb_devid);
  922. if (mc_ret != MC_DRV_OK) {
  923. MSG(ERR, "%s, mc_open_device failed: %d\n", __func__, mc_ret);
  924. cnt++;
  925. continue;
  926. }
  927. MSG(INFO, "%s, mc_open_device success.\n", __func__);
  928. /* allocating WSM for DCI */
  929. mc_ret = mc_malloc_wsm(rpmb_devid, 0, sizeof(dciMessage_t), (uint8_t **)&rpmb_dci, 0);
  930. if (mc_ret != MC_DRV_OK) {
  931. mc_close_device(rpmb_devid);
  932. MSG(ERR, "%s, mc_malloc_wsm failed: %d\n", __func__, mc_ret);
  933. cnt++;
  934. continue;
  935. }
  936. MSG(INFO, "%s, mc_malloc_wsm success.\n", __func__);
  937. MSG(INFO, "uuid[0]=%d, uuid[1]=%d, uuid[2]=%d, uuid[3]=%d\n",
  938. rpmb_uuid.value[0], rpmb_uuid.value[1], rpmb_uuid.value[2], rpmb_uuid.value[3]);
  939. rpmb_session.device_id = rpmb_devid;
  940. /* open session */
  941. mc_ret = mc_open_session(&rpmb_session,
  942. &rpmb_uuid,
  943. (uint8_t *) rpmb_dci,
  944. sizeof(dciMessage_t));
  945. if (mc_ret != MC_DRV_OK) {
  946. MSG(ERR, "%s, mc_open_session failed.(%d)\n", __func__, cnt);
  947. mc_ret = mc_free_wsm(rpmb_devid, (uint8_t *)rpmb_dci);
  948. MSG(ERR, "%s, free wsm result (%d)\n", __func__, mc_ret);
  949. mc_ret = mc_close_device(rpmb_devid);
  950. MSG(ERR, "%s, try free wsm and close device\n", __func__);
  951. cnt++;
  952. continue;
  953. }
  954. /* create a thread for listening DCI signals */
  955. rpmbDci_th = kthread_run(emmc_rpmb_listenDci, NULL, "rpmb_Dci");
  956. if (IS_ERR(rpmbDci_th))
  957. MSG(ERR, "%s, init kthread_run failed!\n", __func__);
  958. else
  959. break;
  960. } while (cnt < 30);
  961. if (cnt >= 30)
  962. MSG(ERR, "%s, open session failed!!!\n", __func__);
  963. MSG(INFO, "%s end, mc_ret = %x\n", __func__, mc_ret);
  964. return mc_ret;
  965. }
  966. static int emmc_rpmb_gp_execute(u32 cmdId)
  967. {
  968. int ret;
  969. struct mmc_card *card = mtk_msdc_host[0]->mmc->card;
  970. struct emmc_rpmb_req rpmb_req;
  971. switch (cmdId) {
  972. case DCI_RPMB_CMD_READ_DATA:
  973. MSG(INFO, "%s: DCI_RPMB_CMD_READ_DATA.\n", __func__);
  974. rpmb_req.type = RPMB_READ_DATA;
  975. rpmb_req.blk_cnt = rpmb_gp_dci->request.blks;
  976. rpmb_req.addr = rpmb_gp_dci->request.addr;
  977. rpmb_req.data_frame = rpmb_gp_dci->request.frame;
  978. ret = emmc_rpmb_req_handle(card, &rpmb_req);
  979. if (ret)
  980. MSG(ERR, "%s, emmc_rpmb_req_read_data failed!!(%x)\n", __func__, ret);
  981. break;
  982. case DCI_RPMB_CMD_GET_WCNT:
  983. MSG(INFO, "%s: DCI_RPMB_CMD_GET_WCNT.\n", __func__);
  984. rpmb_req.type = RPMB_GET_WRITE_COUNTER;
  985. rpmb_req.blk_cnt = rpmb_gp_dci->request.blks;
  986. rpmb_req.addr = rpmb_gp_dci->request.addr;
  987. rpmb_req.data_frame = rpmb_gp_dci->request.frame;
  988. ret = emmc_rpmb_req_handle(card, &rpmb_req);
  989. if (ret)
  990. MSG(ERR, "%s, emmc_rpmb_req_handle failed!!(%x)\n", __func__, ret);
  991. break;
  992. case DCI_RPMB_CMD_WRITE_DATA:
  993. MSG(INFO, "%s: DCI_RPMB_CMD_WRITE_DATA.\n", __func__);
  994. rpmb_req.type = RPMB_WRITE_DATA;
  995. rpmb_req.blk_cnt = rpmb_gp_dci->request.blks;
  996. rpmb_req.addr = rpmb_gp_dci->request.addr;
  997. rpmb_req.data_frame = rpmb_gp_dci->request.frame;
  998. ret = emmc_rpmb_req_handle(card, &rpmb_req);
  999. if (ret)
  1000. MSG(ERR, "%s, emmc_rpmb_req_handle failed!!(%x)\n", __func__, ret);
  1001. break;
  1002. default:
  1003. MSG(ERR, "%s: receive an unknown command id(%d).\n", __func__, cmdId);
  1004. break;
  1005. }
  1006. return 0;
  1007. }
  1008. int emmc_rpmb_gp_listenDci(void *data)
  1009. {
  1010. enum mc_result mc_ret;
  1011. u32 cmdId;
  1012. MSG(INFO, "%s: DCI listener.\n", __func__);
  1013. for (;;) {
  1014. MSG(INFO, "%s: Waiting for notification\n", __func__);
  1015. /* Wait for notification from SWd */
  1016. mc_ret = mc_wait_notification(&rpmb_gp_session, MC_INFINITE_TIMEOUT);
  1017. if (mc_ret != MC_DRV_OK) {
  1018. MSG(ERR, "%s: mcWaitNotification failed, mc_ret=%d\n", __func__, mc_ret);
  1019. break;
  1020. }
  1021. cmdId = rpmb_gp_dci->command.header.commandId;
  1022. MSG(INFO, "%s: wait notification done!! cmdId = %x\n", __func__, cmdId);
  1023. /* Received exception. */
  1024. mc_ret = emmc_rpmb_gp_execute(cmdId);
  1025. /* Notify the STH*/
  1026. mc_ret = mc_notify(&rpmb_gp_session);
  1027. if (mc_ret != MC_DRV_OK) {
  1028. MSG(ERR, "%s: mcNotify returned: %d\n", __func__, mc_ret);
  1029. break;
  1030. }
  1031. }
  1032. return 0;
  1033. }
  1034. static int emmc_rpmb_gp_open_session(void)
  1035. {
  1036. int cnt = 0;
  1037. enum mc_result mc_ret = MC_DRV_ERR_UNKNOWN;
  1038. MSG(INFO, "%s start\n", __func__);
  1039. do {
  1040. msleep(2000);
  1041. /* open device */
  1042. mc_ret = mc_open_device(rpmb_gp_devid);
  1043. if (mc_ret != MC_DRV_OK) {
  1044. MSG(ERR, "%s, mc_open_device failed: %d\n", __func__, mc_ret);
  1045. cnt++;
  1046. continue;
  1047. }
  1048. MSG(INFO, "%s, mc_open_device success.\n", __func__);
  1049. /* allocating WSM for DCI */
  1050. mc_ret = mc_malloc_wsm(rpmb_gp_devid, 0, sizeof(dciMessage_t), (uint8_t **)&rpmb_gp_dci, 0);
  1051. if (mc_ret != MC_DRV_OK) {
  1052. mc_close_device(rpmb_gp_devid);
  1053. MSG(ERR, "%s, mc_malloc_wsm failed: %d\n", __func__, mc_ret);
  1054. cnt++;
  1055. continue;
  1056. }
  1057. MSG(INFO, "%s, mc_malloc_wsm success.\n", __func__);
  1058. MSG(INFO, "uuid[0]=%d, uuid[1]=%d, uuid[2]=%d, uuid[3]=%d\n",
  1059. rpmb_gp_uuid.value[0],
  1060. rpmb_gp_uuid.value[1],
  1061. rpmb_gp_uuid.value[2],
  1062. rpmb_gp_uuid.value[3]
  1063. );
  1064. rpmb_gp_session.device_id = rpmb_gp_devid;
  1065. /* open session */
  1066. mc_ret = mc_open_session(&rpmb_gp_session,
  1067. &rpmb_gp_uuid,
  1068. (uint8_t *) rpmb_gp_dci,
  1069. sizeof(dciMessage_t));
  1070. if (mc_ret != MC_DRV_OK) {
  1071. MSG(ERR, "%s, mc_open_session failed.(%d)\n", __func__, cnt);
  1072. mc_ret = mc_free_wsm(rpmb_gp_devid, (uint8_t *)rpmb_gp_dci);
  1073. MSG(ERR, "%s, free wsm result (%d)\n", __func__, mc_ret);
  1074. mc_ret = mc_close_device(rpmb_gp_devid);
  1075. MSG(ERR, "%s, try free wsm and close device\n", __func__);
  1076. cnt++;
  1077. continue;
  1078. }
  1079. /* create a thread for listening DCI signals */
  1080. rpmb_gp_Dci_th = kthread_run(emmc_rpmb_gp_listenDci, NULL, "rpmb_gp_Dci");
  1081. if (IS_ERR(rpmb_gp_Dci_th))
  1082. MSG(ERR, "%s, init kthread_run failed!\n", __func__);
  1083. else
  1084. break;
  1085. } while (cnt < 30);
  1086. if (cnt >= 30)
  1087. MSG(ERR, "%s, open session failed!!!\n", __func__);
  1088. MSG(ERR, "%s end, mc_ret = %x\n", __func__, mc_ret);
  1089. return mc_ret;
  1090. }
  1091. static int emmc_rpmb_thread(void *context)
  1092. {
  1093. int ret;
  1094. MSG(INFO, "%s start\n", __func__);
  1095. ret = emmc_rpmb_open_session();
  1096. MSG(INFO, "%s emmc_rpmb_open_session, ret = %x\n", __func__, ret);
  1097. ret = emmc_rpmb_gp_open_session();
  1098. MSG(INFO, "%s emmc_rpmb_gp_open_session, ret = %x\n", __func__, ret);
  1099. return 0;
  1100. }
  1101. #endif
  1102. static int emmc_rpmb_open(struct inode *inode, struct file *file)
  1103. {
  1104. MSG(INFO, "%s, !!!!!!!!!!!!\n", __func__);
  1105. #if (defined(CONFIG_MICROTRUST_TZ_DRIVER))
  1106. rpmb_buffer = kzalloc(RPMB_DATA_BUFF_SIZE, 0);
  1107. if (rpmb_buffer == NULL) {
  1108. MSG(ERR, "%s, rpmb kzalloc memory fail!!!\n", __func__);
  1109. return -1;
  1110. }
  1111. MSG(INFO, "%s, rpmb kzalloc memory done!!!\n", __func__);
  1112. #endif
  1113. return 0;
  1114. }
  1115. static long emmc_rpmb_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
  1116. {
  1117. int err = 0;
  1118. struct mmc_card *card = mtk_msdc_host[0]->mmc->card;
  1119. struct rpmb_ioc_param param;
  1120. int ret;
  1121. #if (defined(CONFIG_MICROTRUST_TZ_DRIVER))
  1122. struct rpmb_infor rpmbinfor;
  1123. memset(&rpmbinfor, 0, sizeof(struct rpmb_infor));
  1124. #endif
  1125. MSG(INFO, "%s, !!!!!!!!!!!!\n", __func__);
  1126. err = copy_from_user(&param, (void *)arg, sizeof(param));
  1127. if (err < 0) {
  1128. MSG(ERR, "%s, err=%x\n", __func__, err);
  1129. return -1;
  1130. }
  1131. #if (defined(CONFIG_MICROTRUST_TZ_DRIVER))
  1132. if ((cmd == RPMB_IOCTL_SOTER_WRITE_DATA) || (cmd == RPMB_IOCTL_SOTER_READ_DATA)) {
  1133. err = copy_from_user(rpmb_buffer, (void *)arg, 4);
  1134. if (err < 0) {
  1135. MSG(ERR, "%s, err=%x\n", __func__, err);
  1136. return -1;
  1137. }
  1138. rpmbinfor.size = *(unsigned char *)rpmb_buffer | (*((unsigned char *)rpmb_buffer + 1) << 8);
  1139. rpmbinfor.size |= (*((unsigned char *)rpmb_buffer+2) << 16) | (*((unsigned char *)rpmb_buffer+3) << 24);
  1140. MSG(INFO, "%s, rpmbinfor.size is %d!\n", __func__, rpmbinfor.size);
  1141. err = copy_from_user(rpmb_buffer, (void *)arg, 4 + rpmbinfor.size);
  1142. rpmbinfor.data_frame = (rpmb_buffer + 4);
  1143. if (cmd == RPMB_IOCTL_SOTER_WRITE_DATA) {
  1144. ret = neu_rpmb_req_write_data(card,
  1145. (struct s_rpmb *)(rpmbinfor.data_frame), rpmbinfor.size/1024);
  1146. if (ret)
  1147. MSG(ERR, "%s, emmc_rpmb_req_handle IO error!!!(%x)\n", __func__, ret);
  1148. err = copy_to_user((void *)arg, rpmb_buffer, 4 + rpmbinfor.size);
  1149. } else if (cmd == RPMB_IOCTL_SOTER_READ_DATA) {
  1150. ret = neu_rpmb_req_read_data(card,
  1151. (struct s_rpmb *)(rpmbinfor.data_frame), rpmbinfor.size/1024);
  1152. if (ret)
  1153. MSG(ERR, "%s, emmc_rpmb_req_handle IO error!!!(%x)\n", __func__, ret);
  1154. err = copy_to_user((void *)arg, rpmb_buffer, 4 + rpmbinfor.size);
  1155. }
  1156. }
  1157. #endif
  1158. switch (cmd) {
  1159. case RPMB_IOCTL_PROGRAM_KEY:
  1160. MSG(INFO, "%s, cmd = RPMB_IOCTL_PROGRAM_KEY!!!!!!!!!!!!!!\n", __func__);
  1161. ret = emmc_rpmb_req_set_key(card, param.key);
  1162. break;
  1163. case RPMB_IOCTL_READ_DATA:
  1164. MSG(INFO, "%s, cmd = RPMB_IOCTL_READ_DATA!!!!!!!!!!!!!!\n", __func__);
  1165. ret = emmc_rpmb_req_read_data(card, &param);
  1166. err = copy_to_user((void *)arg, &param, sizeof(param));
  1167. if (err < 0) {
  1168. MSG(ERR, "%s, err=%x\n", __func__, err);
  1169. return -1;
  1170. }
  1171. break;
  1172. case RPMB_IOCTL_WRITE_DATA:
  1173. MSG(INFO, "%s, cmd = RPMB_IOCTL_WRITE_DATA!!!!!!!!!!!!!!\n", __func__);
  1174. ret = emmc_rpmb_req_write_data(card, &param);
  1175. break;
  1176. #if (defined(CONFIG_MICROTRUST_TZ_DRIVER))
  1177. case RPMB_IOCTL_SOTER_GET_CNT:
  1178. ret = neu_rpmb_req_get_wc(card, (unsigned int *)arg);
  1179. break;
  1180. #endif
  1181. default:
  1182. MSG(ERR, "%s, wrong ioctl code (%d)!!!\n", __func__, cmd);
  1183. return -ENOTTY;
  1184. }
  1185. return ret;
  1186. }
  1187. static int emmc_rpmb_close(struct inode *inode, struct file *file)
  1188. {
  1189. int ret = 0;
  1190. MSG(INFO, "%s, !!!!!!!!!!!!\n", __func__);
  1191. #if (defined(CONFIG_MICROTRUST_TZ_DRIVER))
  1192. kfree(rpmb_buffer);
  1193. MSG(INFO, "%s, rpmb free memory done!!!\n", __func__);
  1194. #endif
  1195. return ret;
  1196. }
  1197. static const struct file_operations emmc_rpmb_fops = {
  1198. .owner = THIS_MODULE,
  1199. .open = emmc_rpmb_open,
  1200. .release = emmc_rpmb_close,
  1201. .unlocked_ioctl = emmc_rpmb_ioctl,
  1202. .write = NULL,
  1203. .read = NULL,
  1204. };
  1205. static int __init emmc_rpmb_init(void)
  1206. {
  1207. int alloc_ret = -1;
  1208. int cdev_ret = -1;
  1209. int major;
  1210. dev_t dev;
  1211. struct device *device = NULL;
  1212. MSG(INFO, "%s start\n", __func__);
  1213. alloc_ret = alloc_chrdev_region(&dev, 0, 1, RPMB_NAME);
  1214. if (alloc_ret)
  1215. goto error;
  1216. major = MAJOR(dev);
  1217. cdev_init(&rpmb_dev, &emmc_rpmb_fops);
  1218. rpmb_dev.owner = THIS_MODULE;
  1219. cdev_ret = cdev_add(&rpmb_dev, MKDEV(major, 0), 1);
  1220. if (cdev_ret)
  1221. goto error;
  1222. rpmb_class = class_create(THIS_MODULE, RPMB_NAME);
  1223. if (IS_ERR(rpmb_class))
  1224. goto error;
  1225. device = device_create(rpmb_class, NULL, MKDEV(major, 0), NULL,
  1226. RPMB_NAME "%d", 0);
  1227. if (IS_ERR(device))
  1228. goto error;
  1229. #ifdef CONFIG_TRUSTONIC_TEE_SUPPORT
  1230. open_th = kthread_run(emmc_rpmb_thread, NULL, "rpmb_open");
  1231. if (IS_ERR(open_th))
  1232. MSG(ERR, "%s, init kthread_run failed!\n", __func__);
  1233. #endif
  1234. MSG(INFO, "emmc_rpmb_init end!!!!\n");
  1235. return 0;
  1236. error:
  1237. if (rpmb_class)
  1238. class_destroy(rpmb_class);
  1239. if (cdev_ret == 0)
  1240. cdev_del(&rpmb_dev);
  1241. if (alloc_ret == 0)
  1242. unregister_chrdev_region(dev, 1);
  1243. return -1;
  1244. }
  1245. late_initcall(emmc_rpmb_init);