msm_rng.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574
  1. /*
  2. * Copyright (c) 2011-2014, The Linux Foundation. All rights reserved.
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License version 2 and
  6. * only version 2 as published by the Free Software Foundation.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. */
  14. #include <linux/kernel.h>
  15. #include <linux/module.h>
  16. #include <linux/init.h>
  17. #include <linux/device.h>
  18. #include <linux/platform_device.h>
  19. #include <linux/hw_random.h>
  20. #include <linux/clk.h>
  21. #include <linux/slab.h>
  22. #include <linux/io.h>
  23. #include <linux/err.h>
  24. #include <linux/types.h>
  25. #include <mach/msm_iomap.h>
  26. #include <mach/socinfo.h>
  27. #include <mach/msm_bus.h>
  28. #include <linux/qrng.h>
  29. #include <linux/fs.h>
  30. #include <linux/cdev.h>
  31. #include <linux/platform_data/qcom_crypto_device.h>
  32. #include "msm_rng.h"
  33. #include "ctr_drbg.h"
  34. #include "fips_drbg.h"
  35. #include "msm_fips_selftest.h"
  36. #define DRIVER_NAME "msm_rng"
  37. /* Device specific register offsets */
  38. #define PRNG_DATA_OUT_OFFSET 0x0000
  39. #define PRNG_STATUS_OFFSET 0x0004
  40. #define PRNG_LFSR_CFG_OFFSET 0x0100
  41. #define PRNG_CONFIG_OFFSET 0x0104
  42. /* Device specific register masks and config values */
  43. #define PRNG_LFSR_CFG_MASK 0xFFFF0000
  44. #define PRNG_LFSR_CFG_CLOCKS 0x0000DDDD
  45. #define PRNG_CONFIG_MASK 0xFFFFFFFD
  46. #define PRNG_HW_ENABLE 0x00000002
  47. #define MAX_HW_FIFO_DEPTH 16 /* FIFO is 16 words deep */
  48. #define MAX_HW_FIFO_SIZE (MAX_HW_FIFO_DEPTH * 4) /* FIFO is 32 bits wide */
  49. /* Global FIPS status */
  50. #ifdef CONFIG_FIPS_ENABLE
  51. enum fips_status g_fips140_status = FIPS140_STATUS_FAIL;
  52. EXPORT_SYMBOL(g_fips140_status);
  53. #else
  54. enum fips_status g_fips140_status = FIPS140_STATUS_NA;
  55. EXPORT_SYMBOL(g_fips140_status);
  56. #endif
  57. /*FIPS140-2 call back for DRBG self test */
  58. void *drbg_call_back;
  59. EXPORT_SYMBOL(drbg_call_back);
  60. enum {
  61. FIPS_NOT_STARTED = 0,
  62. DRBG_FIPS_STARTED
  63. };
  64. struct msm_rng_device msm_rng_device_info;
  65. #ifdef CONFIG_FIPS_ENABLE
  66. static int fips_mode_enabled = FIPS_NOT_STARTED;
  67. #endif
  68. static long msm_rng_ioctl(struct file *filp, unsigned int cmd,
  69. unsigned long arg)
  70. {
  71. long ret = 0;
  72. pr_debug("ioctl: cmd = %d\n", cmd);
  73. switch (cmd) {
  74. case QRNG_IOCTL_RESET_BUS_BANDWIDTH:
  75. pr_info("calling msm_rng_bus_scale(LOW)\n");
  76. ret = msm_bus_scale_client_update_request(
  77. msm_rng_device_info.qrng_perf_client, 0);
  78. if (ret)
  79. pr_err("failed qrng_reset_bus_bw, ret = %ld\n", ret);
  80. break;
  81. default:
  82. pr_err("Unsupported IOCTL call");
  83. break;
  84. }
  85. return ret;
  86. }
  87. /*
  88. *
  89. * This function calls hardware random bit generator directory and retuns it
  90. * back to caller
  91. *
  92. */
  93. int msm_rng_direct_read(struct msm_rng_device *msm_rng_dev, void *data)
  94. {
  95. struct platform_device *pdev;
  96. void __iomem *base;
  97. size_t currsize = 0;
  98. unsigned long val;
  99. unsigned long *retdata = data;
  100. int ret;
  101. pdev = msm_rng_dev->pdev;
  102. base = msm_rng_dev->base;
  103. /* enable PRNG clock */
  104. ret = clk_prepare_enable(msm_rng_dev->prng_clk);
  105. if (ret) {
  106. dev_err(&pdev->dev, "failed to enable clock in callback\n");
  107. return 0;
  108. }
  109. /* read random data from h/w */
  110. do {
  111. /* check status bit if data is available */
  112. if (!(readl_relaxed(base + PRNG_STATUS_OFFSET) & 0x00000001))
  113. break; /* no data to read so just bail */
  114. /* read FIFO */
  115. val = readl_relaxed(base + PRNG_DATA_OUT_OFFSET);
  116. if (!val)
  117. break; /* no data to read so just bail */
  118. /* write data back to callers pointer */
  119. *(retdata++) = val;
  120. currsize += 4;
  121. } while (currsize < Q_HW_DRBG_BLOCK_BYTES);
  122. /* vote to turn off clock */
  123. clk_disable_unprepare(msm_rng_dev->prng_clk);
  124. val = 0L;
  125. return currsize;
  126. }
  127. static int msm_rng_drbg_read(struct hwrng *rng,
  128. void *data, size_t max, bool wait)
  129. {
  130. struct msm_rng_device *msm_rng_dev;
  131. struct platform_device *pdev;
  132. void __iomem *base;
  133. size_t maxsize;
  134. size_t currsize = 0;
  135. unsigned long val;
  136. unsigned long *retdata = data;
  137. int ret, ret1;
  138. msm_rng_dev = (struct msm_rng_device *)rng->priv;
  139. pdev = msm_rng_dev->pdev;
  140. base = msm_rng_dev->base;
  141. down(&msm_rng_dev->drbg_sem);
  142. /* calculate max size bytes to transfer back to caller */
  143. maxsize = min_t(size_t, MAX_HW_FIFO_SIZE, max);
  144. /* no room for word data */
  145. if (maxsize < 4)
  146. return 0;
  147. /* read random data from CTR-AES based DRBG */
  148. if (FIPS140_DRBG_ENABLED == msm_rng_dev->fips140_drbg_enabled) {
  149. ret1 = fips_drbg_gen(msm_rng_dev->drbg_ctx, data, maxsize);
  150. if (FIPS140_PRNG_ERR == ret1)
  151. panic("random number generator generator error.\n");
  152. } else
  153. ret1 = 1;
  154. /* read random data from h/w */
  155. /* enable PRNG clock */
  156. ret = clk_prepare_enable(msm_rng_dev->prng_clk);
  157. if (ret) {
  158. dev_err(&pdev->dev, "failed to enable clock in callback\n");
  159. up(&msm_rng_dev->drbg_sem);
  160. return 0;
  161. }
  162. /* read random data from h/w */
  163. do {
  164. /* check status bit if data is available */
  165. if (!(readl_relaxed(base + PRNG_STATUS_OFFSET) & 0x00000001))
  166. break; /* no data to read so just bail */
  167. /* read FIFO */
  168. val = readl_relaxed(base + PRNG_DATA_OUT_OFFSET);
  169. if (!val)
  170. break; /* no data to read so just bail */
  171. /* write data back to callers pointer */
  172. if (0 != ret1)
  173. *(retdata++) = val;
  174. currsize += 4;
  175. /* make sure we stay on 32bit boundary */
  176. if ((maxsize - currsize) < 4)
  177. break;
  178. } while (currsize < maxsize);
  179. /* vote to turn off clock */
  180. clk_disable_unprepare(msm_rng_dev->prng_clk);
  181. up(&msm_rng_dev->drbg_sem);
  182. return currsize;
  183. }
  184. #ifdef CONFIG_FIPS_ENABLE
  185. static void _fips_drbg_init_error(struct msm_rng_device *msm_rng_dev)
  186. {
  187. unregister_chrdev(QRNG_IOC_MAGIC, DRIVER_NAME);
  188. clk_put(msm_rng_dev->prng_clk);
  189. iounmap(msm_rng_dev->base);
  190. kzfree(msm_rng_dev->drbg_ctx);
  191. kzfree(msm_rng_dev);
  192. panic("software random number generator initialization error.\n");
  193. }
  194. #else
  195. static inline void _fips_drbg_init_error(struct msm_rng_device *msm_rng_dev)
  196. {
  197. return;
  198. }
  199. #endif
  200. #ifdef CONFIG_FIPS_ENABLE
  201. int _do_msm_fips_drbg_init(void *rng_dev)
  202. {
  203. struct msm_rng_device *msm_rng_dev = (struct msm_rng_device *) rng_dev;
  204. int ret;
  205. if (NULL == msm_rng_dev)
  206. return 1;
  207. ret = fips_drbg_init(msm_rng_dev);
  208. if (0 == ret) {
  209. pr_debug("start fips self test\n");
  210. ret = fips_self_test();
  211. if (ret) {
  212. msm_rng_dev->fips140_drbg_enabled =
  213. FIPS140_DRBG_DISABLED;
  214. _fips_drbg_init_error(msm_rng_dev);
  215. } else {
  216. msm_rng_dev->fips140_drbg_enabled =
  217. FIPS140_DRBG_ENABLED;
  218. }
  219. } else {
  220. msm_rng_dev->fips140_drbg_enabled = FIPS140_DRBG_DISABLED;
  221. _fips_drbg_init_error(msm_rng_dev);
  222. }
  223. return ret;
  224. }
  225. #else
  226. int _do_msm_fips_drbg_init(void *rng_dev)
  227. {
  228. return 0;
  229. }
  230. #endif
  231. #ifdef CONFIG_FIPS_ENABLE
  232. static int msm_rng_read(struct hwrng *rng, void *data, size_t max, bool wait)
  233. {
  234. struct msm_rng_device *msm_rng_dev = (struct msm_rng_device *)rng->priv;
  235. unsigned char a[Q_HW_DRBG_BLOCK_BYTES];
  236. int read_size;
  237. unsigned char *p = data;
  238. switch (fips_mode_enabled) {
  239. case DRBG_FIPS_STARTED:
  240. return msm_rng_drbg_read(rng, data, max, wait);
  241. break;
  242. case FIPS_NOT_STARTED:
  243. if (g_fips140_status != FIPS140_STATUS_PASS) {
  244. do {
  245. read_size = msm_rng_direct_read(msm_rng_dev, a);
  246. if (read_size <= 0)
  247. break;
  248. if ((max - read_size > 0)) {
  249. memcpy(p, a, read_size);
  250. p += read_size;
  251. max -= read_size;
  252. } else {
  253. memcpy(p, a, max);
  254. break;
  255. }
  256. } while (1);
  257. return p - (unsigned char *)data;
  258. } else {
  259. fips_mode_enabled = DRBG_FIPS_STARTED;
  260. return msm_rng_drbg_read(rng, data, max, wait);
  261. }
  262. break;
  263. default:
  264. return 0;
  265. break;
  266. }
  267. return 0;
  268. }
  269. #else
  270. static int msm_rng_read(struct hwrng *rng, void *data, size_t max, bool wait)
  271. {
  272. return msm_rng_drbg_read(rng, data, max, wait);
  273. }
  274. #endif
  275. static struct hwrng msm_rng = {
  276. .name = DRIVER_NAME,
  277. .read = msm_rng_read,
  278. };
  279. static int __devinit msm_rng_enable_hw(struct msm_rng_device *msm_rng_dev)
  280. {
  281. unsigned long val = 0;
  282. unsigned long reg_val = 0;
  283. int ret = 0;
  284. if (msm_rng_dev->qrng_perf_client) {
  285. ret = msm_bus_scale_client_update_request(
  286. msm_rng_dev->qrng_perf_client, 1);
  287. if (ret)
  288. pr_err("bus_scale_client_update_req failed!\n");
  289. }
  290. /* Enable the PRNG CLK */
  291. ret = clk_prepare_enable(msm_rng_dev->prng_clk);
  292. if (ret) {
  293. dev_err(&(msm_rng_dev->pdev)->dev,
  294. "failed to enable clock in probe\n");
  295. return -EPERM;
  296. }
  297. /* Enable PRNG h/w only if it is NOT ON */
  298. val = readl_relaxed(msm_rng_dev->base + PRNG_CONFIG_OFFSET) &
  299. PRNG_HW_ENABLE;
  300. /* PRNG H/W is not ON */
  301. if (val != PRNG_HW_ENABLE) {
  302. val = readl_relaxed(msm_rng_dev->base + PRNG_LFSR_CFG_OFFSET);
  303. val &= PRNG_LFSR_CFG_MASK;
  304. val |= PRNG_LFSR_CFG_CLOCKS;
  305. writel_relaxed(val, msm_rng_dev->base + PRNG_LFSR_CFG_OFFSET);
  306. /* The PRNG CONFIG register should be first written */
  307. mb();
  308. reg_val = readl_relaxed(msm_rng_dev->base + PRNG_CONFIG_OFFSET)
  309. & PRNG_CONFIG_MASK;
  310. reg_val |= PRNG_HW_ENABLE;
  311. writel_relaxed(reg_val, msm_rng_dev->base + PRNG_CONFIG_OFFSET);
  312. /* The PRNG clk should be disabled only after we enable the
  313. * PRNG h/w by writing to the PRNG CONFIG register.
  314. */
  315. mb();
  316. }
  317. clk_disable_unprepare(msm_rng_dev->prng_clk);
  318. return 0;
  319. }
  320. static const struct file_operations msm_rng_fops = {
  321. .unlocked_ioctl = msm_rng_ioctl,
  322. };
  323. static struct class *msm_rng_class;
  324. static struct cdev msm_rng_cdev;
  325. #ifdef CONFIG_FIPS_ENABLE
  326. static void _first_msm_drbg_init(struct msm_rng_device *msm_rng_dev)
  327. {
  328. fips_reg_drbg_callback((void *)msm_rng_dev);
  329. return;
  330. }
  331. #else
  332. static void _first_msm_drbg_init(struct msm_rng_device *msm_rng_dev)
  333. {
  334. _do_msm_fips_drbg_init(msm_rng_dev);
  335. }
  336. #endif
  337. static int __devinit msm_rng_probe(struct platform_device *pdev)
  338. {
  339. struct resource *res;
  340. struct msm_rng_device *msm_rng_dev = NULL;
  341. void __iomem *base = NULL;
  342. int error = 0;
  343. int ret = 0;
  344. struct device *dev;
  345. struct msm_bus_scale_pdata *qrng_platform_support = NULL;
  346. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  347. if (res == NULL) {
  348. dev_err(&pdev->dev, "invalid address\n");
  349. error = -EFAULT;
  350. goto err_exit;
  351. }
  352. msm_rng_dev = kzalloc(sizeof(struct msm_rng_device), GFP_KERNEL);
  353. if (!msm_rng_dev) {
  354. dev_err(&pdev->dev, "cannot allocate memory\n");
  355. error = -ENOMEM;
  356. goto err_exit;
  357. }
  358. base = ioremap(res->start, resource_size(res));
  359. if (!base) {
  360. dev_err(&pdev->dev, "ioremap failed\n");
  361. error = -ENOMEM;
  362. goto err_iomap;
  363. }
  364. msm_rng_dev->base = base;
  365. msm_rng_dev->drbg_ctx = kzalloc(sizeof(struct fips_drbg_ctx_s),
  366. GFP_KERNEL);
  367. if (!msm_rng_dev->drbg_ctx) {
  368. dev_err(&pdev->dev, "cannot allocate memory\n");
  369. error = -ENOMEM;
  370. goto err_clk_get;
  371. }
  372. /* create a handle for clock control */
  373. if ((pdev->dev.of_node) && (of_property_read_bool(pdev->dev.of_node,
  374. "qcom,msm-rng-iface-clk")))
  375. msm_rng_dev->prng_clk = clk_get(&pdev->dev,
  376. "iface_clk");
  377. else
  378. msm_rng_dev->prng_clk = clk_get(&pdev->dev, "core_clk");
  379. if (IS_ERR(msm_rng_dev->prng_clk)) {
  380. dev_err(&pdev->dev, "failed to register clock source\n");
  381. error = -EPERM;
  382. goto err_clk_get;
  383. }
  384. /* save away pdev and register driver data */
  385. msm_rng_dev->pdev = pdev;
  386. platform_set_drvdata(pdev, msm_rng_dev);
  387. if (pdev->dev.of_node) {
  388. /* Register bus client */
  389. qrng_platform_support = msm_bus_cl_get_pdata(pdev);
  390. msm_rng_dev->qrng_perf_client = msm_bus_scale_register_client(
  391. qrng_platform_support);
  392. msm_rng_device_info.qrng_perf_client =
  393. msm_rng_dev->qrng_perf_client;
  394. if (!msm_rng_dev->qrng_perf_client)
  395. pr_err("Unable to register bus client\n");
  396. }
  397. /* Enable rng h/w */
  398. error = msm_rng_enable_hw(msm_rng_dev);
  399. if (error)
  400. goto rollback_clk;
  401. /* register with hwrng framework */
  402. msm_rng.priv = (unsigned long) msm_rng_dev;
  403. error = hwrng_register(&msm_rng);
  404. if (error) {
  405. dev_err(&pdev->dev, "failed to register hwrng\n");
  406. error = -EPERM;
  407. goto rollback_clk;
  408. }
  409. ret = register_chrdev(QRNG_IOC_MAGIC, DRIVER_NAME, &msm_rng_fops);
  410. msm_rng_class = class_create(THIS_MODULE, "msm-rng");
  411. if (IS_ERR(msm_rng_class)) {
  412. pr_err("class_create failed\n");
  413. return PTR_ERR(msm_rng_class);
  414. }
  415. dev = device_create(msm_rng_class, NULL, MKDEV(QRNG_IOC_MAGIC, 0),
  416. NULL, "msm-rng");
  417. if (IS_ERR(dev)) {
  418. pr_err("Device create failed\n");
  419. error = PTR_ERR(dev);
  420. goto unregister_chrdev;
  421. }
  422. cdev_init(&msm_rng_cdev, &msm_rng_fops);
  423. sema_init(&msm_rng_dev->drbg_sem, 1);
  424. _first_msm_drbg_init(msm_rng_dev);
  425. return error;
  426. unregister_chrdev:
  427. unregister_chrdev(QRNG_IOC_MAGIC, DRIVER_NAME);
  428. class_destroy(msm_rng_class);
  429. rollback_clk:
  430. clk_put(msm_rng_dev->prng_clk);
  431. err_clk_get:
  432. iounmap(msm_rng_dev->base);
  433. err_iomap:
  434. kzfree(msm_rng_dev->drbg_ctx);
  435. kzfree(msm_rng_dev);
  436. err_exit:
  437. return error;
  438. }
  439. static int __devexit msm_rng_remove(struct platform_device *pdev)
  440. {
  441. struct msm_rng_device *msm_rng_dev = platform_get_drvdata(pdev);
  442. unregister_chrdev(QRNG_IOC_MAGIC, DRIVER_NAME);
  443. hwrng_unregister(&msm_rng);
  444. clk_put(msm_rng_dev->prng_clk);
  445. iounmap(msm_rng_dev->base);
  446. platform_set_drvdata(pdev, NULL);
  447. if (msm_rng_dev->qrng_perf_client)
  448. msm_bus_scale_unregister_client(msm_rng_dev->qrng_perf_client);
  449. if (msm_rng_dev->drbg_ctx) {
  450. fips_drbg_final(msm_rng_dev->drbg_ctx);
  451. kzfree(msm_rng_dev->drbg_ctx);
  452. msm_rng_dev->drbg_ctx = NULL;
  453. }
  454. kzfree(msm_rng_dev);
  455. return 0;
  456. }
  457. static struct of_device_id qrng_match[] = {
  458. { .compatible = "qcom,msm-rng",
  459. },
  460. {}
  461. };
  462. static struct platform_driver rng_driver = {
  463. .probe = msm_rng_probe,
  464. .remove = __devexit_p(msm_rng_remove),
  465. .driver = {
  466. .name = DRIVER_NAME,
  467. .owner = THIS_MODULE,
  468. .of_match_table = qrng_match,
  469. }
  470. };
  471. static int __init msm_rng_init(void)
  472. {
  473. return platform_driver_register(&rng_driver);
  474. }
  475. module_init(msm_rng_init);
  476. static void __exit msm_rng_exit(void)
  477. {
  478. platform_driver_unregister(&rng_driver);
  479. }
  480. module_exit(msm_rng_exit);
  481. #ifdef CONFIG_FIPS_ENABLE
  482. EXPORT_SYMBOL(fips_ctraes128_df_known_answer_test);
  483. #endif
  484. EXPORT_SYMBOL(_do_msm_fips_drbg_init);
  485. MODULE_AUTHOR("The Linux Foundation");
  486. MODULE_DESCRIPTION("Qualcomm MSM Random Number Driver");
  487. MODULE_LICENSE("GPL v2");