summaryrefslogtreecommitdiffstats
path: root/src/usr/hwpf/fapi/fapiParseErrorInfo.pl
diff options
context:
space:
mode:
authorElliott Dahle <dedahle@us.ibm.com>2013-09-25 11:38:43 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2013-10-08 21:23:38 -0500
commitaa0428221628fdb25c980f5764a3b4400004ee5d (patch)
treed95d1680cfa741a747b9e1bde8a9320292cef4e7 /src/usr/hwpf/fapi/fapiParseErrorInfo.pl
parent31a07e2cc87a0a24099b6e8d7ccc5cb3d0729b67 (diff)
downloadblackbird-hostboot-aa0428221628fdb25c980f5764a3b4400004ee5d.tar.gz
blackbird-hostboot-aa0428221628fdb25c980f5764a3b4400004ee5d.zip
HWPF Error XML allow register collection from child chiplets
Change-Id: I65a608378adac04b6b8f0e80a02578421b5b2680 RTC: 80609 Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/6409 Reviewed-by: Brian H. Horton <brianh@linux.ibm.com> Tested-by: Jenkins Server Reviewed-by: MIKE J. JONES <mjjones@us.ibm.com> Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/usr/hwpf/fapi/fapiParseErrorInfo.pl')
-rwxr-xr-xsrc/usr/hwpf/fapi/fapiParseErrorInfo.pl131
1 files changed, 99 insertions, 32 deletions
diff --git a/src/usr/hwpf/fapi/fapiParseErrorInfo.pl b/src/usr/hwpf/fapi/fapiParseErrorInfo.pl
index 03689f7af..dc20d3625 100755
--- a/src/usr/hwpf/fapi/fapiParseErrorInfo.pl
+++ b/src/usr/hwpf/fapi/fapiParseErrorInfo.pl
@@ -58,6 +58,7 @@
# mjjones 06/24/13 Support Children CDGs
# mjjones 08/20/13 Use constants for Reg FFDC collection
# mjjones 08/26/13 Support HW Callouts
+# dedahle 09/30/13 Support chiplet register FFDC collection
#
# End Change Log ******************************************************
@@ -282,11 +283,13 @@ print CRFILE "#include <fapiReturnCode.H>\n";
print CRFILE "#include <fapiHwAccess.H>\n";
print CRFILE "#include <fapiPlatTrace.H>\n";
print CRFILE "#include <fapiPlatRegAddresses.H>\n\n";
+print CRFILE "#include <fapiPlatAttributeService.H>\n\n";
print CRFILE "namespace fapi\n";
print CRFILE "{\n";
print CRFILE "void fapiCollectRegFfdc(const fapi::Target & i_target,\n";
print CRFILE " const fapi::HwpFfdcId i_ffdcId,\n";
-print CRFILE " fapi::ReturnCode & o_rc)\n";
+print CRFILE " fapi::ReturnCode & o_rc,\n";
+print CRFILE " fapi::TargetType i_child)\n";
print CRFILE "{\n";
print CRFILE " FAPI_INF(\"fapiCollectRegFfdc. FFDC ID: 0x%x\", i_ffdcId);\n";
print CRFILE " fapi::ReturnCode l_rc;\n";
@@ -425,17 +428,26 @@ foreach my $argnum (1 .. $#ARGV)
print ("fapiParseErrorInfo.pl ERROR in $err->{rc}. id(s) missing from collectRegisterFfdc\n");
exit(1);
}
-
- if (! exists $collectRegisterFfdc->{target})
- {
- print ("fapiParseErrorInfo.pl ERROR in $err->{rc}. target missing from collectRegisterFfdc\n");
- exit(1);
- }
-
foreach my $id (@{$collectRegisterFfdc->{id}})
{
- print EIFILE "fapiCollectRegFfdc($collectRegisterFfdc->{target}, ";
- print EIFILE "fapi::$id, RC); ";
+ #------------------------------------------------------------------
+ # If collecting chiplet register FFDC, insert childType parameter
+ #------------------------------------------------------------------
+ if (exists $collectRegisterFfdc->{childTargets})
+ {
+ print EIFILE "fapiCollectRegFfdc($collectRegisterFfdc->{childTargets}->{parent}, ";
+ print EIFILE "fapi::$id, RC, fapi::$collectRegisterFfdc->{childTargets}->{childType}); ";
+ }
+ else
+ {
+ if (! exists $collectRegisterFfdc->{target})
+ {
+ print ("fapiParseErrorInfo.pl ERROR. target missing from collectRegisterFfdc\n");
+ exit(1);
+ }
+ print EIFILE "fapiCollectRegFfdc($collectRegisterFfdc->{target}, ";
+ print EIFILE "fapi::$id, RC); ";
+ }
}
}
@@ -869,41 +881,96 @@ print CRFILE " FAPI_ERR(\"fapiCollectRegFfdc.C: Invalid FFDC ID 0x%x\
print CRFILE "i_ffdcId);\n";
print CRFILE " return;\n";
print CRFILE " }\n\n";
-print CRFILE " uint8_t * l_pBuf = new uint8_t[l_ffdcSize];\n";
-print CRFILE " uint8_t * l_pData = l_pBuf;\n\n";
-print CRFILE " for (std::vector<uint32_t>::const_iterator cfamIter = l_cfamAddresses.begin();\n";
-print CRFILE " cfamIter != l_cfamAddresses.end(); ++cfamIter)\n";
+print CRFILE " uint8_t * l_pBuf = NULL;\n";
+print CRFILE " uint8_t * l_pData = NULL;\n";
+print CRFILE " std::vector<fapi::Target> l_targets;\n";
+print CRFILE " uint32_t l_chipletPos32 = 0;\n";
+print CRFILE " l_ffdcSize += sizeof(l_chipletPos32);\n";
+print CRFILE " if (fapi::TARGET_TYPE_NONE != i_child)\n";
print CRFILE " {\n";
-print CRFILE " l_rc = fapiGetCfamRegister(i_target, *cfamIter, l_buf);\n";
+print CRFILE " l_rc = fapiGetChildChiplets(i_target, i_child, l_targets, TARGET_STATE_FUNCTIONAL);\n";
print CRFILE " if (l_rc)\n";
print CRFILE " {\n";
-print CRFILE " FAPI_ERR(\"fapiCollectRegFfdc.C: CFAM error for 0x%x\",";
-print CRFILE "*cfamIter);\n";
-print CRFILE " l_cfamData = 0xbaddbadd;\n";
+print CRFILE " FAPI_ERR(\"fapiCollectRegFfdc.C: Error: fapiGetChildChiplets: failed to get chiplets.\");\n";
+print CRFILE " return;\n";
print CRFILE " }\n";
-print CRFILE " else\n";
+print CRFILE " if (l_targets.empty())\n";
print CRFILE " {\n";
-print CRFILE " l_cfamData = l_buf.getWord(0);\n";
+print CRFILE " FAPI_INF(\"fapiCollectRegFfdc.C: Error: No functional chiplets found. \");\n";
+print CRFILE " return;\n";
print CRFILE " }\n";
-print CRFILE " *(reinterpret_cast<uint32_t *>(l_pData)) = l_cfamData;\n";
-print CRFILE " l_pData += sizeof(l_cfamData);\n";
+print CRFILE " l_ffdcSize *= l_targets.size();\n";
+print CRFILE " l_pBuf = new uint8_t[l_ffdcSize];\n";
+print CRFILE " l_pData = l_pBuf;\n";
+print CRFILE " }\n";
+print CRFILE " else\n";
+print CRFILE " {\n";
+print CRFILE " l_pBuf = new uint8_t[l_ffdcSize];\n";
+print CRFILE " l_pData = l_pBuf;\n";
+print CRFILE " l_targets.push_back(i_target);\n";
print CRFILE " }\n\n";
-print CRFILE " for (std::vector<uint64_t>::const_iterator scomIter = l_scomAddresses.begin();\n";
-print CRFILE " scomIter != l_scomAddresses.end(); ++scomIter)\n";
+print CRFILE " for (std::vector<fapi::Target>::const_iterator targetIter = l_targets.begin();\n";
+print CRFILE " targetIter != l_targets.end(); ++targetIter)\n";
print CRFILE " {\n";
-print CRFILE " l_rc = fapiGetScom(i_target, *scomIter, l_buf);\n";
-print CRFILE " if (l_rc)\n";
+print CRFILE " if (fapi::TARGET_TYPE_NONE != i_child)\n";
print CRFILE " {\n";
-print CRFILE " FAPI_ERR(\"fapiCollectRegFfdc.C: SCOM error for 0x%llx\",";
-print CRFILE "*scomIter);\n";
-print CRFILE " l_scomData = 0xbaddbaddbaddbaddULL;\n";
+print CRFILE " uint8_t l_chipletPos = 0;\n";
+print CRFILE " l_rc = FAPI_ATTR_GET(ATTR_CHIP_UNIT_POS, &(*targetIter), l_chipletPos);\n";
+print CRFILE " if (l_rc)\n";
+print CRFILE " {\n";
+print CRFILE " FAPI_ERR(\"fapiCollectRegFfdc.C: Error getting chiplet position\");\n";
+print CRFILE " l_chipletPos = 0xFF;\n";
+print CRFILE " }\n";
+print CRFILE " // We print the target's position in the error log whether the target is a\n";
+print CRFILE " // chip or chiplet, so we need to store the chiplet position in a uint32_t\n";
+print CRFILE " // to have consitency in the buffer as ATTR_POS below returns a uint32_t\n";
+print CRFILE " l_chipletPos32 = l_chipletPos;\n";
print CRFILE " }\n";
print CRFILE " else\n";
print CRFILE " {\n";
-print CRFILE " l_scomData = l_buf.getDoubleWord(0);\n";
+print CRFILE " l_rc = FAPI_ATTR_GET(ATTR_POS, &(*targetIter), l_chipletPos32);\n";
+print CRFILE " if (l_rc)\n";
+print CRFILE " {\n";
+print CRFILE " FAPI_ERR(\"fapiCollectRegFfdc.C: Error getting chip position\");\n";
+print CRFILE " l_chipletPos32 = 0xFFFFFFFF;\n";
+print CRFILE " }\n";
+print CRFILE " }\n";
+print CRFILE " *(reinterpret_cast<uint32_t *>(l_pData)) = l_chipletPos32;\n";
+print CRFILE " l_pData += sizeof(l_chipletPos32);\n";
+print CRFILE " for (std::vector<uint32_t>::const_iterator cfamIter = l_cfamAddresses.begin();\n";
+print CRFILE " cfamIter != l_cfamAddresses.end(); ++cfamIter)\n";
+print CRFILE " {\n";
+print CRFILE " l_rc = fapiGetCfamRegister(*targetIter, *cfamIter, l_buf);\n";
+print CRFILE " if (l_rc)\n";
+print CRFILE " {\n";
+print CRFILE " FAPI_ERR(\"fapiCollectRegFfdc.C: CFAM error for 0x%x\",";
+print CRFILE "*cfamIter);\n";
+print CRFILE " l_cfamData = 0xbaddbadd;\n";
+print CRFILE " }\n";
+print CRFILE " else\n";
+print CRFILE " {\n";
+print CRFILE " l_cfamData = l_buf.getWord(0);\n";
+print CRFILE " }\n";
+print CRFILE " *(reinterpret_cast<uint32_t *>(l_pData)) = l_cfamData;\n";
+print CRFILE " l_pData += sizeof(l_cfamData);\n";
+print CRFILE " }\n\n";
+print CRFILE " for (std::vector<uint64_t>::const_iterator scomIter = l_scomAddresses.begin();\n";
+print CRFILE " scomIter != l_scomAddresses.end(); ++scomIter)\n";
+print CRFILE " {\n";
+print CRFILE " l_rc = fapiGetScom(*targetIter, *scomIter, l_buf);\n";
+print CRFILE " if (l_rc)\n";
+print CRFILE " {\n";
+print CRFILE " FAPI_ERR(\"fapiCollectRegFfdc.C: SCOM error for 0x%llx\",";
+print CRFILE "*scomIter);\n";
+print CRFILE " l_scomData = 0xbaddbaddbaddbaddULL;\n";
+print CRFILE " }\n";
+print CRFILE " else\n";
+print CRFILE " {\n";
+print CRFILE " l_scomData = l_buf.getDoubleWord(0);\n";
+print CRFILE " }\n";
+print CRFILE " *(reinterpret_cast<uint64_t *>(l_pData)) = l_scomData;\n";
+print CRFILE " l_pData += sizeof(l_scomData);\n";
print CRFILE " }\n";
-print CRFILE " *(reinterpret_cast<uint64_t *>(l_pData)) = l_scomData;\n";
-print CRFILE " l_pData += sizeof(l_scomData);\n";
print CRFILE " }\n\n";
print CRFILE " o_rc.addEIFfdc(i_ffdcId, l_pBuf, l_ffdcSize);\n";
print CRFILE " delete [] l_pBuf;\n";
OpenPOWER on IntegriCloud