diff options
author | Anup Patel <anup.patel@wdc.com> | 2020-04-24 14:20:40 +0300 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2020-05-01 07:27:55 +0300 |
commit | 8ff2b94ea16ccd361cb1821390fffde1e7ff7a5d (patch) | |
tree | 1b1301ee66cad162c8fd5b9d4a2de4536abcfe31 /lib/utils/timer/fdt_timer_clint.c | |
parent | 1ac794cb618fea55db81cc697f46442bf70469d8 (diff) | |
download | opensbi-8ff2b94ea16ccd361cb1821390fffde1e7ff7a5d.tar.xz |
lib: utils: Add simple FDT timer framework
We add simple timer framework which will select and use timer driver
based on details in FDT passed by previous booting stage.
Signed-off-by: Anup Patel <anup.patel@wdc.com>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
Diffstat (limited to 'lib/utils/timer/fdt_timer_clint.c')
-rw-r--r-- | lib/utils/timer/fdt_timer_clint.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/lib/utils/timer/fdt_timer_clint.c b/lib/utils/timer/fdt_timer_clint.c new file mode 100644 index 0000000..6aa6929 --- /dev/null +++ b/lib/utils/timer/fdt_timer_clint.c @@ -0,0 +1,46 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2020 Western Digital Corporation or its affiliates. + * + * Authors: + * Anup Patel <anup.patel@wdc.com> + */ + +#include <sbi_utils/fdt/fdt_helper.h> +#include <sbi_utils/timer/fdt_timer.h> +#include <sbi_utils/sys/clint.h> + +static int timer_clint_cold_init(void *fdt, int nodeoff, + const struct fdt_match *match) +{ + int rc; + u32 max_hartid; + unsigned long addr; + + rc = fdt_parse_max_hart_id(fdt, &max_hartid); + if (rc) + return rc; + + rc = fdt_get_node_addr_size(fdt, nodeoff, &addr, NULL); + if (rc) + return rc; + + /* TODO: We should figure-out CLINT has_64bit_mmio from DT node */ + return clint_cold_timer_init(addr, max_hartid + 1, TRUE); +} + +static const struct fdt_match timer_clint_match[] = { + { .compatible = "riscv,clint0" }, + { }, +}; + +struct fdt_timer fdt_timer_clint = { + .match_table = timer_clint_match, + .cold_init = timer_clint_cold_init, + .warm_init = clint_warm_timer_init, + .exit = NULL, + .value = clint_timer_value, + .event_stop = clint_timer_event_stop, + .event_start = clint_timer_event_start, +}; |