lib: utils/ipi: Initialize all matching ipi DT nodes
authorAnup Patel <anup.patel@wdc.com>
Wed, 13 May 2020 07:44:33 +0000 (13:14 +0530)
committerAnup Patel <anup@brainfault.org>
Sat, 23 May 2020 05:06:49 +0000 (10:36 +0530)
We can have multiple matching DT nodes of the same FDT ipi driver
so in this case we should call cold_init() for all matching DT nodes
instead of just first matching DT node.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
lib/utils/ipi/fdt_ipi.c
lib/utils/ipi/fdt_ipi_clint.c

index d99a941..6562469 100644 (file)
@@ -69,17 +69,19 @@ static int fdt_ipi_cold_init(void)
        for (pos = 0; pos < array_size(ipi_drivers); pos++) {
                drv = ipi_drivers[pos];
 
-               noff = fdt_find_match(fdt, -1, drv->match_table, &match);
-               if (noff < 0)
-                       continue;
-
-               if (drv->cold_init) {
-                       rc = drv->cold_init(fdt, noff, match);
-                       if (rc)
-                               return rc;
+               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;
                }
-               current_driver = drv;
-               break;
+
+               if (current_driver != &dummy)
+                       break;
        }
 
        return 0;
index eead8b3..e992440 100644 (file)
@@ -7,22 +7,31 @@
  *   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>
 
-static struct clint_data clint_ipi;
+#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;
+       struct clint_data *ci;
+
+       if (CLINT_IPI_MAX_NR <= clint_ipi_count)
+               return SBI_ENOSPC;
+       ci = &clint_ipi[clint_ipi_count++];
 
-       rc = fdt_parse_clint_node(fdt, nodeoff, FALSE, &clint_ipi);
+       rc = fdt_parse_clint_node(fdt, nodeoff, FALSE, ci);
        if (rc)
                return rc;
 
-       return clint_cold_ipi_init(&clint_ipi);
+       return clint_cold_ipi_init(ci);
 }
 
 static const struct fdt_match ipi_clint_match[] = {