Skip to contentSkip to conversation

platform: generic: Fix fw_platform_coldboot_harts_init() function

PATCH New Anup Patel 2 participants 2 messages Aug 25, 2024 – Aug 27, 2024

lore
Share & tools
lore

Anup Patel

author
#0 lore raw

PATCH 1/1 platform: generic: Fix fw_platform_coldboot_harts_init() function

It is possible that the OpenSBI config DT node is present but the "cold-boot-harts" DT property is not present. In this case, the fw_platform_coldboot_harts_init() will do nothing which in-turn causes OpenSBI firmware hang at boot time.

To address the above issue, fallback to the default approach when the "cold-boot-harts" DT property is not present.

Fixes 67ce5a763cfb ("platform: generic: Add support for specify coldboot harts in DT")
---
 platform/generic/platform.c | 32 ++++++++++++++++----------------
 1 file changed, 16 insertions(+), 16 deletions(-)
platform/generic/platform.c +16 -16
index 8a0ace83..d1fa84bd 100644
@@ -102,26 +102,26 @@ static void fw_platform_coldboot_harts_init(const void *fdt)
 		goto default_config;
 
 	val = fdt_getprop(fdt, config_offset, "cold-boot-harts", &len);
-	len = len / sizeof(u32);
-	if (val && len) {
-		for (int i = 0; i < len; i++) {
-			cpu_offset = fdt_node_offset_by_phandle(fdt,
-							fdt32_to_cpu(val[i]));
-			if (cpu_offset < 0)
-				goto default_config;
+	if (!val || !len)
+		goto default_config;
 
-			err = fdt_parse_hart_id(fdt, cpu_offset, &val32);
-			if (err)
-				goto default_config;
+	len = len / sizeof(u32);
+	for (int i = 0; i < len; i++) {
+		cpu_offset = fdt_node_offset_by_phandle(fdt,
+						fdt32_to_cpu(val[i]));
+		if (cpu_offset < 0)
+			goto default_config;
 
-			if (!fdt_node_is_enabled(fdt, cpu_offset))
-				continue;
+		err = fdt_parse_hart_id(fdt, cpu_offset, &val32);
+		if (err)
+			goto default_config;
 
-			for (int i = 0; i < platform.hart_count; i++) {
-				if (val32 == generic_hart_index2id[i])
-					bitmap_set(generic_coldboot_harts, i, 1);
-			}
+		if (!fdt_node_is_enabled(fdt, cpu_offset))
+			continue;
 
+		for (int i = 0; i < platform.hart_count; i++) {
+			if (val32 == generic_hart_index2id[i])
+				bitmap_set(generic_coldboot_harts, i, 1);
 		}
 	}
 
Signature · 1 line
2.34.1
Applied
#1 lore raw

PATCH 1/1 platform: generic: Fix fw_platform_coldboot_harts_init() function

Quoted 11 lines · On Sun, Aug 25, 2024 at 9:33?AM Anup Patel <[email protected]> wrote:

It is possible that the OpenSBI config DT node is present but the "cold-boot-harts" DT property is not present. In this case, the fw_platform_coldboot_harts_init() will do nothing which in-turn causes OpenSBI firmware hang at boot time.

To address the above issue, fallback to the default approach when the "cold-boot-harts" DT property is not present.

Fixes 67ce5a763cfb ("platform: generic: Add support for specify coldboot harts in DT")

This is a critical fix hence applying immediately.

Applied this patch to the riscv/opensbi repo.

Thanks,
Anup

Quoted 54 lines
---
 platform/generic/platform.c | 32 ++++++++++++++++----------------
 1 file changed, 16 insertions(+), 16 deletions(-)
platform/generic/platform.c +16 -17
index 8a0ace83..d1fa84bd 100644
@@ -102,26 +102,26 @@ static void fw_platform_coldboot_harts_init(const void *fdt)
                goto default_config;
 
        val = fdt_getprop(fdt, config_offset, "cold-boot-harts", &len);
-       len = len / sizeof(u32);
-       if (val && len) {
-               for (int i = 0; i < len; i++) {
-                       cpu_offset = fdt_node_offset_by_phandle(fdt,
-                                                       fdt32_to_cpu(val[i]));
-                       if (cpu_offset < 0)
-                               goto default_config;
+       if (!val || !len)
+               goto default_config;
 
-                       err = fdt_parse_hart_id(fdt, cpu_offset, &val32);
-                       if (err)
-                               goto default_config;
+       len = len / sizeof(u32);
+       for (int i = 0; i < len; i++) {
+               cpu_offset = fdt_node_offset_by_phandle(fdt,
+                                               fdt32_to_cpu(val[i]));
+               if (cpu_offset < 0)
+                       goto default_config;
 
-                       if (!fdt_node_is_enabled(fdt, cpu_offset))
-                               continue;
+               err = fdt_parse_hart_id(fdt, cpu_offset, &val32);
+               if (err)
+                       goto default_config;
 
-                       for (int i = 0; i < platform.hart_count; i++) {
-                               if (val32 == generic_hart_index2id[i])
-                                       bitmap_set(generic_coldboot_harts, i, 1);
-                       }
+               if (!fdt_node_is_enabled(fdt, cpu_offset))
+                       continue;
 
+               for (int i = 0; i < platform.hart_count; i++) {
+                       if (val32 == generic_hart_index2id[i])
+                               bitmap_set(generic_coldboot_harts, i, 1);
                }
        }
 
--

2.34.1