mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-25 22:23:14 -04:00
Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
Pull crypto updates from Herbert Xu: "Here is the crypto update for 4.8: API: - first part of skcipher low-level conversions - add KPP (Key-agreement Protocol Primitives) interface. Algorithms: - fix IPsec/cryptd reordering issues that affects aesni - RSA no longer does explicit leading zero removal - add SHA3 - add DH - add ECDH - improve DRBG performance by not doing CTR by hand Drivers: - add x86 AVX2 multibuffer SHA256/512 - add POWER8 optimised crc32c - add xts support to vmx - add DH support to qat - add RSA support to caam - add Layerscape support to caam - add SEC1 AEAD support to talitos - improve performance by chaining requests in marvell/cesa - add support for Araneus Alea I USB RNG - add support for Broadcom BCM5301 RNG - add support for Amlogic Meson RNG - add support Broadcom NSP SoC RNG" * 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6: (180 commits) crypto: vmx - Fix aes_p8_xts_decrypt build failure crypto: vmx - Ignore generated files crypto: vmx - Adding support for XTS crypto: vmx - Adding asm subroutines for XTS crypto: skcipher - add comment for skcipher_alg->base crypto: testmgr - Print akcipher algorithm name crypto: marvell - Fix wrong flag used for GFP in mv_cesa_dma_add_iv_op crypto: nx - off by one bug in nx_of_update_msc() crypto: rsa-pkcs1pad - fix rsa-pkcs1pad request struct crypto: scatterwalk - Inline start/map/done crypto: scatterwalk - Remove unnecessary BUG in scatterwalk_start crypto: scatterwalk - Remove unnecessary advance in scatterwalk_pagedone crypto: scatterwalk - Fix test in scatterwalk_done crypto: api - Optimise away crypto_yield when hard preemption is on crypto: scatterwalk - add no-copy support to copychunks crypto: scatterwalk - Remove scatterwalk_bytes_sglen crypto: omap - Stop using crypto scatterwalk_bytes_sglen crypto: skcipher - Remove top-level givcipher interface crypto: user - Remove crypto_lookup_skcipher call crypto: cts - Convert to skcipher ...
This commit is contained in:
commit
bbce2ad2d7
184 changed files with 19350 additions and 4261 deletions
|
|
@ -90,7 +90,7 @@ config HW_RANDOM_BCM63XX
|
|||
|
||||
config HW_RANDOM_BCM2835
|
||||
tristate "Broadcom BCM2835 Random Number Generator support"
|
||||
depends on ARCH_BCM2835
|
||||
depends on ARCH_BCM2835 || ARCH_BCM_NSP || ARCH_BCM_5301X
|
||||
default HW_RANDOM
|
||||
---help---
|
||||
This driver provides kernel-side support for the Random Number
|
||||
|
|
@ -396,6 +396,20 @@ config HW_RANDOM_PIC32
|
|||
|
||||
If unsure, say Y.
|
||||
|
||||
config HW_RANDOM_MESON
|
||||
tristate "Amlogic Meson Random Number Generator support"
|
||||
depends on HW_RANDOM
|
||||
depends on ARCH_MESON || COMPILE_TEST
|
||||
default y
|
||||
---help---
|
||||
This driver provides kernel-side support for the Random Number
|
||||
Generator hardware found on Amlogic Meson SoCs.
|
||||
|
||||
To compile this driver as a module, choose M here. the
|
||||
module will be called meson-rng.
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
endif # HW_RANDOM
|
||||
|
||||
config UML_RANDOM
|
||||
|
|
|
|||
|
|
@ -34,3 +34,4 @@ obj-$(CONFIG_HW_RANDOM_ST) += st-rng.o
|
|||
obj-$(CONFIG_HW_RANDOM_XGENE) += xgene-rng.o
|
||||
obj-$(CONFIG_HW_RANDOM_STM32) += stm32-rng.o
|
||||
obj-$(CONFIG_HW_RANDOM_PIC32) += pic32-rng.o
|
||||
obj-$(CONFIG_HW_RANDOM_MESON) += meson-rng.o
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@
|
|||
#define RNG_CTRL 0x0
|
||||
#define RNG_STATUS 0x4
|
||||
#define RNG_DATA 0x8
|
||||
#define RNG_INT_MASK 0x10
|
||||
|
||||
/* enable rng */
|
||||
#define RNG_RBGEN 0x1
|
||||
|
|
@ -26,10 +27,24 @@
|
|||
/* the initial numbers generated are "less random" so will be discarded */
|
||||
#define RNG_WARMUP_COUNT 0x40000
|
||||
|
||||
#define RNG_INT_OFF 0x1
|
||||
|
||||
static void __init nsp_rng_init(void __iomem *base)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
/* mask the interrupt */
|
||||
val = readl(base + RNG_INT_MASK);
|
||||
val |= RNG_INT_OFF;
|
||||
writel(val, base + RNG_INT_MASK);
|
||||
}
|
||||
|
||||
static int bcm2835_rng_read(struct hwrng *rng, void *buf, size_t max,
|
||||
bool wait)
|
||||
{
|
||||
void __iomem *rng_base = (void __iomem *)rng->priv;
|
||||
u32 max_words = max / sizeof(u32);
|
||||
u32 num_words, count;
|
||||
|
||||
while ((__raw_readl(rng_base + RNG_STATUS) >> 24) == 0) {
|
||||
if (!wait)
|
||||
|
|
@ -37,8 +52,14 @@ static int bcm2835_rng_read(struct hwrng *rng, void *buf, size_t max,
|
|||
cpu_relax();
|
||||
}
|
||||
|
||||
*(u32 *)buf = __raw_readl(rng_base + RNG_DATA);
|
||||
return sizeof(u32);
|
||||
num_words = readl(rng_base + RNG_STATUS) >> 24;
|
||||
if (num_words > max_words)
|
||||
num_words = max_words;
|
||||
|
||||
for (count = 0; count < num_words; count++)
|
||||
((u32 *)buf)[count] = readl(rng_base + RNG_DATA);
|
||||
|
||||
return num_words * sizeof(u32);
|
||||
}
|
||||
|
||||
static struct hwrng bcm2835_rng_ops = {
|
||||
|
|
@ -46,10 +67,19 @@ static struct hwrng bcm2835_rng_ops = {
|
|||
.read = bcm2835_rng_read,
|
||||
};
|
||||
|
||||
static const struct of_device_id bcm2835_rng_of_match[] = {
|
||||
{ .compatible = "brcm,bcm2835-rng"},
|
||||
{ .compatible = "brcm,bcm-nsp-rng", .data = nsp_rng_init},
|
||||
{ .compatible = "brcm,bcm5301x-rng", .data = nsp_rng_init},
|
||||
{},
|
||||
};
|
||||
|
||||
static int bcm2835_rng_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct device_node *np = dev->of_node;
|
||||
void (*rng_setup)(void __iomem *base);
|
||||
const struct of_device_id *rng_id;
|
||||
void __iomem *rng_base;
|
||||
int err;
|
||||
|
||||
|
|
@ -61,6 +91,15 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
|
|||
}
|
||||
bcm2835_rng_ops.priv = (unsigned long)rng_base;
|
||||
|
||||
rng_id = of_match_node(bcm2835_rng_of_match, np);
|
||||
if (!rng_id)
|
||||
return -EINVAL;
|
||||
|
||||
/* Check for rng init function, execute it */
|
||||
rng_setup = rng_id->data;
|
||||
if (rng_setup)
|
||||
rng_setup(rng_base);
|
||||
|
||||
/* set warm-up count & enable */
|
||||
__raw_writel(RNG_WARMUP_COUNT, rng_base + RNG_STATUS);
|
||||
__raw_writel(RNG_RBGEN, rng_base + RNG_CTRL);
|
||||
|
|
@ -90,10 +129,6 @@ static int bcm2835_rng_remove(struct platform_device *pdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id bcm2835_rng_of_match[] = {
|
||||
{ .compatible = "brcm,bcm2835-rng", },
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, bcm2835_rng_of_match);
|
||||
|
||||
static struct platform_driver bcm2835_rng_driver = {
|
||||
|
|
|
|||
|
|
@ -45,12 +45,12 @@ struct exynos_rng {
|
|||
|
||||
static u32 exynos_rng_readl(struct exynos_rng *rng, u32 offset)
|
||||
{
|
||||
return __raw_readl(rng->mem + offset);
|
||||
return readl_relaxed(rng->mem + offset);
|
||||
}
|
||||
|
||||
static void exynos_rng_writel(struct exynos_rng *rng, u32 val, u32 offset)
|
||||
{
|
||||
__raw_writel(val, rng->mem + offset);
|
||||
writel_relaxed(val, rng->mem + offset);
|
||||
}
|
||||
|
||||
static int exynos_rng_configure(struct exynos_rng *exynos_rng)
|
||||
|
|
|
|||
131
drivers/char/hw_random/meson-rng.c
Normal file
131
drivers/char/hw_random/meson-rng.c
Normal file
|
|
@ -0,0 +1,131 @@
|
|||
/*
|
||||
* This file is provided under a dual BSD/GPLv2 license. When using or
|
||||
* redistributing this file, you may do so under either license.
|
||||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright (c) 2016 BayLibre, SAS.
|
||||
* Author: Neil Armstrong <narmstrong@baylibre.com>
|
||||
* Copyright (C) 2014 Amlogic, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
* The full GNU General Public License is included in this distribution
|
||||
* in the file called COPYING.
|
||||
*
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright (c) 2016 BayLibre, SAS.
|
||||
* Author: Neil Armstrong <narmstrong@baylibre.com>
|
||||
* Copyright (C) 2014 Amlogic, Inc.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of Intel Corporation nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#include <linux/err.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/hw_random.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/of.h>
|
||||
|
||||
#define RNG_DATA 0x00
|
||||
|
||||
struct meson_rng_data {
|
||||
void __iomem *base;
|
||||
struct platform_device *pdev;
|
||||
struct hwrng rng;
|
||||
};
|
||||
|
||||
static int meson_rng_read(struct hwrng *rng, void *buf, size_t max, bool wait)
|
||||
{
|
||||
struct meson_rng_data *data =
|
||||
container_of(rng, struct meson_rng_data, rng);
|
||||
|
||||
if (max < sizeof(u32))
|
||||
return 0;
|
||||
|
||||
*(u32 *)buf = readl_relaxed(data->base + RNG_DATA);
|
||||
|
||||
return sizeof(u32);
|
||||
}
|
||||
|
||||
static int meson_rng_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct meson_rng_data *data;
|
||||
struct resource *res;
|
||||
|
||||
data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
|
||||
if (!data)
|
||||
return -ENOMEM;
|
||||
|
||||
data->pdev = pdev;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
data->base = devm_ioremap_resource(dev, res);
|
||||
if (IS_ERR(data->base))
|
||||
return PTR_ERR(data->base);
|
||||
|
||||
data->rng.name = pdev->name;
|
||||
data->rng.read = meson_rng_read;
|
||||
|
||||
platform_set_drvdata(pdev, data);
|
||||
|
||||
return devm_hwrng_register(dev, &data->rng);
|
||||
}
|
||||
|
||||
static const struct of_device_id meson_rng_of_match[] = {
|
||||
{ .compatible = "amlogic,meson-rng", },
|
||||
{},
|
||||
};
|
||||
|
||||
static struct platform_driver meson_rng_driver = {
|
||||
.probe = meson_rng_probe,
|
||||
.driver = {
|
||||
.name = "meson-rng",
|
||||
.of_match_table = meson_rng_of_match,
|
||||
},
|
||||
};
|
||||
|
||||
module_platform_driver(meson_rng_driver);
|
||||
|
||||
MODULE_ALIAS("platform:meson-rng");
|
||||
MODULE_DESCRIPTION("Meson H/W Random Number Generator driver");
|
||||
MODULE_AUTHOR("Lawrence Mok <lawrence.mok@amlogic.com>");
|
||||
MODULE_AUTHOR("Neil Armstrong <narmstrong@baylibre.com>");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
|
@ -384,7 +384,12 @@ static int omap_rng_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
pm_runtime_get_sync(&pdev->dev);
|
||||
ret = pm_runtime_get_sync(&pdev->dev);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Failed to runtime_get device: %d\n", ret);
|
||||
pm_runtime_put_noidle(&pdev->dev);
|
||||
goto err_ioremap;
|
||||
}
|
||||
|
||||
ret = (dev->of_node) ? of_get_omap_rng_device_details(priv, pdev) :
|
||||
get_omap_rng_device_details(priv);
|
||||
|
|
@ -435,8 +440,15 @@ static int __maybe_unused omap_rng_suspend(struct device *dev)
|
|||
static int __maybe_unused omap_rng_resume(struct device *dev)
|
||||
{
|
||||
struct omap_rng_dev *priv = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
|
||||
ret = pm_runtime_get_sync(dev);
|
||||
if (ret) {
|
||||
dev_err(dev, "Failed to runtime_get device: %d\n", ret);
|
||||
pm_runtime_put_noidle(dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
pm_runtime_get_sync(dev);
|
||||
priv->pdata->init(priv);
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -69,8 +69,12 @@ static int stm32_rng_read(struct hwrng *rng, void *data, size_t max, bool wait)
|
|||
}
|
||||
|
||||
/* If error detected or data not ready... */
|
||||
if (sr != RNG_SR_DRDY)
|
||||
if (sr != RNG_SR_DRDY) {
|
||||
if (WARN_ONCE(sr & (RNG_SR_SEIS | RNG_SR_CEIS),
|
||||
"bad RNG status - %x\n", sr))
|
||||
writel_relaxed(0, priv->base + RNG_SR);
|
||||
break;
|
||||
}
|
||||
|
||||
*(u32 *)data = readl_relaxed(priv->base + RNG_DR);
|
||||
|
||||
|
|
@ -79,10 +83,6 @@ static int stm32_rng_read(struct hwrng *rng, void *data, size_t max, bool wait)
|
|||
max -= sizeof(u32);
|
||||
}
|
||||
|
||||
if (WARN_ONCE(sr & (RNG_SR_SEIS | RNG_SR_CEIS),
|
||||
"bad RNG status - %x\n", sr))
|
||||
writel_relaxed(0, priv->base + RNG_SR);
|
||||
|
||||
pm_runtime_mark_last_busy((struct device *) priv->rng.priv);
|
||||
pm_runtime_put_sync_autosuspend((struct device *) priv->rng.priv);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue