tpm: rng: Add driver model interface for TPM RNG device

The TPM device has a builtin random number generator(RNG)
functionality. Expose the RNG functions of the TPM device to the
driver model so that they can be used by the EFI_RNG_PROTOCOL if the
protocol is installed.

Also change the function arguments and return type of the random
number functions to comply with the driver model api.

Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org>
Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
Signed-off-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
This commit is contained in:
Sughosh Ganu 2022-07-22 21:32:04 +05:30 committed by Ilias Apalodimas
parent 5d98329196
commit e67ffb5aa5
5 changed files with 37 additions and 3 deletions

View file

@ -74,4 +74,13 @@ config RNG_SMCCC_TRNG
Enable random number generator for platforms that support Arm Enable random number generator for platforms that support Arm
SMCCC TRNG interface. SMCCC TRNG interface.
config TPM_RNG
bool "Enable random number generator on TPM device"
depends on TPM
default y
help
The TPM device has an inbuilt random number generator
functionality. Enable random number generator on TPM
devices.
endif endif

View file

@ -13,3 +13,4 @@ obj-$(CONFIG_RNG_STM32MP1) += stm32mp1_rng.o
obj-$(CONFIG_RNG_ROCKCHIP) += rockchip_rng.o obj-$(CONFIG_RNG_ROCKCHIP) += rockchip_rng.o
obj-$(CONFIG_RNG_IPROC200) += iproc_rng200.o obj-$(CONFIG_RNG_IPROC200) += iproc_rng200.o
obj-$(CONFIG_RNG_SMCCC_TRNG) += smccc_trng.o obj-$(CONFIG_RNG_SMCCC_TRNG) += smccc_trng.o
obj-$(CONFIG_TPM_RNG) += tpm_rng.o

23
drivers/rng/tpm_rng.c Normal file
View file

@ -0,0 +1,23 @@
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (c) 2022, Linaro Limited
*/
#include <dm.h>
#include <rng.h>
#include <tpm_api.h>
static int rng_tpm_random_read(struct udevice *dev, void *data, size_t count)
{
return tpm_get_random(dev_get_parent(dev), data, count);
}
static const struct dm_rng_ops tpm_rng_ops = {
.read = rng_tpm_random_read,
};
U_BOOT_DRIVER(tpm_rng) = {
.name = "tpm-rng",
.id = UCLASS_RNG,
.ops = &tpm_rng_ops,
};

View file

@ -360,6 +360,7 @@ source lib/crypt/Kconfig
config TPM config TPM
bool "Trusted Platform Module (TPM) Support" bool "Trusted Platform Module (TPM) Support"
depends on DM depends on DM
imply DM_RNG
help help
This enables support for TPMs which can be used to provide security This enables support for TPMs which can be used to provide security
features for your board. The TPM can be connected via LPC or I2C features for your board. The TPM can be connected via LPC or I2C

View file

@ -269,7 +269,7 @@ u32 tpm_get_random(struct udevice *dev, void *data, u32 count)
if (tpm_is_v1(dev)) if (tpm_is_v1(dev))
return tpm1_get_random(dev, data, count); return tpm1_get_random(dev, data, count);
else if (tpm_is_v2(dev)) else if (tpm_is_v2(dev))
return -ENOSYS; /* not implemented yet */ return tpm2_get_random(dev, data, count);
else
return -ENOSYS; return -ENOSYS;
} }