[PATCH 1/1] riscv: riscv_get_time() implementation for SMODE
Heinrich Schuchardt
xypron.glpk at gmx.de
Fri Aug 14 19:59:38 CEST 2020
On 14.08.20 19:52, Anup Patel wrote:
> On Fri, Aug 14, 2020 at 11:15 PM Heinrich Schuchardt <xypron.glpk at gmx.de> wrote:
>>
>> On the Kendryte K210 OpenBSI cannot emulate the rdtime instruction. So we
>> have to use the Sifive CLINT driver to provide riscv_get_time() in SMODE.
>
> Can you elaborate why ?
>
> The rdtime instruction should generate an illegal instruction fault which
> OpenSBI will emulate.
The RISC-V Instruction Set Manual Volume II Privileged architectur 1.11
has incompatible changes relative to version 1.9.1
mtval on the Kendryte K210 delivers the bad virtual address and not the
instruction:
lib/sbi/sbi_illegal_insn.c(123) sbi_illegal_insn_handler:
insn 0x4114121602, epc 0x8058c168.
The illegal instruction being
c01027f3 rdtime a5
In the long run it may make sense to provide backwards compatibility in
OpenSBI.
Without this patch I observe a crash in the loady command. So I cannot
load a file over the UART.
Best regards
Heinrich
>
> Regards,
> Anup
>
>>
>> Adjust Kconfig and Makefile to allow compiling the Sifive CLINT driver in
>> SMODE.
>>
>> Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
>> ---
>> arch/riscv/Kconfig | 16 +++++++++++-----
>> arch/riscv/cpu/fu540/Kconfig | 3 ++-
>> arch/riscv/cpu/generic/Kconfig | 3 ++-
>> arch/riscv/include/asm/global_data.h | 2 +-
>> arch/riscv/lib/Makefile | 2 +-
>> 5 files changed, 17 insertions(+), 9 deletions(-)
>>
>> diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
>> index 009a545fcf..96c386225b 100644
>> --- a/arch/riscv/Kconfig
>> +++ b/arch/riscv/Kconfig
>> @@ -153,12 +153,18 @@ config 64BIT
>> bool
>>
>> config SIFIVE_CLINT
>> - bool
>> - depends on RISCV_MMODE || SPL_RISCV_MMODE
>> + bool "SiFive's Core Local Interruptor (CLINT) driver"
>> select REGMAP
>> select SYSCON
>> - select SPL_REGMAP if SPL
>> - select SPL_SYSCON if SPL
>> + help
>> + The SiFive CLINT block holds memory-mapped control and status registers
>> + associated with software and timer interrupts.
>> +
>> +config SPL_SIFIVE_CLINT
>> + bool "SiFive's Core Local Interruptor (CLINT) driver in SPL"
>> + depends on SPL
>> + select SPL_REGMAP
>> + select SPL_SYSCON
>> help
>> The SiFive CLINT block holds memory-mapped control and status registers
>> associated with software and timer interrupts.
>> @@ -186,7 +192,7 @@ config ANDES_PLMT
>> associated with timer tick.
>>
>> config RISCV_RDTIME
>> - bool
>> + bool "Timer API via rdtime instruction"
>> default y if RISCV_SMODE || SPL_RISCV_SMODE
>> help
>> The provides the riscv_get_time() API that is implemented using the
>> diff --git a/arch/riscv/cpu/fu540/Kconfig b/arch/riscv/cpu/fu540/Kconfig
>> index 2dcad8e27f..8b2c83039f 100644
>> --- a/arch/riscv/cpu/fu540/Kconfig
>> +++ b/arch/riscv/cpu/fu540/Kconfig
>> @@ -8,7 +8,8 @@ config SIFIVE_FU540
>> imply CPU
>> imply CPU_RISCV
>> imply RISCV_TIMER
>> - imply SIFIVE_CLINT if (RISCV_MMODE || SPL_RISCV_MMODE)
>> + imply SIFIVE_CLINT if RISCV_MMODE
>> + imply SPL_SIFIVE_CLINT if SPL_RISCV_MMODE
>> imply CMD_CPU
>> imply SPL_CPU_SUPPORT
>> imply SPL_OPENSBI
>> diff --git a/arch/riscv/cpu/generic/Kconfig b/arch/riscv/cpu/generic/Kconfig
>> index b2cb155d6d..62fcadd710 100644
>> --- a/arch/riscv/cpu/generic/Kconfig
>> +++ b/arch/riscv/cpu/generic/Kconfig
>> @@ -8,7 +8,8 @@ config GENERIC_RISCV
>> imply CPU
>> imply CPU_RISCV
>> imply RISCV_TIMER
>> - imply SIFIVE_CLINT if (RISCV_MMODE || SPL_RISCV_MMODE)
>> + imply SIFIVE_CLINT if RISCV_MMODE
>> + imply SPL_SIFIVE_CLINT if SPL_RISCV_MMODE
>> imply CMD_CPU
>> imply SPL_CPU_SUPPORT
>> imply SPL_OPENSBI
>> diff --git a/arch/riscv/include/asm/global_data.h b/arch/riscv/include/asm/global_data.h
>> index 2eb14815bc..b89b469d41 100644
>> --- a/arch/riscv/include/asm/global_data.h
>> +++ b/arch/riscv/include/asm/global_data.h
>> @@ -18,7 +18,7 @@
>> struct arch_global_data {
>> long boot_hart; /* boot hart id */
>> phys_addr_t firmware_fdt_addr;
>> -#ifdef CONFIG_SIFIVE_CLINT
>> +#if CONFIG_IS_ENABLED(SIFIVE_CLINT)
>> void __iomem *clint; /* clint base address */
>> #endif
>> #ifdef CONFIG_ANDES_PLIC
>> diff --git a/arch/riscv/lib/Makefile b/arch/riscv/lib/Makefile
>> index 6c503ff2b2..861d7b489f 100644
>> --- a/arch/riscv/lib/Makefile
>> +++ b/arch/riscv/lib/Makefile
>> @@ -10,8 +10,8 @@ obj-$(CONFIG_CMD_BOOTM) += bootm.o
>> obj-$(CONFIG_CMD_BOOTI) += bootm.o image.o
>> obj-$(CONFIG_CMD_GO) += boot.o
>> obj-y += cache.o
>> +obj-$(CONFIG_$(SPL_)SIFIVE_CLINT) += sifive_clint.o
>> ifeq ($(CONFIG_$(SPL_)RISCV_MMODE),y)
>> -obj-$(CONFIG_SIFIVE_CLINT) += sifive_clint.o
>> obj-$(CONFIG_ANDES_PLIC) += andes_plic.o
>> obj-$(CONFIG_ANDES_PLMT) += andes_plmt.o
>> else
>> --
>> 2.28.0
>>
More information about the U-Boot
mailing list