summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMissy Connell <missyc@us.ibm.com>2013-02-20 16:30:51 -0600
committerA. Patrick Williams III <iawillia@us.ibm.com>2013-04-09 14:33:13 -0500
commit63b344dd0fcbd2318a8fd46978970a08f3eb9ca9 (patch)
treeac68337341709cee0a5ccc54936c0557b2238170 /src
parent84d81bdda49213dcde23c604a2d6ab7ace90f1d6 (diff)
downloadtalos-hostboot-63b344dd0fcbd2318a8fd46978970a08f3eb9ca9.tar.gz
talos-hostboot-63b344dd0fcbd2318a8fd46978970a08f3eb9ca9.zip
Call Dump Collect from call_host_mpipl_service
Change-Id: I4c449177618f00d64b90b81403144649d0df756f RTC:46996 Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/3339 Tested-by: Jenkins Server Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src')
-rw-r--r--src/include/usr/dump/dumpif.H168
-rw-r--r--src/include/usr/dump/dumpreasoncodes.H1
-rw-r--r--src/include/usr/isteps/istep14list.H1
-rw-r--r--src/include/usr/mbox/mbox_queues.H49
-rw-r--r--src/include/usr/vmmconst.h33
-rw-r--r--src/usr/dump/dumpCollect.C230
-rw-r--r--src/usr/dump/dumpCollect.H58
-rw-r--r--src/usr/dump/test/dumptest.H78
-rw-r--r--src/usr/hwpf/hwp/dram_initialization/dram_initialization.C171
-rw-r--r--src/usr/initservice/extinitsvc/extinitsvctasks.H11
-rw-r--r--src/usr/runtime/hdatservice.C1
11 files changed, 613 insertions, 188 deletions
diff --git a/src/include/usr/dump/dumpif.H b/src/include/usr/dump/dumpif.H
new file mode 100644
index 000000000..21d50f677
--- /dev/null
+++ b/src/include/usr/dump/dumpif.H
@@ -0,0 +1,168 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/dump/dumpif.H $ */
+/* */
+/* IBM CONFIDENTIAL */
+/* */
+/* COPYRIGHT International Business Machines Corp. 2012,2013 */
+/* */
+/* p1 */
+/* */
+/* Object Code Only (OCO) source materials */
+/* Licensed Internal Code Source Materials */
+/* IBM HostBoot Licensed Internal Code */
+/* */
+/* The source code for this program is not published or otherwise */
+/* divested of its trade secrets, irrespective of what has been */
+/* deposited with the U.S. Copyright Office. */
+/* */
+/* Origin: 30 */
+/* */
+/* IBM_PROLOG_END_TAG */
+#ifndef __DUMPIF_H
+#define __DUMPIF_H
+
+/** @file dumpif.H
+ * @brief Provides the external interfaces for dump.
+ * - copy dump data from src to destination
+ * - Send Mbox Msg for dump status
+ */
+
+namespace DUMP
+{
+
+
+ /**
+ * @brief DUMP Message Types
+ */
+
+ enum DUMP_MSG_TYPE
+ {
+ DUMP_MSG_START_MSG_TYPE = 0x000000B1,
+ DUMP_MSG_END_MSG_TYPE = 0x000000B2,
+ DUMP_MSG_ERROR_MSG_TYPE = 0x000000B3,
+
+ };
+
+ // The following are #defines needed for Dump Testing.. These are the
+ // default memory locations for MDST, MDDT, MDRT when running withoutPHYPab
+ // The data range is defined in vmmconst.h so this test space is saved.
+
+ /* Chunk of physical memory used for Dump Source Table */
+ #define DUMP_TEST_SRC_MEM_ADDR DUMP_TEST_MEMORY_ADDR
+ #define DUMP_TEST_SRC_MEM_SIZE MEGABYTE
+
+ /* Chunk of physical memory used for Dump Destination Table */
+ #define DUMP_TEST_DST_MEM_ADDR (DUMP_TEST_SRC_MEM_ADDR + \
+ DUMP_TEST_SRC_MEM_SIZE)
+
+
+ #define DUMP_TEST_DST_MEM_SIZE MEGABYTE
+
+ /* Chunk of physical memory used for Dump Results Table */
+ #define DUMP_TEST_RESULTS_MEM_ADDR (DUMP_TEST_DST_MEM_ADDR + \
+ DUMP_TEST_DST_MEM_SIZE)
+
+
+ #define DUMP_TEST_RESULTS_MEM_SIZE MEGABYTE
+
+ // Data location where the src, destination tables point to. (The actual
+ // data)
+ #define DUMP_TEST_SRC_DATA_AREA (DUMP_TEST_RESULTS_MEM_ADDR + \
+ DUMP_TEST_RESULTS_MEM_SIZE)
+
+
+ #define DUMP_TEST_DST_DATA_AREA (DUMP_TEST_SRC_DATA_AREA + \
+ DUMP_TEST_DATA_SIZE)
+
+ #define DUMP_TEST_DATA_SIZE MEGABYTE
+
+ // default enums to point out the start and end of the DUMP Tables in memory
+ #define DUMP_TEST_TABLE_START DUMP_TEST_SRC_MEM_ADDR
+ #define DUMP_TEST_TABLE_SIZE (DUMP_TEST_SRC_MEM_SIZE + \
+ DUMP_TEST_DST_MEM_SIZE + DUMP_TEST_RESULTS_MEM_SIZE)
+
+
+ #define DUMP_TEST_TABLE_END (DUMP_TEST_TABLE_START + DUMP_TEST_TABLE_SIZE)
+
+ // In addition to the dump table locations we have scratch data area that is
+ // used to put the SRC data that the MDST will point to.
+
+ // This is the size of all the Data used for Dump testing
+ #define DUMP_TEST_ALL_SIZE (DUMP_TEST_TABLE_SIZE + (2*MEGABYTE))
+
+ // This is the ending address of test Data area
+ #define DUMP_TEST_ALL_END (DUMP_TEST_TABLE_START + DUMP_TEST_ALL_SIZE)
+
+
+ //These structures are defined in the HDAT spec
+ //The MDST and MDDT have this format.
+ struct dumpEntry
+ {
+ uint64_t dataAddr;
+ uint64_t dataSize;
+ };
+
+ //The MDRT has this format.
+ struct resultsEntry
+ {
+ uint64_t srcAddr;
+ uint64_t destAddr;
+ uint64_t dataSize;
+ };
+
+
+ /**
+ * @brief This function is a wrapper function that calls
+ * getHostDataPtrs to get the MDDT, MDST, MDRT pointers
+ * and then passes those values to the copySrcToDest
+ * routine that performs the copy
+ *
+ * @param[in] void
+ *
+ * @return errlHndl_t
+ */
+ errlHndl_t doDumpCollect(void);
+
+ /**
+ * @brief This function copies the data and sizes retrieved from the
+ * MDST(source table) to the addresses indicated by the MDDT(destination
+ * table). Each write is then logged in the MDRT (results table) with
+ * source addr, destination addr and size
+ *
+ * @param[in] srcTableEntry Ptr to the first MDST entry
+ * @param[in] srcTableSize Size of the entire MDST
+ *
+ * @param[in] destTableAddr Ptr to the first MDDT entry
+ * @param[in] destTableSize Size of the entire MDDT
+ *
+ * @param[in] resultsTableAddr Ptr to the first MDRT entry
+ * @param[in] resultsTableSize Size of the entire MDRT
+ *
+ * @return errlHndl_t
+ */
+ errlHndl_t copySrcToDest(dumpEntry *srcTableEntry, uint64_t srcTableSize,
+ dumpEntry *destTableEntry, uint64_t destTableSize,
+ resultsEntry *resultsTableEntry,
+ uint64_t resultsTableSize);
+
+ /**
+ * @brief This function handles sending the mailbox message to the Fsp to
+ * notify of Dump Status. Start, error or complete. If Error or
+ * complete types are requested, the dump results table is passed
+ * to the FSP.
+ *
+ * @param[in] i_type - The type of DUMP msg being written.
+ *
+ * @return errlHndl_t - NULL if successful, otherwise a pointer to the error
+ * log.
+ */
+ errlHndl_t sendMboxMsg (DUMP_MSG_TYPE i_type);
+
+
+
+} // end of namespace
+
+
+#endif
diff --git a/src/include/usr/dump/dumpreasoncodes.H b/src/include/usr/dump/dumpreasoncodes.H
index 9f1da4353..1bd2aaf11 100644
--- a/src/include/usr/dump/dumpreasoncodes.H
+++ b/src/include/usr/dump/dumpreasoncodes.H
@@ -31,6 +31,7 @@ namespace DUMP
{
DUMP_COLLECT_INVALID = 0x00,
DUMP_COLLECT = 0x01,
+ DUMP_SEND_MBOX_MSG = 0x02,
};
enum dumpReasonCode
diff --git a/src/include/usr/isteps/istep14list.H b/src/include/usr/isteps/istep14list.H
index 5aa93574c..04ba0d3cd 100644
--- a/src/include/usr/isteps/istep14list.H
+++ b/src/include/usr/isteps/istep14list.H
@@ -182,6 +182,7 @@ namespace INITSERVICE
const DepModInfo g_istep14Dependancies = {
{
DEP_LIB(libdram_initialization.so),
+ DEP_LIB(libdump.so),
{ 0 },
}
};
diff --git a/src/include/usr/mbox/mbox_queues.H b/src/include/usr/mbox/mbox_queues.H
index e60546558..094811d53 100644
--- a/src/include/usr/mbox/mbox_queues.H
+++ b/src/include/usr/mbox/mbox_queues.H
@@ -1,26 +1,25 @@
-/* IBM_PROLOG_BEGIN_TAG
- * This is an automatically generated prolog.
- *
- * $Source: src/include/usr/mbox/mbox_queues.H $
- *
- * IBM CONFIDENTIAL
- *
- * COPYRIGHT International Business Machines Corp. 2012
- *
- * p1
- *
- * Object Code Only (OCO) source materials
- * Licensed Internal Code Source Materials
- * IBM HostBoot Licensed Internal Code
- *
- * The source code for this program is not published or other-
- * wise divested of its trade secrets, irrespective of what has
- * been deposited with the U.S. Copyright Office.
- *
- * Origin: 30
- *
- * IBM_PROLOG_END_TAG
- */
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/include/usr/mbox/mbox_queues.H $ */
+/* */
+/* IBM CONFIDENTIAL */
+/* */
+/* COPYRIGHT International Business Machines Corp. 2012,2013 */
+/* */
+/* p1 */
+/* */
+/* Object Code Only (OCO) source materials */
+/* Licensed Internal Code Source Materials */
+/* IBM HostBoot Licensed Internal Code */
+/* */
+/* The source code for this program is not published or otherwise */
+/* divested of its trade secrets, irrespective of what has been */
+/* deposited with the U.S. Copyright Office. */
+/* */
+/* Origin: 30 */
+/* */
+/* IBM_PROLOG_END_TAG */
#ifndef __MBOX_QUEUES_H
#define __MBOX_QUEUES_H
@@ -59,9 +58,9 @@ namespace MBOX
FSP_PROGRESS_CODES_MSGQ = 0x80000003,
FSP_ERROR_MSGQ = 0x80000004,
FSP_VDDR_MSGQ = 0x80000005,
- IPL_SERVICE_QUEUE = 0x80000008, // Defined by Fsp team
+ IPL_SERVICE_QUEUE = 0x80000008,
FSP_ATTR_SYNC_MSGQ = 0x80000009,
- // 0x8000000A, // Reserved for VID
+ FSP_DUMP_MSGQ_ID = 0x8000000A,
FSP_HWPF_ATTR_MSGQ = 0x8000000B, // HWPF Attribute override/sync
FSP_VPD_MSGQ = 0x8000000C,
diff --git a/src/include/usr/vmmconst.h b/src/include/usr/vmmconst.h
index d3b29415e..1c5ae6d01 100644
--- a/src/include/usr/vmmconst.h
+++ b/src/include/usr/vmmconst.h
@@ -130,41 +130,8 @@ enum BlockPriority
#define HSVC_TEST_MEMORY_SIZE (2*MEGABYTE)
/* Chunk of physical memory used for Dump Source Table */
-//#define DUMP_TEST_SRC_MEM_ADDR (VMM_MEMORY_SIZE + 64*MEGABYTE)
#define DUMP_TEST_MEMORY_ADDR (HSVC_TEST_MEMORY_ADDR + HSVC_TEST_MEMORY_SIZE)
#define DUMP_TEST_MEMORY_SIZE (4*MEGABYTE)
-// The rest of these #defines will be moved to dumpif.H.
-
-#define DUMP_TEST_SRC_MEM_ADDR (HSVC_TEST_MEMORY_ADDR + HSVC_TEST_MEMORY_SIZE)
-#define DUMP_TEST_SRC_MEM_SIZE (MEGABYTE)
-
-/* Chunk of physical memory used for Dump Destination Table */
-#define DUMP_TEST_DST_MEM_ADDR (DUMP_TEST_SRC_MEM_ADDR + DUMP_TEST_SRC_MEM_SIZE)
-#define DUMP_TEST_DST_MEM_SIZE (MEGABYTE)
-
-/* Chunk of physical memory used for Dump Results Table */
-#define DUMP_TEST_RESULTS_MEM_ADDR (DUMP_TEST_DST_MEM_ADDR + DUMP_TEST_DST_MEM_SIZE)
-#define DUMP_TEST_RESULTS_MEM_SIZE (MEGABYTE)
-
-// Data location where the src, destination tables point to.
-#define DUMP_TEST_SRC_DATA_AREA DUMP_TEST_RESULTS_MEM_ADDR + DUMP_TEST_RESULTS_MEM_SIZE
-#define DUMP_TEST_DST_DATA_AREA DUMP_TEST_SRC_DATA_AREA + DUMP_TEST_DATA_SIZE
-#define DUMP_TEST_DATA_SIZE MEGABYTE
-
-// default enums to point out the start and end of the DUMP Tables in memory
-#define DUMP_TEST_TABLE_START DUMP_TEST_SRC_MEM_ADDR
-#define DUMP_TEST_TABLE_SIZE DUMP_TEST_SRC_MEM_SIZE + DUMP_TEST_DST_MEM_SIZE + DUMP_TEST_RESULTS_MEM_SIZE
-#define DUMP_TEST_TABLE_END DUMP_TEST_TABLE_START + DUMP_TEST_TABLE_SIZE
-
-// In addition to the dump table locations we have scratch data area that is used
-// to put the SRC data that the MDST will point to.
-
-// This is the size of all the Data used for Dump testing
-#define DUMP_TEST_ALL_SIZE = DUMP_TEST_TABLE_SIZE + (2*MEGABYTE)
-// This is the ending address of test Data area
-#define DUMP_TEST_ALL_END = DUMP_TEST_TABLE_START + DUMP_TEST_ALL_SIZE
-
-
#endif /* _VMMCONST_H */
diff --git a/src/usr/dump/dumpCollect.C b/src/usr/dump/dumpCollect.C
index 1a23a9757..4af04ec71 100644
--- a/src/usr/dump/dumpCollect.C
+++ b/src/usr/dump/dumpCollect.C
@@ -34,7 +34,10 @@
#include <runtime/runtime.H>
#include <util/align.H>
#include <sys/mm.h>
+#include <dump/dumpif.H>
+#include <sys/msg.h> // message Q's
+#include <mbox/mbox_queues.H> //
// Trace definition
trace_desc_t* g_trac_dump = NULL;
@@ -45,7 +48,6 @@ namespace DUMP
{
-
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
@@ -67,29 +69,29 @@ namespace DUMP
do
{
- // Get the Data pointers to the locations we need from HDAT
- // MS_DUMP_SRC_TBL, < MDST: Memory Dump Source Table
- // MS_DUMP_DST_TBL, < MDDT: Memory Dump Destination Table
- // MS_DUMP_RESULTS_TBL, <MDRT:Memory Dump Results Table
- l_err = getHostDataPtrs(srcTableEntry, srcTableSize,
- destTableEntry, destTableSize,
- resultsTableEntry, resultsTableSize);
-
- if (l_err)
- {
- TRACFCOMP(g_trac_dump, "doDumpCollect: Got an error back from getHostDataPtrs");
- break;
- }
+ // Get the Data pointers to the locations we need from HDAT
+ // MS_DUMP_SRC_TBL, < MDST: Memory Dump Source Table
+ // MS_DUMP_DST_TBL, < MDDT: Memory Dump Destination Table
+ // MS_DUMP_RESULTS_TBL, <MDRT:Memory Dump Results Table
+ l_err = getHostDataPtrs(srcTableEntry, srcTableSize,
+ destTableEntry, destTableSize,
+ resultsTableEntry, resultsTableSize);
- l_err = copySrcToDest(srcTableEntry,srcTableSize,
- destTableEntry,destTableSize,
- resultsTableEntry,resultsTableSize);
+ if (l_err)
+ {
+ TRACFCOMP(g_trac_dump, "doDumpCollect: Got an error back from getHostDataPtrs");
+ break;
+ }
- if (l_err)
- {
- TRACFCOMP(g_trac_dump, "doDumpCollect: Got an error back from copySrcToDest");
- break;
- }
+ l_err = copySrcToDest(srcTableEntry,srcTableSize,
+ destTableEntry,destTableSize,
+ resultsTableEntry,resultsTableSize);
+
+ if (l_err)
+ {
+ TRACFCOMP(g_trac_dump, "doDumpCollect: Got an error back from copySrcToDest");
+ break;
+ }
}while (0);
@@ -97,8 +99,8 @@ namespace DUMP
}
-///////////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////////
errlHndl_t copySrcToDest(dumpEntry *srcTableEntry, uint64_t srcTableSize,
dumpEntry *destTableEntry, uint64_t destTableSize,
@@ -188,13 +190,13 @@ namespace DUMP
vaMapSrcTableAddr =
(static_cast<uint64_t*>(mmio_dev_map(reinterpret_cast<void*>(ALIGN_PAGE_DOWN(curSrcTableAddr)),
- THIRTYTWO_GB)));
+ THIRTYTWO_GB)));
vaSrcTableAddr = vaMapSrcTableAddr;
vaMapDestTableAddr =
(static_cast<uint64_t*>(mmio_dev_map(reinterpret_cast<void*>(ALIGN_PAGE_DOWN(curDestTableAddr)),
- THIRTYTWO_GB)));
+ THIRTYTWO_GB)));
vaDestTableAddr = vaMapDestTableAddr;
@@ -271,9 +273,9 @@ namespace DUMP
// map the MDST entry to a device such that we can read and write from that memory
// address
- vaMapSrcTableAddr =
- (static_cast<uint64_t*>(mmio_dev_map(reinterpret_cast<void*>(ALIGN_PAGE_DOWN(curSrcTableAddr)),
- THIRTYTWO_GB)));
+ vaMapSrcTableAddr =
+ (static_cast<uint64_t*>(mmio_dev_map(reinterpret_cast<void*>(ALIGN_PAGE_DOWN(curSrcTableAddr)),
+ THIRTYTWO_GB)));
vaSrcTableAddr = vaMapSrcTableAddr;
@@ -392,7 +394,7 @@ namespace DUMP
// size.. Perhaps put the bad destination entry
// there as well
}
-
+
break;
}
@@ -603,7 +605,7 @@ namespace DUMP
// Invalid size or address
TRACFCOMP(g_trac_dump,
"HBDumpGetHostData address or size invalie for MDDT: addr =0x%X, size =0x%X," ,
- destTableAddr, destTableSize);
+ destTableAddr, destTableSize);
l_section = RUNTIME::MS_DUMP_DST_TBL;
l_addr = destTableAddr;
@@ -636,7 +638,7 @@ namespace DUMP
// Invalid size or address
TRACFCOMP(g_trac_dump,
"HBDumpGetHostData address or size invalid for MDRT: addr =0x%X, size =0x%X," ,
- resultsTableAddr, resultsTableSize);
+ resultsTableAddr, resultsTableSize);
l_section = RUNTIME::MS_DUMP_RESULTS_TBL;
l_addr = resultsTableAddr;
@@ -678,4 +680,166 @@ namespace DUMP
}
-}
+ // ------------------------------------------------------------------
+ // sendMboxMsg
+ // ------------------------------------------------------------------
+ errlHndl_t sendMboxMsg(DUMP_MSG_TYPE i_type)
+
+ {
+ errlHndl_t l_err = NULL;
+ msg_t* msg = NULL;
+ TRACFCOMP( g_trac_dump,
+ ENTER_MRK"sendMboxMsg()" );
+
+ do
+ {
+
+ //Create a mailbox message to send to FSP
+ msg = msg_allocate();
+ msg->type = i_type;
+
+ // If this is not a dump start message, need to collect the
+ // Results table and size as well as the results table itself.
+ if (i_type != DUMP_MSG_START_MSG_TYPE)
+ {
+ uint64_t resultsTableAddr = 0;
+ uint64_t resultsTableSize = 0;
+
+ // Get the Results Table Address
+ l_err =
+ RUNTIME::get_host_data_section(RUNTIME::MS_DUMP_RESULTS_TBL,
+ 0,
+ resultsTableAddr,
+ resultsTableSize);
+
+
+ if (l_err)
+ {
+ // Got an errorlog back from get_host_data_sections
+ TRACFCOMP(g_trac_dump, "HBDumpGetHostData get_host_data_sections for MDDT failed rc=0x%X", l_err->reasonCode());
+ }
+ // If the address or size is zero - error out
+ else if ((resultsTableSize == 0) || (resultsTableAddr == 0))
+ {
+ // Invalid size or address
+ TRACFCOMP(g_trac_dump,
+ "HBDumpGetHostData address or size invalid for MDRT: addr =0x%X, size =0x%X," ,
+ resultsTableAddr, resultsTableSize);
+
+
+ // Create an errorlog and change the type to error and add
+ // the plid to the data section.
+
+ /*@
+ * @errortype
+ * @moduleid DUMP::DUMP_SEND_MBOX_MSG
+ * @reasoncode DUMP::DUMP_NO_HDAT_ADDR
+ * @userdata1 Address returned
+ * @userdata2 Table type Requested
+ * @devdesc Invalid address and size returned from HDAT
+ */
+ l_err =
+ new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE,
+ DUMP_SEND_MBOX_MSG,
+ DUMP_NO_HDAT_ADDR,
+ resultsTableAddr,
+ i_type);
+
+ }
+
+ // if no error then collect as expected.
+ if (!l_err)
+ {
+
+ // TODO: Issue RTC 67082 - fix sending the MDRT
+ // to FSP once we have a design that can send the
+ // entire table.. Max size is 512K - truncating to
+ // 32K for the time being.
+ uint64_t l_resultsTableSize = resultsTableSize;
+
+ // If the results table is greater than 32K truncate it.
+ if (resultsTableSize > (32*KILOBYTE))
+ {
+ // Set the results table size to only include up to
+ // 32K
+ l_resultsTableSize = (32*KILOBYTE);
+
+ TRACFCOMP( g_trac_dump,
+ INFO_MRK"Truncating the RESULTS table to 32K for dump msg type =. %.8X,",
+ i_type);
+
+ }
+
+ // TODO: RTC 67082 - Need to make sure we put the physical
+ // Address here.
+
+ // Address of the results table
+ msg->data[0] = resultsTableAddr;
+
+ // Number of bytes in the results table
+ msg->data[1] = l_resultsTableSize;
+
+ //Copy the Results table into the message
+ msg->extra_data = malloc( l_resultsTableSize );
+
+ memcpy( msg->extra_data,
+ reinterpret_cast<uint64_t*>(resultsTableAddr),
+ l_resultsTableSize);
+
+
+ }
+ else
+ {
+ TRACFCOMP( g_trac_dump,
+ INFO_MRK"Got an error trying to send msg. %.8X,",
+ i_type);
+
+ // change the msg type to be error type
+ i_type = DUMP_MSG_ERROR_MSG_TYPE;
+
+ l_err->collectTrace("DUMP",1024);
+
+ // Put a default value into the data[0] indicating plid to in data[1]
+ msg->data[0] = 0xFFFF;
+
+ msg->data[1] = l_err->plid(); // plid
+
+ // just commit the log from failure on Read.. and
+ // send an error msg to FSP.
+ errlCommit( l_err, DUMP_COMP_ID );
+ l_err = NULL;
+
+ }
+ }
+
+
+ TRACFCOMP( g_trac_dump,
+ INFO_MRK"Send msg to FSP about DUMP %.8X,",
+ i_type);
+
+ // Send the message
+ l_err = MBOX::send( MBOX::FSP_DUMP_MSGQ_ID, msg );
+
+ // got an error.. Free the msg space allocated above.
+ if( l_err )
+ {
+ TRACFCOMP(g_trac_dump,
+ ERR_MRK "Failed sending DUMP to FSP for %.8X",i_type);
+
+ l_err->collectTrace("DUMP",1024);
+
+ free( msg->extra_data );
+ msg->extra_data = NULL;
+ msg_free( msg );
+ }
+ } while( 0 );
+
+
+ TRACFCOMP( g_trac_dump,
+ EXIT_MRK"sendMboxMsg()" );
+
+ return l_err;
+ }
+
+
+}; // end of namespace
diff --git a/src/usr/dump/dumpCollect.H b/src/usr/dump/dumpCollect.H
index 282a13886..3272c401d 100644
--- a/src/usr/dump/dumpCollect.H
+++ b/src/usr/dump/dumpCollect.H
@@ -24,65 +24,15 @@
#define __DUMPCOLLECT_H
#include <errl/errlentry.H>
-
+#include <dump/dumpif.H>
/** @file dumpCollect.H
- * @brief Provides the interfaces to copy dump data from src to destination
+ * @brief Provides the interfaces to get the host data pointers for the
+ * dump tables.
*/
namespace DUMP
{
- //These structures are defined in the HDAT spec
- //The MDST and MDDT have this format.
- struct dumpEntry
- {
- uint64_t dataAddr;
- uint64_t dataSize;
- };
-
-
- //The MDRT has this format.
- struct resultsEntry
- {
- uint64_t srcAddr;
- uint64_t destAddr;
- uint64_t dataSize;
- };
-
-
- /**
- * @brief This function is a wrapper function that calls
- * getHostDataPtrs to get the MDDT, MDST, MDRT pointers
- * and then passes those values to the copySrcToDest
- * routine that performs the copy
- *
- * @param[in] void
- *
- * @return errlHndl_t
- */
- errlHndl_t doDumpCollect(void);
-
- /**
- * @brief This function copies the data and sizes retrieved from the
- * MDST(source table) to the addresses indicated by the MDDT(destination
- * table). Each write is then logged in the MDRT (results table) with
- * source addr, destination addr and size
- *
- * @param[in] srcTableEntry Ptr to the first MDST entry
- * @param[in] srcTableSize Size of the entire MDST
- *
- * @param[in] destTableAddr Ptr to the first MDDT entry
- * @param[in] destTableSize Size of the entire MDDT
- *
- * @param[in] resultsTableAddr Ptr to the first MDRT entry
- * @param[in] resultsTableSize Size of the entire MDRT
- *
- * @return errlHndl_t
- */
- errlHndl_t copySrcToDest(dumpEntry *srcTableEntry, uint64_t srcTableSize,
- dumpEntry *destTableEntry, uint64_t destTableSize,
- resultsEntry *resultsTableEntry, uint64_t resultsTableSize);
-
/**
* @brief This routine retrieves first entry of the MDST, MDDT and
* MDRT and the size of each of those tables.
@@ -103,7 +53,7 @@ namespace DUMP
resultsEntry *resultsTableEntry,uint64_t &resultsTableSize);
-}
+}; // end of namespace
#endif
diff --git a/src/usr/dump/test/dumptest.H b/src/usr/dump/test/dumptest.H
index a0fa852d1..7b9d16385 100644
--- a/src/usr/dump/test/dumptest.H
+++ b/src/usr/dump/test/dumptest.H
@@ -35,13 +35,12 @@
#include <errl/errlentry.H>
#include <devicefw/userif.H>
#include <targeting/common/util.H>
-#include "../dumpCollect.H"
#include <runtime/runtime.H>
-#include <usr/vmmconst.h>
#include <sys/mmio.h>
#include <util/align.H>
#include <sys/mm.h>
-
+#include <dump/dumpif.H>
+#include <vfs/vfs.H>
extern trace_desc_t* g_trac_dump;
@@ -49,6 +48,35 @@ class DumpTest: public CxxTest::TestSuite
{
public:
+ // Load the dump module as it is loaded on demand
+ DumpTest(): CxxTest::TestSuite()
+ {
+ errlHndl_t l_err = VFS::module_load( "libdump.so" );
+
+ if (l_err)
+ {
+ TRACFCOMP(g_trac_dump, "DumpTest:DumpTest> got an error back from moduleLoad : RC=%X",l_err->reasonCode() );
+ TS_FAIL( "DumpTest::DumpTest ERROR : Unexpected error log from moduleLoad" );
+ errlCommit(l_err,DUMP_COMP_ID);
+
+ }
+ };
+
+ // unload the dump module
+ ~DumpTest()
+ {
+ // Need to unload the dump module regardless of whether we have
+ // an error or not.
+ errlHndl_t l_err = VFS::module_unload( "libdump.so" );
+
+ if (l_err)
+ {
+ TRACFCOMP(g_trac_dump, "DumpTest:~DumpTest> got an error back from moduleUnLoad : RC=%X",l_err->reasonCode() );
+ TS_FAIL( "DumpTest::DumpTest ERROR : Unexpected error log from moduleUnLoad" );
+ errlCommit(l_err,DUMP_COMP_ID);
+
+ }
+ };
/**
* @brief Basic dump test that has sequential src addresses to
@@ -1041,7 +1069,7 @@ class DumpTest: public CxxTest::TestSuite
TRACFCOMP(g_trac_dump, "DumpTest::DumpCollectUnevenSRC:1 : Results Data mismatch rc = %d", result_rc);
TS_FAIL( "DumpTest::DumpCollectUnevenSrc ERROR : Unexpected error data mismatch in results table" );
}
-
+
TRACFCOMP( g_trac_dump, "dumpTest::test_dumpCollectUnevenSrc COMPLETE" );
}
@@ -1049,7 +1077,9 @@ class DumpTest: public CxxTest::TestSuite
/**
* @brief Basic dump test that forces an error condition that does not have
- * enough destination space to hold the src size
+ * enough destination space to hold the src size.
+ * This testcase also verifies that we can send a mbox message with
+ * dump status to the FSP.
*
*/
@@ -1164,23 +1194,42 @@ class DumpTest: public CxxTest::TestSuite
index+=2;
}
+ l_err = DUMP::sendMboxMsg(DUMP::DUMP_MSG_START_MSG_TYPE);
+ // On the end message queue we need to add the results talble..
+ if (l_err)
+ {
+ TRACFCOMP(g_trac_dump,
+ "DumpTest::DumpCollectNotEnoughDest ERROR : Got an errorlog back from sendMboxMsg-start");
+ TS_FAIL(
+ "DumpTest::DumpCollectNotEnoughDest ERROR : Got an errorlog back from sendMboxMsg-start" );
+ errlCommit(l_err,DUMP_COMP_ID);
+ }
srcTableEntry = reinterpret_cast<DUMP::dumpEntry *>(srcTableAddr);
destTableEntry = reinterpret_cast<DUMP::dumpEntry *>(dstTableAddr);
resultsTableEntry = reinterpret_cast<DUMP::resultsEntry *>(resultsTableAddr);
-
l_err = DUMP::copySrcToDest(srcTableEntry,srcTableSize,
destTableEntry,dstTableSize,
resultsTableEntry,resultsTableSize);
-
// this testcase expects an error returned.
if( l_err )
{
+
TRACFCOMP(g_trac_dump,
"DumpTest::DumpCollectNotEnoughDest got an EXPECTED error back from copySrcToDest : RC=%X",l_err->reasonCode() );
delete l_err;
+
+ // Send an Error mbox msg to FSP that we got an error
+ l_err = DUMP::sendMboxMsg(DUMP::DUMP_MSG_ERROR_MSG_TYPE);
+
+ if (l_err)
+ {
+ TRACFCOMP(g_trac_dump,
+ "DumpTest::DumpCollectNotEnoughDest ERROR : Got an errorlog back from sendMboxMsg-error");
+ TS_FAIL( "DumpTest::DumpCollectNotEnoughDest ERROR : Got an errorlog back from sendMboxMsg-error" );
+ }
}
else
{
@@ -1190,6 +1239,21 @@ class DumpTest: public CxxTest::TestSuite
}
+ // This call is just to verify we can call MSG_END .. even though with
+ // this flow we already sent a msg ERROR.
+
+
+ // Successful so send mbox message indicating the dump is complete and successful
+ l_err = DUMP::sendMboxMsg(DUMP::DUMP_MSG_END_MSG_TYPE);
+
+ if (l_err)
+ {
+ TRACFCOMP(g_trac_dump,
+ "DumpTest::DumpCollectNotEnoughDest ERROR : Got an errorlog back from sendMboxMsg-END");
+ TS_FAIL( "DumpTest::DumpCollectNotEnoughDest ERROR : Got an errorlog back from sendMboxMsg-END" );
+ }
+
+
TRACFCOMP( g_trac_dump, "dumpTest::test_dumpCollectNotEnoughDest COMPLETE" );
}
diff --git a/src/usr/hwpf/hwp/dram_initialization/dram_initialization.C b/src/usr/hwpf/hwp/dram_initialization/dram_initialization.C
index 3ae989ddc..c0eae1734 100644
--- a/src/usr/hwpf/hwp/dram_initialization/dram_initialization.C
+++ b/src/usr/hwpf/hwp/dram_initialization/dram_initialization.C
@@ -75,7 +75,8 @@
#include <vpd/spdenums.H>
#include <sys/time.h>
#include <sys/mm.h>
-
+#include <dump/dumpif.H>
+#include <vfs/vfs.H>
namespace DRAM_INITIALIZATION
{
@@ -706,39 +707,46 @@ void* call_proc_exit_cache_contained( void *io_pArgs )
"ERROR : call_proc_exit_cache_contained, errorlog PLID=0x%x",
l_errl->plid() );
}
+ // no errors so extend VMM.
else
{
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
"SUCCESS : call_proc_exit_cache_contained" );
- }
- // Call the function to extend VMM to 32MEG
- int rc = mm_extend();
- if (rc!=0)
- {
- /*@
- * @errortype
- * @moduleid fapi::MOD_EXIT_CACHE_CONTAINED
- * @reasoncode fapi::RC_MM_EXTEND_FAILED
- * @userdata1 rc from mm_extend
- * @userdata2 <UNUSED>
- *
- * @devdesc Failure extending memory to 32MEG after
- * exiting cache contained mode.
- */
- l_errl = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE,
- fapi::MOD_EXIT_CACHE_CONTAINED,
- fapi::RC_MM_EXTEND_FAILED,
- rc,
- 0);
+ // Call the function to extend VMM to 32MEG
+ int rc = mm_extend();
- TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
- "ERROR : call_proc_exit_cache_contained - extendVMM, rc=0x%x",
- rc );
- }
+ if (rc!=0)
+ {
+ /*@
+ * @errortype
+ * @moduleid fapi::MOD_EXIT_CACHE_CONTAINED
+ * @reasoncode fapi::RC_MM_EXTEND_FAILED
+ * @userdata1 rc from mm_extend
+ * @userdata2 <UNUSED>
+ *
+ * @devdesc Failure extending memory to 32MEG after
+ * exiting cache contained mode.
+ */
+ l_errl = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE,
+ fapi::MOD_EXIT_CACHE_CONTAINED,
+ fapi::RC_MM_EXTEND_FAILED,
+ rc,
+ 0);
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "ERROR : call_proc_exit_cache_contained - extendVMM, rc=0x%x",
+ rc );
+ }
+ else
+ {
+ // trace out the extend VMM was successful
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "SUCCESS : call_proc_exit_cache_contained - extendVMM");
+ }
+ }
if ( l_errl )
{
/*@
@@ -845,6 +853,117 @@ void* call_host_mpipl_service( void *io_pArgs )
}
}
+ // No error on the procedure.. proceed to collect the dump.
+ if (!l_err)
+ {
+
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "SUCCESS : proc_mpipl_ex_cleanup" );
+
+
+ // currently according to Adriana, the dump calls should only cause an
+ // istep failure when the dump collect portion of this step fails.. We
+ // will not fail the istep on any mbox message failures. instead we will
+ // simply commit the errorlog and continue.
+
+ errlHndl_t l_errMsg = NULL;
+
+ // Need to load the dump module
+ l_err = VFS::module_load( "libdump.so" );
+
+ // If dump module successfull loaded then continue with DumpCollect and
+ // messaging
+ if (!l_err)
+ {
+ do
+ {
+ // send the start message
+ l_errMsg = DUMP::sendMboxMsg(DUMP::DUMP_MSG_START_MSG_TYPE);
+
+ // If error, commit and send error message.
+ if (l_errMsg)
+ {
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "ERROR : returned from DUMP::sendMboxMsg - dump start" );
+
+ errlCommit( l_errMsg, HWPF_COMP_ID );
+
+ // don't break in this case because we not want to fail the
+ // istep on the dump collect so we will continue after we
+ // log the errhandle that we can't send a message.
+ }
+
+ // Call the dump collect
+ l_err = DUMP::doDumpCollect();
+
+ // Got a Dump Collect error.. Commit the dumpCollect
+ // errorlog and then send an dump Error mbox message
+ // and FSP will decide what to do.
+ // We do not want dump Collect failures to terminate the istep.
+ if (l_err)
+ {
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "ERROR : returned from DUMP::HbDumpCopySrcToDest" );
+
+ break;
+ }
+
+ } while(0);
+
+ DUMP::DUMP_MSG_TYPE msgType = DUMP::DUMP_MSG_END_MSG_TYPE;
+
+ // Send dumpCollect success trace
+ if (!l_err)
+ {
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "SUCCESS : doDumpCollect" );
+ }
+ // got an error that we need to send a ERROR message to FSP
+ // and commit the errorlog from dumpCollect.
+ else
+ {
+ msgType = DUMP::DUMP_MSG_ERROR_MSG_TYPE;
+
+ // Commit the dumpCollect errorlog from above as
+ // we dont want dump collect to kill the istep
+ errlCommit( l_err, HWPF_COMP_ID );
+
+ }
+
+ // Send an Error mbox msg to FSP (either end or error)
+ l_errMsg = DUMP::sendMboxMsg(msgType);
+
+ if (l_errMsg)
+ {
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "ERROR : returned from DUMP::sendMboxMsg" );
+
+ errlCommit( l_errMsg, HWPF_COMP_ID );
+ }
+
+
+ // Need to unload the dump module regardless of whether we have
+ // an error or not.
+ errlHndl_t l_errUnLoad = VFS::module_unload( "libdump.so" );
+
+ if (l_errUnLoad)
+ {
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "ERROR : returned from VFS::module_unload (libdump.so)" );
+
+ errlCommit( l_errUnLoad, HWPF_COMP_ID );
+ }
+
+ }
+ else
+ {
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "ERROR : returned from VFS::module_load (libdump.so)" );
+ }
+
+ }
+
+ // If got an error in the procedure or collection of the dump kill the istep
if( l_err )
{
@@ -871,6 +990,8 @@ void* call_host_mpipl_service( void *io_pArgs )
errlCommit( l_err, HWPF_COMP_ID );
}
+
+
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
"call_host_mpipl_service exit" );
diff --git a/src/usr/initservice/extinitsvc/extinitsvctasks.H b/src/usr/initservice/extinitsvc/extinitsvctasks.H
index 7edd7b724..2701c9d0e 100644
--- a/src/usr/initservice/extinitsvc/extinitsvctasks.H
+++ b/src/usr/initservice/extinitsvc/extinitsvctasks.H
@@ -304,17 +304,6 @@ const TaskInfo g_exttaskinfolist[] = {
}
},
- /**
- * @brief dump code library
- */
- {
- "libdump.so" , // taskname
- NULL, // no pointer to fn
- {
- INIT_TASK, // task type
- EXT_IMAGE, // Extended Module
- }
- },
// end TODO.
diff --git a/src/usr/runtime/hdatservice.C b/src/usr/runtime/hdatservice.C
index 4ad6325f6..e67abc3f3 100644
--- a/src/usr/runtime/hdatservice.C
+++ b/src/usr/runtime/hdatservice.C
@@ -31,6 +31,7 @@
#include <util/align.H>
#include "hdatstructs.H"
#include "fakepayload.H"
+#include <dump/dumpif.H>
extern trace_desc_t* g_trac_runtime;
OpenPOWER on IntegriCloud