lib: utils/ipi: Use heap in ACLINT MSWI driver
authorAnup Patel <apatel@ventanamicro.com>
Wed, 19 Apr 2023 11:24:13 +0000 (16:54 +0530)
committerAnup Patel <anup@brainfault.org>
Mon, 5 Jun 2023 10:25:56 +0000 (15:55 +0530)
Let's use heap allocation in ACLINT MSWI driver instead of using
a fixed size global array.

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
lib/utils/ipi/fdt_ipi_mswi.c

index 4dc91f2cb964585399b5369df3e6e7f7fced7e07..e3a637824658f1a6e8453d840cc3082b18c28270 100644 (file)
@@ -8,15 +8,11 @@
  */
 
 #include <sbi/sbi_error.h>
+#include <sbi/sbi_heap.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)
 {
@@ -24,15 +20,17 @@ static int ipi_mswi_cold_init(void *fdt, int nodeoff,
        unsigned long offset;
        struct aclint_mswi_data *ms;
 
-       if (MSWI_MAX_NR <= mswi_count)
-               return SBI_ENOSPC;
-       ms = &mswi[mswi_count];
+       ms = sbi_zalloc(sizeof(*ms));
+       if (!ms)
+               return SBI_ENOMEM;
 
        rc = fdt_parse_aclint_node(fdt, nodeoff, false,
                                   &ms->addr, &ms->size, NULL, NULL,
                                   &ms->first_hartid, &ms->hart_count);
-       if (rc)
+       if (rc) {
+               sbi_free(ms);
                return rc;
+       }
 
        if (match->data) {
                /* Adjust MSWI address and size for CLINT device */
@@ -44,10 +42,11 @@ static int ipi_mswi_cold_init(void *fdt, int nodeoff,
        }
 
        rc = aclint_mswi_cold_init(ms);
-       if (rc)
+       if (rc) {
+               sbi_free(ms);
                return rc;
+       }
 
-       mswi_count++;
        return 0;
 }