From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id F318EC38145 for ; Thu, 8 Sep 2022 19:29:52 +0000 (UTC) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 3F2DF84AF4; Thu, 8 Sep 2022 21:29:50 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=fail (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.b="MNM2XElO"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 2B01D84A5B; Thu, 8 Sep 2022 21:29:49 +0200 (CEST) Received: from mout.gmx.net (mout.gmx.net [212.227.17.22]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id EC1B884AF4 for ; Thu, 8 Sep 2022 21:29:45 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=xypron.glpk@gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1662665383; bh=5iLcVVizOeabO4g9sjUBRHp9Nz5BgRmc0BWfFABkS5k=; h=X-UI-Sender-Class:Date:Subject:To:Cc:References:From:In-Reply-To; b=MNM2XElOAPFcnwtQVUsWd6ryhrnKk2UOtfvzkEcSnHjIVEUS2bD4Isrht076EpzXK g6ATiZ2VoYtSlaJVCX5Lerr5k3MriNbuly7q3RDqKUvmZ7DeQIloY1NiFOTRAMqBcM kGWGsiOYP1IKV10PC5GEsGtnukJLuVeM9j+uzGGY= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from [192.168.123.94] ([84.118.157.2]) by mail.gmx.net (mrgmx105 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MOREc-1ohslM2wZC-00Py25; Thu, 08 Sep 2022 21:29:42 +0200 Message-ID: Date: Thu, 8 Sep 2022 21:29:37 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.2.1 Subject: Re: [PATCH v1] 2: Uboot RNG Driver using Data Co-processor To: Kshitiz Varshney Cc: U-Boot Mailing List , Horia Geanta , Pankaj Gupta , Varun Sethi , Gaurav Jain , Rahul Kumar Yadav , Vabhav Sharma , Sahil Malhotra , Ye Li , Stefano Babic , Fabio Estevam , Peng Fan , Sughosh Ganu , Simon Glass References: <20220908085735.437808-1-kshitiz.varshney@nxp.com> <20220908085735.437808-2-kshitiz.varshney@nxp.com> Content-Language: en-US From: Heinrich Schuchardt In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:funbClIZ4VecU0rJP2HZ66yvYJADWhYLzEM2tLNzRISB9/LUjTi M1fyBn/HCMPbAcn+n1XFFoHbRvJ7k3/Aj4V0mu3snHB/riJO+hmPN8SMamz64dFgrg3tgNG XkGVxzTi907cVl0XIO8kvV4L60UMrFnEuATypVwgZGjiIHxzShfOVJnzCckVlFigxEN4SrQ hzn20kLlZPVqldC2R+c+Q== X-UI-Out-Filterresults: notjunk:1;V03:K0:KRfvCPF1gII=:rQNVv7waRnO01iMwtoAkXt aGNOWC+SzUT3C572vFflvh/olbUjYXSN9OrceX1quZeqbhhbAD3Z1hNe+rJ2NwNmR2FTNQ1Zx hMXXVNBHFMTOi/17Fzp+kKePzgurkJiYoMndlb3wZtS22oX3OWaRFzkcZZYj4zxhSObuH5NVQ imBiZ+GY1odf849Pkco7/v0sjzy3eUoi3abBtED/Qzhd2MA+/UDNGIzfZzgWUiq9tI/9Si/hN uzLMhPRKHwwXlsHTpQfQ2kCXD0GKqRqmaK/5Vp9vIbxkkzfcsS+0a/JEdFUbDJmDIJF8n7sJ3 8v7uOk9uSBXEg+iDU3AU31fbTtaiRXdjorrz0ySOZNUwbByEhZyYLJX8RbESJiA7XknQ3gJB/ lcUJSvrlJc8RtMyDfTt4PxBsF7GWbB761KprtRP71ycCsnZEFhD4fLMKj/QoSjZtCBN/Dcimf UAy38kkaBN83PNMv8hc6QulSGcWmprtF1WoR6bQceKPwypaWor1peBWmqqQzwuHOlI9sCckMS +HTPzh0fxy8+RexGNHP08hSS8suXCG3cZ7Srp2wnHF2KjRortHBqtMZVMDlbFMWk7aZTu83u1 Tbhb+RVWGV0qqa4yisBNNH2M+ysgle3TLIc4UagHj5zTKWzdKpq0TG99i8dQT4861Y3BM46Rr BhG3k+CszVL1JXmOBnwXzhna7RJlGSuoDnHZL+G6M7dWzmxO0i5RleDeo2U/CZ5KJGF5i/Ht4 wMcib4NRKj8FVfkbfyZKGRbENaZLVp+SpoQJVRp7w7i44hTnsxhY+3gZ7k9FI7AKc9ioWKkZa nNXWwH12aCvuJIiCUKNfZJNFoo7xASkDJWIFBkRrcdO9suJaW8fz/NQTlFsZ1fjGxTNKwlKWp Fob4DfdqiQ2heEaVTx5XXzNPSjxEmkPhoJEapolVqjVUEiPopNNJyM+YGGBZBmP8dflrskYkt m/Kkrnpq4iFti6fPLV14sWlVsiRrSTUuNrpwyRdkI6qvEZXwh6PFUxOZxoxo35lMK1tAIWVRD 5U3yIbaeX5WE3yyfo39h9oaptRyjPg87y71v5ZoCpHuj93zblxGzSXtCbNjR8tLV7voZCd1qQ hU6Tm4T6GuT4UhphQg9uwbwiXwd9YImvaVzvRAIl5Mex4f/2n8u8OFGeTIj64bqzHYrcdSQEB +JJY/0WQ9meRVZBYaPP3KOchv1 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.6 at phobos.denx.de X-Virus-Status: Clean On 9/8/22 20:19, Simon Glass wrote: > Hi Kshitiz, > > On Thu, 8 Sept 2022 at 02:59, Kshitiz Varshney wrote: >> >> From: Kshitiz >> >> This commit introduces Random number generator to uboot. It uses DCP >> driver for number generation. >> RNG driver can be invoked by using below command on uboot prompt:- >> rng >> >> Signed-off-by: Kshitiz Varshney CC the maintainer for RNG Sughosh Ganu . >> Reviewed-by: Ye Li >> --- >> drivers/crypto/fsl/Kconfig | 10 ++ >> drivers/crypto/fsl/Makefile | 1 + >> drivers/crypto/fsl/dcp_rng.c | 184 ++++++++++++++++++++++++++++++++++= + >> 3 files changed, 195 insertions(+) >> create mode 100644 drivers/crypto/fsl/dcp_rng.c > > Reviewed-by: Simon Glass > > but please see below > >> >> diff --git a/drivers/crypto/fsl/Kconfig b/drivers/crypto/fsl/Kconfig >> index 702d204a3d..da5955e31d 100644 >> --- a/drivers/crypto/fsl/Kconfig >> +++ b/drivers/crypto/fsl/Kconfig >> @@ -96,3 +96,13 @@ config RNG_SELF_TEST >> must be run before running any RNG based crypto implementatio= n. >> >> endif >> + >> +config FSL_DCP_RNG >> + bool "Enable Random Number Generator support" >> + depends on DM_RNG >> + default n >> + help >> + Enable support for the hardware based random number generator >> + module of the DCP.It uses the True Random Number Generator (TRN= G) Please, use the same indentation as the other Kconfig entries in this file: Add two space in each line of the help text. > > Space before It > >> + and a Pseudo-Random Number Generator (PRNG) to achieve a true >> + randomness and cryptographic strength. >> diff --git a/drivers/crypto/fsl/Makefile b/drivers/crypto/fsl/Makefile >> index 926300e2ab..c653208d23 100644 >> --- a/drivers/crypto/fsl/Makefile >> +++ b/drivers/crypto/fsl/Makefile >> @@ -7,6 +7,7 @@ obj-$(CONFIG_FSL_CAAM) +=3D jr.o fsl_hash.o jobdesc.o e= rror.o >> obj-$(CONFIG_FSL_BLOB) +=3D fsl_blob.o >> obj-$(CONFIG_RSA_FREESCALE_EXP) +=3D fsl_rsa.o >> obj-$(CONFIG_FSL_CAAM_RNG) +=3D rng.o >> +obj-$(CONFIG_FSL_DCP_RNG) +=3D dcp_rng.o >> obj-$(CONFIG_IMX_CAAM_MFG_PROT) +=3D fsl_mfgprot.o >> obj-$(CONFIG_RNG_SELF_TEST) +=3D rng_self_test.o >> obj-$(CONFIG_CMD_PROVISION_KEY) +=3D fsl_aes.o tag_object.o >> diff --git a/drivers/crypto/fsl/dcp_rng.c b/drivers/crypto/fsl/dcp_rng.= c >> new file mode 100644 >> index 0000000000..a797710c2e >> --- /dev/null >> +++ b/drivers/crypto/fsl/dcp_rng.c >> @@ -0,0 +1,184 @@ >> +// SPDX-License-Identifier: GPL-2.0-or-later >> +/* >> + * RNG driver for Freescale RNGC >> + * >> + * Copyright (C) 2008-2012 Freescale Semiconductor, Inc. >> + * Copyright (C) 2017 Martin Kaiser >> + * Copyright 2022 NXP >> + * >> + * Based on RNGC driver in drivers/char/hw_random/imx-rngc.c in Linux >> + */ >> + >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include > > Should be: > >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include > > >> + >> +#define DCP_RNG_MAX_FIFO_STORE_SIZE 4 >> +#define RNGC_VER_ID 0x0000 >> +#define RNGC_COMMAND 0x0004 >> +#define RNGC_CONTROL 0x0008 >> +#define RNGC_STATUS 0x000C >> +#define RNGC_ERROR 0x0010 >> +#define RNGC_FIFO 0x0014 >> + >> +/* the fields in the ver id register */ >> +#define RNGC_TYPE_SHIFT 28 >> + >> +/* the rng_type field */ >> +#define RNGC_TYPE_RNGB 0x1 >> +#define RNGC_TYPE_RNGC 0x2 >> + >> +#define RNGC_CMD_CLR_ERR 0x00000020 >> +#define RNGC_CMD_SEED 0x00000002 >> + >> +#define RNGC_CTRL_AUTO_SEED 0x00000010 >> + >> +#define RNGC_STATUS_ERROR 0x00010000 >> +#define RNGC_STATUS_FIFO_LEVEL_MASK 0x00000f00 >> +#define RNGC_STATUS_FIFO_LEVEL_SHIFT 8 >> +#define RNGC_STATUS_SEED_DONE 0x00000020 >> +#define RNGC_STATUS_ST_DONE 0x00000010 > > Why all the leading zeroes? > >> + >> +#define RNGC_ERROR_STATUS_STAT_ERR 0x00000008 >> + >> +#define RNGC_TIMEOUT 3000000U /* 3 sec */ >> + >> +struct imx_rngc { > > Normally the priv data should have a _priv suffix. > >> + unsigned long base; >> +}; >> + >> +static int rngc_read(struct udevice *dev, void *data, size_t len) >> +{ >> + struct imx_rngc *rngc =3D dev_get_priv(dev); > > Normally the var should be called priv This is described in doc/develop/codingstyle.rst line 192ff. > >> + u8 buffer[DCP_RNG_MAX_FIFO_STORE_SIZE]; >> + u32 status, level; >> + size_t size; >> + >> + while (len) { >> + status =3D readl(rngc->base + RNGC_STATUS); >> + >> + /* is there some error while reading this random number= ? */ >> + if (status & RNGC_STATUS_ERROR) >> + break; >> + /* how many random numbers are in FIFO? [0-16] */ >> + level =3D (status & RNGC_STATUS_FIFO_LEVEL_MASK) >> >> + RNGC_STATUS_FIFO_LEVEL_SHIFT; >> + >> + if (level) { >> + /* retrieve a random number from FIFO */ >> + *(u32 *)buffer =3D readl(rngc->base + RNGC_FIFO= ); >> + size =3D min(len, sizeof(u32)); >> + memcpy(data, buffer, size); >> + data +=3D size; >> + len -=3D size; >> + } >> + } >> + >> + return len ? -EIO : 0; >> +} >> + >> +static int rngc_init(struct imx_rngc *rngc) >> +{ >> + u32 cmd, ctrl, status, err_reg =3D 0; >> + unsigned long long timeval =3D 0; >> + unsigned long long timeout =3D RNGC_TIMEOUT; >> + >> + /* clear error */ >> + cmd =3D readl(rngc->base + RNGC_COMMAND); >> + writel(cmd | RNGC_CMD_CLR_ERR, rngc->base + RNGC_COMMAND); >> + >> + /* create seed, repeat while there is some statistical error */ >> + do { >> + /* seed creation */ >> + cmd =3D readl(rngc->base + RNGC_COMMAND); >> + writel(cmd | RNGC_CMD_SEED, rngc->base + RNGC_COMMAND); >> + >> + udelay(1); >> + timeval +=3D 1; As this loop can take rather long, should we call WATCHDOG_RESET() before and after the loop? Otherwise looks good to me. Acked-by: Heinrich Schuchardt >> + >> + status =3D readl(rngc->base + RNGC_STATUS); >> + err_reg =3D readl(rngc->base + RNGC_ERROR); >> + >> + if (status & (RNGC_STATUS_SEED_DONE | RNGC_STATUS_ST_DO= NE)) >> + break; >> + >> + if (timeval > timeout) { >> + debug("rngc timed out\n"); >> + return -ETIMEDOUT; >> + } >> + } while (err_reg =3D=3D RNGC_ERROR_STATUS_STAT_ERR); >> + >> + if (err_reg) >> + return -EIO; >> + >> + /* >> + * enable automatic seeding, the rngc creates a new seed automa= tically >> + * after serving 2^20 random 160-bit words >> + */ >> + ctrl =3D readl(rngc->base + RNGC_CONTROL); >> + ctrl |=3D RNGC_CTRL_AUTO_SEED; >> + writel(ctrl, rngc->base + RNGC_CONTROL); > > setbits_le32(rngc->base + RNGC_CONTROL, RNGC_CTRL_AUTO_SEED); > >> + return 0; >> +} >> + >> +static int rngc_probe(struct udevice *dev) >> +{ >> + struct imx_rngc *rngc =3D dev_get_priv(dev); >> + fdt_addr_t addr; >> + u32 ver_id; >> + u8 rng_type; >> + int ret; >> + >> + addr =3D dev_read_addr(dev); >> + if (addr =3D=3D FDT_ADDR_T_NONE) { >> + ret =3D -EINVAL; >> + goto err; >> + } >> + >> + rngc->base =3D addr; >> + ver_id =3D readl(rngc->base + RNGC_VER_ID); >> + rng_type =3D ver_id >> RNGC_TYPE_SHIFT; >> + /* >> + * This driver supports only RNGC and RNGB. (There's a differen= t >> + * driver for RNGA.) >> + */ >> + if (rng_type !=3D RNGC_TYPE_RNGC && rng_type !=3D RNGC_TYPE_RNG= B) { >> + ret =3D -ENODEV; >> + goto err; >> + } >> + >> + ret =3D rngc_init(rngc); >> + if (ret) >> + goto err; >> + >> + return 0; >> + >> +err: >> + printf("%s error =3D %d\n", __func__, ret); >> + return ret; >> +} >> + >> +static const struct dm_rng_ops rngc_ops =3D { >> + .read =3D rngc_read, >> +}; >> + >> +static const struct udevice_id rngc_dt_ids[] =3D { >> + { .compatible =3D "fsl,imx25-rngb" }, >> + { } >> +}; >> + >> +U_BOOT_DRIVER(dcp_rng) =3D { >> + .name =3D "dcp_rng", >> + .id =3D UCLASS_RNG, >> + .of_match =3D rngc_dt_ids, >> + .ops =3D &rngc_ops, >> + .probe =3D rngc_probe, >> + .priv_auto =3D sizeof(struct imx_rngc), >> + .flags =3D DM_FLAG_ALLOC_PRIV_DMA, >> +}; >> -- >> 2.25.1 >> > > Regards, > Simon