lib: utils: Improve fdt_ipi
authorXiang W <wxjstz@126.com>
Mon, 22 May 2023 05:18:08 +0000 (13:18 +0800)
committerAnup Patel <anup@brainfault.org>
Fri, 26 May 2023 07:13:25 +0000 (12:43 +0530)
Remove dummy driver. Optimize fdt_ipi_cold_init to exit the loop
early.

Signed-off-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
lib/utils/ipi/fdt_ipi.c

index 66dc51082ed75dadef512cc79be89785c2e3ab4f..7762ababe5978c2c0c49117b4ece3558dfa0c25c 100644 (file)
 extern struct fdt_ipi *fdt_ipi_drivers[];
 extern unsigned long fdt_ipi_drivers_size;
 
-static struct fdt_ipi dummy = {
-       .match_table = NULL,
-       .cold_init = NULL,
-       .warm_init = NULL,
-       .exit = NULL,
-};
-
-static struct fdt_ipi *current_driver = &dummy;
+static struct fdt_ipi *current_driver = NULL;
 
 void fdt_ipi_exit(void)
 {
-       if (current_driver->exit)
+       if (current_driver && current_driver->exit)
                current_driver->exit();
 }
 
 static int fdt_ipi_warm_init(void)
 {
-       if (current_driver->warm_init)
+       if (current_driver && current_driver->warm_init)
                return current_driver->warm_init();
        return 0;
 }
@@ -51,20 +44,28 @@ static int fdt_ipi_cold_init(void)
                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 == SBI_ENODEV)
-                                       continue;
-                               if (rc)
-                                       return rc;
-                       }
+                       /* drv->cold_init must not be NULL */
+                       if (drv->cold_init == NULL)
+                               return SBI_EFAIL;
+
+                       rc = drv->cold_init(fdt, noff, match);
+                       if (rc == SBI_ENODEV)
+                               continue;
+                       if (rc)
+                               return rc;
                        current_driver = drv;
-               }
 
-               if (current_driver != &dummy)
-                       break;
+                       /*
+                        * We will have multiple IPI devices on multi-die or
+                        * multi-socket systems so we cannot break here.
+                        */
+               }
        }
 
+       /*
+        * On some single-hart system there is no need for ipi,
+        * so we cannot return a failure here
+        */
        return 0;
 }