summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorTom Rini <trini@konsulko.com>2023-09-05 09:04:49 -0400
committerTom Rini <trini@konsulko.com>2023-09-05 09:04:49 -0400
commite7b7dca28f57e9331388550597c0687d3bfaded0 (patch)
treedba6f74cca2f0eb5726d838795b08fe87c7276bd /drivers
parent493fd3363f6da6a784514657d689c7cda0f390d5 (diff)
parentdfe08374943c0e898fcfaf7327f69e0fb56b7d23 (diff)
downloadu-boot-e7b7dca28f57e9331388550597c0687d3bfaded0.tar.gz
u-boot-e7b7dca28f57e9331388550597c0687d3bfaded0.tar.bz2
u-boot-e7b7dca28f57e9331388550597c0687d3bfaded0.zip
Merge https://source.denx.de/u-boot/custodians/u-boot-riscv
+ Implement OpenSBI DBCN extension for early debug console + Fixes for VisionFive2 board + Fix timer missing + Fix L2 LIM issue + Enable PCIE auto enumeration to support USB and NVMe by default + Set eth0 mac address properly + Add __noreturn attribute to spl_invoke_opensbi
Diffstat (limited to 'drivers')
-rw-r--r--drivers/serial/Kconfig5
-rw-r--r--drivers/serial/serial_sbi.c20
-rw-r--r--drivers/timer/riscv_timer.c28
3 files changed, 50 insertions, 3 deletions
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
index a1e089962a..8c54bc9c47 100644
--- a/drivers/serial/Kconfig
+++ b/drivers/serial/Kconfig
@@ -218,6 +218,7 @@ config DEBUG_UART
choice
prompt "Select which UART will provide the debug UART"
depends on DEBUG_UART
+ default DEBUG_SBI_CONSOLE if RISCV_SMODE
default DEBUG_UART_NS16550
config DEBUG_UART_ALTERA_JTAGUART
@@ -289,11 +290,13 @@ config DEBUG_EFI_CONSOLE
config DEBUG_SBI_CONSOLE
bool "SBI"
- depends on SBI_V01
+ depends on RISCV_SMODE
help
Select this to enable a debug console which calls back to SBI to
output to the console. This can be useful for early debugging of
U-Boot when running on top of SBI (Supervisor Binary Interface).
+ This implementation of the debug UART is not available while in
+ M-mode (e.g. during SPL).
config DEBUG_UART_S5P
bool "Samsung S5P"
diff --git a/drivers/serial/serial_sbi.c b/drivers/serial/serial_sbi.c
index b9f35ed36e..a51a96c1ef 100644
--- a/drivers/serial/serial_sbi.c
+++ b/drivers/serial/serial_sbi.c
@@ -3,6 +3,8 @@
#include <debug_uart.h>
#include <asm/sbi.h>
+#ifdef CONFIG_SBI_V01
+
static inline void _debug_uart_init(void)
{
}
@@ -13,4 +15,22 @@ static inline void _debug_uart_putc(int c)
sbi_console_putchar(c);
}
+#else
+
+static int sbi_dbcn_available;
+
+static inline void _debug_uart_init(void)
+{
+ if (CONFIG_IS_ENABLED(RISCV_SMODE))
+ sbi_dbcn_available = sbi_probe_extension(SBI_EXT_DBCN);
+}
+
+static inline void _debug_uart_putc(int ch)
+{
+ if (CONFIG_IS_ENABLED(RISCV_SMODE) && sbi_dbcn_available)
+ sbi_dbcn_write_byte(ch);
+}
+
+#endif
+
DEBUG_UART_FUNCS
diff --git a/drivers/timer/riscv_timer.c b/drivers/timer/riscv_timer.c
index 3627ed79b8..28a6a6870b 100644
--- a/drivers/timer/riscv_timer.c
+++ b/drivers/timer/riscv_timer.c
@@ -13,6 +13,7 @@
#include <common.h>
#include <dm.h>
#include <errno.h>
+#include <fdt_support.h>
#include <timer.h>
#include <asm/csr.h>
@@ -53,9 +54,26 @@ u64 notrace timer_early_get_count(void)
static int riscv_timer_probe(struct udevice *dev)
{
struct timer_dev_priv *uc_priv = dev_get_uclass_priv(dev);
+ u32 rate;
- /* clock frequency was passed from the cpu driver as driver data */
- uc_priv->clock_rate = dev->driver_data;
+ /* When this function was called from the CPU driver, clock
+ * frequency is passed as driver data.
+ */
+ rate = dev->driver_data;
+
+ /* When called from an FDT match, the rate needs to be looked up. */
+ if (!rate && gd->fdt_blob) {
+ rate = fdt_getprop_u32_default(gd->fdt_blob,
+ "/cpus", "timebase-frequency", 0);
+ }
+
+ uc_priv->clock_rate = rate;
+
+ /* With rate==0, timer uclass post_probe might later fail with -EINVAL.
+ * Give a hint at the cause for debugging.
+ */
+ if (!rate)
+ log_err("riscv_timer_probe with invalid clock rate 0!\n");
return 0;
}
@@ -64,9 +82,15 @@ static const struct timer_ops riscv_timer_ops = {
.get_count = riscv_timer_get_count,
};
+static const struct udevice_id riscv_timer_ids[] = {
+ { .compatible = "riscv,timer", },
+ { }
+};
+
U_BOOT_DRIVER(riscv_timer) = {
.name = "riscv_timer",
.id = UCLASS_TIMER,
+ .of_match = of_match_ptr(riscv_timer_ids),
.probe = riscv_timer_probe,
.ops = &riscv_timer_ops,
.flags = DM_FLAG_PRE_RELOC,