summaryrefslogtreecommitdiffstats
path: root/src/usr/sbeio/sbe_psuReadSeeprom.C
diff options
context:
space:
mode:
authorChristian Geddes <crgeddes@us.ibm.com>2017-10-13 14:18:17 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2017-11-17 21:05:53 -0500
commit4bfe046e2f8bedcb1ca04fdb702e11c81af46840 (patch)
tree293928b64ed4806e7e424241d874cb37f17f1d0a /src/usr/sbeio/sbe_psuReadSeeprom.C
parent5b86ae89fcd99c36516ec9bd8a597bdcf1a1ca1e (diff)
downloadtalos-hostboot-4bfe046e2f8bedcb1ca04fdb702e11c81af46840.tar.gz
talos-hostboot-4bfe046e2f8bedcb1ca04fdb702e11c81af46840.zip
Use readSeeprom PSU chipop to get SBE seeprom image version
During an SBE update we were getting I2C collisions when trying to access pnor on the "running" or "active" side of the seeprom. This commit adds support for a PSU chipOp called "readSeeprom" which allows the host to make a request to the SBE to copy a specified chunk of pnor out to a buffer in memory which the host can access. This commit also uses this chipOp in place of the I2C read during the SBE update of the active seeprom side. Change-Id: I4b639ebe6090dcc0bdbb42f13fcb12c23260a8b4 RTC: 180959 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/48408 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Matt Derksen <mderkse1@us.ibm.com> Tested-by: Jenkins OP Build CI <op-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/sbeio/sbe_psuReadSeeprom.C')
-rw-r--r--src/usr/sbeio/sbe_psuReadSeeprom.C108
1 files changed, 108 insertions, 0 deletions
diff --git a/src/usr/sbeio/sbe_psuReadSeeprom.C b/src/usr/sbeio/sbe_psuReadSeeprom.C
new file mode 100644
index 000000000..9550b0cdd
--- /dev/null
+++ b/src/usr/sbeio/sbe_psuReadSeeprom.C
@@ -0,0 +1,108 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/sbeio/sbe_psuReadSeeprom.C $ */
+/* */
+/* OpenPOWER HostBoot Project */
+/* */
+/* Contributors Listed Below - COPYRIGHT 2012,2017 */
+/* [+] International Business Machines Corp. */
+/* */
+/* */
+/* Licensed under the Apache License, Version 2.0 (the "License"); */
+/* you may not use this file except in compliance with the License. */
+/* You may obtain a copy of the License at */
+/* */
+/* http://www.apache.org/licenses/LICENSE-2.0 */
+/* */
+/* Unless required by applicable law or agreed to in writing, software */
+/* distributed under the License is distributed on an "AS IS" BASIS, */
+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
+/* implied. See the License for the specific language governing */
+/* permissions and limitations under the License. */
+/* */
+/* IBM_PROLOG_END_TAG */
+/**
+* @file sbe_psuReadSeeprom.C
+* @brief Send command to request Seeprom read on SBE
+*/
+
+#include <config.h>
+#include <trace/interface.H>
+#include <errl/errlmanager.H>
+#include <sbeio/sbeioif.H>
+#include <sbeio/sbe_psudd.H>
+
+extern trace_desc_t* g_trac_sbeio;
+
+#define SBE_TRACD(printf_string,args...) \
+TRACDCOMP(g_trac_sbeio,"psuReadSeeprom: " printf_string,##args)
+
+#define SBE_TRACF(printf_string,args...) \
+TRACFCOMP(g_trac_sbeio,"psuReadSeeprom: " printf_string,##args)
+
+namespace SBEIO
+{
+
+ /**
+ * @brief Sends a PSU chipOp to request Seeprom read from SBE
+ *
+ * @param[in] i_target Target with SBE to send read request to
+ * @param[in] i_seepromOffset Offset in the seeprom image where we want
+ * to start copying from (ignores ECC)
+ * @param[in] i_readSize Amount of bytes we want to copy (ignores ECC)
+ * @param[in] i_destAddr Address that hostboot has prepared which the
+ * sbe will write too
+ * @param[out] o_opSupported Bool which tells us if the sbe supports the
+ * chipOp or not
+ *
+ * @return errlHndl_t Error log handle on failure.
+ *
+ */
+ errlHndl_t sendPsuReadSeeprom(TARGETING::Target * i_target,
+ uint32_t i_seepromOffset,
+ uint32_t i_readSize,
+ uint64_t i_destAddr,
+ bool & o_opSupported)
+ {
+ errlHndl_t errl = nullptr;
+
+ SBE_TRACD(ENTER_MRK "sending psu seeprom read request command from HB -> SBE");
+
+ // set up PSU command message
+ SbePsu::psuCommand l_psuCommand(
+ SbePsu::SBE_REQUIRE_RESPONSE |
+ SbePsu::SBE_REQUIRE_ACK, //control flags
+ SbePsu::SBE_PSU_GENERIC_MESSAGE, //command class
+ SbePsu::SBE_PSU_READ_SEEPROM); //command
+ SbePsu::psuResponse l_psuResponse;
+
+ l_psuCommand.cd7_readSeeprom_SeepromOffset = i_seepromOffset;
+ l_psuCommand.cd7_readSeeprom_ReadSize = i_readSize;
+ l_psuCommand.cd7_readSeeprom_DestinationAddr = i_destAddr;
+
+
+ errl = SBEIO::SbePsu::getTheInstance().performPsuChipOp(i_target,
+ &l_psuCommand,
+ &l_psuResponse,
+ SbePsu::MAX_PSU_SHORT_TIMEOUT_NS,
+ SbePsu::SBE_READ_SEEPROM_REQ_USED_REGS,
+ SbePsu::SBE_READ_SEEPROM_RSP_USED_REGS);
+
+ if(l_psuResponse.primaryStatus == SBE_PRI_INVALID_COMMAND &&
+ l_psuResponse.secondaryStatus == SBE_SEC_COMMAND_NOT_SUPPORTED)
+ {
+ SBE_TRACF(ENTER_MRK "SBE firmware level does not support PSU Seeprom Read Requests");
+ //Make sure we aren't passing out any errors if the command isn't supported
+ delete errl;
+ errl = nullptr;
+ o_opSupported = false;
+ }
+
+ SBE_TRACD(EXIT_MRK "sendPsuReadSeeprom");
+
+ return errl;
+ };
+
+} //end namespace SBEIO
+
OpenPOWER on IntegriCloud