diff options
Diffstat (limited to 'roms/opensbi/lib/utils/timer')
-rw-r--r-- | roms/opensbi/lib/utils/timer/fdt_timer.c | 112 | ||||
-rw-r--r-- | roms/opensbi/lib/utils/timer/fdt_timer_clint.c | 52 | ||||
-rw-r--r-- | roms/opensbi/lib/utils/timer/objects.mk | 11 |
3 files changed, 175 insertions, 0 deletions
diff --git a/roms/opensbi/lib/utils/timer/fdt_timer.c b/roms/opensbi/lib/utils/timer/fdt_timer.c new file mode 100644 index 000000000..d1d0e0ce1 --- /dev/null +++ b/roms/opensbi/lib/utils/timer/fdt_timer.c @@ -0,0 +1,112 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2020 Western Digital Corporation or its affiliates. + * + * Authors: + * Anup Patel <anup.patel@wdc.com> + */ + +#include <sbi/sbi_scratch.h> +#include <sbi_utils/fdt/fdt_helper.h> +#include <sbi_utils/timer/fdt_timer.h> + +extern struct fdt_timer fdt_timer_clint; + +static struct fdt_timer *timer_drivers[] = { + &fdt_timer_clint +}; + +static u64 dummy_value(void) +{ + return 0; +} + +static void dummy_event_stop(void) +{ +} + +static void dummy_event_start(u64 next_event) +{ +} + +static struct fdt_timer dummy = { + .match_table = NULL, + .cold_init = NULL, + .warm_init = NULL, + .exit = NULL, + .value = dummy_value, + .event_stop = dummy_event_stop, + .event_start = dummy_event_start +}; + +static struct fdt_timer *current_driver = &dummy; + +u64 fdt_timer_value(void) +{ + return current_driver->value(); +} + +void fdt_timer_event_stop(void) +{ + current_driver->event_stop(); +} + +void fdt_timer_event_start(u64 next_event) +{ + current_driver->event_start(next_event); +} + +void fdt_timer_exit(void) +{ + if (current_driver->exit) + current_driver->exit(); +} + +static int fdt_timer_warm_init(void) +{ + if (current_driver->warm_init) + return current_driver->warm_init(); + return 0; +} + +static int fdt_timer_cold_init(void) +{ + int pos, noff, rc; + struct fdt_timer *drv; + const struct fdt_match *match; + void *fdt = sbi_scratch_thishart_arg1_ptr(); + + for (pos = 0; pos < array_size(timer_drivers); pos++) { + drv = timer_drivers[pos]; + + noff = -1; + while ((noff = fdt_find_match(fdt, noff, + drv->match_table, &match)) >= 0) { + if (drv->cold_init) { + rc = drv->cold_init(fdt, noff, match); + if (rc) + return rc; + } + current_driver = drv; + } + + if (current_driver != &dummy) + break; + } + + return 0; +} + +int fdt_timer_init(bool cold_boot) +{ + int rc; + + if (cold_boot) { + rc = fdt_timer_cold_init(); + if (rc) + return rc; + } + + return fdt_timer_warm_init(); +} diff --git a/roms/opensbi/lib/utils/timer/fdt_timer_clint.c b/roms/opensbi/lib/utils/timer/fdt_timer_clint.c new file mode 100644 index 000000000..fe6670866 --- /dev/null +++ b/roms/opensbi/lib/utils/timer/fdt_timer_clint.c @@ -0,0 +1,52 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2020 Western Digital Corporation or its affiliates. + * + * Authors: + * Anup Patel <anup.patel@wdc.com> + */ + +#include <sbi/sbi_error.h> +#include <sbi_utils/fdt/fdt_helper.h> +#include <sbi_utils/timer/fdt_timer.h> +#include <sbi_utils/sys/clint.h> + +#define CLINT_TIMER_MAX_NR 16 + +static unsigned long clint_timer_count = 0; +static struct clint_data clint_timer[CLINT_TIMER_MAX_NR]; + +static int timer_clint_cold_init(void *fdt, int nodeoff, + const struct fdt_match *match) +{ + int rc; + struct clint_data *ct, *ctmaster = NULL; + + if (CLINT_TIMER_MAX_NR <= clint_timer_count) + return SBI_ENOSPC; + ct = &clint_timer[clint_timer_count++]; + if (1 < clint_timer_count) + ctmaster = &clint_timer[0]; + + rc = fdt_parse_clint_node(fdt, nodeoff, TRUE, ct); + if (rc) + return rc; + + return clint_cold_timer_init(ct, ctmaster); +} + +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, +}; diff --git a/roms/opensbi/lib/utils/timer/objects.mk b/roms/opensbi/lib/utils/timer/objects.mk new file mode 100644 index 000000000..1b84e926c --- /dev/null +++ b/roms/opensbi/lib/utils/timer/objects.mk @@ -0,0 +1,11 @@ +# +# SPDX-License-Identifier: BSD-2-Clause +# +# Copyright (c) 2020 Western Digital Corporation or its affiliates. +# +# Authors: +# Anup Patel <anup.patel@wdc.com> +# + +libsbiutils-objs-y += timer/fdt_timer.o +libsbiutils-objs-y += timer/fdt_timer_clint.o |