From 7cc6fa4d8a65e08048e1dd469087805ce89bf306 Mon Sep 17 00:00:00 2001
From: Anup Patel <anup.patel@wdc.com>
Date: Fri, 24 Apr 2020 17:02:48 +0530
Subject: 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>
---
 include/sbi_utils/reset/fdt_reset.h | 25 +++++++++++++++++
 lib/utils/reset/fdt_reset.c         | 55 +++++++++++++++++++++++++++++++++++++
 lib/utils/reset/fdt_reset_htif.c    | 22 +++++++++++++++
 lib/utils/reset/fdt_reset_sifive.c  | 37 +++++++++++++++++++++++++
 lib/utils/reset/objects.mk          | 12 ++++++++
 5 files changed, 151 insertions(+)
 create mode 100644 include/sbi_utils/reset/fdt_reset.h
 create mode 100644 lib/utils/reset/fdt_reset.c
 create mode 100644 lib/utils/reset/fdt_reset_htif.c
 create mode 100644 lib/utils/reset/fdt_reset_sifive.c
 create mode 100644 lib/utils/reset/objects.mk

diff --git a/include/sbi_utils/reset/fdt_reset.h b/include/sbi_utils/reset/fdt_reset.h
new file mode 100644
index 0000000..789a6ac
--- /dev/null
+++ b/include/sbi_utils/reset/fdt_reset.h
@@ -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
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
-- 
cgit v1.2.3