[Skiboot] [PATCH v5 6/6] platform: Identify correct bmc platform based on bmc hw version

Mahesh Salgaonkar mahesh at linux.ibm.com
Mon Mar 3 18:02:59 AEDT 2025


At the moment the generic platform sets bmc_generic() as bmc platform
which does not have any support to initialize the flash and hence it
fails to load petitboot kernel.

[  583.105000325,4] FLASH: Failed to load VERSION data
[  583.105490257,5] INIT: Waiting for kernel...
[  583.105523156,5] INIT: platform wait for kernel load failed
[  583.105555219,5] INIT: Assuming kernel at 0x20000000
[  583.105589925,3] INIT: ELF header not found. Assuming raw binary.
[...]
[  583.299682673,5] INIT: Starting kernel at 0x20000000, fdt at 0x30a44eb0
1274673 bytes
[  583.344432417,3] ***********************************************
[  583.344490230,3] Fatal Exception 0x800 at 0000000020000000
MSR 9000000000000000
[  583.344535875,3] CFAR : 0000000030022948 MSR  : 9000000000000000
[  583.344578019,3] SRR0 : 0000000020000000 SRR1 : 9000000000000000
[  583.344620242,3] HSRR0: 0000000020000000 HSRR1: 9000000000000000

OPAL builds the device tree for BMC based system using HDAT. It
populates bmc/compatible node with bmc hw version e.g.
"ibm,ast2600,openbmc". Use that to identify proper BMC hw board and
initialize BMC platform with proper backend. This allows opal to
successfully load and boot into petitboot kernel.

Signed-off-by: Mahesh Salgaonkar <mahesh at linux.ibm.com>
Reviewed-by: Nicholas Piggin <npiggin at gmail.com>
---
 core/platform.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/core/platform.c b/core/platform.c
index 320fdea03d..34ef5e5d7b 100644
--- a/core/platform.c
+++ b/core/platform.c
@@ -135,15 +135,27 @@ static int64_t opal_cec_reboot2(uint32_t reboot_type, char *diag)
 }
 opal_call(OPAL_CEC_REBOOT2, opal_cec_reboot2, 2);
 
+static void generic_platform_fixup_bmc(struct dt_node *bmc)
+{
+	/* Try setting proper bmc platform by checking compatible property */
+	if (dt_node_is_compatible(bmc, "ibm,ast2600,openbmc"))
+		platform.bmc = &bmc_plat_ast2600_openbmc;
+}
+
 static bool generic_platform_probe(void)
 {
-	if (dt_find_by_path(dt_root, "bmc")) {
+	struct dt_node *bmc;
+
+	bmc = dt_find_by_path(dt_root, "bmc");
+	if (bmc) {
 		/* We appear to have a BMC... so let's cross our fingers
 		 * and see if we can do anything!
 		 */
 		prlog(PR_ERR, "GENERIC BMC PLATFORM: **GUESSING** that there's "
 		      "*maybe* a BMC we can talk to.\n");
 		prlog(PR_ERR, "THIS IS ****UNSUPPORTED****, BRINGUP USE ONLY.\n");
+
+		generic_platform_fixup_bmc(bmc);
 		astbmc_early_init();
 	} else {
 		uart_init();
-- 
2.48.1



More information about the Skiboot mailing list