Support-hardware-random-number-generator-for-RK3328.patch 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503
  1. From e5b5361651940ff5c0c1784dfd0130abec7ab535 Mon Sep 17 00:00:00 2001
  2. From: wevsty <[email protected]>
  3. Date: Mon, 24 Aug 2020 02:27:11 +0800
  4. Subject: [PATCH] Support hardware random number generator for RK3328
  5. Signed-off-by: wevsty <[email protected]>
  6. ---
  7. target/linux/rockchip/armv8/config-5.4 | 2 +
  8. ...rockchip-hardware-random-dev-support.patch | 385 ++++++++++++++++++
  9. ...rockchip-add-hardware-rng-for-RK3328.patch | 28 ++
  10. ...rockchip-add-hardware-rng-for-RK3399.patch | 27 ++
  11. ...p-enable-hardware-rng-for-NanoPi-R2S.patch | 17 +
  12. 5 files changed, 459 insertions(+)
  13. create mode 100644 target/linux/rockchip/patches-5.4/012-rockchip-hardware-random-dev-support.patch
  14. create mode 100644 target/linux/rockchip/patches-5.4/013-rockchip-add-hardware-rng-for-RK3328.patch
  15. create mode 100644 target/linux/rockchip/patches-5.4/014-rockchip-add-hardware-rng-for-RK3399.patch
  16. create mode 100644 target/linux/rockchip/patches-5.4/015-rockchip-enable-hardware-rng-for-NanoPi-R2S.patch
  17. diff -rNEZbwBdu3 a/target/linux/rockchip/armv8/config-5.4 b/target/linux/rockchip/armv8/config-5.4
  18. --- a/target/linux/rockchip/armv8/config-5.4 2020-08-27 16:16:43.088264763 +0800
  19. +++ b/target/linux/rockchip/armv8/config-5.4 2020-08-27 16:20:13.937869695 +0800
  20. @@ -182,6 +182,8 @@
  21. CONFIG_HWMON=y
  22. CONFIG_HWSPINLOCK=y
  23. CONFIG_HW_CONSOLE=y
  24. +CONFIG_HW_RANDOM=y
  25. +CONFIG_HW_RANDOM_ROCKCHIP=y
  26. # CONFIG_HZ_PERIODIC is not set
  27. CONFIG_I2C=y
  28. CONFIG_I2C_ALGOBIT=y
  29. diff -rNEZbwBdu3 a/target/linux/rockchip/patches-5.4/012-rockchip-hardware-random-dev-support.patch b/target/linux/rockchip/patches-5.4/012-rockchip-hardware-random-dev-support.patch
  30. --- a/target/linux/rockchip/patches-5.4/012-rockchip-hardware-random-dev-support.patch 1970-01-01 08:00:00.000000000 +0800
  31. +++ b/target/linux/rockchip/patches-5.4/012-rockchip-hardware-random-dev-support.patch 2020-08-27 16:19:22.785477444 +0800
  32. @@ -0,0 +1,385 @@
  33. +From: wevsty <[email protected]>
  34. +Subject: Support for rockchip hardware random number generator
  35. +
  36. +This patch provides hardware random number generator support for all rockchip SOC.
  37. +
  38. +rockchip-rng.c from https://github.com/rockchip-linux/kernel/blob/develop-4.4/drivers/char/hw_random/rockchip-rng.c
  39. +
  40. +Signed-off-by: wevsty <[email protected]>
  41. +---
  42. +
  43. +--- a/drivers/char/hw_random/Kconfig
  44. ++++ b/drivers/char/hw_random/Kconfig
  45. +@@ -345,6 +345,19 @@ config HW_RANDOM_STM32
  46. +
  47. + If unsure, say N.
  48. +
  49. ++config HW_RANDOM_ROCKCHIP
  50. ++ tristate "Rockchip Random Number Generator support"
  51. ++ depends on ARCH_ROCKCHIP
  52. ++ default HW_RANDOM
  53. ++ help
  54. ++ This driver provides kernel-side support for the Random Number
  55. ++ Generator hardware found on Rockchip cpus.
  56. ++
  57. ++ To compile this driver as a module, choose M here: the
  58. ++ module will be called rockchip-rng.
  59. ++
  60. ++ If unsure, say Y.
  61. ++
  62. + config HW_RANDOM_PIC32
  63. + tristate "Microchip PIC32 Random Number Generator support"
  64. + depends on HW_RANDOM && MACH_PIC32
  65. +--- /dev/null
  66. ++++ b/drivers/char/hw_random/rockchip-rng.c
  67. +@@ -0,0 +1,340 @@
  68. ++// SPDX-License-Identifier: GPL-2.0
  69. ++/*
  70. ++ * rockchip-rng.c Random Number Generator driver for the Rockchip
  71. ++ *
  72. ++ * Copyright (c) 2018, Fuzhou Rockchip Electronics Co., Ltd.
  73. ++ * Author: Lin Jinhan <[email protected]>
  74. ++ *
  75. ++ */
  76. ++#include <linux/clk.h>
  77. ++#include <linux/hw_random.h>
  78. ++#include <linux/iopoll.h>
  79. ++#include <linux/module.h>
  80. ++#include <linux/mod_devicetable.h>
  81. ++#include <linux/of.h>
  82. ++#include <linux/platform_device.h>
  83. ++#include <linux/pm_runtime.h>
  84. ++
  85. ++#define _SBF(s, v) ((v) << (s))
  86. ++#define HIWORD_UPDATE(val, mask, shift) \
  87. ++ ((val) << (shift) | (mask) << ((shift) + 16))
  88. ++
  89. ++#define ROCKCHIP_AUTOSUSPEND_DELAY 100
  90. ++#define ROCKCHIP_POLL_PERIOD_US 100
  91. ++#define ROCKCHIP_POLL_TIMEOUT_US 10000
  92. ++#define RK_MAX_RNG_BYTE (32)
  93. ++
  94. ++/* start of CRYPTO V1 register define */
  95. ++#define CRYPTO_V1_CTRL 0x0008
  96. ++#define CRYPTO_V1_RNG_START BIT(8)
  97. ++#define CRYPTO_V1_RNG_FLUSH BIT(9)
  98. ++
  99. ++#define CRYPTO_V1_TRNG_CTRL 0x0200
  100. ++#define CRYPTO_V1_OSC_ENABLE BIT(16)
  101. ++#define CRYPTO_V1_TRNG_SAMPLE_PERIOD(x) (x)
  102. ++
  103. ++#define CRYPTO_V1_TRNG_DOUT_0 0x0204
  104. ++/* end of CRYPTO V1 register define */
  105. ++
  106. ++/* start of CRYPTO V2 register define */
  107. ++#define CRYPTO_V2_RNG_CTL 0x0400
  108. ++#define CRYPTO_V2_RNG_64_BIT_LEN _SBF(4, 0x00)
  109. ++#define CRYPTO_V2_RNG_128_BIT_LEN _SBF(4, 0x01)
  110. ++#define CRYPTO_V2_RNG_192_BIT_LEN _SBF(4, 0x02)
  111. ++#define CRYPTO_V2_RNG_256_BIT_LEN _SBF(4, 0x03)
  112. ++#define CRYPTO_V2_RNG_FATESY_SOC_RING _SBF(2, 0x00)
  113. ++#define CRYPTO_V2_RNG_SLOWER_SOC_RING_0 _SBF(2, 0x01)
  114. ++#define CRYPTO_V2_RNG_SLOWER_SOC_RING_1 _SBF(2, 0x02)
  115. ++#define CRYPTO_V2_RNG_SLOWEST_SOC_RING _SBF(2, 0x03)
  116. ++#define CRYPTO_V2_RNG_ENABLE BIT(1)
  117. ++#define CRYPTO_V2_RNG_START BIT(0)
  118. ++#define CRYPTO_V2_RNG_SAMPLE_CNT 0x0404
  119. ++#define CRYPTO_V2_RNG_DOUT_0 0x0410
  120. ++/* end of CRYPTO V2 register define */
  121. ++
  122. ++struct rk_rng_soc_data {
  123. ++ const char * const *clks;
  124. ++ int clks_num;
  125. ++ int (*rk_rng_read)(struct hwrng *rng, void *buf, size_t max, bool wait);
  126. ++};
  127. ++
  128. ++struct rk_rng {
  129. ++ struct device *dev;
  130. ++ struct hwrng rng;
  131. ++ void __iomem *mem;
  132. ++ struct rk_rng_soc_data *soc_data;
  133. ++ u32 clk_num;
  134. ++ struct clk_bulk_data *clk_bulks;
  135. ++};
  136. ++
  137. ++static const char * const rk_rng_v1_clks[] = {
  138. ++ "hclk_crypto",
  139. ++ "clk_crypto",
  140. ++};
  141. ++
  142. ++static const char * const rk_rng_v2_clks[] = {
  143. ++ "hclk_crypto",
  144. ++ "aclk_crypto",
  145. ++ "clk_crypto",
  146. ++ "clk_crypto_apk",
  147. ++};
  148. ++
  149. ++static void rk_rng_writel(struct rk_rng *rng, u32 val, u32 offset)
  150. ++{
  151. ++ __raw_writel(val, rng->mem + offset);
  152. ++}
  153. ++
  154. ++static u32 rk_rng_readl(struct rk_rng *rng, u32 offset)
  155. ++{
  156. ++ return __raw_readl(rng->mem + offset);
  157. ++}
  158. ++
  159. ++static int rk_rng_init(struct hwrng *rng)
  160. ++{
  161. ++ int ret;
  162. ++ struct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng);
  163. ++
  164. ++ dev_dbg(rk_rng->dev, "clk_bulk_prepare_enable.\n");
  165. ++
  166. ++ ret = clk_bulk_prepare_enable(rk_rng->clk_num, rk_rng->clk_bulks);
  167. ++ if (ret < 0) {
  168. ++ dev_err(rk_rng->dev, "failed to enable clks %d\n", ret);
  169. ++ return ret;
  170. ++ }
  171. ++
  172. ++ return 0;
  173. ++}
  174. ++
  175. ++static void rk_rng_cleanup(struct hwrng *rng)
  176. ++{
  177. ++ struct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng);
  178. ++
  179. ++ dev_dbg(rk_rng->dev, "clk_bulk_disable_unprepare.\n");
  180. ++ clk_bulk_disable_unprepare(rk_rng->clk_num, rk_rng->clk_bulks);
  181. ++}
  182. ++
  183. ++static void rk_rng_read_regs(struct rk_rng *rng, u32 offset, void *buf,
  184. ++ size_t size)
  185. ++{
  186. ++ u32 i;
  187. ++
  188. ++ for (i = 0; i < size; i += 4)
  189. ++ *(u32 *)(buf + i) = be32_to_cpu(rk_rng_readl(rng, offset + i));
  190. ++}
  191. ++
  192. ++static int rk_rng_v1_read(struct hwrng *rng, void *buf, size_t max, bool wait)
  193. ++{
  194. ++ int ret = 0;
  195. ++ u32 reg_ctrl = 0;
  196. ++ struct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng);
  197. ++
  198. ++ ret = pm_runtime_get_sync(rk_rng->dev);
  199. ++ if (ret < 0) {
  200. ++ pm_runtime_put_noidle(rk_rng->dev);
  201. ++ return ret;
  202. ++ }
  203. ++
  204. ++ /* enable osc_ring to get entropy, sample period is set as 100 */
  205. ++ reg_ctrl = CRYPTO_V1_OSC_ENABLE | CRYPTO_V1_TRNG_SAMPLE_PERIOD(100);
  206. ++ rk_rng_writel(rk_rng, reg_ctrl, CRYPTO_V1_TRNG_CTRL);
  207. ++
  208. ++ reg_ctrl = HIWORD_UPDATE(CRYPTO_V1_RNG_START, CRYPTO_V1_RNG_START, 0);
  209. ++
  210. ++ rk_rng_writel(rk_rng, reg_ctrl, CRYPTO_V1_CTRL);
  211. ++
  212. ++ ret = readl_poll_timeout(rk_rng->mem + CRYPTO_V1_CTRL, reg_ctrl,
  213. ++ !(reg_ctrl & CRYPTO_V1_RNG_START),
  214. ++ ROCKCHIP_POLL_PERIOD_US,
  215. ++ ROCKCHIP_POLL_TIMEOUT_US);
  216. ++ if (ret < 0)
  217. ++ goto out;
  218. ++
  219. ++ ret = min_t(size_t, max, RK_MAX_RNG_BYTE);
  220. ++
  221. ++ rk_rng_read_regs(rk_rng, CRYPTO_V1_TRNG_DOUT_0, buf, ret);
  222. ++
  223. ++out:
  224. ++ /* close TRNG */
  225. ++ rk_rng_writel(rk_rng, HIWORD_UPDATE(0, CRYPTO_V1_RNG_START, 0),
  226. ++ CRYPTO_V1_CTRL);
  227. ++
  228. ++ pm_runtime_mark_last_busy(rk_rng->dev);
  229. ++ pm_runtime_put_sync_autosuspend(rk_rng->dev);
  230. ++
  231. ++ return ret;
  232. ++}
  233. ++
  234. ++static int rk_rng_v2_read(struct hwrng *rng, void *buf, size_t max, bool wait)
  235. ++{
  236. ++ int ret = 0;
  237. ++ u32 reg_ctrl = 0;
  238. ++ struct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng);
  239. ++
  240. ++ ret = pm_runtime_get_sync(rk_rng->dev);
  241. ++ if (ret < 0) {
  242. ++ pm_runtime_put_noidle(rk_rng->dev);
  243. ++ return ret;
  244. ++ }
  245. ++
  246. ++ /* enable osc_ring to get entropy, sample period is set as 100 */
  247. ++ rk_rng_writel(rk_rng, 100, CRYPTO_V2_RNG_SAMPLE_CNT);
  248. ++
  249. ++ reg_ctrl |= CRYPTO_V2_RNG_256_BIT_LEN;
  250. ++ reg_ctrl |= CRYPTO_V2_RNG_SLOWER_SOC_RING_0;
  251. ++ reg_ctrl |= CRYPTO_V2_RNG_ENABLE;
  252. ++ reg_ctrl |= CRYPTO_V2_RNG_START;
  253. ++
  254. ++ rk_rng_writel(rk_rng, HIWORD_UPDATE(reg_ctrl, 0xffff, 0),
  255. ++ CRYPTO_V2_RNG_CTL);
  256. ++
  257. ++ ret = readl_poll_timeout(rk_rng->mem + CRYPTO_V2_RNG_CTL, reg_ctrl,
  258. ++ !(reg_ctrl & CRYPTO_V2_RNG_START),
  259. ++ ROCKCHIP_POLL_PERIOD_US,
  260. ++ ROCKCHIP_POLL_TIMEOUT_US);
  261. ++ if (ret < 0)
  262. ++ goto out;
  263. ++
  264. ++ ret = min_t(size_t, max, RK_MAX_RNG_BYTE);
  265. ++
  266. ++ rk_rng_read_regs(rk_rng, CRYPTO_V2_RNG_DOUT_0, buf, ret);
  267. ++
  268. ++out:
  269. ++ /* close TRNG */
  270. ++ rk_rng_writel(rk_rng, HIWORD_UPDATE(0, 0xffff, 0), CRYPTO_V2_RNG_CTL);
  271. ++
  272. ++ pm_runtime_mark_last_busy(rk_rng->dev);
  273. ++ pm_runtime_put_sync_autosuspend(rk_rng->dev);
  274. ++
  275. ++ return ret;
  276. ++}
  277. ++
  278. ++static const struct rk_rng_soc_data rk_rng_v1_soc_data = {
  279. ++ .clks_num = ARRAY_SIZE(rk_rng_v1_clks),
  280. ++ .clks = rk_rng_v1_clks,
  281. ++ .rk_rng_read = rk_rng_v1_read,
  282. ++};
  283. ++
  284. ++static const struct rk_rng_soc_data rk_rng_v2_soc_data = {
  285. ++ .clks_num = ARRAY_SIZE(rk_rng_v2_clks),
  286. ++ .clks = rk_rng_v2_clks,
  287. ++ .rk_rng_read = rk_rng_v2_read,
  288. ++};
  289. ++
  290. ++static const struct of_device_id rk_rng_dt_match[] = {
  291. ++ {
  292. ++ .compatible = "rockchip,cryptov1-rng",
  293. ++ .data = (void *)&rk_rng_v1_soc_data,
  294. ++ },
  295. ++ {
  296. ++ .compatible = "rockchip,cryptov2-rng",
  297. ++ .data = (void *)&rk_rng_v2_soc_data,
  298. ++ },
  299. ++ { },
  300. ++};
  301. ++
  302. ++MODULE_DEVICE_TABLE(of, rk_rng_dt_match);
  303. ++
  304. ++static int rk_rng_probe(struct platform_device *pdev)
  305. ++{
  306. ++ int i;
  307. ++ int ret;
  308. ++ struct rk_rng *rk_rng;
  309. ++ struct device_node *np = pdev->dev.of_node;
  310. ++ const struct of_device_id *match;
  311. ++
  312. ++ dev_dbg(&pdev->dev, "probing...\n");
  313. ++ rk_rng = devm_kzalloc(&pdev->dev, sizeof(struct rk_rng), GFP_KERNEL);
  314. ++ if (!rk_rng)
  315. ++ return -ENOMEM;
  316. ++
  317. ++ match = of_match_node(rk_rng_dt_match, np);
  318. ++ rk_rng->soc_data = (struct rk_rng_soc_data *)match->data;
  319. ++
  320. ++ rk_rng->dev = &pdev->dev;
  321. ++ rk_rng->rng.name = "rockchip";
  322. ++#ifndef CONFIG_PM
  323. ++ rk_rng->rng.init = rk_rng_init;
  324. ++ rk_rng->rng.cleanup = rk_rng_cleanup,
  325. ++#endif
  326. ++ rk_rng->rng.read = rk_rng->soc_data->rk_rng_read;
  327. ++ rk_rng->rng.quality = 999;
  328. ++
  329. ++ rk_rng->clk_bulks =
  330. ++ devm_kzalloc(&pdev->dev, sizeof(*rk_rng->clk_bulks) *
  331. ++ rk_rng->soc_data->clks_num, GFP_KERNEL);
  332. ++
  333. ++ rk_rng->clk_num = rk_rng->soc_data->clks_num;
  334. ++
  335. ++ for (i = 0; i < rk_rng->soc_data->clks_num; i++)
  336. ++ rk_rng->clk_bulks[i].id = rk_rng->soc_data->clks[i];
  337. ++
  338. ++ rk_rng->mem = devm_of_iomap(&pdev->dev, pdev->dev.of_node, 0, NULL);
  339. ++ if (IS_ERR(rk_rng->mem))
  340. ++ return PTR_ERR(rk_rng->mem);
  341. ++
  342. ++ ret = devm_clk_bulk_get(&pdev->dev, rk_rng->clk_num,
  343. ++ rk_rng->clk_bulks);
  344. ++ if (ret) {
  345. ++ dev_err(&pdev->dev, "failed to get clks property\n");
  346. ++ return ret;
  347. ++ }
  348. ++
  349. ++ platform_set_drvdata(pdev, rk_rng);
  350. ++
  351. ++ pm_runtime_set_autosuspend_delay(&pdev->dev,
  352. ++ ROCKCHIP_AUTOSUSPEND_DELAY);
  353. ++ pm_runtime_use_autosuspend(&pdev->dev);
  354. ++ pm_runtime_enable(&pdev->dev);
  355. ++
  356. ++ ret = devm_hwrng_register(&pdev->dev, &rk_rng->rng);
  357. ++ if (ret) {
  358. ++ pm_runtime_dont_use_autosuspend(&pdev->dev);
  359. ++ pm_runtime_disable(&pdev->dev);
  360. ++ }
  361. ++
  362. ++ return ret;
  363. ++}
  364. ++
  365. ++#ifdef CONFIG_PM
  366. ++static int rk_rng_runtime_suspend(struct device *dev)
  367. ++{
  368. ++ struct rk_rng *rk_rng = dev_get_drvdata(dev);
  369. ++
  370. ++ rk_rng_cleanup(&rk_rng->rng);
  371. ++
  372. ++ return 0;
  373. ++}
  374. ++
  375. ++static int rk_rng_runtime_resume(struct device *dev)
  376. ++{
  377. ++ struct rk_rng *rk_rng = dev_get_drvdata(dev);
  378. ++
  379. ++ return rk_rng_init(&rk_rng->rng);
  380. ++}
  381. ++
  382. ++static const struct dev_pm_ops rk_rng_pm_ops = {
  383. ++ SET_RUNTIME_PM_OPS(rk_rng_runtime_suspend,
  384. ++ rk_rng_runtime_resume, NULL)
  385. ++ SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
  386. ++ pm_runtime_force_resume)
  387. ++};
  388. ++
  389. ++#endif
  390. ++
  391. ++static struct platform_driver rk_rng_driver = {
  392. ++ .driver = {
  393. ++ .name = "rockchip-rng",
  394. ++#ifdef CONFIG_PM
  395. ++ .pm = &rk_rng_pm_ops,
  396. ++#endif
  397. ++ .of_match_table = rk_rng_dt_match,
  398. ++ },
  399. ++ .probe = rk_rng_probe,
  400. ++};
  401. ++
  402. ++module_platform_driver(rk_rng_driver);
  403. ++
  404. ++MODULE_DESCRIPTION("ROCKCHIP H/W Random Number Generator driver");
  405. ++MODULE_AUTHOR("Lin Jinhan <[email protected]>");
  406. ++MODULE_LICENSE("GPL v2");
  407. ++
  408. +--- a/drivers/char/hw_random/Makefile
  409. ++++ b/drivers/char/hw_random/Makefile
  410. +@@ -32,6 +32,7 @@ obj-$(CONFIG_HW_RANDOM_IPROC_RNG200) +=
  411. + obj-$(CONFIG_HW_RANDOM_ST) += st-rng.o
  412. + obj-$(CONFIG_HW_RANDOM_XGENE) += xgene-rng.o
  413. + obj-$(CONFIG_HW_RANDOM_STM32) += stm32-rng.o
  414. ++obj-$(CONFIG_HW_RANDOM_ROCKCHIP) += rockchip-rng.o
  415. + obj-$(CONFIG_HW_RANDOM_PIC32) += pic32-rng.o
  416. + obj-$(CONFIG_HW_RANDOM_MESON) += meson-rng.o
  417. + obj-$(CONFIG_HW_RANDOM_CAVIUM) += cavium-rng.o cavium-rng-vf.o
  418. diff -rNEZbwBdu3 a/target/linux/rockchip/patches-5.4/013-rockchip-add-hardware-rng-for-RK3328.patch b/target/linux/rockchip/patches-5.4/013-rockchip-add-hardware-rng-for-RK3328.patch
  419. --- a/target/linux/rockchip/patches-5.4/013-rockchip-add-hardware-rng-for-RK3328.patch 1970-01-01 08:00:00.000000000 +0800
  420. +++ b/target/linux/rockchip/patches-5.4/013-rockchip-add-hardware-rng-for-RK3328.patch 2020-08-27 16:19:22.785477444 +0800
  421. @@ -0,0 +1,28 @@
  422. +From: wevsty <[email protected]>
  423. +Subject: Add hardware random number generator for RK3328
  424. +
  425. +Adding Hardware Random Number Generator Resources to the RK3328.
  426. +
  427. +Signed-off-by: wevsty <[email protected]>
  428. +---
  429. +
  430. +--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi
  431. ++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
  432. +@@ -269,6 +269,17 @@
  433. + status = "disabled";
  434. + };
  435. +
  436. ++ rng: rng@ff060000 {
  437. ++ compatible = "rockchip,cryptov1-rng";
  438. ++ reg = <0x0 0xff060000 0x0 0x4000>;
  439. ++
  440. ++ clocks = <&cru SCLK_CRYPTO>, <&cru HCLK_CRYPTO_SLV>;
  441. ++ clock-names = "clk_crypto", "hclk_crypto";
  442. ++ assigned-clocks = <&cru SCLK_CRYPTO>, <&cru HCLK_CRYPTO_SLV>;
  443. ++ assigned-clock-rates = <150000000>, <100000000>;
  444. ++ status = "disabled";
  445. ++ };
  446. ++
  447. + grf: syscon@ff100000 {
  448. + compatible = "rockchip,rk3328-grf", "syscon", "simple-mfd";
  449. + reg = <0x0 0xff100000 0x0 0x1000>;
  450. diff -rNEZbwBdu3 a/target/linux/rockchip/patches-5.4/014-rockchip-add-hardware-rng-for-RK3399.patch b/target/linux/rockchip/patches-5.4/014-rockchip-add-hardware-rng-for-RK3399.patch
  451. --- a/target/linux/rockchip/patches-5.4/014-rockchip-add-hardware-rng-for-RK3399.patch 1970-01-01 08:00:00.000000000 +0800
  452. +++ b/target/linux/rockchip/patches-5.4/014-rockchip-add-hardware-rng-for-RK3399.patch 2020-08-27 16:19:22.785477444 +0800
  453. @@ -0,0 +1,27 @@
  454. +From: wevsty <[email protected]>
  455. +Subject: Add hardware random number generator for RK3399
  456. +
  457. +Adding Hardware Random Number Generator Resources to the RK3399.
  458. +
  459. +Signed-off-by: wevsty <[email protected]>
  460. +---
  461. +
  462. +--- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi
  463. ++++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi
  464. +@@ -1886,6 +1886,16 @@
  465. + };
  466. + };
  467. +
  468. ++ rng: rng@ff8b8000 {
  469. ++ compatible = "rockchip,cryptov1-rng";
  470. ++ reg = <0x0 0xff8b8000 0x0 0x1000>;
  471. ++ clocks = <&cru SCLK_CRYPTO1>, <&cru HCLK_S_CRYPTO1>;
  472. ++ clock-names = "clk_crypto", "hclk_crypto";
  473. ++ assigned-clocks = <&cru SCLK_CRYPTO1>, <&cru HCLK_S_CRYPTO1>;
  474. ++ assigned-clock-rates = <150000000>, <100000000>;
  475. ++ status = "disabled";
  476. ++ };
  477. ++
  478. + gpu: gpu@ff9a0000 {
  479. + compatible = "rockchip,rk3399-mali", "arm,mali-t860";
  480. + reg = <0x0 0xff9a0000 0x0 0x10000>;
  481. diff -rNEZbwBdu3 a/target/linux/rockchip/patches-5.4/015-rockchip-enable-hardware-rng-for-NanoPi-R2S.patch b/target/linux/rockchip/patches-5.4/015-rockchip-enable-hardware-rng-for-NanoPi-R2S.patch
  482. --- a/target/linux/rockchip/patches-5.4/015-rockchip-enable-hardware-rng-for-NanoPi-R2S.patch 1970-01-01 08:00:00.000000000 +0800
  483. +++ b/target/linux/rockchip/patches-5.4/015-rockchip-enable-hardware-rng-for-NanoPi-R2S.patch 2020-08-27 16:19:22.785477444 +0800
  484. @@ -0,0 +1,17 @@
  485. +From: wevsty <[email protected]>
  486. +Subject: Enable hardware random number generator for RK3328
  487. +
  488. +
  489. +Signed-off-by: wevsty <[email protected]>
  490. +---
  491. +
  492. +--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts
  493. ++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts
  494. +@@ -140,3 +140,7 @@
  495. + };
  496. + };
  497. + };
  498. ++
  499. ++&rng {
  500. ++ status = "okay";
  501. ++};