Skip to content

Commit 785a5e3

Browse files
maheshsalrarbab
authored andcommitted
platform: Identify correct bmc platform based on bmc hw version
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 <[email protected]> Reviewed-by: Nicholas Piggin <[email protected]> Signed-off-by: Reza Arbab <[email protected]>
1 parent e7279e3 commit 785a5e3

File tree

1 file changed

+13
-1
lines changed

1 file changed

+13
-1
lines changed

core/platform.c

+13-1
Original file line numberDiff line numberDiff line change
@@ -135,15 +135,27 @@ static int64_t opal_cec_reboot2(uint32_t reboot_type, char *diag)
135135
}
136136
opal_call(OPAL_CEC_REBOOT2, opal_cec_reboot2, 2);
137137

138+
static void generic_platform_fixup_bmc(struct dt_node *bmc)
139+
{
140+
/* Try setting proper bmc platform by checking compatible property */
141+
if (dt_node_is_compatible(bmc, "ibm,ast2600,openbmc"))
142+
platform.bmc = &bmc_plat_ast2600_openbmc;
143+
}
144+
138145
static bool generic_platform_probe(void)
139146
{
140-
if (dt_find_by_path(dt_root, "bmc")) {
147+
struct dt_node *bmc;
148+
149+
bmc = dt_find_by_path(dt_root, "bmc");
150+
if (bmc) {
141151
/* We appear to have a BMC... so let's cross our fingers
142152
* and see if we can do anything!
143153
*/
144154
prlog(PR_ERR, "GENERIC BMC PLATFORM: **GUESSING** that there's "
145155
"*maybe* a BMC we can talk to.\n");
146156
prlog(PR_ERR, "THIS IS ****UNSUPPORTED****, BRINGUP USE ONLY.\n");
157+
158+
generic_platform_fixup_bmc(bmc);
147159
astbmc_early_init();
148160
} else {
149161
uart_init();

0 commit comments

Comments
 (0)