summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoland Veloz <rveloz@us.ibm.com>2019-02-27 23:00:46 -0600
committerDaniel M. Crowell <dcrowell@us.ibm.com>2019-03-26 16:05:07 -0500
commit17930bb348b5e6aa0a93627b52b5f4e3556c5520 (patch)
treecbbaf79e4d664cf78cfde73ab7aa83e169f9c293
parent76a4f5d86930611ddb4be8d273e9fbd279ff3f53 (diff)
downloadtalos-hostboot-17930bb348b5e6aa0a93627b52b5f4e3556c5520.tar.gz
talos-hostboot-17930bb348b5e6aa0a93627b52b5f4e3556c5520.zip
Unit test and integration test for platGetVPD(OCMB) call
This file does negative and positive tests on the call to platGetVPD(OCMB). This also does integration test with platGetVPD(OCMB) and call to HWP call ddimm_get_efd. Change-Id: Ie15b53a8d43a75c97278828392a31162ecff7be6 RTC: 205964 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/72604 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@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> Reviewed-by: Matt Derksen <mderkse1@us.ibm.com> Reviewed-by: Christian R. Geddes <crgeddes@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
-rw-r--r--src/usr/fapi2/plat_vpd_access.C8
-rw-r--r--src/usr/fapi2/test/fapi2PlatGetVpdOcmbChipTest.C377
-rw-r--r--src/usr/fapi2/test/fapi2PlatGetVpdOcmbChipTest.H52
-rw-r--r--src/usr/fapi2/test/fapi2Test.mk4
4 files changed, 437 insertions, 4 deletions
diff --git a/src/usr/fapi2/plat_vpd_access.C b/src/usr/fapi2/plat_vpd_access.C
index 147d7e937..89456e0ed 100644
--- a/src/usr/fapi2/plat_vpd_access.C
+++ b/src/usr/fapi2/plat_vpd_access.C
@@ -387,8 +387,8 @@ fapi2::ReturnCode platGetVPD(
break;
}
- // Retrieve the EFD data from the given SPD buffer.
- // if o_blob is nullptr then size will be returned in io_vpdInfo.iv_size
+ // Retrieve the EFD data from the given SPD buffer. If o_blob is
+ // nullptr then size will be returned in io_vpdInfo.iv_size
FAPI_EXEC_HWP( l_rc,
ddimm_get_efd,
i_ocmbFapi2Target,
@@ -435,7 +435,9 @@ fapi2::ReturnCode platGetVPD(
l_rc.setPlatDataPtr(reinterpret_cast<void *> (l_errl));
}
- FAPI_DBG("platGetVPD(OCMB): exit");
+ FAPI_DBG("platGetVPD(OCMB): exiting with %s",
+ ( (l_rc == fapi2::FAPI2_RC_SUCCESS) ?
+ "no errors" : "errors" ));
return l_rc;
}
diff --git a/src/usr/fapi2/test/fapi2PlatGetVpdOcmbChipTest.C b/src/usr/fapi2/test/fapi2PlatGetVpdOcmbChipTest.C
new file mode 100644
index 000000000..49f038458
--- /dev/null
+++ b/src/usr/fapi2/test/fapi2PlatGetVpdOcmbChipTest.C
@@ -0,0 +1,377 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/fapi2/test/fapi2PlatGetVpdOcmbChipTest.C $ */
+/* */
+/* OpenPOWER HostBoot Project */
+/* */
+/* Contributors Listed Below - COPYRIGHT 2016,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 */
+
+#include <fapi2PlatGetVpdOcmbChipTest.H>
+#include <plat_vpd_access.H>
+
+// The maximum size of a the EFD buffer
+// Ony used if failed to get buffer size
+const size_t DEFAULT_MAX_BYTES_BUFFER_SIZE = 128;
+
+
+void fapi2PlatGetVpdOcmbChipTest::testPlatGetVPD_EFD()
+{
+ FAPI_INF(">>testGetVPD_EFD");
+
+ if(TARGETING::MODEL_AXONE != TARGETING::targetService().getProcessorModel())
+ {
+ FAPI_INF("<<testGetVPD_EFD: This is not AXONE. Skipping AXONE tests.");
+ return;
+ }
+
+ // Find a valid target of type OCMB_CHIP
+ TARGETING::TargetHandleList l_ocmbTargetList;
+ TARGETING::getAllChips(l_ocmbTargetList, TARGETING::TYPE_OCMB_CHIP, true);
+ if (!l_ocmbTargetList.size())
+ {
+ TS_FAIL("<<testGetVPD_EFD: No valid TYPE_OCMB_CHIP target found. "
+ "Can not execute test cases.");
+ return;
+ }
+
+ // Some useful variables
+ size_t l_numTests(0);
+ size_t l_numFails(0);
+ fapi2::ReturnCode l_rc;
+ fapi2::VPDInfo<fapi2::TARGET_TYPE_OCMB_CHIP> l_vpdInfo(fapi2::EFD);
+
+
+ /// Test case 1
+ // Test with a "bad" target
+ ++l_numTests;
+ do
+ {
+ fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP> l_ocmbChipTarget;
+ uint8_t* o_efdBuffer(nullptr);
+
+ l_rc = platGetVPD(l_ocmbChipTarget, l_vpdInfo, o_efdBuffer);
+
+ if (l_rc == fapi2::FAPI2_RC_SUCCESS)
+ {
+ TS_FAIL("testGetVPD_EFD: Test case 1 failed: OCMB_CHIP target is a "
+ "nullptr but platGetVPD returned SUCCESS.");
+
+ ++l_numFails;
+ break;
+ }
+
+ } while(0);
+
+
+ /// Test case 2
+ // Test with an invalid target. If no invalid target is found, then move
+ // on - do not fail the test. This test is an unlikely scenario and not
+ // so critical that it needs to fail if unable to perform.
+ do
+ {
+ // Get a list of targets
+ TARGETING::TargetRangeFilter l_targetList(
+ TARGETING::targetService().begin(),
+ TARGETING::targetService().end(),
+ NULL);
+
+ // Iterate thru the list looking for the first NON OCMB_CHIP target
+ for ( ; l_targetList; ++l_targetList)
+ {
+ if ( TARGETING::TYPE_OCMB_CHIP !=
+ (*l_targetList)->getAttr<TARGETING::ATTR_TYPE>() )
+ {
+ // Found first non OCMB_CHIP target, break out and use it
+ break;
+ }
+ }
+
+ // l_targetList is just an iterator that gets advanced in a container.
+ // If that iterator is still valid then we can safely assume that
+ // it points to a non OCMB_CHIP target
+ if (l_targetList)
+ {
+ ++l_numTests;
+ fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP> l_ocmbChipTarget =
+ *l_targetList;
+ uint8_t* o_efdBuffer(nullptr);
+
+ l_rc = platGetVPD(l_ocmbChipTarget, l_vpdInfo, o_efdBuffer);
+
+ if (l_rc == fapi2::FAPI2_RC_SUCCESS)
+ {
+ TS_FAIL("testGetVPD_EFD: Test case 2 failed: OCMB_CHIP target "
+ "is invalid (the target is being spoofed with a "
+ "different type) but platGetVPD returned SUCCESS.");
+
+ ++l_numFails;
+ break;
+ } // end if (l_rc == fapi2::FAPI2_RC_SUCCESS)
+ } // end if (l_targetList)
+ } while (0);
+
+
+ // Initialize input data
+ fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP> l_ocmbChipTarget =
+ l_ocmbTargetList[0];
+ uint8_t* o_efdBuffer{nullptr};
+
+
+ /// Test case 3
+ // Test with NULL buffer
+ ++l_numTests;
+ do
+ {
+ // Initialize the essential input variables
+ l_vpdInfo.iv_size = 0;
+
+ // Make the platGetVPD call with buffer size 0 and buffer set at nullptr
+ l_rc = platGetVPD(l_ocmbChipTarget, l_vpdInfo, o_efdBuffer);
+
+ // Error if call not successful and size is 0
+ if (l_rc != fapi2::FAPI2_RC_SUCCESS || !l_vpdInfo.iv_size)
+ {
+ TS_FAIL("testGetVPD_EFD: Test case 3 failed: Failed to return a "
+ "buffer size.");
+
+ ++l_numFails;
+ break;
+ }
+ } while(0);
+
+ // If no buffer size returned from previous call then set size to default
+ if (!l_vpdInfo.iv_size)
+ {
+ l_vpdInfo.iv_size = DEFAULT_MAX_BYTES_BUFFER_SIZE;
+ }
+
+ // Create the memory for the buffer
+ o_efdBuffer = new uint8_t[l_vpdInfo.iv_size];
+
+ /// Test case 4
+ // Test with data that will not find a match on frequency
+ // and enable ffdc set to false.
+ ++l_numTests;
+ do
+ {
+ // Initialize the other input variables
+ l_vpdInfo.iv_omi_freq_mhz = 19200;
+ l_vpdInfo.iv_rank = 0;
+ l_vpdInfo.iv_is_config_ffdc_enabled = false;
+
+ // Make the platGetVPD call
+ l_rc = platGetVPD(l_ocmbChipTarget, l_vpdInfo, o_efdBuffer);
+
+ if (l_rc == fapi2::FAPI2_RC_SUCCESS)
+ {
+ TS_FAIL("testGetVPD_EFD: Test case 4 failed: Request for EFD with "
+ "frequency %d and rank %d should have failed.",
+ l_vpdInfo.iv_omi_freq_mhz, l_vpdInfo.iv_rank);
+
+ ++l_numFails;
+ break;
+ }
+ } while(0);
+
+
+ /// Test case 5
+ // Test with data that will not find a match on frequency
+ // and enable ffdc set to true.
+ ++l_numTests;
+ do
+ {
+ // Initialize the other input variables
+ l_vpdInfo.iv_omi_freq_mhz = 25600;
+ l_vpdInfo.iv_rank = 2;
+ l_vpdInfo.iv_is_config_ffdc_enabled = true;
+
+ // Make the platGetVPD call
+ l_rc = platGetVPD(l_ocmbChipTarget, l_vpdInfo, o_efdBuffer);
+
+ if (l_rc == fapi2::FAPI2_RC_SUCCESS)
+ {
+ TS_FAIL("testGetVPD_EFD: Test case 5 failed: Request for EFD with "
+ "frequency %d and rank %d should have failed.",
+ l_vpdInfo.iv_omi_freq_mhz, l_vpdInfo.iv_rank);
+
+ ++l_numFails;
+ break;
+ }
+ } while(0);
+
+
+ /// Test case 6
+ // Test when the size of the output buffer is insufficient to hold
+ // the found EFD block data
+ ++l_numTests;
+ do
+ {
+ // Initialize the other input variables
+ l_vpdInfo.iv_omi_freq_mhz = 21330;
+ l_vpdInfo.iv_rank = 0;
+ l_vpdInfo.iv_is_config_ffdc_enabled = false;
+
+ // Shrink the buffer size to be less than size of returning data
+ --l_vpdInfo.iv_size;
+
+ // Make the platGetVPD call
+ l_rc = platGetVPD(l_ocmbChipTarget, l_vpdInfo, o_efdBuffer);
+
+ if (l_rc == fapi2::FAPI2_RC_SUCCESS)
+ {
+ TS_FAIL("testGetVPD_EFD: Test case 6 failed: Size of buffer (%d) "
+ "is inadequate to hold returning data, size (%d).",
+ l_vpdInfo.iv_size, (l_vpdInfo.iv_size + 1));
+
+ ++l_numFails;
+ break;
+ }
+ } while(0);
+
+
+ /// Test case 7
+ // Test when the size of the output buffer is greater than
+ // the size of the found EFD block data
+ ++l_numTests;
+ do
+ {
+ // Initialize the other input variables
+ l_vpdInfo.iv_omi_freq_mhz = 21330;
+ l_vpdInfo.iv_rank = 0;
+ l_vpdInfo.iv_is_config_ffdc_enabled = false;
+
+ // Increase the buffer size to be greater than size of returning data
+ ++l_vpdInfo.iv_size;
+
+ // Make the platGetVPD call
+ l_rc = platGetVPD(l_ocmbChipTarget, l_vpdInfo, o_efdBuffer);
+
+ if (l_rc != fapi2::FAPI2_RC_SUCCESS)
+ {
+ TS_FAIL("testGetVPD_EFD: Test case 7 failed: Failed with known "
+ "good data - frequency(%d), master rank(%d) "
+ "and buffer size(%d)",
+ l_vpdInfo.iv_omi_freq_mhz,
+ l_vpdInfo.iv_rank,
+ l_vpdInfo.iv_size);
+
+ ++l_numFails;
+ break;
+ }
+ } while(0);
+
+
+ /// Test case 8
+ // Test with data that is guaranteed to find a match 1
+ ++l_numTests;
+ do
+ {
+ // Initialize the other input variables
+ l_vpdInfo.iv_omi_freq_mhz = 25600;
+ l_vpdInfo.iv_rank = 0;
+ l_vpdInfo.iv_is_config_ffdc_enabled = true;
+
+ // Make the platGetVPD call to find the EFD data block that matches
+ // given data
+ l_rc = platGetVPD(l_ocmbChipTarget, l_vpdInfo, o_efdBuffer);
+
+ if (l_rc != fapi2::FAPI2_RC_SUCCESS)
+ {
+ TS_FAIL("testGetVPD_EFD: Test case 8 failed: Failed with known "
+ "good data - frequency(%d), master rank(%d) "
+ "and buffer size(%d)",
+ l_vpdInfo.iv_omi_freq_mhz,
+ l_vpdInfo.iv_rank,
+ l_vpdInfo.iv_size);
+
+ ++l_numFails;
+ break;
+ }
+ } while(0);
+
+
+ /// Test case 9
+ // Test with data that is guaranteed to find a match 2
+ ++l_numTests;
+ do
+ {
+ // Initialize the other input variables
+ l_vpdInfo.iv_omi_freq_mhz = 23460;
+ l_vpdInfo.iv_rank = 0;
+ l_vpdInfo.iv_is_config_ffdc_enabled = true;
+
+ // Make the platGetVPD call to find the EFD data block that matches
+ // given data
+ l_rc = platGetVPD(l_ocmbChipTarget, l_vpdInfo, o_efdBuffer);
+
+
+ if (l_rc != fapi2::FAPI2_RC_SUCCESS)
+ {
+ TS_FAIL("testGetVPD_EFD: Test case 9 failed: Failed with known "
+ "good data - frequency(%d), master rank(%d) "
+ "and buffer size(%d)",
+ l_vpdInfo.iv_omi_freq_mhz,
+ l_vpdInfo.iv_rank,
+ l_vpdInfo.iv_size);
+
+ ++l_numFails;
+ break;
+ }
+ } while(0);
+
+
+ /// Test case 10
+ // Test with data that is guaranteed to find a match 3
+ ++l_numTests;
+ do
+ {
+ // Initialize the other input variables
+ l_vpdInfo.iv_omi_freq_mhz = 21330;
+ l_vpdInfo.iv_rank = 0;
+ l_vpdInfo.iv_is_config_ffdc_enabled = true;
+
+ // Make the platGetVPD call to find the EFD data block that matches
+ // given data
+ l_rc = platGetVPD(l_ocmbChipTarget, l_vpdInfo, o_efdBuffer);
+
+ if (l_rc != fapi2::FAPI2_RC_SUCCESS)
+ {
+ TS_FAIL("testGetVPD_EFD: Test case 10 failed: Failed with known "
+ "good data - frequency(%d), master rank(%d) "
+ "and buffer size(%d)",
+ l_vpdInfo.iv_omi_freq_mhz,
+ l_vpdInfo.iv_rank,
+ l_vpdInfo.iv_size);
+
+ ++l_numFails;
+ break;
+ }
+ } while(0);
+
+
+ // Clean up memory
+ delete []o_efdBuffer;
+ o_efdBuffer = nullptr;
+
+ FAPI_INF("<<testGetVPD_EFD: Test Complete. %d/%d fails",
+ l_numFails, l_numTests);
+}; // end void fapi2PlatGetVpdOcmbChipTest::testPlatGetVPD_EFD()
+
+
diff --git a/src/usr/fapi2/test/fapi2PlatGetVpdOcmbChipTest.H b/src/usr/fapi2/test/fapi2PlatGetVpdOcmbChipTest.H
new file mode 100644
index 000000000..795ee828c
--- /dev/null
+++ b/src/usr/fapi2/test/fapi2PlatGetVpdOcmbChipTest.H
@@ -0,0 +1,52 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/fapi2/test/fapi2PlatGetVpdOcmbChipTest.H $ */
+/* */
+/* OpenPOWER HostBoot Project */
+/* */
+/* Contributors Listed Below - COPYRIGHT 2016,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 __GET_VPD_OCMB_CHIP_TEST_H
+#define __GET_VPD_OCMB_CHIP_TEST_H
+
+/**
+ * @file fapi2GetVpdOcmbChipTest.H
+ * @brief platGetVpd for OCMB CHIP memory test cases
+ */
+
+#include <cxxtest/TestSuite.H>
+
+class fapi2PlatGetVpdOcmbChipTest : public CxxTest::TestSuite
+{
+ public:
+ /**
+ * @brief OCMB_CHIP platGetVpd EFD tests
+ *
+ * Test the platGetVPD EFD interface. Based on a VPDInfo configuration,
+ * verify the expected direct memory vpd is returned.
+ * There is a dependency to update standalone simics direct memory
+ * (dimmspd.dat) for the configuration to map to a keyword.
+ */
+ void testPlatGetVPD_EFD();
+
+}; // end class fapi2PlatGetVpdOcmbChipTest
+
+
+#endif
diff --git a/src/usr/fapi2/test/fapi2Test.mk b/src/usr/fapi2/test/fapi2Test.mk
index 16c779b6e..475bb62dc 100644
--- a/src/usr/fapi2/test/fapi2Test.mk
+++ b/src/usr/fapi2/test/fapi2Test.mk
@@ -5,7 +5,7 @@
#
# OpenPOWER HostBoot Project
#
-# Contributors Listed Below - COPYRIGHT 2016,2018
+# Contributors Listed Below - COPYRIGHT 2016,2019
# [+] International Business Machines Corp.
#
#
@@ -51,6 +51,8 @@ OBJS += rcSupport.o
OBJS += fapi2TestUtils.o
OBJS += getVpdTest.o
OBJS += p9_pm_get_poundv_bucket.o
+OBJS += fapi2PlatGetVpdOcmbChipTest.o
+
ifeq (${HOSTBOOT_RUNTIME},1)
################################################################################
OpenPOWER on IntegriCloud