1014-hwrng-Add-StarFive-JH7100-Random-Number-Generator-dr.patch 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477
  1. From 919bcebc58044a266e953ac302c8e068e255e2a6 Mon Sep 17 00:00:00 2001
  2. From: Huan Feng <[email protected]>
  3. Date: Fri, 8 Jan 2021 03:35:42 +0800
  4. Subject: [PATCH 1014/1024] hwrng: Add StarFive JH7100 Random Number Generator
  5. driver
  6. Signed-off-by: Emil Renner Berthing <[email protected]>
  7. ---
  8. drivers/char/hw_random/Kconfig | 13 ++
  9. drivers/char/hw_random/Makefile | 1 +
  10. drivers/char/hw_random/starfive-vic-rng.c | 256 ++++++++++++++++++++++
  11. drivers/char/hw_random/starfive-vic-rng.h | 167 ++++++++++++++
  12. 4 files changed, 437 insertions(+)
  13. create mode 100644 drivers/char/hw_random/starfive-vic-rng.c
  14. create mode 100644 drivers/char/hw_random/starfive-vic-rng.h
  15. --- a/drivers/char/hw_random/Kconfig
  16. +++ b/drivers/char/hw_random/Kconfig
  17. @@ -322,6 +322,19 @@ config HW_RANDOM_POWERNV
  18. If unsure, say Y.
  19. +config HW_RANDOM_STARFIVE_VIC
  20. + tristate "Starfive VIC Random Number Generator support"
  21. + depends on HW_RANDOM && (SOC_STARFIVE || COMPILE_TEST)
  22. + default SOC_STARFIVE
  23. + help
  24. + This driver provides kernel-side support for the Random Number
  25. + Generator hardware found on Starfive VIC SoC.
  26. +
  27. + To compile this driver as a module, choose M here: the
  28. + module will be called starfive-vic-rng.
  29. +
  30. + If unsure, say Y.
  31. +
  32. config HW_RANDOM_HISI
  33. tristate "Hisilicon Random Number Generator support"
  34. depends on HW_RANDOM && ARCH_HISI
  35. --- a/drivers/char/hw_random/Makefile
  36. +++ b/drivers/char/hw_random/Makefile
  37. @@ -28,6 +28,7 @@ obj-$(CONFIG_HW_RANDOM_OCTEON) += octeon
  38. obj-$(CONFIG_HW_RANDOM_NOMADIK) += nomadik-rng.o
  39. obj-$(CONFIG_HW_RANDOM_PSERIES) += pseries-rng.o
  40. obj-$(CONFIG_HW_RANDOM_POWERNV) += powernv-rng.o
  41. +obj-$(CONFIG_HW_RANDOM_STARFIVE_VIC) += starfive-vic-rng.o
  42. obj-$(CONFIG_HW_RANDOM_HISI) += hisi-rng.o
  43. obj-$(CONFIG_HW_RANDOM_BCM2835) += bcm2835-rng.o
  44. obj-$(CONFIG_HW_RANDOM_IPROC_RNG200) += iproc-rng200.o
  45. --- /dev/null
  46. +++ b/drivers/char/hw_random/starfive-vic-rng.c
  47. @@ -0,0 +1,256 @@
  48. +/*
  49. + ******************************************************************************
  50. + * @file starfive-vic-rng.c
  51. + * @author StarFive Technology
  52. + * @version V1.0
  53. + * @date 08/13/2020
  54. + * @brief
  55. + ******************************************************************************
  56. + * @copy
  57. + *
  58. + * THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  59. + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  60. + * TIME. AS A RESULT, STARFIVE SHALL NOT BE HELD LIABLE FOR ANY
  61. + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  62. + * FROM THE CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  63. + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  64. + *
  65. + * COPYRIGHT 2020 Shanghai StarFive Technology Co., Ltd.
  66. + */
  67. +#include <linux/err.h>
  68. +#include <linux/kernel.h>
  69. +#include <linux/hw_random.h>
  70. +#include <linux/io.h>
  71. +#include <linux/module.h>
  72. +#include <linux/of.h>
  73. +#include <linux/platform_device.h>
  74. +#include <linux/interrupt.h>
  75. +#include <linux/random.h>
  76. +
  77. +#include "starfive-vic-rng.h"
  78. +
  79. +#define to_vic_rng(p) container_of(p, struct vic_rng, rng)
  80. +
  81. +struct vic_rng {
  82. + struct device *dev;
  83. + void __iomem *base;
  84. + struct hwrng rng;
  85. +};
  86. +
  87. +static inline void vic_wait_till_idle(struct vic_rng *hrng)
  88. +{
  89. + while(readl(hrng->base + VIC_STAT) & VIC_STAT_BUSY)
  90. + ;
  91. +}
  92. +
  93. +static inline void vic_rng_irq_mask_clear(struct vic_rng *hrng)
  94. +{
  95. + // clear register: ISTAT
  96. + u32 data = readl(hrng->base + VIC_ISTAT);
  97. + writel(data, hrng->base + VIC_ISTAT);
  98. + writel(0, hrng->base + VIC_ALARM);
  99. +}
  100. +
  101. +static int vic_trng_cmd(struct vic_rng *hrng, u32 cmd) {
  102. + int res = 0;
  103. + // wait till idle
  104. + vic_wait_till_idle(hrng);
  105. + switch (cmd) {
  106. + case VIC_CTRL_CMD_NOP:
  107. + case VIC_CTRL_CMD_GEN_NOISE:
  108. + case VIC_CTRL_CMD_GEN_NONCE:
  109. + case VIC_CTRL_CMD_CREATE_STATE:
  110. + case VIC_CTRL_CMD_RENEW_STATE:
  111. + case VIC_CTRL_CMD_REFRESH_ADDIN:
  112. + case VIC_CTRL_CMD_GEN_RANDOM:
  113. + case VIC_CTRL_CMD_ADVANCE_STATE:
  114. + case VIC_CTRL_CMD_KAT:
  115. + case VIC_CTRL_CMD_ZEROIZE:
  116. + writel(cmd, hrng->base + VIC_CTRL);
  117. + break;
  118. + default:
  119. + res = -1;
  120. + break;
  121. + }
  122. +
  123. + return res;
  124. +}
  125. +
  126. +static int vic_rng_init(struct hwrng *rng)
  127. +{
  128. + struct vic_rng *hrng = to_vic_rng(rng);
  129. +
  130. + // wait till idle
  131. +
  132. + // clear register: ISTAT
  133. + vic_rng_irq_mask_clear(hrng);
  134. +
  135. + // set mission mode
  136. + writel(VIC_SMODE_SECURE_EN(1), hrng->base + VIC_SMODE);
  137. +
  138. + vic_trng_cmd(hrng, VIC_CTRL_CMD_GEN_NOISE);
  139. + vic_wait_till_idle(hrng);
  140. +
  141. + // set interrupt
  142. + writel(VIC_IE_ALL, hrng->base + VIC_IE);
  143. +
  144. + // zeroize
  145. + vic_trng_cmd(hrng, VIC_CTRL_CMD_ZEROIZE);
  146. +
  147. + vic_wait_till_idle(hrng);
  148. +
  149. + return 0;
  150. +}
  151. +
  152. +static irqreturn_t vic_rng_irq(int irq, void *priv)
  153. +{
  154. + u32 status, val;
  155. + struct vic_rng *hrng = (struct vic_rng *)priv;
  156. +
  157. + /*
  158. + * clearing the interrupt will also clear the error register
  159. + * read error and status before clearing
  160. + */
  161. + status = readl(hrng->base + VIC_ISTAT);
  162. +
  163. + if (status & VIC_ISTAT_ALARMS) {
  164. + writel(VIC_ISTAT_ALARMS, hrng->base + VIC_ISTAT);
  165. + val = readl(hrng->base + VIC_ALARM);
  166. + if (val & VIC_ALARM_ILLEGAL_CMD_SEQ) {
  167. + writel(VIC_ALARM_ILLEGAL_CMD_SEQ, hrng->base + VIC_ALARM);
  168. + //dev_info(hrng->dev, "ILLEGAL CMD SEQ: LAST_CMD=0x%x\r\n",
  169. + //VIC_STAT_LAST_CMD(readl(hrng->base + VIC_STAT)));
  170. + } else {
  171. + dev_info(hrng->dev, "Failed test: %x\r\n", val);
  172. + }
  173. + }
  174. +
  175. + if (status & VIC_ISTAT_ZEROIZE) {
  176. + writel(VIC_ISTAT_ZEROIZE, hrng->base + VIC_ISTAT);
  177. + //dev_info(hrng->dev, "zeroized\r\n");
  178. + }
  179. +
  180. + if (status & VIC_ISTAT_KAT_COMPLETE) {
  181. + writel(VIC_ISTAT_KAT_COMPLETE, hrng->base + VIC_ISTAT);
  182. + //dev_info(hrng->dev, "kat_completed\r\n");
  183. + }
  184. +
  185. + if (status & VIC_ISTAT_NOISE_RDY) {
  186. + writel(VIC_ISTAT_NOISE_RDY, hrng->base + VIC_ISTAT);
  187. + //dev_info(hrng->dev, "noise_rdy\r\n");
  188. + }
  189. +
  190. + if (status & VIC_ISTAT_DONE) {
  191. + writel(VIC_ISTAT_DONE, hrng->base + VIC_ISTAT);
  192. + //dev_info(hrng->dev, "done\r\n");
  193. + /*
  194. + if (VIC_STAT_LAST_CMD(readl(hrng->base + VIC_STAT)) ==
  195. + VIC_CTRL_CMD_GEN_RANDOM) {
  196. + dev_info(hrng->dev, "Need Update Buffer\r\n");
  197. + }
  198. + */
  199. + }
  200. + vic_rng_irq_mask_clear(hrng);
  201. +
  202. + return IRQ_HANDLED;
  203. +}
  204. +
  205. +static void vic_rng_cleanup(struct hwrng *rng)
  206. +{
  207. + struct vic_rng *hrng = to_vic_rng(rng);
  208. +
  209. + writel(0, hrng->base + VIC_CTRL);
  210. +}
  211. +
  212. +static int vic_rng_read(struct hwrng *rng, void *buf, size_t max, bool wait)
  213. +{
  214. + struct vic_rng *hrng = to_vic_rng(rng);
  215. +
  216. + vic_trng_cmd(hrng, VIC_CTRL_CMD_ZEROIZE);
  217. + vic_trng_cmd(hrng, VIC_CTRL_CMD_GEN_NOISE);
  218. + vic_trng_cmd(hrng, VIC_CTRL_CMD_CREATE_STATE);
  219. +
  220. + vic_wait_till_idle(hrng);
  221. + max = min_t(size_t, max, (VIC_RAND_LEN * 4));
  222. +
  223. + writel(0x0, hrng->base + VIC_MODE);
  224. + vic_trng_cmd(hrng, VIC_CTRL_CMD_GEN_RANDOM);
  225. +
  226. + vic_wait_till_idle(hrng);
  227. + memcpy_fromio(buf, hrng->base + VIC_RAND0, max);
  228. + vic_trng_cmd(hrng, VIC_CTRL_CMD_ZEROIZE);
  229. +
  230. + vic_wait_till_idle(hrng);
  231. + return max;
  232. +}
  233. +
  234. +static int vic_rng_probe(struct platform_device *pdev)
  235. +{
  236. + int ret;
  237. + int irq;
  238. + struct vic_rng *rng;
  239. + struct resource *res;
  240. +
  241. + rng = devm_kzalloc(&pdev->dev, sizeof(*rng), GFP_KERNEL);
  242. + if (!rng){
  243. + return -ENOMEM;
  244. + }
  245. +
  246. + platform_set_drvdata(pdev, rng);
  247. +
  248. + res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  249. + rng->base = devm_ioremap_resource(&pdev->dev, res);
  250. + if (IS_ERR(rng->base)){
  251. + return PTR_ERR(rng->base);
  252. + }
  253. +
  254. + irq = platform_get_irq(pdev, 0);
  255. + if (irq <= 0) {
  256. + dev_err(&pdev->dev, "Couldn't get irq %d\n", irq);
  257. + return irq;
  258. + }
  259. +
  260. + ret = devm_request_irq(&pdev->dev, irq, vic_rng_irq, 0, pdev->name,
  261. + (void *)rng);
  262. + if (ret) {
  263. + dev_err(&pdev->dev, "Can't get interrupt working.\n");
  264. + return ret;
  265. + }
  266. +
  267. + rng->rng.name = pdev->name;
  268. + rng->rng.init = vic_rng_init;
  269. + rng->rng.cleanup = vic_rng_cleanup;
  270. + rng->rng.read = vic_rng_read;
  271. +
  272. + rng->dev = &pdev->dev;
  273. +
  274. + ret = devm_hwrng_register(&pdev->dev, &rng->rng);
  275. + if (ret) {
  276. + dev_err(&pdev->dev, "failed to register hwrng\n");
  277. + return ret;
  278. + }
  279. +
  280. + dev_info(&pdev->dev, "Initialized\n");
  281. +
  282. + return 0;
  283. +}
  284. +
  285. +static const struct of_device_id vic_rng_dt_ids[] = {
  286. + { .compatible = "starfive,vic-rng" },
  287. + { }
  288. +};
  289. +MODULE_DEVICE_TABLE(of, vic_rng_dt_ids);
  290. +
  291. +static struct platform_driver vic_rng_driver = {
  292. + .probe = vic_rng_probe,
  293. + .driver = {
  294. + .name = "vic-rng",
  295. + .of_match_table = vic_rng_dt_ids,
  296. + },
  297. +};
  298. +
  299. +module_platform_driver(vic_rng_driver);
  300. +
  301. +MODULE_LICENSE("GPL");
  302. +MODULE_AUTHOR("Huan Feng <[email protected]>");
  303. +MODULE_DESCRIPTION("Starfive VIC random number generator driver");
  304. --- /dev/null
  305. +++ b/drivers/char/hw_random/starfive-vic-rng.h
  306. @@ -0,0 +1,167 @@
  307. +/*
  308. + ******************************************************************************
  309. + * @file starfive-vic-rng.h
  310. + * @author StarFive Technology
  311. + * @version V1.0
  312. + * @date 08/13/2020
  313. + * @brief
  314. + ******************************************************************************
  315. + * @copy
  316. + *
  317. + * THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  318. + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  319. + * TIME. AS A RESULT, STARFIVE SHALL NOT BE HELD LIABLE FOR ANY
  320. + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  321. + * FROM THE CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  322. + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  323. + *
  324. + * COPYRIGHT 2020 Shanghai StarFive Technology Co., Ltd.
  325. + */
  326. +
  327. +#define VIC_CTRL 0x00
  328. +#define VIC_MODE 0x04
  329. +#define VIC_SMODE 0x08
  330. +#define VIC_STAT 0x0C
  331. +#define VIC_IE 0x10
  332. +#define VIC_ISTAT 0x14
  333. +#define VIC_ALARM 0x18
  334. +#define VIC_BUILD_ID 0x1C
  335. +#define VIC_FEATURES 0x20
  336. +#define VIC_RAND0 0x24
  337. +#define VIC_NPA_DATA0 0x34
  338. +#define VIC_SEED0 0x74
  339. +#define VIC_IA_RDATA 0xA4
  340. +#define VIC_IA_WDATA 0xA8
  341. +#define VIC_IA_ADDR 0xAC
  342. +#define VIC_IA_CMD 0xB0
  343. +
  344. +/* CTRL */
  345. +#define VIC_CTRL_CMD_NOP 0
  346. +#define VIC_CTRL_CMD_GEN_NOISE 1
  347. +#define VIC_CTRL_CMD_GEN_NONCE 2
  348. +#define VIC_CTRL_CMD_CREATE_STATE 3
  349. +#define VIC_CTRL_CMD_RENEW_STATE 4
  350. +#define VIC_CTRL_CMD_REFRESH_ADDIN 5
  351. +#define VIC_CTRL_CMD_GEN_RANDOM 6
  352. +#define VIC_CTRL_CMD_ADVANCE_STATE 7
  353. +#define VIC_CTRL_CMD_KAT 8
  354. +#define VIC_CTRL_CMD_ZEROIZE 15
  355. +
  356. +/* MODE */
  357. +#define _VIC_MODE_ADDIN_PRESENT 4
  358. +#define _VIC_MODE_PRED_RESIST 3
  359. +#define _VIC_MODE_KAT_SEL 2
  360. +#define _VIC_MODE_KAT_VEC 1
  361. +#define _VIC_MODE_SEC_ALG 0
  362. +
  363. +#define VIC_MODE_ADDIN_PRESENT (1UL << _VIC_MODE_ADDIN_PRESENT)
  364. +#define VIC_MODE_PRED_RESIST (1UL << _VIC_MODE_PRED_RESIST)
  365. +#define VIC_MODE_KAT_SEL (1UL << _VIC_MODE_KAT_SEL)
  366. +#define VIC_MODE_KAT_VEC (1UL << _VIC_MODE_KAT_VEC)
  367. +#define VIC_MODE_SEC_ALG (1UL << _VIC_MODE_SEC_ALG)
  368. +
  369. +/* SMODE */
  370. +#define _VIC_SMODE_MAX_REJECTS 2
  371. +#define _VIC_SMODE_SECURE_EN 1
  372. +#define _VIC_SMODE_NONCE 0
  373. +
  374. +#define VIC_SMODE_MAX_REJECTS(x) ((x) << _VIC_SMODE_MAX_REJECTS)
  375. +#define VIC_SMODE_SECURE_EN(x) ((x) << _VIC_SMODE_SECURE_EN)
  376. +#define VIC_SMODE_NONCE (1UL << _VIC_SMODE_NONCE)
  377. +
  378. +/* STAT */
  379. +#define _VIC_STAT_BUSY 31
  380. +#define _VIC_STAT_DRBG_STATE 7
  381. +#define _VIC_STAT_SECURE 6
  382. +#define _VIC_STAT_NONCE_MODE 5
  383. +#define _VIC_STAT_SEC_ALG 4
  384. +#define _VIC_STAT_LAST_CMD 0
  385. +
  386. +#define VIC_STAT_BUSY (1UL << _VIC_STAT_BUSY)
  387. +#define VIC_STAT_DRBG_STATE (1UL << _VIC_STAT_DRBG_STATE)
  388. +#define VIC_STAT_SECURE (1UL << _VIC_STAT_SECURE)
  389. +#define VIC_STAT_NONCE_MODE (1UL << _VIC_STAT_NONCE_MODE)
  390. +#define VIC_STAT_SEC_ALG (1UL << _VIC_STAT_SEC_ALG)
  391. +#define VIC_STAT_LAST_CMD(x) (((x) >> _VIC_STAT_LAST_CMD) & 0xF)
  392. +
  393. +/* IE */
  394. +#define _VIC_IE_GLBL 31
  395. +#define _VIC_IE_DONE 4
  396. +#define _VIC_IE_ALARMS 3
  397. +#define _VIC_IE_NOISE_RDY 2
  398. +#define _VIC_IE_KAT_COMPLETE 1
  399. +#define _VIC_IE_ZEROIZE 0
  400. +
  401. +#define VIC_IE_GLBL (1UL << _VIC_IE_GLBL)
  402. +#define VIC_IE_DONE (1UL << _VIC_IE_DONE)
  403. +#define VIC_IE_ALARMS (1UL << _VIC_IE_ALARMS)
  404. +#define VIC_IE_NOISE_RDY (1UL << _VIC_IE_NOISE_RDY)
  405. +#define VIC_IE_KAT_COMPLETE (1UL << _VIC_IE_KAT_COMPLETE)
  406. +#define VIC_IE_ZEROIZE (1UL << _VIC_IE_ZEROIZE)
  407. +#define VIC_IE_ALL (VIC_IE_GLBL | VIC_IE_DONE | VIC_IE_ALARMS | \
  408. + VIC_IE_NOISE_RDY | VIC_IE_KAT_COMPLETE | VIC_IE_ZEROIZE)
  409. +
  410. +/* ISTAT */
  411. +#define _VIC_ISTAT_DONE 4
  412. +#define _VIC_ISTAT_ALARMS 3
  413. +#define _VIC_ISTAT_NOISE_RDY 2
  414. +#define _VIC_ISTAT_KAT_COMPLETE 1
  415. +#define _VIC_ISTAT_ZEROIZE 0
  416. +
  417. +#define VIC_ISTAT_DONE (1UL << _VIC_ISTAT_DONE)
  418. +#define VIC_ISTAT_ALARMS (1UL << _VIC_ISTAT_ALARMS)
  419. +#define VIC_ISTAT_NOISE_RDY (1UL << _VIC_ISTAT_NOISE_RDY)
  420. +#define VIC_ISTAT_KAT_COMPLETE (1UL << _VIC_ISTAT_KAT_COMPLETE)
  421. +#define VIC_ISTAT_ZEROIZE (1UL << _VIC_ISTAT_ZEROIZE)
  422. +
  423. +/* ALARMS */
  424. +#define VIC_ALARM_ILLEGAL_CMD_SEQ (1UL << 4)
  425. +#define VIC_ALARM_FAILED_TEST_ID_OK 0
  426. +#define VIC_ALARM_FAILED_TEST_ID_KAT_STAT 1
  427. +#define VIC_ALARM_FAILED_TEST_ID_KAT 2
  428. +#define VIC_ALARM_FAILED_TEST_ID_MONOBIT 3
  429. +#define VIC_ALARM_FAILED_TEST_ID_RUN 4
  430. +#define VIC_ALARM_FAILED_TEST_ID_LONGRUN 5
  431. +#define VIC_ALARM_FAILED_TEST_ID_AUTOCORRELATION 6
  432. +#define VIC_ALARM_FAILED_TEST_ID_POKER 7
  433. +#define VIC_ALARM_FAILED_TEST_ID_REPETITION_COUNT 8
  434. +#define VIC_ALARM_FAILED_TEST_ID_ADAPATIVE_PROPORTION 9
  435. +
  436. +/* BUILD_ID */
  437. +#define VIC_BUILD_ID_STEPPING(x) (((x) >> 28) & 0xF)
  438. +#define VIC_BUILD_ID_EPN(x) ((x) & 0xFFFF)
  439. +
  440. +/* FEATURES */
  441. +#define VIC_FEATURES_AES_256(x) (((x) >> 9) & 1)
  442. +#define VIC_FEATURES_EXTRA_PS_PRESENT(x) (((x) >> 8) & 1)
  443. +#define VIC_FEATURES_DIAG_LEVEL_NS(x) (((x) >> 7) & 1)
  444. +#define VIC_FEATURES_DIAG_LEVEL_CLP800(x) (((x) >> 4) & 7)
  445. +#define VIC_FEATURES_DIAG_LEVEL_ST_HLT(x) (((x) >> 1) & 7)
  446. +#define VIC_FEATURES_SECURE_RST_STATE(x) ((x) & 1)
  447. +
  448. +/* IA_CMD */
  449. +#define VIC_IA_CMD_GO (1UL << 31)
  450. +#define VIC_IA_CMD_WR (1)
  451. +
  452. +#define _VIC_SMODE_MAX_REJECTS_MASK 255UL
  453. +#define _VIC_SMODE_SECURE_EN_MASK 1UL
  454. +#define _VIC_SMODE_NONCE_MASK 1UL
  455. +#define _VIC_MODE_SEC_ALG_MASK 1UL
  456. +#define _VIC_MODE_ADDIN_PRESENT_MASK 1UL
  457. +#define _VIC_MODE_PRED_RESIST_MASK 1UL
  458. +
  459. +#define VIC_SMODE_SET_MAX_REJECTS(y, x) (((y) & ~(_VIC_SMODE_MAX_REJECTS_MASK << _VIC_SMODE_MAX_REJECTS)) | ((x) << _VIC_SMODE_MAX_REJECTS))
  460. +#define VIC_SMODE_SET_SECURE_EN(y, x) (((y) & ~(_VIC_SMODE_SECURE_EN_MASK << _VIC_SMODE_SECURE_EN)) | ((x) << _VIC_SMODE_SECURE_EN))
  461. +#define VIC_SMODE_SET_NONCE(y, x) (((y) & ~(_VIC_SMODE_NONCE_MASK << _VIC_SMODE_NONCE)) | ((x) << _VIC_SMODE_NONCE))
  462. +#define VIC_SMODE_GET_MAX_REJECTS(x) (((x) >> _VIC_SMODE_MAX_REJECTS) & _VIC_SMODE_MAX_REJECTS_MASK)
  463. +#define VIC_SMODE_GET_SECURE_EN(x) (((x) >> _VIC_SMODE_SECURE_EN) & _VIC_SMODE_SECURE_EN_MASK)
  464. +#define VIC_SMODE_GET_NONCE(x) (((x) >> _VIC_SMODE_NONCE) & _VIC_SMODE_NONCE_MASK)
  465. +
  466. +#define VIC_MODE_SET_SEC_ALG(y, x) (((y) & ~(_VIC_MODE_SEC_ALG_MASK << _VIC_MODE_SEC_ALG)) | ((x) << _VIC_MODE_SEC_ALG))
  467. +#define VIC_MODE_SET_PRED_RESIST(y, x) (((y) & ~(_VIC_MODE_PRED_RESIST_MASK << _VIC_MODE_PRED_RESIST)) | ((x) << _VIC_MODE_PRED_RESIST))
  468. +#define VIC_MODE_SET_ADDIN_PRESENT(y, x) (((y) & ~(_VIC_MODE_ADDIN_PRESENT_MASK << _VIC_MODE_ADDIN_PRESENT)) | ((x) << _VIC_MODE_ADDIN_PRESENT))
  469. +#define VIC_MODE_GET_SEC_ALG(x) (((x) >> _VIC_MODE_SEC_ALG) & _VIC_MODE_SEC_ALG_MASK)
  470. +#define VIC_MODE_GET_PRED_RESIST(x) (((x) >> _VIC_MODE_PRED_RESIST) & _VIC_MODE_PRED_RESIST_MASK)
  471. +#define VIC_MODE_GET_ADDIN_PRESENT(x) (((x) >> _VIC_MODE_ADDIN_PRESENT) & _VIC_MODE_ADDIN_PRESENT_MASK)
  472. +
  473. +#define VIC_RAND_LEN 4