From 689282bdceb3cfa328cd5b723cc9beaa9cab74cd Mon Sep 17 00:00:00 2001 From: Lin Jinhan Date: Tue, 15 Oct 2019 09:49:31 +0800 Subject: [PATCH] hwrng: rockchip: fix bugs on read trng output regs memcpy_fromio requrie 8 byte align on arm64 while crypto v1 trng output regs offset is 0x204. Change-Id: Ida2239a3d493bd9910c63ae4c4be1c23f9cc1212 Signed-off-by: Lin Jinhan --- drivers/char/hw_random/rockchip-rng.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/drivers/char/hw_random/rockchip-rng.c b/drivers/char/hw_random/rockchip-rng.c index 9e38fe01ca8b..51dbd01f8e9c 100644 --- a/drivers/char/hw_random/rockchip-rng.c +++ b/drivers/char/hw_random/rockchip-rng.c @@ -84,6 +84,11 @@ static void rk_rng_writel(struct rk_rng *rng, u32 val, u32 offset) __raw_writel(val, rng->mem + offset); } +static u32 rk_rng_readl(struct rk_rng *rng, u32 offset) +{ + return __raw_readl(rng->mem + offset); +} + static int rk_rng_init(struct hwrng *rng) { int ret; @@ -108,6 +113,15 @@ static void rk_rng_cleanup(struct hwrng *rng) clk_bulk_disable_unprepare(rk_rng->clk_num, rk_rng->clk_bulks); } +static void rk_rng_read_regs(struct rk_rng *rng, u32 offset, void *buf, + size_t size) +{ + u32 i; + + for (i = 0; i < size; i += 4) + *(u32 *)(buf + i) = be32_to_cpu(rk_rng_readl(rng, offset + i)); +} + static int rk_rng_v1_read(struct hwrng *rng, void *buf, size_t max, bool wait) { int ret = 0; @@ -133,7 +147,7 @@ static int rk_rng_v1_read(struct hwrng *rng, void *buf, size_t max, bool wait) ret = min_t(size_t, max, RK_MAX_RNG_BYTE); - memcpy_fromio(buf, rk_rng->mem + CRYPTO_V1_TRNG_DOUT_0, ret); + rk_rng_read_regs(rk_rng, CRYPTO_V1_TRNG_DOUT_0, buf, ret); out: /* close TRNG */ @@ -174,7 +188,7 @@ static int rk_rng_v2_read(struct hwrng *rng, void *buf, size_t max, bool wait) ret = min_t(size_t, max, RK_MAX_RNG_BYTE); - memcpy_fromio(buf, rk_rng->mem + CRYPTO_V2_RNG_DOUT_0, ret); + rk_rng_read_regs(rk_rng, CRYPTO_V2_RNG_DOUT_0, buf, ret); out: /* close TRNG */