summaryrefslogtreecommitdiff
path: root/drivers/crypto
diff options
context:
space:
mode:
authorShravani Dingari <shravanid@nvidia.com>2013-02-27 10:55:34 +0530
committerDan Willemsen <dwillemsen@nvidia.com>2013-09-14 13:01:47 -0700
commit4d7355e1be36a752bab90ee91c27a1dd8fabbbbd (patch)
tree135fc5511a4562e4dbd953957b114b2bd432c2c2 /drivers/crypto
parentdfded32f7ba9c6b4cd7ef313ac3c25cfb75f4301 (diff)
crypto: tegra-se: Enable RO entropy source for DRBG
Bug 1194672 , Bug 1213276 Change-Id: I2a1d033b5da8782b802f9dbac0461a596942b968 Signed-off-by: Shravani Dingari <shravanid@nvidia.com> Reviewed-on: http://git-master/r/204402 Reviewed-by: Simone Willett <swillett@nvidia.com> Tested-by: Simone Willett <swillett@nvidia.com>
Diffstat (limited to 'drivers/crypto')
-rw-r--r--drivers/crypto/tegra-se.c30
-rw-r--r--drivers/crypto/tegra-se.h12
2 files changed, 40 insertions, 2 deletions
diff --git a/drivers/crypto/tegra-se.c b/drivers/crypto/tegra-se.c
index 986e5dd428cc..9ece5194de25 100644
--- a/drivers/crypto/tegra-se.c
+++ b/drivers/crypto/tegra-se.c
@@ -4,7 +4,7 @@
*
* Support for Tegra Security Engine hardware crypto algorithms.
*
- * Copyright (c) 2011-2012, NVIDIA Corporation. All Rights Reserved.
+ * Copyright (c) 2011-2013, NVIDIA Corporation. All Rights Reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -199,6 +199,7 @@ static struct workqueue_struct *se_work_q;
#define PMC_SCRATCH43_REG_OFFSET 0x22c
#define GET_MSB(x) ((x) >> (8*sizeof(x)-1))
static int force_reseed_count;
+static int drbg_ro_entropy_src_enabled;
static void tegra_se_leftshift_onebit(u8 *in_buf, u32 size, u8 *org_msb)
{
u8 carry;
@@ -1322,6 +1323,23 @@ static int tegra_se_rng_drbg_init(struct crypto_tfm *tfm)
return -ENOMEM;
}
+ /* take access to the hw */
+ mutex_lock(&se_hw_lock);
+ pm_runtime_get_sync(se_dev->dev);
+
+ if (!drbg_ro_entropy_src_enabled
+ && (tegra_get_chipid() != TEGRA_CHIPID_TEGRA3)
+ && (tegra_get_chipid() != TEGRA_CHIPID_TEGRA11)) {
+ se_writel(se_dev,
+ SE_RNG_SRC_CONFIG_RO_ENT_SRC(DRBG_RO_ENT_SRC_ENABLE)
+ |SE_RNG_SRC_CONFIG_RO_ENT_SRC_LOCK(DRBG_RO_ENT_SRC_LOCK_ENABLE),
+ SE_RNG_SRC_CONFIG_REG_OFFSET);
+ drbg_ro_entropy_src_enabled = 1;
+ }
+
+ pm_runtime_put(se_dev->dev);
+ mutex_unlock(&se_hw_lock);
+
return 0;
}
@@ -2731,6 +2749,16 @@ static int tegra_se_remove(struct platform_device *pdev)
#if defined(CONFIG_PM)
static int tegra_se_resume(struct device *dev)
{
+ struct tegra_se_dev *se_dev = sg_tegra_se_dev;
+ if ((tegra_get_chipid() != TEGRA_CHIPID_TEGRA3)
+ && (tegra_get_chipid() != TEGRA_CHIPID_TEGRA11)) {
+ se_writel(se_dev,
+ SE_RNG_SRC_CONFIG_RO_ENT_SRC(DRBG_RO_ENT_SRC_ENABLE)
+ |SE_RNG_SRC_CONFIG_RO_ENT_SRC_LOCK(DRBG_RO_ENT_SRC_LOCK_ENABLE),
+ SE_RNG_SRC_CONFIG_REG_OFFSET);
+ drbg_ro_entropy_src_enabled = 1;
+ }
+
return 0;
}
diff --git a/drivers/crypto/tegra-se.h b/drivers/crypto/tegra-se.h
index 88df933b4b6a..b2245120eeae 100644
--- a/drivers/crypto/tegra-se.h
+++ b/drivers/crypto/tegra-se.h
@@ -1,7 +1,7 @@
/*
* Driver for Tegra Security Engine
*
- * Copyright (c) 2011, NVIDIA Corporation.
+ * Copyright (c) 2011-2013, NVIDIA Corporation.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -74,6 +74,16 @@
#define DRBG_MODE_FORCE_RESEED 2
#define SE_RNG_CONFIG_MODE(x) (x << DRBG_MODE_SHIFT)
+#define SE_RNG_SRC_CONFIG_REG_OFFSET 0x344
+#define DRBG_RO_ENT_SRC_SHIFT 1
+#define DRBG_RO_ENT_SRC_ENABLE 1
+#define DRBG_RO_ENT_SRC_DISABLE 0
+#define SE_RNG_SRC_CONFIG_RO_ENT_SRC(x) (x << DRBG_RO_ENT_SRC_SHIFT)
+#define DRBG_RO_ENT_SRC_LOCK_SHIFT 0
+#define DRBG_RO_ENT_SRC_LOCK_ENABLE 1
+#define DRBG_RO_ENT_SRC_LOCK_DISABLE 0
+#define SE_RNG_SRC_CONFIG_RO_ENT_SRC_LOCK(x) (x << DRBG_RO_ENT_SRC_LOCK_SHIFT)
+
#define DRBG_SRC_SHIFT 2
#define DRBG_SRC_NONE 0
#define DRBG_SRC_ENTROPY 1