summaryrefslogtreecommitdiffstats
path: root/src/usr/ipmibase
diff options
context:
space:
mode:
authorAndrew Jeffery <andrewrj@au1.ibm.com>2018-09-17 17:23:15 +0930
committerDaniel M. Crowell <dcrowell@us.ibm.com>2018-10-10 13:45:29 -0500
commitc829113199d6ee1f1788ff336a09b55b98bc3609 (patch)
tree2b684af29b43d6d6723917a5502e0d48366eaeb3 /src/usr/ipmibase
parent4874662e58d998ed49aa773d0cfe98b61e076bd5 (diff)
downloadtalos-hostboot-c829113199d6ee1f1788ff336a09b55b98bc3609.tar.gz
talos-hostboot-c829113199d6ee1f1788ff336a09b55b98bc3609.zip
pnor: Introduce an IPMI-based PNOR driver implementation
Similar to the AST MBOX implementation, the IPMI PNOR implementation negotiates the layout of the LPC FW space with the BMC, but using IPMI rather than the AST mailbox as a protocol transport. The same protocol is still used and has simply been adapted to the new interface. Note that currently the change of transport has had a 2-3x impact on boot performance. Optimisation is an ongoing effort. Change-Id: I7f838f5b5e88ac877a725386a33df58ee5e7213c Signed-off-by: Andrew Jeffery <andrewrj@au1.ibm.com> Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/65942 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/usr/ipmibase')
-rw-r--r--src/usr/ipmibase/ipmirp.C16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/usr/ipmibase/ipmirp.C b/src/usr/ipmibase/ipmirp.C
index dabbea218..665b8eb18 100644
--- a/src/usr/ipmibase/ipmirp.C
+++ b/src/usr/ipmibase/ipmirp.C
@@ -598,7 +598,16 @@ void IpmiRP::execute(void)
// bottom of this loop will start the transmit process.
// Be sure to push_back to ensure ordering of transmission.
case IPMI::MSG_STATE_SEND:
- if (!l_shutdown_pending)
+ {
+ IPMI::Message* l_ipmi_msg =
+ static_cast<IPMI::Message*>(msg->extra_data);
+ const IPMI::command_t l_pnor = IPMI::pnor_hiomap_request();
+ bool l_is_pnor = (l_ipmi_msg->iv_netfun == l_pnor.first &&
+ l_ipmi_msg->iv_cmd == l_pnor.second);
+ IPMI_TRAC(WARN_MRK "Got message (0x%x:0x%x): l_is_pnor: %d",
+ l_ipmi_msg->iv_netfun, l_ipmi_msg->iv_cmd, l_is_pnor);
+ /* PNOR requests always allowed, else we hang shutdown */
+ if (!l_shutdown_pending || l_is_pnor)
{
iv_sendq.push_back(msg);
}
@@ -606,15 +615,14 @@ void IpmiRP::execute(void)
else
{
IPMI_TRAC(WARN_MRK "IPMI shutdown pending. Message dropped");
- IPMI::Message* ipmi_msg =
- static_cast<IPMI::Message*>(msg->extra_data);
- response(ipmi_msg, IPMI::CC_BADSTATE);
+ response(l_ipmi_msg, IPMI::CC_BADSTATE);
msg_free(msg);
}
break;
// State changes from the IPMI hardware. These are async
// messages so we get rid of them here.
+ }
case IPMI::MSG_STATE_IDLE:
msg_free(msg);
// No-op - we do it at the bottom of the loop.
OpenPOWER on IntegriCloud