Message ID | 1442286607-15755-2-git-send-email-joel@jms.id.au |
---|---|
State | Accepted |
Headers | show |
On 09/15/2015 08:40 AM, Joel Stanley wrote: > Our normal sequence for a soft power action (IPMI 'power soft' or > 'power cycle') involve receiving a SEL from the BMC, sending a message > to Linux's opal platform support which instructs the host OS to shut > down, and finally the host will request OPAL to cut power. > > When the host is not yet up we will send the message to /dev/null, and > no action will be taken. This patches changes that behaviour to perform > the action immediately if we know how. > > Signed-off-by: Joel Stanley <joel@jms.id.au> > --- > hw/ipmi/ipmi-sel.c | 20 ++++++++++++++++---- > 1 file changed, 16 insertions(+), 4 deletions(-) > > diff --git a/hw/ipmi/ipmi-sel.c b/hw/ipmi/ipmi-sel.c > index 4626d9d..c446dfc 100644 > --- a/hw/ipmi/ipmi-sel.c > +++ b/hw/ipmi/ipmi-sel.c > @@ -457,12 +457,24 @@ static void sel_power(uint8_t power) > { > switch (power) { > case SOFT_OFF: > - prlog(PR_NOTICE, "soft shutdown requested\n"); > - opal_queue_msg(OPAL_MSG_SHUTDOWN, NULL, NULL, SOFT_OFF); > + prlog(PR_NOTICE, "Soft shutdown requested\n"); > + if (!debug_descriptor.opal_boot_complete && > + platform.cec_power_down) { > + prlog(PR_NOTICE, "Host not up, shutting down now\n"); > + platform.cec_power_down(IPMI_CHASSIS_PWR_DOWN); > + } else { > + opal_queue_msg(OPAL_MSG_SHUTDOWN, NULL, NULL, SOFT_OFF); > + } > break; > case SOFT_REBOOT: > - prlog(PR_NOTICE, "soft reboot rqeuested\n"); > - opal_queue_msg(OPAL_MSG_SHUTDOWN, NULL, NULL, SOFT_REBOOT); > + prlog(PR_NOTICE, "Soft reboot rqeuested\n"); Looks like copy-parse error... s/rqeuested/requested/ .. > + if (!debug_descriptor.opal_boot_complete && > + platform.cec_reboot) { > + prlog(PR_NOTICE, "Host not up, rebooting now\n"); > + platform.cec_reboot(); > + } else { > + opal_queue_msg(OPAL_MSG_SHUTDOWN, NULL, NULL, SOFT_REBOOT); > + } So if platform.cec_reboot, then we will endup calling "opal_queue_msg".. which is not correct.. But given that cec_reboot will be set well before update opal_boot_complete flag, probably we are fine. -Vasant
Vasant Hegde <hegdevasant@linux.vnet.ibm.com> writes: > On 09/15/2015 08:40 AM, Joel Stanley wrote: >> Our normal sequence for a soft power action (IPMI 'power soft' or >> 'power cycle') involve receiving a SEL from the BMC, sending a message >> to Linux's opal platform support which instructs the host OS to shut >> down, and finally the host will request OPAL to cut power. >> >> When the host is not yet up we will send the message to /dev/null, and >> no action will be taken. This patches changes that behaviour to perform >> the action immediately if we know how. >> >> Signed-off-by: Joel Stanley <joel@jms.id.au> >> --- >> hw/ipmi/ipmi-sel.c | 20 ++++++++++++++++---- >> 1 file changed, 16 insertions(+), 4 deletions(-) >> >> diff --git a/hw/ipmi/ipmi-sel.c b/hw/ipmi/ipmi-sel.c >> index 4626d9d..c446dfc 100644 >> --- a/hw/ipmi/ipmi-sel.c >> +++ b/hw/ipmi/ipmi-sel.c >> @@ -457,12 +457,24 @@ static void sel_power(uint8_t power) >> { >> switch (power) { >> case SOFT_OFF: >> - prlog(PR_NOTICE, "soft shutdown requested\n"); >> - opal_queue_msg(OPAL_MSG_SHUTDOWN, NULL, NULL, SOFT_OFF); >> + prlog(PR_NOTICE, "Soft shutdown requested\n"); >> + if (!debug_descriptor.opal_boot_complete && >> + platform.cec_power_down) { >> + prlog(PR_NOTICE, "Host not up, shutting down now\n"); >> + platform.cec_power_down(IPMI_CHASSIS_PWR_DOWN); >> + } else { >> + opal_queue_msg(OPAL_MSG_SHUTDOWN, NULL, NULL, SOFT_OFF); >> + } >> break; >> case SOFT_REBOOT: >> - prlog(PR_NOTICE, "soft reboot rqeuested\n"); >> - opal_queue_msg(OPAL_MSG_SHUTDOWN, NULL, NULL, SOFT_REBOOT); >> + prlog(PR_NOTICE, "Soft reboot rqeuested\n"); > > Looks like copy-parse error... s/rqeuested/requested/ .. > >> + if (!debug_descriptor.opal_boot_complete && >> + platform.cec_reboot) { >> + prlog(PR_NOTICE, "Host not up, rebooting now\n"); >> + platform.cec_reboot(); >> + } else { >> + opal_queue_msg(OPAL_MSG_SHUTDOWN, NULL, NULL, SOFT_REBOOT); >> + } > > So if platform.cec_reboot, then we will endup calling "opal_queue_msg".. which > is not correct.. > But given that cec_reboot will be set well before update opal_boot_complete > flag, probably we are fine. Looks to be same behaviour as before, correct? Not sure what else we should do? Maybe fall back to attn or something? Or just print a log message wishing the user good luck (or, more likely, the hardware/firmware/kernel developer)? :)
diff --git a/hw/ipmi/ipmi-sel.c b/hw/ipmi/ipmi-sel.c index 4626d9d..c446dfc 100644 --- a/hw/ipmi/ipmi-sel.c +++ b/hw/ipmi/ipmi-sel.c @@ -457,12 +457,24 @@ static void sel_power(uint8_t power) { switch (power) { case SOFT_OFF: - prlog(PR_NOTICE, "soft shutdown requested\n"); - opal_queue_msg(OPAL_MSG_SHUTDOWN, NULL, NULL, SOFT_OFF); + prlog(PR_NOTICE, "Soft shutdown requested\n"); + if (!debug_descriptor.opal_boot_complete && + platform.cec_power_down) { + prlog(PR_NOTICE, "Host not up, shutting down now\n"); + platform.cec_power_down(IPMI_CHASSIS_PWR_DOWN); + } else { + opal_queue_msg(OPAL_MSG_SHUTDOWN, NULL, NULL, SOFT_OFF); + } break; case SOFT_REBOOT: - prlog(PR_NOTICE, "soft reboot rqeuested\n"); - opal_queue_msg(OPAL_MSG_SHUTDOWN, NULL, NULL, SOFT_REBOOT); + prlog(PR_NOTICE, "Soft reboot rqeuested\n"); + if (!debug_descriptor.opal_boot_complete && + platform.cec_reboot) { + prlog(PR_NOTICE, "Host not up, rebooting now\n"); + platform.cec_reboot(); + } else { + opal_queue_msg(OPAL_MSG_SHUTDOWN, NULL, NULL, SOFT_REBOOT); + } break; default: prlog(PR_WARNING, "requested bad power state: %02x\n",
Our normal sequence for a soft power action (IPMI 'power soft' or 'power cycle') involve receiving a SEL from the BMC, sending a message to Linux's opal platform support which instructs the host OS to shut down, and finally the host will request OPAL to cut power. When the host is not yet up we will send the message to /dev/null, and no action will be taken. This patches changes that behaviour to perform the action immediately if we know how. Signed-off-by: Joel Stanley <joel@jms.id.au> --- hw/ipmi/ipmi-sel.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-)