Patrick Rudolph has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/31567
Change subject: soc/cavium/cn81xx: Enable RNG for DRAM init ......................................................................
soc/cavium/cn81xx: Enable RNG for DRAM init
The Cavium DRAM init might use the RNG for pattern generation. Initialize it before running DRAM init.
Tested on OpenCellular Elgon. The RNG generates non identical numbers.
Change-Id: I886f920e9941793fb76b56cc5a24a42e23b082e0 Signed-off-by: Patrick Rudolph patrick.rudolph@9elements.com --- M src/soc/cavium/cn81xx/sdram.c 1 file changed, 50 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/67/31567/1
diff --git a/src/soc/cavium/cn81xx/sdram.c b/src/soc/cavium/cn81xx/sdram.c index 2342b04..f434265 100644 --- a/src/soc/cavium/cn81xx/sdram.c +++ b/src/soc/cavium/cn81xx/sdram.c @@ -3,6 +3,7 @@ * * Copyright 2018 Facebook, Inc. * Copyright 2003-2017 Cavium Inc. support@cavium.com + * Copyright 2019 9elements Agency GmbH * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,17 +29,66 @@ #include <libbdk-hal/bdk-utils.h> #include <libbdk-hal/bdk-l2c.h> #include <libdram/libdram-config.h> +#include <soc/ecam.h> +#include <device/pci_ops.h> +#include <device/pci.h>
size_t sdram_size_mb(void) { return bdk_dram_get_size_mbytes(0); }
+/* Enable RNG for DRAM init */ +static void rnm_init(void) +{ + u64 *bar = NULL; + + #define BDK_RNM_CTL_STATUS 0 + #define BDK_RNM_RANDOM 0x100000 + + /* Bus numbers are hardcoded in ASIC */ +#ifdef __SIMPLE_DEVICE__ + pci_devfn_t dev = pci_locate_device_on_bus(0xa018177d, 2); + if (dev == PCI_DEV_INVALID) { + printk(BIOS_ERR, "RNG: Failed to find PCI device\n"); + return; + } + + bar = (u64 *)ecam0_get_bar_val(dev, 0); +#endif + if (!bar) { + printk(BIOS_ERR, "RNG: Failed to get BAR0\n"); + return; + } + + printk(BIOS_DEBUG, "RNG: BAR0 at %p\n", bar); + + u64 reg = read64(&bar[BDK_RNM_CTL_STATUS]); + /** + * Enables the output of the RNG. + * Entropy enable for random number generator. + */ + reg |= 3; + write64(&bar[BDK_RNM_CTL_STATUS], reg); + + /* Read back after enable so we know it is done. */ + reg = read64(&bar[BDK_RNM_CTL_STATUS]); + /* Errata (RNM-22528) First consecutive reads to RNM_RANDOM return same + * value. Before using the random entropy, read RNM_RANDOM at least once + * and discard the data */ + reg = read64(&bar[BDK_RNM_RANDOM]); + printk(BIOS_DEBUG, "RNG: RANDOM %llx\n", reg); + reg = read64(&bar[BDK_RNM_RANDOM]); + printk(BIOS_DEBUG, "RNG: RANDOM %llx\n", reg); +} + /* based on bdk_boot_dram() */ void sdram_init(void) { printk(BIOS_DEBUG, "Initializing DRAM\n");
+ rnm_init(); + /** * FIXME: second arg is actually a desired frequency if set (the * function usually obtains frequency via the config). That might