Re: [PATCH] crypto: hisilicon/trng - add version to adapt new algorithm

2021-04-16 Thread Herbert Xu
On Wed, Apr 07, 2021 at 05:44:33PM +0800, Weili Qian wrote:
> Kunpeng930 supports trng and prng, but Kunpeng920 only supports trng.
> 
> Therefore, version information is added to ensure that prng is not
> registered to Crypto subsystem on Kunpeng920.
> 
> Signed-off-by: Weili Qian 
> ---
>  drivers/crypto/hisilicon/trng/trng.c | 13 ++---
>  1 file changed, 10 insertions(+), 3 deletions(-)

Patch applied.  Thanks.
-- 
Email: Herbert Xu 
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt


[PATCH] crypto: hisilicon/trng - add version to adapt new algorithm

2021-04-07 Thread Weili Qian
Kunpeng930 supports trng and prng, but Kunpeng920 only supports trng.

Therefore, version information is added to ensure that prng is not
registered to Crypto subsystem on Kunpeng920.

Signed-off-by: Weili Qian 
---
 drivers/crypto/hisilicon/trng/trng.c | 13 ++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/drivers/crypto/hisilicon/trng/trng.c 
b/drivers/crypto/hisilicon/trng/trng.c
index 2971268..829f2ca 100644
--- a/drivers/crypto/hisilicon/trng/trng.c
+++ b/drivers/crypto/hisilicon/trng/trng.c
@@ -18,6 +18,8 @@
 #define HISI_TRNG_REG  0x00F0
 #define HISI_TRNG_BYTES4
 #define HISI_TRNG_QUALITY  512
+#define HISI_TRNG_VERSION  0x01B8
+#define HISI_TRNG_VER_V1   GENMASK(31, 0)
 #define SLEEP_US   10
 #define TIMEOUT_US 1
 #define SW_DRBG_NUM_SHIFT  2
@@ -50,6 +52,7 @@ struct hisi_trng {
struct hisi_trng_list *trng_list;
struct list_head list;
struct hwrng rng;
+   u32 ver;
bool is_used;
struct mutex mutex;
 };
@@ -260,6 +263,7 @@ static int hisi_trng_probe(struct platform_device *pdev)
return PTR_ERR(trng->base);
 
trng->is_used = false;
+   trng->ver = readl(trng->base + HISI_TRNG_VERSION);
if (!trng_devices.is_init) {
INIT_LIST_HEAD(_devices.list);
mutex_init(_devices.lock);
@@ -267,7 +271,8 @@ static int hisi_trng_probe(struct platform_device *pdev)
}
 
hisi_trng_add_to_list(trng);
-   if (atomic_inc_return(_active_devs) == 1) {
+   if (trng->ver != HISI_TRNG_VER_V1 &&
+   atomic_inc_return(_active_devs) == 1) {
ret = crypto_register_rng(_trng_alg);
if (ret) {
dev_err(>dev,
@@ -289,7 +294,8 @@ static int hisi_trng_probe(struct platform_device *pdev)
return ret;
 
 err_crypto_unregister:
-   if (atomic_dec_return(_active_devs) == 0)
+   if (trng->ver != HISI_TRNG_VER_V1 &&
+   atomic_dec_return(_active_devs) == 0)
crypto_unregister_rng(_trng_alg);
 
 err_remove_from_list:
@@ -305,7 +311,8 @@ static int hisi_trng_remove(struct platform_device *pdev)
while (hisi_trng_del_from_list(trng))
;
 
-   if (atomic_dec_return(_active_devs) == 0)
+   if (trng->ver != HISI_TRNG_VER_V1 &&
+   atomic_dec_return(_active_devs) == 0)
crypto_unregister_rng(_trng_alg);
 
return 0;
-- 
2.8.1