diff options
author | Anup Patel <anup.patel@wdc.com> | 2020-04-24 14:32:48 +0300 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2020-05-01 08:01:37 +0300 |
commit | 7cc6fa4d8a65e08048e1dd469087805ce89bf306 (patch) | |
tree | 14a42d7fa4873a3ad3a17e2e3dd9b3fce9c1f8c6 /lib/utils | |
parent | 76a89403c8efa58582fe35cf942e80be7f5f36f9 (diff) | |
download | opensbi-7cc6fa4d8a65e08048e1dd469087805ce89bf306.tar.xz |
lib: utils: Add simple FDT reset framework
We add simple reset framework which will select and use reset 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')
-rw-r--r-- | lib/utils/reset/fdt_reset.c | 55 | ||||
-rw-r--r-- | lib/utils/reset/fdt_reset_htif.c | 22 | ||||
-rw-r--r-- | lib/utils/reset/fdt_reset_sifive.c | 37 | ||||
-rw-r--r-- | lib/utils/reset/objects.mk | 12 |
4 files changed, 126 insertions, 0 deletions
diff --git a/lib/utils/reset/fdt_reset.c b/lib/utils/reset/fdt_reset.c new file mode 100644 index 0000000..98fbb54 --- /dev/null +++ b/lib/utils/reset/fdt_reset.c @@ -0,0 +1,55 @@ +/* + * 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/reset/fdt_reset.h> + +extern struct fdt_reset fdt_reset_sifive; +extern struct fdt_reset fdt_reset_htif; + +static struct fdt_reset *reset_drivers[] = { + &fdt_reset_sifive, + &fdt_reset_htif, +}; + +static struct fdt_reset *current_driver = NULL; + +int fdt_system_reset(u32 reset_type) +{ + if (current_driver && current_driver->system_reset) + return current_driver->system_reset(reset_type); + return 0; +} + +int fdt_reset_init(void) +{ + int pos, noff, rc; + struct fdt_reset *drv; + const struct fdt_match *match; + void *fdt = sbi_scratch_thishart_arg1_ptr(); + + for (pos = 0; pos < array_size(reset_drivers); pos++) { + drv = reset_drivers[pos]; + + noff = fdt_find_match(fdt, drv->match_table, &match); + if (noff < 0) + continue; + + if (drv->init) { + rc = drv->init(fdt, noff, match); + if (rc) + return rc; + } + current_driver = drv; + break; + } + + return 0; +} diff --git a/lib/utils/reset/fdt_reset_htif.c b/lib/utils/reset/fdt_reset_htif.c new file mode 100644 index 0000000..e453d05 --- /dev/null +++ b/lib/utils/reset/fdt_reset_htif.c @@ -0,0 +1,22 @@ +/* + * 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/reset/fdt_reset.h> +#include <sbi_utils/fdt/fdt_helper.h> +#include <sbi_utils/sys/htif.h> + +static const struct fdt_match htif_reset_match[] = { + { .compatible = "ucb,htif0" }, + { }, +}; + +struct fdt_reset fdt_reset_htif = { + .match_table = htif_reset_match, + .system_reset = htif_system_reset +}; diff --git a/lib/utils/reset/fdt_reset_sifive.c b/lib/utils/reset/fdt_reset_sifive.c new file mode 100644 index 0000000..6a171ca --- /dev/null +++ b/lib/utils/reset/fdt_reset_sifive.c @@ -0,0 +1,37 @@ +/* + * 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/reset/fdt_reset.h> +#include <sbi_utils/sys/sifive_test.h> + +static int sifive_test_reset_init(void *fdt, int nodeoff, + const struct fdt_match *match) +{ + int rc; + unsigned long addr; + + rc = fdt_get_node_addr_size(fdt, nodeoff, &addr, NULL); + if (rc) + return rc; + + return sifive_test_init(addr); +} + +static const struct fdt_match sifive_test_reset_match[] = { + { .compatible = "sifive,test1" }, + { }, +}; + +struct fdt_reset fdt_reset_sifive = { + .match_table = sifive_test_reset_match, + .init = sifive_test_reset_init, + .system_reset = sifive_test_system_reset +}; diff --git a/lib/utils/reset/objects.mk b/lib/utils/reset/objects.mk new file mode 100644 index 0000000..b447261 --- /dev/null +++ b/lib/utils/reset/objects.mk @@ -0,0 +1,12 @@ +# +# 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 += reset/fdt_reset.o +libsbiutils-objs-y += reset/fdt_reset_htif.o +libsbiutils-objs-y += reset/fdt_reset_sifive.o |