diff options
author | Andrew Jeffery <andrewrj@au1.ibm.com> | 2018-09-17 17:23:15 +0930 |
---|---|---|
committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2018-10-10 13:45:29 -0500 |
commit | c829113199d6ee1f1788ff336a09b55b98bc3609 (patch) | |
tree | 2b684af29b43d6d6723917a5502e0d48366eaeb3 /src/usr/ipmibase/ipmirp.C | |
parent | 4874662e58d998ed49aa773d0cfe98b61e076bd5 (diff) | |
download | talos-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/ipmirp.C')
-rw-r--r-- | src/usr/ipmibase/ipmirp.C | 16 |
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. |