[U-Boot] [PATCH v7 4/4] RISC-V: Add S-mode timer implementation

Bin Meng bmeng.cn at gmail.com
Mon Dec 3 06:36:46 UTC 2018


Hi Anup,

On Mon, Dec 3, 2018 at 1:28 PM Anup Patel <anup at brainfault.org> wrote:
>
> When running in S-mode, we can use rdtime and rdtimeh instructions
> for reading timer ticks (just like Linux). The frequency of timer
> ticks is passed by prior booting stages in "timebase-frequency" DT
> property of the "/cpus" DT node.
>
> This patch provides a generic timer implementation for U-Boot
> running in S-mode. For U-Boot running in M-mode, specific timer
> drivers will have to be provided.
>
> Signed-off-by: Anup Patel <anup at brainfault.org>
> ---
>  arch/Kconfig            |  1 -
>  arch/riscv/Kconfig      | 22 +++++++++++----
>  arch/riscv/lib/Makefile |  1 +
>  arch/riscv/lib/time.c   | 60 +++++++++++++++++++++++++++++++++++++++++
>  4 files changed, 78 insertions(+), 6 deletions(-)
>  create mode 100644 arch/riscv/lib/time.c
>
> diff --git a/arch/Kconfig b/arch/Kconfig
> index 9fdd2f7e66..a4fcb3522d 100644
> --- a/arch/Kconfig
> +++ b/arch/Kconfig
> @@ -72,7 +72,6 @@ config RISCV
>         imply BLK
>         imply CLK
>         imply MTD
> -       imply TIMER

No, please don't do this.

>         imply CMD_DM
>
>  config SANDBOX
> diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
> index 732a357a99..20a060454b 100644
> --- a/arch/riscv/Kconfig
> +++ b/arch/riscv/Kconfig
> @@ -44,6 +44,23 @@ config ARCH_RV64I
>
>  endchoice
>
> +choice
> +       prompt "Run Mode"
> +       default RISCV_MMODE
> +
> +config RISCV_MMODE
> +       bool "Machine"
> +       select TIMER
> +       help
> +          Choose this option to build U-Boot for RISC-V M-Mode.
> +
> +config RISCV_SMODE
> +       bool "Supervisor"
> +       help
> +          Choose this option to build U-Boot for RISC-V S-Mode.
> +
> +endchoice
> +

The above changes deserve separate patch, or merge that in the 1st
patch in the series.

>  config RISCV_ISA_C
>         bool "Emit compressed instructions"
>         default y
> @@ -55,11 +72,6 @@ config RISCV_ISA_C
>  config RISCV_ISA_A
>         def_bool y
>
> -config RISCV_SMODE
> -       bool "Run in S-Mode"
> -       help
> -         Enable this option to build U-Boot for RISC-V S-Mode
> -
>  config 32BIT
>         bool
>
> diff --git a/arch/riscv/lib/Makefile b/arch/riscv/lib/Makefile
> index b58db89752..98aa6d40e7 100644
> --- a/arch/riscv/lib/Makefile
> +++ b/arch/riscv/lib/Makefile
> @@ -12,6 +12,7 @@ obj-y += cache.o
>  obj-y  += interrupts.o
>  obj-y  += reset.o
>  obj-y   += setjmp.o
> +obj-$(CONFIG_RISCV_SMODE) += time.o
>
>  # For building EFI apps
>  CFLAGS_$(EFI_CRT0) := $(CFLAGS_EFI)
> diff --git a/arch/riscv/lib/time.c b/arch/riscv/lib/time.c
> new file mode 100644
> index 0000000000..077e568ca6
> --- /dev/null
> +++ b/arch/riscv/lib/time.c
> @@ -0,0 +1,60 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (C) 2018, Anup Patel <anup at brainfault.org>
> + */
> +
> +#include <common.h>
> +#include <fdtdec.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +static unsigned int tbclk;
> +
> +static void setup_tbclk(void)
> +{
> +       int cpus;
> +
> +       if (!gd->fdt_blob || tbclk)
> +               return;
> +
> +       cpus = fdt_path_offset(gd->fdt_blob, "/cpus");
> +       if (cpus < 0) {
> +               debug("%s: Missing /cpus node\n", __func__);
> +               return;
> +       }
> +
> +       tbclk = fdtdec_get_int(gd->fdt_blob, cpus,
> +                              "timebase-frequency", 1000000);
> +}
> +
> +ulong notrace get_tbclk(void)
> +{
> +       setup_tbclk();
> +
> +       return tbclk;
> +}
> +
> +#ifdef CONFIG_64BIT
> +uint64_t notrace get_ticks(void)
> +{
> +       unsigned long n;
> +
> +       __asm__ __volatile__ (
> +               "rdtime %0"
> +               : "=r" (n));
> +       return n;
> +}
> +#else
> +uint64_t notrace get_ticks(void)
> +{
> +       uint32_t lo, hi, tmp;
> +       __asm__ __volatile__ (
> +               "1:\n"
> +               "rdtimeh %0\n"
> +               "rdtime %1\n"
> +               "rdtimeh %2\n"
> +               "bne %0, %2, 1b"
> +               : "=&r" (hi), "=&r" (lo), "=&r" (tmp));
> +       return ((uint64_t)hi << 32) | lo;
> +}
> +#endif
> --

The proper way to implement timer driver is via DM. Could you please
implement a DM timer driver for S-mode?

The M-mode timer driver is @ http://patchwork.ozlabs.org/patch/996892/, FYI.

Regards,
Bin


More information about the U-Boot mailing list