summaryrefslogtreecommitdiffstats
path: root/src/usr/fapi2/test/fapi2SpdTestCxx.H
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/fapi2/test/fapi2SpdTestCxx.H')
-rw-r--r--src/usr/fapi2/test/fapi2SpdTestCxx.H194
1 files changed, 123 insertions, 71 deletions
diff --git a/src/usr/fapi2/test/fapi2SpdTestCxx.H b/src/usr/fapi2/test/fapi2SpdTestCxx.H
index 2ccd457dc..d033401e8 100644
--- a/src/usr/fapi2/test/fapi2SpdTestCxx.H
+++ b/src/usr/fapi2/test/fapi2SpdTestCxx.H
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2016 */
+/* Contributors Listed Below - COPYRIGHT 2016,2019 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -37,6 +37,7 @@
#include <errl/errlentry.H>
#include <devicefw/driverif.H>
#include <fapi2_spd_access.H>
+#include <vpd/spdenums.H>
using namespace TARGETING;
@@ -52,76 +53,127 @@ class SPDTest: public CxxTest::TestSuite
{
public:
- /**
- * @brief Test SPD get Interface DIMMs.
- */
- void testGetSPD ( void )
- {
- fapi2::ReturnCode l_rc;
- size_t l_size = 0;
- uint8_t * l_blobData = NULL;
-
- FAPI_INF( "testGetSPD - Enter" );
-
- do
- {
- TARGETING::Target * i_pTarget = NULL;
-
- // Get DIMM Targets
- TargetHandleList dimmList;
- getDIMMTargets( dimmList );
-
- // Should get atleast one
- if( ( 0 == dimmList.size() ) ||
- ( NULL == dimmList[0] ) )
- {
- FAPI_INF( "testGetSPD- No DIMMs found!");
- break;
- }
-
- // Work on the first DIMM target
- i_pTarget = dimmList[0];
-
- // convert to fapi2 target
- fapi2::Target<fapi2::TARGET_TYPE_DIMM> fapi2_Target(i_pTarget);
-
- // SPD interface call with NULL blob to get size data
- l_rc = fapi2::getSPD(fapi2_Target, NULL, l_size);
-
- // Expect to return the size or non failure
- if( !l_size || (l_rc != fapi2::FAPI2_RC_SUCCESS) )
- {
- TS_FAIL("testGetSPD: Failed getting the size of the mem buffer");
- break;
- }
-
- // allocate the blob data of mem size length to hold data
- l_blobData = reinterpret_cast<uint8_t *>(malloc(l_size));
- memset(l_blobData,0,l_size);
-
- l_rc = fapi2::getSPD(fapi2_Target,l_blobData, l_size);
- if ( l_rc != fapi2::FAPI2_RC_SUCCESS )
- {
- TS_FAIL( "testGetSPD- Failed to read data from DIMM with HUID= 0x%x",
- TARGETING::get_huid(i_pTarget));
- break;
- }
-
- FAPI_DBG("getSPD: SPD data for DIMM with HUID=0x%.8X Size %d Blob %d",
- TARGETING::get_huid(i_pTarget),
- l_size,
- l_blobData);
-
- } while(0);
-
- if( NULL != l_blobData )
- {
- free( l_blobData );
- l_blobData = NULL;
- }
-
- FAPI_INF( "testGetSPD - Exit" );
- }
+ /**
+ * @brief Test SPD get Interface DIMMs.
+ */
+ void testGetSPD ( void )
+ {
+ fapi2::ReturnCode l_rc;
+ size_t l_spdSize = 0;
+ uint8_t * l_blobData = NULL;
+
+ FAPI_INF( "testGetSPD - Enter" );
+
+ // Get DIMM Targets
+ TargetHandleList dimmList;
+ getDIMMTargets( dimmList );
+
+ // Should get atleast one
+ if( ( 0 == dimmList.size() ) ||
+ ( NULL == dimmList[0] ) )
+ {
+ TS_FAIL( "testGetSPD- No DIMMs found!");
+ }
+
+ for( auto l_tDimm : dimmList )
+ {
+
+ // convert to fapi2 target
+ fapi2::Target<fapi2::TARGET_TYPE_DIMM> l_fDimm(l_tDimm);
+
+ // SPD interface call with NULL blob to get size data
+ l_rc = fapi2::getSPD(l_fDimm, NULL, l_spdSize);
+
+ // Expect to return the size or non failure
+ if( !l_spdSize || (l_rc != fapi2::FAPI2_RC_SUCCESS) )
+ {
+ TS_FAIL("testGetSPD: Failed getting the size of the mem buffer - Dimm %.8X", TARGETING::get_huid(l_tDimm));
+ continue;
+ }
+
+ // allocate the blob data of mem size length to hold data
+ l_blobData = reinterpret_cast<uint8_t *>(malloc(l_spdSize));
+ memset(l_blobData,0,l_spdSize);
+
+ l_rc = fapi2::getSPD(l_fDimm,l_blobData, l_spdSize);
+ if ( l_rc != fapi2::FAPI2_RC_SUCCESS )
+ {
+ TS_FAIL( "testGetSPD- Failed to read data from DIMM with HUID= 0x%x",
+ TARGETING::get_huid(l_tDimm));
+ continue;
+ }
+
+ uint8_t l_memModule = 0x0;
+ size_t l_memSize = sizeof(uint8_t);
+
+ auto l_errl = deviceRead(l_tDimm,
+ (void *)&l_memModule,
+ l_memSize,
+ DEVICE_SPD_ADDRESS(SPD::MODULE_TYPE));
+
+ if ( l_errl )
+ {
+ TS_FAIL( "testGetSPD- Failed to deviceRead with HUID= 0x%x",
+ TARGETING::get_huid(l_tDimm));
+ continue;
+ }
+
+ uint8_t l_memGen = 0x0;
+ l_errl = deviceRead(l_tDimm,
+ (void *)&l_memGen,
+ l_memSize,
+ DEVICE_SPD_ADDRESS(SPD::BASIC_MEMORY_TYPE));
+
+ if ( l_errl )
+ {
+ TS_FAIL( "testGetSPD- Failed to deviceRead with HUID= 0x%x",
+ TARGETING::get_huid(l_tDimm));
+ continue;
+ }
+
+ // figure out the expected size based on the memory type
+ size_t l_compareSize = 0;
+ if( (l_memModule == SPD::MEM_DDIMM) && (l_memGen == SPD::MEM_DDR4) )
+ {
+ l_compareSize = SPD::OCMB_SPD_EFD_COMBINED_SIZE;
+ }
+ else if( (l_memModule != SPD::MEM_DDIMM) && (l_memGen == SPD::MEM_DDR4) )
+ {
+ l_compareSize = SPD::DDR4_SPD_SIZE;
+ }
+ else if( l_memGen == SPD::MEM_DDR3 )
+ {
+ l_compareSize = SPD::DDR3_SPD_SIZE;
+ }
+ else
+ {
+ TS_FAIL( "testGetSPD - Unknown memory type for %.8X : module=0x%X, gen=0x%X",
+ TARGETING::get_huid(l_tDimm), l_memModule, l_memGen );
+ continue;
+ }
+
+ if( l_compareSize != l_spdSize )
+ {
+ TS_FAIL( "testGetSPD - Wrong SPD size for %.8X : module=0x%X, gen=0x%X, exp=%d, act=%d",
+ TARGETING::get_huid(l_tDimm), l_memModule, l_memGen,
+ l_compareSize, l_spdSize);
+ continue;
+ }
+
+ FAPI_DBG("getSPD: SPD data for DIMM with HUID=0x%.8X Size %d Blob %d",
+ TARGETING::get_huid(l_tDimm),
+ l_spdSize,
+ l_blobData);
+ }
+
+ if( NULL != l_blobData )
+ {
+ free( l_blobData );
+ l_blobData = NULL;
+ }
+
+ FAPI_INF( "testGetSPD - Exit" );
+ }
};
OpenPOWER on IntegriCloud