lib: utils: Add simple FDT reset framework
authorAnup Patel <anup.patel@wdc.com>
Fri, 24 Apr 2020 11:32:48 +0000 (17:02 +0530)
committerAnup Patel <anup@brainfault.org>
Fri, 1 May 2020 05:01:37 +0000 (10:31 +0530)
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>
include/sbi_utils/reset/fdt_reset.h [new file with mode: 0644]
lib/utils/reset/fdt_reset.c [new file with mode: 0644]
lib/utils/reset/fdt_reset_htif.c [new file with mode: 0644]
lib/utils/reset/fdt_reset_sifive.c [new file with mode: 0644]
lib/utils/reset/objects.mk [new file with mode: 0644]

diff --git a/include/sbi_utils/reset/fdt_reset.h b/include/sbi_utils/reset/fdt_reset.h
new file mode 100644 (file)
index 0000000..789a6ac
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2020 Western Digital Corporation or its affiliates.
+ *
+ * Authors:
+ *   Anup Patel <anup.patel@wdc.com>
+ */
+
+#ifndef __FDT_RESET_H__
+#define __FDT_RESET_H__
+
+#include <sbi/sbi_types.h>
+
+struct fdt_reset {
+       const struct fdt_match *match_table;
+       int (*init)(void *fdt, int nodeoff, const struct fdt_match *match);
+       int (*system_reset)(u32 reset_type);
+};
+
+int fdt_system_reset(u32 reset_type);
+
+int fdt_reset_init(void);
+
+#endif
diff --git a/lib/utils/reset/fdt_reset.c b/lib/utils/reset/fdt_reset.c
new file mode 100644 (file)
index 0000000..98fbb54
--- /dev/null
@@ -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 (file)
index 0000000..e453d05
--- /dev/null
@@ -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 (file)
index 0000000..6a171ca
--- /dev/null
@@ -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 (file)
index 0000000..b447261
--- /dev/null
@@ -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