summaryrefslogtreecommitdiffstats
path: root/src/usr/hwpf/hwp/dram_training/mss_draminit_trainadv/mss_mcbist_common.C
diff options
context:
space:
mode:
authorCamVan Nguyen <ctnguyen@us.ibm.com>2012-12-15 00:58:48 -0600
committerA. Patrick Williams III <iawillia@us.ibm.com>2012-12-15 17:06:17 -0600
commit96e9ad8a27db09971911c6b5b2fe3e36d8208243 (patch)
tree787987ffec2a7c185cbe2cf19e14a1193478d3cc /src/usr/hwpf/hwp/dram_training/mss_draminit_trainadv/mss_mcbist_common.C
parent8badd89016edda6a4ba8167534cf28e3c95a348d (diff)
downloadtalos-hostboot-96e9ad8a27db09971911c6b5b2fe3e36d8208243.tar.gz
talos-hostboot-96e9ad8a27db09971911c6b5b2fe3e36d8208243.zip
HWP Integration: mss_draminit_training_advanced
Change-Id: Ibb7361cc9f3f36353f745d82e340f9129c75cc5c RTC: 41344 Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/2720 Tested-by: Jenkins Server Reviewed-by: MIKE J. JONES <mjjones@us.ibm.com> Reviewed-by: Brian H. Horton <brianh@linux.ibm.com> Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/usr/hwpf/hwp/dram_training/mss_draminit_trainadv/mss_mcbist_common.C')
-rw-r--r--src/usr/hwpf/hwp/dram_training/mss_draminit_trainadv/mss_mcbist_common.C1115
1 files changed, 1115 insertions, 0 deletions
diff --git a/src/usr/hwpf/hwp/dram_training/mss_draminit_trainadv/mss_mcbist_common.C b/src/usr/hwpf/hwp/dram_training/mss_draminit_trainadv/mss_mcbist_common.C
new file mode 100644
index 000000000..c472c1111
--- /dev/null
+++ b/src/usr/hwpf/hwp/dram_training/mss_draminit_trainadv/mss_mcbist_common.C
@@ -0,0 +1,1115 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/hwpf/hwp/dram_training/mss_draminit_trainadv/mss_mcbist_common.C $ */
+/* */
+/* 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 otherwise */
+/* divested of its trade secrets, irrespective of what has been */
+/* deposited with the U.S. Copyright Office. */
+/* */
+/* Origin: 30 */
+/* */
+/* IBM_PROLOG_END_TAG */
+// $Id: mss_mcbist_common.C,v 1.10 2012/12/14 16:09:38 sasethur Exp $
+// *!***************************************************************************
+// *! (C) Copyright International Business Machines Corp. 1997, 1998
+// *! All Rights Reserved -- Property of IBM
+// *! *** IBM Confidential ***
+// *!***************************************************************************
+// *! FILENAME : mss_mcbist_common.C
+// *! TITLE :
+// *! DESCRIPTION : MCBIST Procedures
+// *! CONTEXT :
+// *!
+// *! OWNER NAME : Devashikamani, Aditya Email: adityamd@in.ibm.com
+// *! BACKUP : Sethuraman, Saravanan Email: saravanans@in.ibm.com
+// *!***************************************************************************
+// CHANGE HISTORY:
+//------------------------------------------------------------------------------
+// Version:|Author: | Date: | Comment:
+// --------|--------|--------|--------------------------------------------------
+// 1.10 |sasethur|12/14/12| Updated for warnings
+// 1.9 |aditya |12/14/12| Updated FW review comments
+// 1.8 |aditya |12/6/12 | Updated Review Comments
+// 1.7 |aditya |11/15/12| Updated for FW REVIEW COMMENTS
+// 1.6 |aditya |10/31/12| Fixed issue in mcb_error_map function
+// 1.5 |abhijit |10/29/12| fixed issue in byte mask function
+// 1.4 |aditya |10/29/12| Updated from ReturnCode to fapi::ReturnCode and Target to const fapi::Target &
+// 1.3 |aditya |10/18/12| Replaced insertFromBin by InsertFromRight
+// 1.2 |aditya |10/17/12| updated code to be compatible with ecmd 13 release
+// 1.1 |aditya |10/01/12| updated fw review comments, datapattern, testtype, addressing
+//
+//
+//This File mss_mcbist_common.C contains the definition of common procedures for the files mss_mcbist.C and mss_mcbist_lab.C
+//------------------------------------------------------------------------------
+#include "mss_mcbist.H"
+#include <mss_access_delay_reg.H>
+#include <fapiTestHwpDq.H>
+#include <dimmBadDqBitmapFuncs.H>
+
+extern "C"
+{
+using namespace fapi;
+
+#define MCB_DEBUG
+#define MCB_DEBUG1
+#define MCB_DEBUG2
+
+
+//const uint8_t MAX_PORT = 2;
+const uint8_t MAX_DRAM = 20;
+
+//const uint8_t MAX_BYTE = 10;
+//const uint8_t MAX_RANK = 8;
+//const uint8_t MAX_NIBBLE = 1;
+const uint8_t MCB_TEST_NUM = 16;
+const uint8_t MCB_MAX_TIMEOUT = 100;
+const uint64_t DELAY_100US = 100000; // general purpose 100 usec delay for HW mode (2000000 sim cycles if simclk = 20ghz)
+const uint64_t DELAY_2000SIMCYCLES = 2000; // general purpose 2000 sim cycle delay for sim mode (100 ns if simclk = 20Ghz)
+//const uint64_t END_ADDRESS = 0x0000000004; //Will be fixed later, once the address generation function is ready
+// const uint64_t START_ADDRESS = 0x0000000001;
+//const uint64_t FEW_INTERVAL = 0x0000000003;
+
+const uint64_t END_ADDRESS = 0x0000000010000000ull; //Will be fixed later, once the address generation function is ready
+ const uint64_t START_ADDRESS = 0x0000000004000000ull;
+const uint64_t FEW_INTERVAL = 0x000000000C000000ull;
+const uint64_t FOUR = 0x0000000000000004ull;
+
+
+//*****************************************************************/
+// Funtion name : setup_mcbist
+// Description : Will setup the required MCBIST configuration register
+// Input Parameters :
+// const fapi::Target & Centaur.mba
+// uint8_t i_port Port on which we are operating.
+
+// mcbist_data_gen i_mcbpatt Data pattern
+// mcbist_test_mem i_mcbtest subtest Type
+// mcbist_byte_mask i_mcbbytemask It is used to mask bad bits read from SPD
+// uint8_t i_mcbrotate Provides the number of bit to shift per burst
+
+// uint8_t i_pattern Data Pattern
+// uint8_t i_test_type Subtest Type
+// uint8_t i_rank Current Rank
+//****************************************************************/
+
+
+fapi::ReturnCode setup_mcbist(const fapi::Target & i_target_mba, uint8_t i_port,mcbist_data_gen i_mcbpatt,mcbist_test_mem i_mcbtest,mcbist_byte_mask i_mcbbytemask,uint8_t i_mcbrotate,uint8_t i_pattern,uint8_t i_test_type,uint8_t i_rank)
+{
+
+ fapi::ReturnCode rc;
+ uint32_t rc_num = 0;
+ FAPI_INF("Function Setup_MCBIST");
+ ecmdDataBufferBase l_data_buffer_64(64);
+ ecmdDataBufferBase l_data_bufferx1_64(64);
+ ecmdDataBufferBase l_data_bufferx2_64(64);
+ ecmdDataBufferBase l_data_bufferx3_64(64);
+ ecmdDataBufferBase l_data_bufferx4_64(64);
+ //ecmdDataBufferBase l_data_buffer_64_1(64);
+
+
+ rc = mcb_reset_trap(i_target_mba);
+ if(rc) return rc;
+/*
+ rc = fapiGetScom(i_target_mba, MBA01_MCBIST_MCBMR0Q_0x030106a8,l_data_buffer_64); if(rc) return rc;
+ rc_num = rc_num | l_data_buffer_64.flushTo0();
+ rc_num = rc_num | l_data_buffer_64.setBit(18);
+ rc_num = rc_num | l_data_buffer_64.setBit(27);
+ rc = fapiPutScom(i_target_mba, MBA01_MCBIST_MCBMR0Q_0x030106a8, l_data_buffer_64); if(rc) return rc;
+
+ rc = fapiGetScom(i_target_mba, MBA01_MCBIST_MCBSEARA0Q_0x030106d2,l_data_buffer_64);if(rc) return rc;
+ rc_num = rc_num | l_data_buffer_64.setBit(36);
+ rc_num = rc_num | l_data_buffer_64.setBit(37);
+ rc = fapiPutScom(i_target_mba, MBA01_MCBIST_MCBSEARA0Q_0x030106d2,l_data_buffer_64); if(rc) return rc;
+
+ rc = fapiGetScom(i_target_mba, MBA01_MCBIST_MCBSSARA0Q_0x030106d0,l_data_buffer_64); if(rc) return rc;
+ rc_num = rc_num | l_data_buffer_64.flushTo0();
+ rc = fapiPutScom(i_target_mba, MBA01_MCBIST_MCBSSARA0Q_0x030106d0,l_data_buffer_64); if(rc) return rc;
+
+ rc = fapiGetScom(i_target_mba, MBA01_MCBIST_MCBAGRAQ_0x030106d6,l_data_buffer_64); if(rc) return rc;
+ rc_num = rc_num | l_data_buffer_64.setBit(24);
+ rc_num = rc_num | l_data_buffer_64.clearBit(25);
+ rc = fapiPutScom(i_target_mba, MBA01_MCBIST_MCBAGRAQ_0x030106d6, l_data_buffer_64); if(rc) return rc;
+ */
+ rc = fapiGetScom(i_target_mba,MBA01_CCS_MODEQ_0x030106a7, l_data_buffer_64); if(rc) return rc;
+ rc_num = l_data_buffer_64.clearBit(29); if (rc_num){FAPI_ERR( "Error in function setup_mcb:");rc.setEcmdError(rc_num);return rc;}
+
+ rc = fapiPutScom(i_target_mba,MBA01_CCS_MODEQ_0x030106a7, l_data_buffer_64); if(rc) return rc;
+ //rc = print_pattern(i_target_mba);if(rc)return rc;
+ if((i_test_type == 1) && (i_pattern == 1))
+ {
+ FAPI_INF("User pattern and User test_type modes enabled");
+ rc = cfg_mcb_dgen(i_target_mba,USR_MODE,i_mcbrotate); if(rc) return rc;
+ FAPI_INF("Inside setup mcbist Entering cfg_mcb_addr");
+ //rc = cfg_mcb_addr(i_target_mba,i_rank,i_port);if(rc) return rc;
+ rc = cfg_mcb_test_mem(i_target_mba,USER_MODE); if(rc) return rc;
+ }
+ else if(i_pattern == 1)
+ {
+ FAPI_INF("User pattern mode enabled");
+ rc = cfg_mcb_dgen(i_target_mba,USR_MODE,i_mcbrotate); if(rc) return rc;
+ FAPI_INF("Inside setup mcbist Entering cfg_mcb_addr");
+ //rc = cfg_mcb_addr(i_target_mba,i_rank,i_port);if(rc) return rc;
+ rc = cfg_mcb_test_mem(i_target_mba,i_mcbtest); if(rc) return rc;
+ }
+ else if(i_test_type == 1)
+ {
+ FAPI_INF(" User test_type mode enabled");
+ rc = cfg_mcb_dgen(i_target_mba,i_mcbpatt,i_mcbrotate); if(rc) return rc;
+ FAPI_INF("Inside setup mcbist Entering cfg_mcb_addr");
+ //rc = cfg_mcb_addr(i_target_mba,i_rank,i_port);if(rc) return rc;
+ rc = cfg_mcb_test_mem(i_target_mba,USER_MODE); if(rc) return rc;
+ }
+ else
+ {
+ rc = cfg_mcb_dgen(i_target_mba,i_mcbpatt,i_mcbrotate); if(rc) return rc;
+ FAPI_INF("Inside setup mcbist Entering cfg_mcb_addr");
+ //rc = cfg_mcb_addr(i_target_mba,i_rank,i_port);if(rc) return rc;
+ rc = cfg_mcb_test_mem(i_target_mba,i_mcbtest); if(rc) return rc;
+ }
+
+ if(i_mcbbytemask != NONE)
+ {
+ rc = cfg_byte_mask(i_target_mba,i_rank,i_port); if(rc) return rc;
+
+ }
+
+
+ return rc;
+}
+
+//*****************************************************************/
+// Funtion name : mcb_reset_trap
+// Description: Clears all the trap registers in MCBIST engine
+//Input Parameters :
+// const fapi::Target & centaur.mba
+//*****************************************************************/
+
+fapi::ReturnCode mcb_reset_trap(const fapi::Target & i_target_mba)
+{
+ ecmdDataBufferBase l_data_buffer_64(64);
+ fapi::ReturnCode rc;
+ uint32_t rc_num = 0;
+
+
+ FAPI_INF("Function - mcb_reset_trap");
+ FAPI_INF("Using MCB Reset Trap Function -- This automatically resets error log RA, error counters, Status Reg and error map");
+
+ rc = fapiGetScom(i_target_mba,MBA01_MCBIST_MCBCFGQ_0x030106e0,l_data_buffer_64);if(rc) return rc;
+ rc_num = l_data_buffer_64.clearBit(60);if (rc_num){FAPI_ERR( "Error in function mcb_reset_trap:");rc.setEcmdError(rc_num);return rc;}
+ rc = fapiPutScom(i_target_mba,MBA01_MCBIST_MCBCFGQ_0x030106e0,l_data_buffer_64);if(rc) return rc;
+ rc_num = l_data_buffer_64.setBit(60);if (rc_num){FAPI_ERR( "Error in function mcb_reset_trap:");rc.setEcmdError(rc_num);return rc;}
+ rc = fapiPutScom(i_target_mba,MBA01_MCBIST_MCBCFGQ_0x030106e0,l_data_buffer_64);if(rc) return rc;
+ rc_num = l_data_buffer_64.clearBit(60);if (rc_num){FAPI_ERR( "Error in function mcb_reset_trap:");rc.setEcmdError(rc_num);return rc;}
+ rc = fapiPutScom(i_target_mba,MBA01_MCBIST_MCBCFGQ_0x030106e0,l_data_buffer_64);if(rc) return rc;
+ //Reset MCB Maintanence register
+ FAPI_INF("Clearing the MCBIST Maintenance ");
+ rc_num = l_data_buffer_64.flushTo0();if (rc_num){FAPI_ERR( "Error in function mcb_reset_trap:");rc.setEcmdError(rc_num);return rc;}
+ rc = fapiGetScom(i_target_mba,MBA01_MCBIST_MCB_CNTLSTATQ_0x030106dc,l_data_buffer_64);if(rc) return rc;
+ rc_num = l_data_buffer_64.clearBit(0,3);if (rc_num){FAPI_ERR( "Error in function mcb_reset_trap:");rc.setEcmdError(rc_num);return rc;}
+ rc = fapiPutScom(i_target_mba,MBA01_MCBIST_MCB_CNTLSTATQ_0x030106dc,l_data_buffer_64);if(rc) return rc;
+
+ //Reset the MCBIST runtime counter
+ FAPI_INF("Clearing the MCBIST Runtime Counter ");
+ rc_num = l_data_buffer_64.flushTo0();if (rc_num){FAPI_ERR( "Error in function mcb_reset_trap:");rc.setEcmdError(rc_num);return rc;}
+ rc = fapiGetScom(i_target_mba,MBA01_MCBIST_RUNTIMECTRQ_0x030106b0,l_data_buffer_64);if(rc) return rc;
+ rc_num = l_data_buffer_64.clearBit(0,37);if (rc_num){FAPI_ERR( "Error in function mcb_reset_trap:");rc.setEcmdError(rc_num);return rc;}
+ rc = fapiPutScom(i_target_mba,MBA01_MCBIST_RUNTIMECTRQ_0x030106b0,l_data_buffer_64);if(rc) return rc;
+
+ FAPI_INF("To clear Port error map registers of both port A and B");
+ rc_num = l_data_buffer_64.flushTo0();if (rc_num){FAPI_ERR( "Error in function mcb_reset_trap:");rc.setEcmdError(rc_num);return rc;}
+ //PORT - A
+ rc = fapiPutScom(i_target_mba,MBS_MCBIST01_MCBEMA1Q_0x0201166a,l_data_buffer_64); if(rc) return(rc);
+ rc = fapiPutScom(i_target_mba,MBS_MCBIST01_MCBEMA2Q_0x0201166b,l_data_buffer_64); if(rc) return(rc);
+ rc = fapiPutScom(i_target_mba,MBS_MCBIST01_MCBEMA3Q_0x0201166c,l_data_buffer_64); if(rc) return(rc);
+
+ //PORT - B
+ rc = fapiPutScom(i_target_mba,MBS_MCBIST01_MCBEMB1Q_0x0201166d,l_data_buffer_64); if(rc) return(rc);
+ rc = fapiPutScom(i_target_mba,MBS_MCBIST01_MCBEMB2Q_0x0201166e,l_data_buffer_64); if(rc) return(rc);
+ rc = fapiPutScom(i_target_mba,MBS_MCBIST01_MCBEMB3Q_0x0201166f,l_data_buffer_64); if(rc) return(rc);
+
+
+
+ return rc;
+}
+
+
+//*****************************************************************/
+// Funtion name : start_mcb
+// Description: Checks for dimms drop in the particular port & starts MCBIST
+//Input Parameters :
+// const fapi::Target & Centaur.mba
+//*****************************************************************/
+
+fapi::ReturnCode start_mcb(const fapi::Target & i_target_mba)
+{
+ ecmdDataBufferBase l_data_buffer_64(64);
+ uint8_t l_num_ranks_per_dimm[2][2];
+ fapi::ReturnCode rc;
+ uint32_t rc_num = 0;
+ FAPI_INF("Function - start_mcb");
+
+
+ rc = fapiGetScom(i_target_mba,MBA01_MCBIST_MCBAGRAQ_0x030106d6,l_data_buffer_64); if(rc) return rc;
+ rc = FAPI_ATTR_GET(ATTR_EFF_NUM_RANKS_PER_DIMM, &i_target_mba, l_num_ranks_per_dimm); if(rc) return rc;
+
+
+ if(l_num_ranks_per_dimm[0][0] > 0)
+ {
+ FAPI_INF("Port AB configured, Socket 0 Configured");
+ rc_num = l_data_buffer_64.setBit(24);if (rc_num){FAPI_ERR( "Error in function start_mcb:");rc.setEcmdError(rc_num);return rc;}
+ rc_num = l_data_buffer_64.clearBit(25);if (rc_num){FAPI_ERR( "Error in function start_mcb:");rc.setEcmdError(rc_num);return rc;}
+ }
+ else if(l_num_ranks_per_dimm[0][1] > 0)
+ {
+ FAPI_INF("Port AB configured, Socket 1 Configured");
+ rc_num = l_data_buffer_64.clearBit(24);if (rc_num){FAPI_ERR( "Error in function start_mcb:");rc.setEcmdError(rc_num);return rc;}
+ rc_num = l_data_buffer_64.setBit(25);if (rc_num){FAPI_ERR( "Error in function start_mcb:");rc.setEcmdError(rc_num);return rc;}
+ }
+ else if((l_num_ranks_per_dimm[0][0] > 0) && (l_num_ranks_per_dimm[0][1] > 0))
+ {
+ FAPI_INF("Port AB configured, Socket 0, 1 Configured");
+ rc_num = l_data_buffer_64.setBit(24);if (rc_num){FAPI_ERR( "Error in function start_mcb:");rc.setEcmdError(rc_num);return rc;}
+ rc_num = l_data_buffer_64.setBit(25);if (rc_num){FAPI_ERR( "Error in function start_mcb:");rc.setEcmdError(rc_num);return rc;}
+ }
+ else
+ {
+ FAPI_INF("No Socket found");
+
+ }
+
+
+ //rc = fapiDelay(DELAY_100US, DELAY_2000SIMCYCLES);if(rc) return rc; // wait 2000 simcycles (in sim mode) OR 100 uS (in hw mode)
+
+ rc = fapiPutScom(i_target_mba,MBA01_MCBIST_MCBAGRAQ_0x030106d6,l_data_buffer_64); if(rc) return rc;
+ FAPI_INF("STARTING MCBIST for Centaur Target");
+ rc = fapiGetScom(i_target_mba,MBA01_MCBIST_MCB_CNTLSTATQ_0x030106dc,l_data_buffer_64); if(rc) return rc;
+
+ if(l_data_buffer_64.isBitSet(0))
+ {
+ FAPI_INF("MCBIST already in progess, wait till MCBIST completes");
+
+ return rc;
+
+ }
+ rc_num = l_data_buffer_64.flushTo0();if (rc_num){FAPI_ERR( "Error in function start_mcb:");rc.setEcmdError(rc_num);return rc;}
+ rc_num = l_data_buffer_64.setBit(0);if (rc_num){FAPI_ERR( "Error in function start_mcb:");rc.setEcmdError(rc_num);return rc;}
+ rc = fapiPutScom(i_target_mba,MBA01_MCBIST_MCB_CNTLQ_0x030106db,l_data_buffer_64); if(rc) return rc;
+
+ //rc = fapiDelay(DELAY_100US, DELAY_2000SIMCYCLES);if(rc) return rc; // wait 2000 simcycles (in sim mode) OR 100 uS (in hw mode)
+
+
+
+ return rc;
+}
+
+
+
+//*****************************************************************/
+// Funtion name : poll_mcb
+// Description : Will check the MCBIST Configuration Register for mcb fail, in progress
+// fail. It will print the corresponding centaur on which MCBIST has
+// been completed, in progress or failed.
+// Input Parameters :
+// const fapi::Target & Centaur.mba
+// bool i_mcb_stop_on_fail Whether MCBIST should stop on fail or not
+// Output Parameter :
+// uint32 status = 1 MCBIST done with fail or MCBIST not complete (default value)
+// = 0 MCBIST Done without fail
+//****************************************************************/
+fapi::ReturnCode poll_mcb(const fapi::Target & i_target_mba,bool i_mcb_stop_on_fail,uint8_t *o_mcb_status)
+{
+ fapi::ReturnCode rc; // return value after each SCOM access/buffer modification
+ uint32_t rc_num = 0;
+ ecmdDataBufferBase l_data_buffer_64(64);
+ ecmdDataBufferBase l_stop_on_fail_buffer_64(64);
+ //Current status of the MCB (done, fail, in progress)
+ uint8_t l_mcb_done = 0;
+ uint8_t l_mcb_fail = 0;
+ uint8_t l_mcb_ip = 0;
+ //Time out variables
+ uint32_t l_mcb_timeout = 0;
+ uint32_t l_count = 0;
+
+ // Clear to register to zero;
+
+ FAPI_INF("Function Poll_MCBIST");
+
+ while ((l_mcb_done == 0) && (l_mcb_timeout <= MCB_MAX_TIMEOUT))
+ {
+ rc = fapiGetScom(i_target_mba,MBA01_MCBIST_MCB_CNTLSTATQ_0x030106dc,l_data_buffer_64); if(rc) return rc;
+ if(l_data_buffer_64.isBitSet(0))
+ {
+ FAPI_INF("MCBIST is in progress_inside poll_mcb");
+ l_mcb_ip = 1;
+ }
+ if(l_data_buffer_64.isBitSet(1))
+ {
+ FAPI_INF("MCBIST is done");
+ l_mcb_ip = 0;
+ l_mcb_done = 1;
+ }
+ if(l_data_buffer_64.isBitSet(2))
+ {
+ l_mcb_fail = 1;
+ if(i_mcb_stop_on_fail == true) //if stop on error is 1, break after the current subtest completes
+ {
+ rc = fapiGetScom(i_target_mba,MBA01_MCBIST_MCBCFGQ_0x030106e0,l_stop_on_fail_buffer_64); if(rc) return rc;
+ rc_num = l_stop_on_fail_buffer_64.setBit(62);if (rc_num){FAPI_ERR( "Error in function poll_mcb:");rc.setEcmdError(rc_num);return rc;} // Set bit 61 to break after current subtest
+ rc = fapiPutScom(i_target_mba,MBA01_MCBIST_MCBCFGQ_0x030106e0,l_stop_on_fail_buffer_64); if(rc) return rc;
+ FAPI_INF("MCBIST will break after Current Subtest");
+
+ while(l_mcb_done == 0) // Poll till MCBIST is done
+ {
+ rc = fapiGetScom(i_target_mba,MBA01_MCBIST_MCB_CNTLSTATQ_0x030106dc,l_data_buffer_64); if(rc) return rc;
+ if(l_data_buffer_64.isBitSet(1))
+ {
+ l_mcb_ip = 0;
+ l_mcb_done = 1;
+ FAPI_INF("MCBIST Done");
+ rc_num = l_stop_on_fail_buffer_64.clearBit(62);if (rc_num){FAPI_ERR( "Error in function poll_mcb:");rc.setEcmdError(rc_num);return rc;} // Clearing bit 61 to avoid breaking after current subtest
+ rc = fapiPutScom(i_target_mba,MBA01_MCBIST_MCBCFGQ_0x030106e0,l_stop_on_fail_buffer_64); if(rc) return rc;
+ }
+ }
+ }
+ }
+ l_mcb_timeout++;
+ if (l_mcb_timeout >= MCB_MAX_TIMEOUT)
+ {
+ FAPI_ERR( "poll_mcb:Maximun time out");
+ FAPI_SET_HWP_ERROR(rc,RC_MSS_MCBIST_TIMEOUT_ERROR);
+ return rc;
+ }
+
+#ifdef MCB_DEBUG_1
+ if(l_count%100 == 0)//Can be changed later
+ {
+ FAPI_INF("MCB done bit : l_mcb_done");
+ FAPI_INF("MCB fail bit : l_mcb_fail");
+ FAPI_INF("MCB IP bit : l_mcb_ip");
+ }
+#endif
+ l_count++;
+ }
+
+ if((l_mcb_done == 1) && (l_mcb_fail == 1) && (i_mcb_stop_on_fail == true))
+ {
+ *o_mcb_status = 1; /// MCB fail
+ #ifdef MCB_DEBUG_2
+ FAPI_INF("*************************************************");
+ FAPI_INF("MCB done bit : %d",l_mcb_done);
+ FAPI_INF("MCB fail bit : %d",l_mcb_fail);
+ FAPI_INF("MCB IP bit : %d",l_mcb_ip);
+ FAPI_INF("*************************************************");
+ #endif
+ }
+ else if((l_mcb_done == 1) && (l_mcb_fail == 0))
+ {
+ *o_mcb_status = 0;//pass;
+ #ifdef MCB_DEBUG2
+ FAPI_INF("*************************************************");
+ FAPI_INF("MCB done bit : %d",l_mcb_done);
+ FAPI_INF("MCB fail bit : %d",l_mcb_fail);
+ FAPI_INF("MCB IP bit : %d",l_mcb_ip);
+ FAPI_INF("*************************************************");
+ #endif
+ }
+ else if((l_mcb_done == 0) && (l_mcb_ip == 1) && (l_mcb_timeout == MCB_MAX_TIMEOUT))
+ {
+ *o_mcb_status = 1;//fail;
+ #ifdef MCB_DEBUG2
+ FAPI_INF("****************************************");
+ FAPI_INF("MCB done bit : %d",l_mcb_done);
+ FAPI_INF("MCB fail bit : %d",l_mcb_fail);
+ FAPI_INF("MCB IP bit : %d",l_mcb_ip);
+ FAPI_INF("****************************************");
+
+ #endif
+ }
+
+
+ if (*o_mcb_status == 1)
+ {
+ FAPI_ERR( "poll_mcb:MCBIST failed");
+ FAPI_SET_HWP_ERROR(rc,RC_MSS_MCBIST_ERROR);
+ return rc;
+ }
+
+
+
+ return rc;
+}
+
+
+
+/****************************************************************/
+// Funtion name : mcb_error_map_print
+// Description : Prints the error Map of a Rank
+// Input Parameters :
+// const fapi::Target & Centaur.mba
+// uint8_t i_port Port in use
+// uint8_t i_rank Rank in use
+// ecmdDataBufferBase & l_mcb_fail_320 Ecmd Buffer
+// Output Parameter :
+// uint8_t o_error_map[][8][10][2] Contains the error map
+//****************************************************************/
+
+fapi::ReturnCode mcb_error_map_print(const fapi::Target & i_target_mba,uint8_t i_port,uint8_t i_rank,ecmdDataBufferBase & l_mcb_fail_320)
+{
+ ReturnCode rc;
+ uint8_t l_num_ranks_per_dimm[MAX_PORT][MAX_PORT];
+ uint8_t l_rankpair_table[MAX_RANK] = {0};
+ uint8_t l_cur_rank =0;
+ uint8_t l_cur_dram =0;
+ uint8_t l_max_rank = 0;
+ uint8_t l_rank_pair = 0;
+ char l_str1[200] = "";
+ uint8_t l_index = 0;
+
+ if(i_port == 0)
+ {
+ FAPI_INF("################# PortA Error MAP #################");
+ }
+ if(i_port == 1)
+ {
+ FAPI_INF("################# PortB Error MAP #################");
+ }
+
+ FAPI_INF("Byte 00112233445566778899");
+ FAPI_INF(" --------------------");
+ FAPI_INF("Nibble 00000000001111111111");
+ FAPI_INF("Nibble 01234567890123456789");
+
+ rc = FAPI_ATTR_GET(ATTR_EFF_NUM_RANKS_PER_DIMM, &i_target_mba, l_num_ranks_per_dimm); if(rc) return rc;
+ l_max_rank=l_num_ranks_per_dimm[i_port][0]+l_num_ranks_per_dimm[i_port][1];
+ rc = mss_getrankpair(i_target_mba,i_port,0,&l_rank_pair,l_rankpair_table); if(rc) return rc;
+
+ if(l_max_rank > MAX_RANK)
+ {
+ FAPI_ERR(" Maximum ranks available exceeded 8");
+ FAPI_SET_HWP_ERROR(rc, RC_MSS_INPUT_ERROR);
+
+ return rc;
+ }
+ for(l_cur_rank = 0;l_cur_rank < l_max_rank;l_cur_rank++)
+ {
+ if(i_rank == l_rankpair_table[l_cur_rank])
+ {
+ sprintf(l_str1,"%-4s%d%5s","RANK",l_rankpair_table[l_cur_rank],"");
+ for(l_cur_dram = 0; l_cur_dram < MAX_DRAM; l_cur_dram++)
+ {
+
+ if(i_port == 1)
+ {
+ l_index = (l_rankpair_table[l_cur_rank])*(MAX_DRAM) + l_cur_dram + 160;
+ }
+
+ if(i_port == 0)
+ {
+ l_index = (l_rankpair_table[l_cur_rank])*(MAX_DRAM) + l_cur_dram ;
+ }
+
+
+
+
+ if(l_mcb_fail_320.isBitSet(l_index))
+ {
+
+ strcat(l_str1,"X");
+ }
+ else
+ {
+
+ strcat(l_str1,".");
+ }
+ }
+
+
+ FAPI_INF("%s",l_str1);
+ break;
+ }
+ }
+return rc;
+}
+
+
+
+
+
+
+
+/*****************************************************************/
+// Funtion name : mcb_error_map
+// Description : Reads the nibblewise Error map registers into o_error_map
+// Input Parameters :
+// const fapi::Target & Centaur.mba
+//
+// Output Parameter :
+// uint8_t o_error_map[][8][10][2] Contains the error map
+//****************************************************************/
+fapi::ReturnCode mcb_error_map(const fapi::Target & i_target_mba, uint8_t o_error_map[][8][10][2],uint8_t i_port,uint8_t i_rank)
+{
+ ecmdDataBufferBase l_mcbem1ab(64);
+ ecmdDataBufferBase l_mcbem2ab(64);
+ ecmdDataBufferBase l_mcbem3ab(64);
+ ecmdDataBufferBase l_data_buffer_64(64);
+ ecmdDataBufferBase l_mcb_fail_320(320);
+
+
+
+
+ //####################
+ fapi::Target i_target_centaur ;
+ //####################
+ fapi::ReturnCode rc;
+ uint32_t rc_num = 0;
+ //uint8_t l_cur_rank =0;
+ //uint8_t l_cur_dram =0;
+ uint8_t l_index0 = 0;
+ uint8_t l_index1 = 0;
+ uint8_t l_port = 0;
+ uint8_t l_rank = 0;
+ uint8_t l_byte = 0;
+ uint8_t l_nibble = 0;
+ uint8_t l_num_ranks_per_dimm[MAX_PORT][MAX_PORT];
+ // uint8_t l_max_rank = 0;
+ // uint8_t l_rankpair_table[MAX_RANK] = {0};
+ //uint8_t l_rank_pair = 0;
+ uint8_t l_mbaPosition = 0;
+ FAPI_INF("Function MCB_ERROR_MAP");
+ rc = FAPI_ATTR_GET(ATTR_CHIP_UNIT_POS, &i_target_mba, l_mbaPosition);
+ if(rc)
+ {
+ FAPI_ERR("Error getting MBA position"); return rc;
+ }
+
+
+ rc = FAPI_ATTR_GET(ATTR_EFF_NUM_RANKS_PER_DIMM, &i_target_mba, l_num_ranks_per_dimm); if(rc) return rc;
+ rc = fapiGetParentChip(i_target_mba, i_target_centaur);
+ if (rc)
+ {
+ FAPI_ERR("Error in getting Parent Chiplet");
+ return rc;
+ }
+
+
+ rc = fapiGetScom(i_target_centaur,MBS_MCBIST01_MCBEMA1Q_0x0201166a,l_mcbem1ab); if(rc) return rc;
+ rc_num = l_mcb_fail_320.insert(l_mcbem1ab,0,60,0);if (rc_num){FAPI_ERR( "Error in function mcb_error_map:");rc.setEcmdError(rc_num);return rc;}
+ rc = fapiGetScom(i_target_centaur,MBS_MCBIST01_MCBEMA2Q_0x0201166b,l_mcbem2ab); if(rc) return rc;
+ rc_num = l_mcb_fail_320.insert(l_mcbem2ab,60,60,0);if (rc_num){FAPI_ERR( "Error in function mcb_error_map:");rc.setEcmdError(rc_num);return rc;}
+ rc = fapiGetScom(i_target_centaur,MBS_MCBIST01_MCBEMA3Q_0x0201166c,l_mcbem3ab); if(rc) return rc;
+ rc_num = l_mcb_fail_320.insert(l_mcbem3ab,120,40,0);if (rc_num){FAPI_ERR( "Error in function mcb_error_map:");rc.setEcmdError(rc_num);return rc;}
+
+
+ //rc = FAPI_ATTR_GET(ATTR_EFF_NUM_RANKS_PER_DIMM, &i_target_mba, l_num_ranks_per_dimm); if(rc) return rc;
+ //l_max_rank=l_num_ranks_per_dimm[0][0]+l_num_ranks_per_dimm[0][1];
+ // rc = mss_getrankpair(i_target_mba,i_port,0,&l_rank_pair,l_rankpair_table); if(rc) return rc;
+
+ /*if(l_max_rank > MAX_RANK)
+ {
+ FAPI_ERR(" Maximum ranks available exceeded 8");
+ FAPI_SET_HWP_ERROR(rc, RC_MSS_INPUT_ERROR);
+ return rc;
+ }*/
+ if(i_port == 0)
+ {
+
+ mcb_error_map_print( i_target_mba ,i_port, i_rank, l_mcb_fail_320);
+
+ }
+ rc = fapiGetScom(i_target_centaur,MBS_MCBIST01_MCBEMB1Q_0x0201166d,l_mcbem1ab); if(rc) return rc;
+ rc_num = l_mcb_fail_320.insert(l_mcbem1ab,160,60,0);if (rc_num){FAPI_ERR( "Error in function mcb_error_map:");rc.setEcmdError(rc_num);return rc;}
+ rc = fapiGetScom(i_target_centaur,MBS_MCBIST01_MCBEMB2Q_0x0201166e,l_mcbem2ab); if(rc) return rc;
+ rc_num = l_mcb_fail_320.insert(l_mcbem2ab,220,60,0);if (rc_num){FAPI_ERR( "Error in function mcb_error_map:");rc.setEcmdError(rc_num);return rc;}
+ rc = fapiGetScom(i_target_centaur,MBS_MCBIST01_MCBEMB3Q_0x0201166f,l_mcbem3ab); if(rc) return rc;
+ rc_num = l_mcb_fail_320.insert(l_mcbem3ab,280,40,0);if (rc_num){FAPI_ERR( "Error in function mcb_error_map:");rc.setEcmdError(rc_num);return rc;}
+ //Restore values
+
+ if(i_port == 1)
+ {
+ mcb_error_map_print(i_target_mba, i_port, i_rank, l_mcb_fail_320);
+ }
+
+ //Need to check the DIMM plugged in and decide the rank? - Implement that.
+
+ for (l_port = 0; l_port < MAX_PORT ; l_port++)
+ {
+ for(l_rank = 0; l_rank < MAX_RANK; l_rank++)
+ {
+ for(l_byte = 0; l_byte < MAX_BYTE; l_byte++)
+ {
+ for(l_nibble = 0; l_nibble < MAX_NIBBLES; l_nibble++)
+ {
+ l_index0 = (l_rank*20) + (l_byte*2) + l_nibble;
+ l_index1 = l_index0 + 160*(l_port);
+ if((l_mcb_fail_320.isBitSet(l_index1)))
+ {
+ o_error_map[l_port][l_rank][l_byte][l_nibble] = 1;
+ }
+ else
+ {
+ o_error_map[l_port][l_rank][l_byte][l_nibble] = 0;
+ }
+
+ }
+ }
+ }
+ }
+
+
+
+ return rc;
+}
+/*****************************************************************/
+// Funtion name : mcb_write_test_mem
+// Description : : Based on parameters passed we write data into Register being passed
+// Input Parameters :
+// const fapi::Target & Centaur.mba
+// const uint64_t i_reg_addr Register address
+// mcbist_oper_type i_operation_type Operation Type
+// mcbist_addr_mode i_addr_mode Sequential or Random address modes
+// mcbist_data_mode i_data_mode Data Mode
+// uint8_t i_done Done Bit
+// mcbist_data_select_mode i_data_select_mode Different BURST modes or DEFAULT
+// mcbist_add_select_mode i_addr_select_mode Address Select mode
+// uint8_t i_testnumber Subtest number
+// uint8_t i_cfg_test_123_cmd Integer value
+
+//****************************************************************/
+fapi::ReturnCode mcb_write_test_mem(const fapi::Target & i_target_mba,const uint64_t i_reg_addr,mcbist_oper_type i_operation_type,uint8_t i_cfg_test_123_cmd,mcbist_addr_mode i_addr_mode,mcbist_data_mode i_data_mode,uint8_t i_done,mcbist_data_select_mode i_data_select_mode, mcbist_add_select_mode i_addr_select_mode,uint8_t i_testnumber)
+{
+ fapi::ReturnCode rc;
+ uint32_t rc_num = 0;
+ uint8_t l_index = 0;
+ uint8_t l_operation_type = i_operation_type;
+ uint8_t l_cfg_test_123_cmd = i_cfg_test_123_cmd;
+ uint8_t l_addr_mode = i_addr_mode;
+ uint8_t l_data_mode = i_data_mode;
+ uint8_t l_data_select_mode = i_data_select_mode;
+ uint8_t l_addr_select_mode = i_addr_select_mode;
+
+ ecmdDataBufferBase l_data_buffer_64(64);
+
+
+ FAPI_INF("Function mcb_write_test_mem");
+ rc = fapiGetScom(i_target_mba,i_reg_addr,l_data_buffer_64);if(rc) return rc;
+ l_index = i_testnumber * (MCB_TEST_NUM) ;
+
+ // Operation type
+
+
+ rc_num = rc_num| l_data_buffer_64.insertFromRight(l_operation_type,l_index ,3);
+
+
+ rc_num = rc_num| l_data_buffer_64.insertFromRight(l_cfg_test_123_cmd,l_index + 3,3);
+
+ // ADDR MODE
+
+ rc_num = rc_num| l_data_buffer_64.insertFromRight(l_addr_mode,l_index + 6,2);
+ // DATA MODE
+
+ rc_num = rc_num| l_data_buffer_64.insertFromRight(l_data_mode,l_index + 8,3);
+ // Done bit
+
+ rc_num = rc_num| l_data_buffer_64.insertFromRight(i_done,l_index + 11,1);
+ // Data Select Mode
+
+ rc_num = rc_num| l_data_buffer_64.insertFromRight(l_data_select_mode,l_index + 12,2);
+
+ // Address Select mode
+
+ rc_num = rc_num| l_data_buffer_64.insertFromRight(l_addr_select_mode,l_index + 14,2);
+
+
+ if (rc_num){FAPI_ERR( "Error in function mcb_write_test_mem:");rc.setEcmdError(rc_num);return rc;}
+
+ rc = fapiPutScom(i_target_mba,i_reg_addr,l_data_buffer_64); if(rc) return rc;
+ rc = fapiGetScom(i_target_mba,i_reg_addr,l_data_buffer_64); if(rc) return rc;
+
+
+ return rc;
+}
+/*****************************************************************/
+// Funtion name : cfg_byte_mask
+// Description :
+// Input Parameters : It is used to mask bad bits read from SPD
+// const fapi::Target & Centaur.mba
+// uint8_t i_rank Current Rank
+// uint8_t i_port Current Port
+//****************************************************************/
+fapi::ReturnCode cfg_byte_mask(const fapi::Target & i_target_mba,uint8_t i_rank,uint8_t i_port)
+{
+
+ uint8_t l_dimm=0;
+ ecmdDataBufferBase l_data_buffer1_64(64);
+ ecmdDataBufferBase l_data_buffer2_64(64);
+ ecmdDataBufferBase l_data_buffer3_64(64);
+
+
+ fapi::ReturnCode rc;
+ uint32_t rc_num = 0;
+
+ rc_num = l_data_buffer3_64.flushTo1();if (rc_num){FAPI_ERR( "Error in function cfg_byte_mask:");rc.setEcmdError(rc_num);return rc;}
+
+
+ uint8_t l_dqBitmap[DIMM_DQ_RANK_BITMAP_SIZE];
+ uint8_t l_dq[8]={0};
+ uint8_t l_sp[2]={0};
+ uint8_t l_index0=0;
+ uint8_t l_index_sp=0;
+ uint16_t l_sp_mask=0xffff;
+
+ FAPI_INF("Function cfg_byte_mask");
+ if(i_rank>3)
+ {
+ l_dimm=1;
+ i_rank=4-i_rank;
+ }
+ else
+ {
+ l_dimm=0;
+ }
+ rc = dimmGetBadDqBitmap(i_target_mba, i_port, l_dimm, i_rank,l_dqBitmap);if(rc) return rc;
+
+ for ( l_index0 = 0; l_index0 < DIMM_DQ_RANK_BITMAP_SIZE; l_index0++)
+ {
+ if(l_index0<8)
+ {
+ l_dq[l_index0]=l_dqBitmap[l_index0];
+ FAPI_INF("\n the bad dq=%x ",l_dqBitmap[l_index0]);
+
+ }
+ else
+ {
+ l_sp[l_index_sp]=l_dqBitmap[l_index0];
+ l_index_sp++;
+ }
+ }
+
+
+ rc_num = l_data_buffer1_64.insertFromRight(l_dq,0,64);if (rc_num){FAPI_ERR( "Error in function cfg_byte_mask:");rc.setEcmdError(rc_num);return rc;}
+ // rc_num = l_data_buffer2_64.insertFromRight(l_sp,0,16);if (rc_num){FAPI_ERR( "Error in function cfg_byte_mask:");rc.setEcmdError(rc_num);return rc;}
+
+ if(i_port == 0)
+ {
+ rc_num = l_data_buffer2_64.insertFromRight(l_sp,0,16);if (rc_num){FAPI_ERR( "Error in function cfg_byte_mask:");rc.setEcmdError(rc_num);return rc;}
+ rc_num = l_data_buffer2_64.insertFromRight(l_sp_mask,16,16);if (rc_num){FAPI_ERR( "Error in function cfg_byte_mask:");rc.setEcmdError(rc_num);return rc;}
+ rc = fapiPutScom(i_target_mba,MBS_MCBIST01_MCBCMA1Q_0x02011672,l_data_buffer1_64); if(rc) return rc;
+ rc = fapiPutScom(i_target_mba,MBS_MCBIST01_MCBCMABQ_0x02011674,l_data_buffer2_64); if(rc) return rc;
+ rc = fapiPutScom(i_target_mba,MBS_MCBIST01_MCBCMB1Q_0x02011673,l_data_buffer3_64); if(rc) return rc;
+ }
+ else
+ {
+ rc_num = l_data_buffer2_64.insertFromRight(l_sp,16,16);if (rc_num){FAPI_ERR( "Error in function cfg_byte_mask:");rc.setEcmdError(rc_num);return rc;}
+ rc_num = l_data_buffer2_64.insertFromRight(l_sp_mask,0,16);if (rc_num){FAPI_ERR( "Error in function cfg_byte_mask:");rc.setEcmdError(rc_num);return rc;}
+ rc = fapiPutScom(i_target_mba,MBS_MCBIST01_MCBCMB1Q_0x02011673,l_data_buffer1_64); if(rc) return rc;
+ rc = fapiPutScom(i_target_mba,MBS_MCBIST01_MCBCMABQ_0x02011674,l_data_buffer2_64); if(rc) return rc;
+ rc = fapiPutScom(i_target_mba,MBS_MCBIST01_MCBCMA1Q_0x02011672,l_data_buffer3_64); if(rc) return rc;
+ }
+
+
+ return rc;
+}
+/*****************************************************************/
+// Funtion name : addr_gen_func
+// Description : Based on the Schmoo Address Mode this function decides the address range on which MCBIST must operate
+// Input Parameters :
+// const fapi::Target & Centaur.mba
+// mcbist_addr_mode i_addr_mode MCBIST address mode
+// uint8_t i_attr_eff_schmoo_addr_mode Schmoo address mode
+// Output Parameters :
+// uint64_t &io_end_address End address of MCBIST
+// uint64_t &io_start_address Start address of MCBIST
+// uint8_t i_rank Current Rank
+//****************************************************************/
+
+fapi::ReturnCode addr_gen_func(const fapi::Target & i_target_mba, mcbist_addr_mode i_addr_mode, uint8_t i_attr_eff_schmoo_addr_mode ,uint64_t &io_end_address,uint64_t &io_start_address,uint8_t i_rank,uint8_t i_port)
+{
+ fapi::ReturnCode rc;
+ uint8_t l_rank = 0;
+ uint8_t l_cur_rank = 0;
+ uint8_t l_rankpair_table[8];
+ FAPI_INF("Function mss_address_gen");
+ uint64_t l_end_address = io_end_address;
+ uint64_t l_start_address = io_start_address;
+ uint64_t l_diff_address = 0;
+ uint64_t l_diff_address1 = 0;
+ uint64_t l_addr1 = 0;
+ uint64_t l_addr2 = 0;
+ uint8_t l_num_ranks_per_dimm[MAX_PORT][MAX_PORT];
+ uint8_t l_max_rank = 0;
+ //uint8_t i_port = 0;
+ uint8_t l_rank_pair = 0;
+ //uint8_t i = 0;
+ uint8_t l_compare = 0;
+ rc = FAPI_ATTR_GET(ATTR_EFF_NUM_RANKS_PER_DIMM, &i_target_mba, l_num_ranks_per_dimm); if(rc) return rc;
+ l_max_rank=l_num_ranks_per_dimm[i_port][0]+l_num_ranks_per_dimm[i_port][1];
+ rc = mss_getrankpair(i_target_mba,i_port,0,&l_rank_pair,l_rankpair_table); if(rc) return rc;
+
+ if(l_max_rank > MAX_RANK)
+ {
+ FAPI_ERR(" Maximum ranks available exceeded 8");
+ FAPI_SET_HWP_ERROR(rc, RC_MSS_INPUT_ERROR);
+ return rc;
+ }
+
+
+ for(l_cur_rank = 0;l_cur_rank < l_max_rank;l_cur_rank++)
+ {
+ if(i_rank == l_rankpair_table[l_cur_rank])
+ {
+ l_rank = l_cur_rank;
+ break;
+ }
+ }
+ //FAPI_INF(" Addressing mode is %d ",i_attr_eff_schmoo_addr_mode);
+ //l_cur_rank = 0;
+
+ if(i_addr_mode == SF)
+ {
+ l_addr1 = l_start_address;
+ l_addr2 = l_end_address;
+ }
+ else if(i_addr_mode == SR)
+ {
+ l_addr1 = l_end_address;
+ l_addr2 = l_start_address;
+ }
+ else
+ {
+ FAPI_INF("Wrong Shmoo address mode");
+ FAPI_SET_HWP_ERROR(rc, RC_MSS_INPUT_ERROR);
+ return rc;
+ }
+
+ if(i_attr_eff_schmoo_addr_mode == FEW_ADDR)
+ {
+ // FAPI_INF("Value 0 of Start is %016llX and Diff %016llX",l_addr1,l_addr2);
+
+ l_diff_address = l_addr2 - l_addr1;
+
+ /*for(i=0;i<l_rank;i++)
+ {
+ l_addr1 = l_addr1 + START_ADDRESS + l_diff_address;
+ }*/
+
+ //FAPI_INF("Value 1 of Start is %016llX and Diff %016llX",l_addr1,l_addr2);
+
+ //l_addr1 += (END_ADDRESS * l_rank);
+ l_addr1 += ((START_ADDRESS + l_diff_address) * l_rank);
+
+ l_addr2 = l_addr1 + FEW_INTERVAL;
+ //FAPI_INF("Value 2 of Start is %016llX and Diff %016llX",l_addr1,l_addr2);
+
+
+ }
+
+ else if(i_attr_eff_schmoo_addr_mode == QUARTER_ADDR)
+ {
+
+
+
+ l_diff_address = l_addr2 - l_addr1;
+
+ if (l_diff_address >= (FOUR))
+ {
+ l_diff_address1 = l_diff_address>>2;
+
+
+
+ /*for(i=0;i<l_rank;i++)
+ {
+ l_addr1 = l_addr1 + START_ADDRESS + l_diff_address;
+ }*/
+ //FAPI_INF("Value 3 of Start is %016llX and Diff %016llX",l_addr1,l_addr2);
+
+ //l_addr1 += ((START_ADDRESS+l_diff_address) * l_rank);
+ l_addr1 += ((START_ADDRESS + l_diff_address) * l_rank);
+ l_addr2 = l_addr1 + l_diff_address1;
+
+
+ //FAPI_INF("Value 4 of Start is %016llX and Diff %016llX",l_addr1,l_addr2);
+ }
+
+
+ }
+ else if(i_attr_eff_schmoo_addr_mode == HALF_ADDR)
+ {
+
+
+
+ l_diff_address = l_addr2 - l_addr1;
+ l_compare = (FOUR)>>1;
+
+ if (l_diff_address >= l_compare)
+ {
+ l_diff_address1 = l_diff_address>>1;
+
+ //FAPI_INF("Value 5.1 of diff is %016llX and FOUR %016llX",l_diff_address,l_compare);
+
+ /*for(i=0;i<l_rank;i++)
+ {
+ l_addr1 = l_addr1 + l_diff_address + START_ADDRESS;
+ } */
+ //FAPI_INF("Value 5 of Start is %016llX and Diff %016llX",l_addr1,l_addr2);
+ //l_addr1 += ((START_ADDRESS+l_diff_address) * l_rank);
+ l_addr1 += ((START_ADDRESS + l_diff_address) * l_rank);
+ l_addr2 = l_addr1 + l_diff_address1;
+ //FAPI_INF("Value 6 of Start is %016llX and Diff %016llX",l_addr1,l_addr2);
+ }
+ }
+
+ else if(i_attr_eff_schmoo_addr_mode == FULL_ADDR)
+ {
+
+ l_diff_address = l_addr2 - l_addr1;
+
+ /*for(i=0;i<l_rank;i++)
+ {
+ l_addr1 = l_addr1 + l_diff_address + START_ADDRESS;
+
+ }*/
+
+ // l_addr1 += ((START_ADDRESS+l_diff_address) * l_rank);
+ l_addr1 += ((START_ADDRESS + l_diff_address) * l_rank);
+ l_addr2 = l_addr1 + l_diff_address;
+
+ }
+
+ if(i_addr_mode == SF)
+ {
+ l_start_address = l_addr1 ;
+ l_end_address = l_addr2 ;
+ }
+ else if(i_addr_mode == SR)
+ {
+ l_end_address = l_addr1;
+ l_start_address = l_addr2;
+ }
+
+
+
+ io_start_address = l_start_address;
+ io_end_address = l_end_address;
+ //FAPI_INF("Value of end_address is %016llX and start address %016llX",io_end_address,io_start_address);
+ return rc;
+}
+
+
+//************************************************************************/
+// Funtion name : cfg_mcb_addr
+// Description : Configures the address range of MCBIST
+// Input Parameters :
+// const fapi::Target & Centaur.mba
+// uint8_t i_rank Current Rank Being Passed
+//************************************************************************/
+fapi::ReturnCode cfg_mcb_addr(const fapi::Target & i_target_mba,uint8_t rank,uint8_t i_port)
+{
+ fapi::ReturnCode rc; // return value after each SCOM access/buffer modification
+ uint32_t rc_num = 0;
+
+ ecmdDataBufferBase l_data_buffer_64(64);
+ ecmdDataBufferBase l_data_buffer2_64(64);
+
+ uint32_t io_value_u32 = 0x00000000;
+ uint32_t l_sbit = 38;
+ uint32_t l_len = 26;
+ uint32_t l_start = 0;
+ uint8_t l_attr_eff_schmoo_addr_mode = 0;
+ uint8_t l_num_ranks_per_dimm[MAX_PORT][MAX_PORT];
+ uint64_t start_address = 0;
+ uint64_t end_address = 0;
+
+
+ rc = FAPI_ATTR_GET(ATTR_EFF_SCHMOO_ADDR_MODE, &i_target_mba, l_attr_eff_schmoo_addr_mode); if(rc) return rc;
+ rc = FAPI_ATTR_GET(ATTR_EFF_NUM_RANKS_PER_DIMM, &i_target_mba, l_num_ranks_per_dimm); if(rc) return rc;
+ FAPI_INF("Function cfg_mcb_addr");
+
+
+ FAPI_INF("Num ranks per dimm :%d ", l_num_ranks_per_dimm[0][0]);
+ FAPI_INF("Num ranks per dimm :%d ", l_num_ranks_per_dimm[0][1]);
+ FAPI_INF("Num ranks per dimm :%d ", l_num_ranks_per_dimm[1][0]);
+ FAPI_INF("Num ranks per dimm :%d ", l_num_ranks_per_dimm[1][1]);
+
+
+
+ if( ( l_attr_eff_schmoo_addr_mode == FEW_ADDR) || ( l_attr_eff_schmoo_addr_mode == QUARTER_ADDR) ||( l_attr_eff_schmoo_addr_mode == HALF_ADDR) ||( l_attr_eff_schmoo_addr_mode == FULL_ADDR))
+ {
+
+
+
+ if(((l_num_ranks_per_dimm[0][0] != 0) || (l_num_ranks_per_dimm[1][0] != 0)) && (rank <=3))
+ {
+ FAPI_INF("Slot 0 is configured\n");
+
+ rc = fapiGetScom(i_target_mba,MBA01_MCBIST_MCBSSARA0Q_0x030106d0,l_data_buffer_64); if(rc) return rc;
+ rc = fapiGetScom(i_target_mba,MBA01_MCBIST_MCBSEARA0Q_0x030106d2,l_data_buffer2_64); if(rc) return rc;
+ start_address = l_data_buffer_64.getDoubleWord (0);
+ end_address = l_data_buffer2_64.getDoubleWord (0);
+
+
+
+
+ FAPI_INF(" value of start and end addr is %016llX and %016llX",start_address,end_address);
+ rc=addr_gen_func(i_target_mba,SF, l_attr_eff_schmoo_addr_mode,end_address,start_address,rank,i_port);if(rc)return rc;
+
+
+ //rc_num=rc_num|l_data_buffer_64.insert(io_value_u32,l_sbit,l_len,l_start);
+ //rc_num=rc_num|l_data_buffer2_64.insert(io_value_u32,l_sbit,l_len,l_start);
+ rc_num = rc_num|l_data_buffer_64.setDoubleWord(0,start_address);
+ rc_num = rc_num| l_data_buffer2_64.setDoubleWord(0,end_address);
+ if (rc_num){FAPI_ERR( "Error in function cfg_mcb_addr:");rc.setEcmdError(rc_num);return rc;}
+
+
+ rc_num=l_data_buffer_64.insert(io_value_u32,l_sbit,l_len,l_start);if (rc_num){FAPI_ERR( "Error in function cfg_mcb_addr:");rc.setEcmdError(rc_num);return rc;}
+ rc_num=l_data_buffer2_64.insert(io_value_u32,l_sbit,l_len,l_start); if (rc_num){FAPI_ERR( "Error in function cfg_mcb_addr:");rc.setEcmdError(rc_num);return rc;}
+
+
+ FAPI_INF(" value of start and end addr is %016llX and %016llX",start_address,end_address);
+ rc = fapiPutScom(i_target_mba,MBA01_MCBIST_MCBSSARA0Q_0x030106d0,l_data_buffer_64); if(rc) return rc;
+ rc = fapiPutScom(i_target_mba,MBA01_MCBIST_MCBSEARA0Q_0x030106d2,l_data_buffer2_64); if(rc) return rc;
+ }
+
+ if(((l_num_ranks_per_dimm[0][1] != 0) || (l_num_ranks_per_dimm[1][1] != 0)) && (rank >=4))
+ {
+ FAPI_INF("Slot 1 is configured\n");
+
+ rc = fapiGetScom(i_target_mba,MBA01_MCBIST_MCBSSARA0Q_0x030106d0,l_data_buffer_64); if(rc) return rc;
+ rc = fapiGetScom(i_target_mba,MBA01_MCBIST_MCBSEARA0Q_0x030106d2,l_data_buffer2_64); if(rc) return rc;
+ start_address = l_data_buffer_64.getDoubleWord (0);
+ end_address = l_data_buffer2_64.getDoubleWord (0);
+ FAPI_INF(" value of start and end addr is %016llX and %016llX",start_address,end_address);
+ rc=addr_gen_func(i_target_mba,SF, l_attr_eff_schmoo_addr_mode,end_address,start_address,rank,i_port); if(rc)return rc;
+ rc_num = rc_num| l_data_buffer_64.setDoubleWord(0,start_address);
+ rc_num = rc_num|l_data_buffer2_64.setDoubleWord(0,end_address);
+ if (rc_num){FAPI_ERR( "Error in function cfg_mcb_addr:");rc.setEcmdError(rc_num);return rc;}
+
+ rc_num=rc_num|l_data_buffer_64.insert(io_value_u32,l_sbit,l_len,l_start);
+ rc_num=rc_num|l_data_buffer2_64.insert(io_value_u32,l_sbit,l_len,l_start);
+ if (rc_num){FAPI_ERR( "Error in function cfg_mcb_addr:");rc.setEcmdError(rc_num);return rc;}
+ FAPI_INF(" value of start and end addr is %016llX and %016llX",start_address,end_address);
+ rc = fapiPutScom(i_target_mba,MBA01_MCBIST_MCBSSARA1Q_0x030106d1,l_data_buffer_64); if(rc) return rc;
+ rc = fapiPutScom(i_target_mba,MBA01_MCBIST_MCBSEARA1Q_0x030106d3,l_data_buffer2_64); if(rc) return rc;
+ }
+
+ }
+
+
+ return rc;
+
+}
+
+
+
+}
+
OpenPOWER on IntegriCloud