From e3870cb85913e2a92843e157427f68ef86e566f8 Mon Sep 17 00:00:00 2001 From: Caleb Palmer Date: Fri, 15 Nov 2019 16:18:46 -0600 Subject: Add DIMM_BAD_DQ_DATA field for DDR4 DDIMM SPD and bad dq tests Change-Id: I1242a9f8733679afb0fee632e985ccf28096fbd9 RTC: 245516 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/87098 Tested-by: Jenkins Server Tested-by: Jenkins OP Build CI Tested-by: Jenkins OP HW Tested-by: FSP CI Jenkins Reviewed-by: Zane C Shelley Reviewed-by: Paul Greenwood Reviewed-by: Brian J Stegmiller Reviewed-by: Benjamen G Tyner Reviewed-by: Daniel M Crowell --- src/usr/diag/prdf/test/prdfTest_BadDqBitmap.H | 227 ++++++++++++++++++++++++++ src/usr/diag/prdf/test/prdf_hb_common_test.mk | 1 + src/usr/vpd/spdDDR4_DDIMM.H | 1 + 3 files changed, 229 insertions(+) create mode 100644 src/usr/diag/prdf/test/prdfTest_BadDqBitmap.H (limited to 'src') diff --git a/src/usr/diag/prdf/test/prdfTest_BadDqBitmap.H b/src/usr/diag/prdf/test/prdfTest_BadDqBitmap.H new file mode 100644 index 000000000..4b4fa8fea --- /dev/null +++ b/src/usr/diag/prdf/test/prdfTest_BadDqBitmap.H @@ -0,0 +1,227 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/usr/diag/prdf/test/prdfTest_BadDqBitmap.H $ */ +/* */ +/* OpenPOWER HostBoot Project */ +/* */ +/* Contributors Listed Below - COPYRIGHT 2019 */ +/* [+] 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 */ + +#ifndef __TEST_PRDFBADDQBITMAP_H +#define __TEST_PRDFBADDQBITMAP_H + +/** + * @file prdfTest_BadDqBitmap.H + * + * @brief prdf testing reading and writing the BAD_DQ_BITMAP attribute + */ + +#ifdef __HOSTBOOT_MODULE + #include + #include + #include +#else + #include + #include + #include +#endif + +#include +#include +#include "prdfsimMacros.H" +#include +#include +#include + +class WriteBadDqBitmap: public CxxTest::TestSuite +{ + +public: + + void TestNimbusReadWriteBadDqBitmap(void) + { + using namespace PRDF; + using namespace TARGETING; + using namespace PlatServices; + + TargetHandle_t masterProc = nullptr; + targetService().masterProcChipTargetHandle(masterProc); + + // Nimbus only test + if ( MODEL_NIMBUS == masterProc->getAttr() ) + { + TS_INFO("- TestNimbusReadWriteBadDqBitmap - Start -"); + + uint32_t rc = SUCCESS; + + // Get an MCBIST + TargetHandle_t mcb = getConnectedChild(masterProc, TYPE_MCBIST, 0); + if ( nullptr == mcb ) + { + TS_FAIL( "ERROR: Failed to get MCBIST" ); + } + // Get an MCA + TargetHandle_t mca = getConnectedChild( mcb, TYPE_MCA, 0 ); + if ( nullptr == mca ) + { + TS_FAIL( "ERROR: Failed to get MCA" ); + } + + // Make arbitrary initial data + MemRank rank( 0, 0 ); + const uint8_t initialBitmap[DQ_BITMAP::BITMAP_SIZE] = + { 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0x00 }; + BitmapData initialData; + memcpy( initialData[0].bitmap, initialBitmap, + sizeof(initialData[0].bitmap) ); + + // Set with the initial data + MemDqBitmap setBitmap( mca, rank, initialData ); + rc = setBadDqBitmap( mca, rank, setBitmap ); + if ( SUCCESS != rc ) + { + TS_FAIL( "ERROR: setBadDqBitmap failed " ); + } + + // Read the data back + MemDqBitmap getBitmap; + rc = getBadDqBitmap( mca, rank, getBitmap ); + if ( SUCCESS != rc ) + { + TS_FAIL( "ERROR: getBadDqBitmap failed" ); + } + + BitmapData newData = getBitmap.getData(); + + // Compare the read data to the initial data. The last byte (byte 9) + // is for spares so we won't worry about comparing that. + for ( uint8_t n = 0; n < (DQ_BITMAP::BITMAP_SIZE-1); n++ ) + { + if ( newData.at(0).bitmap[n] != initialBitmap[n] ) + { + TS_FAIL( "TestNimbusReadWriteBadDqBitmap: Incorrect data " + "found. newData[%d]=0x%x initialBitmap[%d]=0x%x", + n, newData.at(0).bitmap[n], n, initialBitmap[n] ); + } + } + + // Clear the vpd just in case + rc = clearBadDqBitmap( mca, rank ); + if ( SUCCESS != rc ) + { + TS_FAIL( "ERROR: clearBadDqBitmap failed" ); + } + + TS_INFO("- TestNimbusReadWriteBadDqBitmap - End -"); + } + + } + + void TestAxoneReadWriteBadDqBitmap(void) + { + using namespace PRDF; + using namespace TARGETING; + using namespace PlatServices; + + TargetHandle_t masterProc = nullptr; + targetService().masterProcChipTargetHandle(masterProc); + + // Axone only test + if ( MODEL_AXONE == masterProc->getAttr() ) + { + TS_INFO("- TestAxoneReadWriteBadDqBitmap - Start -"); + + uint32_t rc = SUCCESS; + + // Get an OCMB + TargetHandle_t mc = getConnectedChild( masterProc, TYPE_MC, 0 ); + if ( nullptr == mc ) + { + TS_FAIL( "ERROR: Failed to get MC" ); + } + TargetHandle_t omic = getConnectedChild( mc, TYPE_OMIC, 0 ); + if ( nullptr == omic ) + { + TS_FAIL( "ERROR: Failed to get OMIC" ); + } + TargetHandle_t omi = getConnectedChild( omic, TYPE_OMI, 0 ); + if ( nullptr == omi ) + { + TS_FAIL( "ERROR: Failed to get OMI" ); + } + TargetHandle_t ocmb = getConnectedChild( omi, TYPE_OCMB_CHIP, 0 ); + if ( nullptr == ocmb ) + { + TS_FAIL( "ERROR: Failed to get OCMB" ); + } + // Make arbitrary initial data + MemRank rank( 0 ); + const uint8_t initialBitmap[DQ_BITMAP::BITMAP_SIZE] = + { 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0x00 }; + BitmapData initialData; + memcpy( initialData[0].bitmap, initialBitmap, + sizeof(initialData[0].bitmap) ); + + // Set with the initial data + MemDqBitmap setBitmap( ocmb, rank, initialData ); + rc = setBadDqBitmap( ocmb, rank, setBitmap ); + if ( SUCCESS != rc ) + { + TS_FAIL( "ERROR: setBadDqBitmap failed " ); + } + + // Read the data back + MemDqBitmap getBitmap; + rc = getBadDqBitmap( ocmb, rank, getBitmap ); + if ( SUCCESS != rc ) + { + TS_FAIL( "ERROR: getBadDqBitmap failed" ); + } + + BitmapData newData = getBitmap.getData(); + + // Compare the read data to the initial data. The last byte (byte 9) + // is for spares so we won't worry about comparing that. + for ( uint8_t n = 0; n < (DQ_BITMAP::BITMAP_SIZE-1); n++ ) + { + if ( newData.at(0).bitmap[n] != initialBitmap[n] ) + { + TS_FAIL( "TestAxoneReadWriteBadDqBitmap: Incorrect data " + "found. newData[%d]=0x%x initialBitmap[%d]=0x%x", + n, newData.at(0).bitmap[n], n, initialBitmap[n] ); + } + } + + // Clear the vpd just in case + rc = clearBadDqBitmap( ocmb, rank ); + if ( SUCCESS != rc ) + { + TS_FAIL( "ERROR: clearBadDqBitmap failed" ); + } + + TS_INFO("- TestAxoneReadWriteBadDqBitmap - End -"); + + } + + } + +//------------------------------------------------------------------------------ + +}; +#endif diff --git a/src/usr/diag/prdf/test/prdf_hb_common_test.mk b/src/usr/diag/prdf/test/prdf_hb_common_test.mk index 18f9a9d96..5d1e7ea36 100755 --- a/src/usr/diag/prdf/test/prdf_hb_common_test.mk +++ b/src/usr/diag/prdf/test/prdf_hb_common_test.mk @@ -92,6 +92,7 @@ TESTS += ${PRD_USR_TEST_PATH}/prdfTest.H TESTS += ${PRD_USR_TEST_PATH}/prdfTest_XBus.H TESTS += ${PRD_USR_TEST_PATH}/prdfTest_ABus.H TESTS += ${PRD_USR_TEST_PATH}/prdfTest_ProcCentFir.H +TESTS += ${PRD_USR_TEST_PATH}/prdfTest_BadDqBitmap.H TESTS += ${PRD_USR_TEST_PATH}/prdfTest_Ex.H TESTS += ${PRD_USR_TEST_PATH}/prdfTest_NimbusTpLFir.H #@TODO RTC:178802 diff --git a/src/usr/vpd/spdDDR4_DDIMM.H b/src/usr/vpd/spdDDR4_DDIMM.H index 9e10a049a..38899b88e 100755 --- a/src/usr/vpd/spdDDR4_DDIMM.H +++ b/src/usr/vpd/spdDDR4_DDIMM.H @@ -107,6 +107,7 @@ const KeywordData ddr4DDIMMData[] = { MODULE_MANUFACTURER_ID, 0x200, 0x02, 0x00, 0x00, true, false, ALL }, { MODULE_SERIAL_NUMBER, 0x205, 0x04, 0x00, 0x00, false, false, ALL }, { MODULE_PART_NUMBER, 0x209, 0x1E, 0x00, 0x00, false, false, ALL }, + { DIMM_BAD_DQ_DATA, 0x280, 0x50, 0x00, 0x00, false, true, ALL }, { MODULE_REVISION_CODE, 0x277, 0x01, 0x00, 0x00, false, false, ALL }, // Normal fields supported on DDR4 only { BANK_GROUP_BITS, 0x04, 0x01, 0xC0, 0x06, false, false, ALL }, -- cgit v1.2.1