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 5EF18C48260 for ; Tue, 13 Feb 2024 09:17:07 +0000 (UTC) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id A506D875FA; Tue, 13 Feb 2024 10:17:05 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=fail (p=none dis=none) header.from=denx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=denx.de; s=phobos-20191101; t=1707815825; bh=D4L1/p1W6DGiI9aTYkb7WQMFfSuX7D6JOm5UxUrKmI4=; h=Date:Subject:To:References:From:In-Reply-To:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=LQAdVYofTIOQ0zwKKmb19d1g9jSILVHYQeA6IIdwh9X07Z5hQWKUllVjUB6jvjmoV ERG1pBk/irEzWrxtHG6yo4H4Qt9KG4HazZIck+RHBL23Zi95SnNZxSJwuL/FpCX7TV 8mVcOBDWs6CZdZzG1LqM5IqjjgmwqNfXhjUVt7hZAzPSzdMeILnaORoV8RoXW88ZuJ uasPAnNWsWSVt3Z8PqDA3Amj5oUIv44i6NKV25G6pyKQ+1XLGULoAOfpSxVcwJFKIc tLBfpQ0C4L0c6HnTrLcgCPpFAhxIeN2kYhqD8DMM14SCVKKDWT3rnVXlvFNcnPWjhh dZO0fAAkWXTXw== Received: by phobos.denx.de (Postfix, from userid 109) id EF34787D35; Tue, 13 Feb 2024 10:17:03 +0100 (CET) Received: from mout-u-204.mailbox.org (mout-u-204.mailbox.org [IPv6:2001:67c:2050:101:465::204]) (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 081C3875E9 for ; Tue, 13 Feb 2024 10:17:02 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=fail (p=none dis=none) header.from=denx.de Authentication-Results: phobos.denx.de; spf=fail smtp.mailfrom=sr@denx.de Received: from smtp102.mailbox.org (smtp102.mailbox.org [IPv6:2001:67c:2050:b231:465::102]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-u-204.mailbox.org (Postfix) with ESMTPS id 4TYwgv4fFVz9sS5; Tue, 13 Feb 2024 10:16:59 +0100 (CET) Message-ID: <3b7ffd4d-251a-4b2a-bed3-e324e6c4086f@denx.de> Date: Tue, 13 Feb 2024 10:16:58 +0100 MIME-Version: 1.0 Subject: Re: [PATCH v4] rng: Add Turris Mox rTWM RNG driver Content-Language: en-US To: Max Resch , u-boot@lists.denx.de References: <20240211130436.698777-1-resch.max@gmail.com> From: Stefan Roese In-Reply-To: <20240211130436.698777-1-resch.max@gmail.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Rspamd-Queue-Id: 4TYwgv4fFVz9sS5 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.8 at phobos.denx.de X-Virus-Status: Clean Hi Max, mostly some nitpicking comments below. On 2/11/24 14:04, Max Resch wrote: > A RNG driver for Armada 3720 boards running the Turris Mox rWTM firmware > from CZ.NIC in the secure processor. > > Signed-off-by: Max Resch > --- > > Changes in v4: > - wrongful/missing git rebase > > Changes in v3: > - More meaningful variable names in accordance with review > > Changes in v2: > - Removed ring buffer implementation > > drivers/rng/Kconfig | 8 +++ > drivers/rng/Makefile | 1 + > drivers/rng/turris_rwtm_rng.c | 122 ++++++++++++++++++++++++++++++++++ > 3 files changed, 131 insertions(+) > create mode 100644 drivers/rng/turris_rwtm_rng.c > > diff --git a/drivers/rng/Kconfig b/drivers/rng/Kconfig > index a89c899568..cd72852a47 100644 > --- a/drivers/rng/Kconfig > +++ b/drivers/rng/Kconfig > @@ -105,4 +105,12 @@ config RNG_JH7110 > help > Enable True Random Number Generator in StarFive JH7110 SoCs. > > +config RNG_TURRIS_RWTM > + bool "Turris Mox TRNG in Secure Processor" > + depends on DM_RNG && ARMADA_3700 > + help > + Use TRNG in Turris Mox Secure Processor Firmware. Can be used > + on other Armada-3700 devices (like EspressoBin) if Secure > + Firmware from CZ.NIC is used. > + > endif > diff --git a/drivers/rng/Makefile b/drivers/rng/Makefile > index 7e64c4cdfc..ecae1a3da3 100644 > --- a/drivers/rng/Makefile > +++ b/drivers/rng/Makefile > @@ -17,3 +17,4 @@ obj-$(CONFIG_RNG_SMCCC_TRNG) += smccc_trng.o > obj-$(CONFIG_RNG_ARM_RNDR) += arm_rndr.o > obj-$(CONFIG_TPM_RNG) += tpm_rng.o > obj-$(CONFIG_RNG_JH7110) += jh7110_rng.o > +obj-$(CONFIG_RNG_TURRIS_RWTM) += turris_rwtm_rng.o > diff --git a/drivers/rng/turris_rwtm_rng.c b/drivers/rng/turris_rwtm_rng.c > new file mode 100644 > index 0000000000..ec2cb0bca3 > --- /dev/null > +++ b/drivers/rng/turris_rwtm_rng.c > @@ -0,0 +1,122 @@ > +// SPDX-License-Identifier: GPL-2.0-or-later OR BSD-3-Clause > +/* > + * Copyright (c) 2024, Max Resch > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > + > +/* size of entropy buffer */ > +#define RNG_BUFFER_SIZE 128U > + > +struct turris_rwtm_rng_priv { > + phys_addr_t buffer; > +}; > + > +static int turris_rwtm_rng_fill_entropy(phys_addr_t entropy, size_t size) > +{ > + u32 args[3] = { 1, (u32)entropy, size }; > + int ret; > + > + /* flush data cache */ > + flush_dcache_range(entropy, entropy + size); > + > + /* > + * get entropy > + * args[0] = 1 copies BYTES array in args[1] of length args[2] > + */ > + ret = mbox_do_cmd(MBOX_CMD_GET_RANDOM, args, 3, NULL, 0); > + if (ret < 0) > + return ret; > + > + /* invalidate data cache */ > + invalidate_dcache_range(entropy, entropy + size); > + > + return 0; > +} > + > +static int turris_rwtm_rng_random_read(struct udevice *dev, void *data, size_t count) > +{ > + struct turris_rwtm_rng_priv *priv = dev_get_priv(dev); > + phys_addr_t phys; > + size_t size; > + int ret; > + > + phys = priv->buffer; > + > + while (count) { > + size = min_t(size_t, RNG_BUFFER_SIZE, count); > + > + ret = turris_rwtm_rng_fill_entropy(phys, size); Return code check missing here. > + > + memcpy(data, (void *)phys, size); > + count -= size; > + data = (u8 *)data + size; > + } > + > + return 0; > +} > + > +static int turris_rwtm_rng_probe(struct udevice *dev) > +{ > + struct turris_rwtm_rng_priv *priv = dev_get_priv(dev); > + u32 args[] = { 0 }; > + int ret; > + > + /* > + * check if the random command is supported > + * args[0] = 0 would copy 16 DWORDS entropy to out but we ignore them > + */ > + ret = mbox_do_cmd(MBOX_CMD_GET_RANDOM, args, ARRAY_SIZE(args), NULL, 0); > + Please drop this empty line before the ret check. > + if (ret < 0) > + return ret; > + > + /* entropy buffer */ > + priv->buffer = 0; > + > + /* buffer address need to be aligned */ > + dma_alloc_coherent(RNG_BUFFER_SIZE, (unsigned long *)&priv->buffer); > + if (!priv->buffer) > + return -ENOMEM; > + > + return 0; > +} > + > +static int turris_rwtm_rng_remove(struct udevice *dev) > +{ > + struct turris_rwtm_rng_priv *priv = dev_get_priv(dev); > + phys_addr_t phys = priv->buffer; > + > + dma_free_coherent((void *)phys); > + > + return 0; > +} > + > +static const struct dm_rng_ops turris_rwtm_rng_ops = { > + .read = turris_rwtm_rng_random_read, > +}; > + > +/* > + * only Turris MOX firmware has the RNG but allow all probable devices to be > + * probed the default firmware will just reject the probe > + */ > +static const struct udevice_id turris_rwtm_rng_match[] = { > + { .compatible = "cznic,turris-mox-rwtm" }, > + { .compatible = "marvell,armada-3700-rwtm-firmware" }, > + {}, > +}; > + > +U_BOOT_DRIVER(turris_rwtm_rng) = { > + .name = "turris-rwtm-rng", > + .id = UCLASS_RNG, > + .of_match = turris_rwtm_rng_match, > + .ops = &turris_rwtm_rng_ops, > + .probe = turris_rwtm_rng_probe, > + .remove = turris_rwtm_rng_remove, > + .priv_auto = sizeof(struct turris_rwtm_rng_priv), > +}; Thanks, Stefan