summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnup Patel <anup.patel@wdc.com>2021-05-20 12:13:06 +0300
committerAnup Patel <anup@brainfault.org>2021-06-24 07:09:51 +0300
commit56fc5f7618b70a83425a764cafd67ffcf3605b5d (patch)
tree087f378448a33a1728a68c4546f1fa78e9df3c3f
parentbd5d2089b80742a210b257c8e6c1361310725200 (diff)
downloadopensbi-56fc5f7618b70a83425a764cafd67ffcf3605b5d.tar.xz
lib: utils/ipi: Add FDT based ACLINT MSWI IPI driver
We add a new FDT based ACLINT MSWI IPI driver which works for both CLINT device and standalone ACLINT MSWI device. Signed-off-by: Anup Patel <anup.patel@wdc.com> Reviewed-by: Bin Meng <bmeng.cn@gmail.com> Reviewed-by: Xiang W <wxjstz@126.com>
-rw-r--r--lib/utils/ipi/fdt_ipi.c4
-rw-r--r--lib/utils/ipi/fdt_ipi_clint.c51
-rw-r--r--lib/utils/ipi/fdt_ipi_mswi.c67
-rw-r--r--lib/utils/ipi/objects.mk2
4 files changed, 70 insertions, 54 deletions
diff --git a/lib/utils/ipi/fdt_ipi.c b/lib/utils/ipi/fdt_ipi.c
index 3932f50..ed56e49 100644
--- a/lib/utils/ipi/fdt_ipi.c
+++ b/lib/utils/ipi/fdt_ipi.c
@@ -12,10 +12,10 @@
#include <sbi_utils/fdt/fdt_helper.h>
#include <sbi_utils/ipi/fdt_ipi.h>
-extern struct fdt_ipi fdt_ipi_clint;
+extern struct fdt_ipi fdt_ipi_mswi;
static struct fdt_ipi *ipi_drivers[] = {
- &fdt_ipi_clint
+ &fdt_ipi_mswi
};
static struct fdt_ipi dummy = {
diff --git a/lib/utils/ipi/fdt_ipi_clint.c b/lib/utils/ipi/fdt_ipi_clint.c
deleted file mode 100644
index ce0ca8e..0000000
--- a/lib/utils/ipi/fdt_ipi_clint.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * 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/ipi/fdt_ipi.h>
-#include <sbi_utils/sys/clint.h>
-
-#define CLINT_IPI_MAX_NR 16
-
-static unsigned long clint_ipi_count = 0;
-static struct clint_data clint_ipi[CLINT_IPI_MAX_NR];
-
-static int ipi_clint_cold_init(void *fdt, int nodeoff,
- const struct fdt_match *match)
-{
- int rc;
- unsigned long cisize;
- struct clint_data *ci;
-
- if (CLINT_IPI_MAX_NR <= clint_ipi_count)
- return SBI_ENOSPC;
- ci = &clint_ipi[clint_ipi_count++];
-
- rc = fdt_parse_aclint_node(fdt, nodeoff, false, &ci->addr, &cisize,
- &ci->first_hartid, &ci->hart_count);
- if (rc)
- return rc;
- ci->has_64bit_mmio = false;
-
- return clint_cold_ipi_init(ci);
-}
-
-static const struct fdt_match ipi_clint_match[] = {
- { .compatible = "riscv,clint0" },
- { .compatible = "sifive,clint0" },
- { },
-};
-
-struct fdt_ipi fdt_ipi_clint = {
- .match_table = ipi_clint_match,
- .cold_init = ipi_clint_cold_init,
- .warm_init = clint_warm_ipi_init,
- .exit = NULL,
-};
diff --git a/lib/utils/ipi/fdt_ipi_mswi.c b/lib/utils/ipi/fdt_ipi_mswi.c
new file mode 100644
index 0000000..f119f9c
--- /dev/null
+++ b/lib/utils/ipi/fdt_ipi_mswi.c
@@ -0,0 +1,67 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2021 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/ipi/fdt_ipi.h>
+#include <sbi_utils/ipi/aclint_mswi.h>
+
+#define MSWI_MAX_NR 16
+
+static unsigned long mswi_count = 0;
+static struct aclint_mswi_data mswi[MSWI_MAX_NR];
+
+static int ipi_mswi_cold_init(void *fdt, int nodeoff,
+ const struct fdt_match *match)
+{
+ int rc;
+ unsigned long offset;
+ struct aclint_mswi_data *ms;
+
+ if (MSWI_MAX_NR <= mswi_count)
+ return SBI_ENOSPC;
+ ms = &mswi[mswi_count];
+
+ rc = fdt_parse_aclint_node(fdt, nodeoff, false, &ms->addr, &ms->size,
+ &ms->first_hartid, &ms->hart_count);
+ if (rc)
+ return rc;
+
+ if (match->data) {
+ /* Adjust MSWI address and size for CLINT device */
+ offset = *((unsigned long *)match->data);
+ ms->addr += offset;
+ if ((ms->size - offset) < ACLINT_MSWI_SIZE)
+ return SBI_EINVAL;
+ ms->size = ACLINT_MSWI_SIZE;
+ }
+
+ rc = aclint_mswi_cold_init(ms);
+ if (rc)
+ return rc;
+
+ mswi_count++;
+ return 0;
+}
+
+static unsigned long clint_offset = CLINT_MSWI_OFFSET;
+
+static const struct fdt_match ipi_mswi_match[] = {
+ { .compatible = "riscv,clint0", .data = &clint_offset },
+ { .compatible = "sifive,clint0", .data = &clint_offset },
+ { .compatible = "riscv,aclint-mswi" },
+ { },
+};
+
+struct fdt_ipi fdt_ipi_mswi = {
+ .match_table = ipi_mswi_match,
+ .cold_init = ipi_mswi_cold_init,
+ .warm_init = aclint_mswi_warm_init,
+ .exit = NULL,
+};
diff --git a/lib/utils/ipi/objects.mk b/lib/utils/ipi/objects.mk
index 7e37816..129eea8 100644
--- a/lib/utils/ipi/objects.mk
+++ b/lib/utils/ipi/objects.mk
@@ -9,4 +9,4 @@
libsbiutils-objs-y += ipi/aclint_mswi.o
libsbiutils-objs-y += ipi/fdt_ipi.o
-libsbiutils-objs-y += ipi/fdt_ipi_clint.o
+libsbiutils-objs-y += ipi/fdt_ipi_mswi.o