On 12 May 2017 at 13:17, Mike Frysinger <vapier@xxxxxxxxxxxx> wrote: >> Completely untested patch below. Will something like this work? >> >> --- a/drivers/char/hw_random/tpm-rng.c >> +++ b/drivers/char/hw_random/tpm-rng.c >> @@ -35,7 +35,13 @@ static int tpm_rng_read(struct hwrng *rng, void >> *data, size_t max, bool wait) >> >> static int __init rng_init(void) >> { >> - return hwrng_register(&tpm_rng); >> + struct tpm_chip *tpm_rng_chip = tpm_chip_find_get(TPM_ANY_NUM); >> + if (tpm_chip) { >> + tpm_put_ops(tpm_rng_chip); >> + return hwrng_register(&tpm_rng); >> + } >> + >> + return -ENODEV; >> } >> module_init(rng_init); > > keep in mind that TPMs are often on slow buses like I2C, so i suspect > rng_init runs before those have been initialized. so this patch would > break them. > > it would also break if the tpm drivers are modules that don't get > loaded until later, but tpm-rng is built in. or tpm-rng is loaded > first. Hmm. I am not aware of the tpm hardware or driver behavior. Based on your explanation I see that this patch is not useful. It looks like it is possible to detect the presence of tpm device and call hwrng_register once the corresponding driver is loaded. I leave it to Herbert to decide whether to accept this patch in current form or not. Regardless of whether this patch gets accepted or not I can work on a better fix if you can provide instructions on how to setup and use tpm. But that will be only after a couple of months. Regards, PrasannaKumar