summaryrefslogtreecommitdiffstats
path: root/src/import/chips/p9/procedures/hwp/nest
diff options
context:
space:
mode:
authorCHRISTINA L. GRAVES <clgraves@us.ibm.com>2016-11-16 16:22:41 -0600
committerDaniel M. Crowell <dcrowell@us.ibm.com>2016-12-05 12:13:06 -0500
commit95806adfbe2bd8a83772e22b4df3fde3fc14a0bb (patch)
tree2bd318944096224edeb859f8244534fe3239d913 /src/import/chips/p9/procedures/hwp/nest
parentec2ce54ef9ad5fedfe16bf00d2c2320716d3f64b (diff)
downloadtalos-hostboot-95806adfbe2bd8a83772e22b4df3fde3fc14a0bb.tar.gz
talos-hostboot-95806adfbe2bd8a83772e22b4df3fde3fc14a0bb.zip
Fix for hard coded core address
Change-Id: Ib90e7662407f22d5f254bbf6644e1afc00aa73ea Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/32740 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com> Reviewed-by: Dean Sanner <dsanner@us.ibm.com> Reviewed-by: Joseph J. McGill <jmcgill@us.ibm.com> Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/32743 Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/import/chips/p9/procedures/hwp/nest')
-rw-r--r--src/import/chips/p9/procedures/hwp/nest/p9_tod_move_tod_to_tb.C233
1 files changed, 119 insertions, 114 deletions
diff --git a/src/import/chips/p9/procedures/hwp/nest/p9_tod_move_tod_to_tb.C b/src/import/chips/p9/procedures/hwp/nest/p9_tod_move_tod_to_tb.C
index e5239faac..47382db15 100644
--- a/src/import/chips/p9/procedures/hwp/nest/p9_tod_move_tod_to_tb.C
+++ b/src/import/chips/p9/procedures/hwp/nest/p9_tod_move_tod_to_tb.C
@@ -59,165 +59,170 @@ extern "C"
fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>* target = i_tod_node->i_target;
uint32_t tod_init_pending_count = 0; // Timeout counter for bits that are cleared by hardware
uint64_t tfmr_state = 0;
+ uint8_t l_core_id = 0x0;
//bool is_mdmt = true;
FAPI_DBG("Start");
- std::vector<fapi2::Target<fapi2::TARGET_TYPE_CORE>> l_cores = target->getChildren<fapi2::TARGET_TYPE_CORE>();
- fapi2::Target<fapi2::TARGET_TYPE_CORE> coreTarget = l_cores[0];
+ //Get all the cores on this proc chip
+ auto l_core_targets = target->getChildren<fapi2::TARGET_TYPE_CORE>(fapi2::TARGET_STATE_FUNCTIONAL);
- //-------Timebase Setup--------------
- //Read TFMR
- FAPI_TRY(p9_tod_utils_get_tfmr_reg(coreTarget, i_thread_num, data), "Could not read TFMR register");
-
- //Update TFMR bit (00:15) Timebase settings according to processor frequency
- data.insertFromRight((uint32_t)0xFF, TFMR_MAX_CYC_BET_STEPS, TFMR_MAX_CYC_BET_STEPS_LEN);
- data.insertFromRight(TFMR_N_CLKS_PER_STEP_4CLK, TFMR_N_CLKS_PER_STEP, TFMR_N_CLKS_PER_STEP_LEN);
- data.insertFromRight(TFMR_SYNC_BIT_SEL_16US, TFMR_SYNC_BIT_SEL, TFMR_SYNC_BIT_SEL_LEN);
- data.setBit<TFMR_TB_ECLIPZ>();
+ for (auto coreTarget : l_core_targets)
+ {
+ //-------Timebase Setup--------------
+ //Read TFMR
+ FAPI_TRY(p9_tod_utils_get_tfmr_reg(coreTarget, i_thread_num, data), "Could not read TFMR register");
- FAPI_TRY(p9_tod_utils_set_tfmr_reg(coreTarget, i_thread_num, data),
- "Could not write timebase settings according to processor frequency");
+ //Update TFMR bit (00:15) Timebase settings according to processor frequency
+ data.insertFromRight((uint32_t)0xFF, TFMR_MAX_CYC_BET_STEPS, TFMR_MAX_CYC_BET_STEPS_LEN);
+ data.insertFromRight(TFMR_N_CLKS_PER_STEP_4CLK, TFMR_N_CLKS_PER_STEP, TFMR_N_CLKS_PER_STEP_LEN);
+ data.insertFromRight(TFMR_SYNC_BIT_SEL_16US, TFMR_SYNC_BIT_SEL, TFMR_SYNC_BIT_SEL_LEN);
+ data.setBit<TFMR_TB_ECLIPZ>();
- tod_init_pending_count = 0;
+ FAPI_TRY(p9_tod_utils_set_tfmr_reg(coreTarget, i_thread_num, data),
+ "Could not write timebase settings according to processor frequency");
- while(tod_init_pending_count < P9_TOD_UTIL_TIMEOUT_COUNT)
- {
- FAPI_TRY(fapi2::delay(P9_TOD_UTILS_HW_NS_DELAY, P9_TOD_UTILS_SIM_CYCLE_DELAY), "fapiDelay error");
- FAPI_TRY(p9_tod_utils_get_tfmr_reg(coreTarget, i_thread_num, data), "Could not read TFMR register for polling");
- data.extract(tfmr_state, TFMR_STATE_START_BIT, TFMR_STATE_NUM_BITS, 60);
+ tod_init_pending_count = 0;
- if (tfmr_state == TFMR_STATE_TB_RESET)
+ while(tod_init_pending_count < P9_TOD_UTIL_TIMEOUT_COUNT)
{
- FAPI_DBG("TFMR in TB_RESET state");
- break;
- }
+ FAPI_TRY(fapi2::delay(P9_TOD_UTILS_HW_NS_DELAY, P9_TOD_UTILS_SIM_CYCLE_DELAY), "fapiDelay error");
+ FAPI_TRY(p9_tod_utils_get_tfmr_reg(coreTarget, i_thread_num, data), "Could not read TFMR register for polling");
+ data.extract(tfmr_state, TFMR_STATE_START_BIT, TFMR_STATE_NUM_BITS, 60);
- ++tod_init_pending_count;
- }
+ if (tfmr_state == TFMR_STATE_TB_RESET)
+ {
+ FAPI_DBG("TFMR in TB_RESET state");
+ break;
+ }
- FAPI_ASSERT(tod_init_pending_count < P9_TOD_UTIL_TIMEOUT_COUNT,
- fapi2::P9_TOD_INIT_TIMEOUT().set_TARGET(target).set_COUNT(tod_init_pending_count),
- "TFMR state machine did not go to reset in time!");
+ ++tod_init_pending_count;
+ }
+ FAPI_ASSERT(tod_init_pending_count < P9_TOD_UTIL_TIMEOUT_COUNT,
+ fapi2::P9_TOD_INIT_TIMEOUT().set_TARGET(target).set_COUNT(tod_init_pending_count),
+ "TFMR state machine did not go to reset in time!");
- //-------Timebase load_tod_mode_tb(switch Timebase to "Not Set" state)
- //Update TFMR bit (16) = b'1' load_tod_mod_tb. This prepares the time facility logic to accept a new value for the 64-bit Timebase
- data.setBit<TFMR_LOAD_TOD_MOD_TB>();
- FAPI_TRY(p9_tod_utils_set_tfmr_reg(coreTarget, i_thread_num, data), "Could not load_tod_mod_tb");
- //Poll for TFMR bit (16) = b'0'. Hardware clears the bit when the operation is complete. A timeout is indicated by TFMR bit(54) = b'1'
- tod_init_pending_count = 0;
+ //-------Timebase load_tod_mode_tb(switch Timebase to "Not Set" state)
+ //Update TFMR bit (16) = b'1' load_tod_mod_tb. This prepares the time facility logic to accept a new value for the 64-bit Timebase
+ data.setBit<TFMR_LOAD_TOD_MOD_TB>();
+ FAPI_TRY(p9_tod_utils_set_tfmr_reg(coreTarget, i_thread_num, data), "Could not load_tod_mod_tb");
- while(tod_init_pending_count < P9_TOD_UTIL_TIMEOUT_COUNT)
- {
- FAPI_TRY(fapi2::delay(P9_TOD_UTILS_HW_NS_DELAY, P9_TOD_UTILS_SIM_CYCLE_DELAY), "fapiDelay error");
- FAPI_TRY(p9_tod_utils_get_tfmr_reg(coreTarget, i_thread_num, data), "Could not read TFMR register for polling");
- data.extract(tfmr_state, TFMR_STATE_START_BIT, TFMR_STATE_NUM_BITS, 60);
+ //Poll for TFMR bit (16) = b'0'. Hardware clears the bit when the operation is complete. A timeout is indicated by TFMR bit(54) = b'1'
+ tod_init_pending_count = 0;
- if (!data.getBit<TFMR_LOAD_TOD_MOD_TB>() && (tfmr_state == TFMR_STATE_TB_NOT_SET))
+ while(tod_init_pending_count < P9_TOD_UTIL_TIMEOUT_COUNT)
{
- FAPI_DBG("TFMR_LOAD_TOD_MOD cleared.");
- break;
- }
+ FAPI_TRY(fapi2::delay(P9_TOD_UTILS_HW_NS_DELAY, P9_TOD_UTILS_SIM_CYCLE_DELAY), "fapiDelay error");
+ FAPI_TRY(p9_tod_utils_get_tfmr_reg(coreTarget, i_thread_num, data), "Could not read TFMR register for polling");
+ data.extract(tfmr_state, TFMR_STATE_START_BIT, TFMR_STATE_NUM_BITS, 60);
- ++tod_init_pending_count;
- }
+ if (!data.getBit<TFMR_LOAD_TOD_MOD_TB>() && (tfmr_state == TFMR_STATE_TB_NOT_SET))
+ {
+ FAPI_DBG("TFMR_LOAD_TOD_MOD cleared.");
+ break;
+ }
- FAPI_ASSERT(tod_init_pending_count < P9_TOD_UTIL_TIMEOUT_COUNT,
- fapi2::P9_TOD_INIT_TIMEOUT().set_TARGET(target).set_COUNT(tod_init_pending_count),
- "TFMR_LOAD_TOD_MOD did not clear in time!");
+ ++tod_init_pending_count;
+ }
- //-------TOD interrupt check----------------------
- //Read TFMR and check for TFMR(51) = b'0'. This indicates no interrupt pending from the TOD which means no STEP errors were detected, and the external TOD oscillator is operating properly.
- FAPI_TRY(p9_tod_utils_get_tfmr_reg(coreTarget, i_thread_num, data), "Could not read TFMR register to check bit 51");
- FAPI_ASSERT(!data.getBit<51>(), fapi2::P9_TOD_INIT_NOT_RUNNING(),
- "STEP errors were detected or the external TOD oscillator is not operating properly");
+ FAPI_ASSERT(tod_init_pending_count < P9_TOD_UTIL_TIMEOUT_COUNT,
+ fapi2::P9_TOD_INIT_TIMEOUT().set_TARGET(target).set_COUNT(tod_init_pending_count),
+ "TFMR_LOAD_TOD_MOD did not clear in time!");
- //------Move TOD value to Timebase---------
- //Update TFMR bit(18) = b'1' move_chip_tod_to_tb. This prepares the time facility logic to accept a new value after a SYNC boundary occurred
- FAPI_TRY(p9_tod_utils_get_tfmr_reg(coreTarget, i_thread_num, data), "Could not read TFMR to move_chip_tod_to_tb");
- data.setBit<TFMR_MOVE_CHIP_TOD_TO_TB>();
- FAPI_TRY(p9_tod_utils_set_tfmr_reg(coreTarget, i_thread_num, data), "Could not write TFMR to mvoe chip_tod_to_tb");
+ //-------TOD interrupt check----------------------
+ //Read TFMR and check for TFMR(51) = b'0'. This indicates no interrupt pending from the TOD which means no STEP errors were detected, and the external TOD oscillator is operating properly.
+ FAPI_TRY(p9_tod_utils_get_tfmr_reg(coreTarget, i_thread_num, data), "Could not read TFMR register to check bit 51");
+ FAPI_ASSERT(!data.getBit<51>(), fapi2::P9_TOD_INIT_NOT_RUNNING(),
+ "STEP errors were detected or the external TOD oscillator is not operating properly");
- //We don't check for TB_SYNC_WAIT since that state is fleeting
+ //------Move TOD value to Timebase---------
+ //Update TFMR bit(18) = b'1' move_chip_tod_to_tb. This prepares the time facility logic to accept a new value after a SYNC boundary occurred
+ FAPI_TRY(p9_tod_utils_get_tfmr_reg(coreTarget, i_thread_num, data), "Could not read TFMR to move_chip_tod_to_tb");
+ data.setBit<TFMR_MOVE_CHIP_TOD_TO_TB>();
+ FAPI_TRY(p9_tod_utils_set_tfmr_reg(coreTarget, i_thread_num, data), "Could not write TFMR to mvoe chip_tod_to_tb");
- tod_init_pending_count = 0;
+ //We don't check for TB_SYNC_WAIT since that state is fleeting
- while(tod_init_pending_count < P9_TOD_UTIL_TIMEOUT_COUNT)
- {
- FAPI_TRY(fapi2::delay(P9_TOD_UTILS_HW_NS_DELAY, P9_TOD_UTILS_SIM_CYCLE_DELAY), "fapiDelay error");
- FAPI_TRY(p9_tod_utils_get_tfmr_reg(coreTarget, i_thread_num, data), "Could not read TFMR register for polling");
- data.extract(tfmr_state, TFMR_STATE_START_BIT, TFMR_STATE_NUM_BITS, 60);
+ tod_init_pending_count = 0;
- if (tfmr_state == TFMR_STATE_GET_TOD)
+ while(tod_init_pending_count < P9_TOD_UTIL_TIMEOUT_COUNT)
{
- FAPI_DBG("TFMR in GET_TOD state");
- break;
- }
+ FAPI_TRY(fapi2::delay(P9_TOD_UTILS_HW_NS_DELAY, P9_TOD_UTILS_SIM_CYCLE_DELAY), "fapiDelay error");
+ FAPI_TRY(p9_tod_utils_get_tfmr_reg(coreTarget, i_thread_num, data), "Could not read TFMR register for polling");
+ data.extract(tfmr_state, TFMR_STATE_START_BIT, TFMR_STATE_NUM_BITS, 60);
- ++tod_init_pending_count;
- }
+ if (tfmr_state == TFMR_STATE_GET_TOD)
+ {
+ FAPI_DBG("TFMR in GET_TOD state");
+ break;
+ }
- FAPI_ASSERT(tod_init_pending_count < P9_TOD_UTIL_TIMEOUT_COUNT,
- fapi2::P9_TOD_INIT_TIMEOUT().set_TARGET(target).set_COUNT(tod_init_pending_count),
- "TFMR state machine did not go to get_tod in time!");
+ ++tod_init_pending_count;
+ }
+ FAPI_ASSERT(tod_init_pending_count < P9_TOD_UTIL_TIMEOUT_COUNT,
+ fapi2::P9_TOD_INIT_TIMEOUT().set_TARGET(target).set_COUNT(tod_init_pending_count),
+ "TFMR state machine did not go to get_tod in time!");
- //Write TOD_MOVE_TOD_TO_TB_REG(@0x17)[00]=b'1'(move TOD to Timebase). The TOD transfers the TOD value to the Timebase after a SYNC boundary occurred. Note that TOD_TX_TTYPE_CTRL_REG(@0x27)[24:31] needs to be configured before issuing a TOD transfer to Timebase.The address of the PIB slave targeted by the TOD PIB master is configured as 0xNN0126a1 where NN is the configurable slave address specified in TOD_TX_TTYPE_CTRL_REG(@0x27)[24:31].
- // TODO: read PIR and set for each core
- data.flush<0>();
- /*data.insertFromRight(TOD_TX_TTYPE_CTRL_REG_TX_TTYPE_PIB_MST_ADDR_CFG_C5,
- TOD_TX_TTYPE_CTRL_REG_TX_TTYPE_PIB_MST_ADDR_CFG, TOD_TX_TTYPE_CTRL_REG_TX_TTYPE_PIB_MST_ADDR_CFG_LEN);*/
- data.insertFromRight(0x2E010AA310000000, 0, 64);
- //data.setBit<25>().setBit<27>();
- FAPI_TRY(fapi2::putScom(*target, PERV_TOD_TX_TTYPE_CTRL_REG, data), "Could not write PERV_TOD_TX_TTYPE_CTRL_REG");
- data.flush<0>();
- data.setBit<0>();
- FAPI_TRY(fapi2::putScom(*target, PERV_TOD_MOVE_TOD_TO_TB_REG, data), "Could not write TOD_MOVE_TOD_TO_TB_REG");
+ //Write TOD_MOVE_TOD_TO_TB_REG(@0x17)[00]=b'1'(move TOD to Timebase). The TOD transfers the TOD value to the Timebase after a SYNC boundary occurred. Note that TOD_TX_TTYPE_CTRL_REG(@0x27)[24:31] needs to be configured before issuing a TOD transfer to Timebase.The address of the PIB slave targeted by the TOD PIB master is configured as 0xNN0126a1 where NN is the configurable slave address specified in TOD_TX_TTYPE_CTRL_REG(@0x27)[24:31].
+ data.flush<0>();
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CHIP_UNIT_POS, coreTarget, l_core_id));
+ l_core_id = l_core_id + 0x20;
+ data.insertFromRight(l_core_id, 0, 8);
- tod_init_pending_count = 0;
+ //This will go the TOD_READ register (0x20010AA3) for the core that we are currently targeting
+ data.insertFromRight(0x010AA310000000, 8, 56);
+ FAPI_TRY(fapi2::putScom(*target, PERV_TOD_TX_TTYPE_CTRL_REG, data), "Could not write PERV_TOD_TX_TTYPE_CTRL_REG");
- while(tod_init_pending_count < P9_TOD_UTIL_TIMEOUT_COUNT)
- {
- FAPI_TRY(fapi2::delay(P9_TOD_UTILS_HW_NS_DELAY, P9_TOD_UTILS_SIM_CYCLE_DELAY), "fapiDelay error");
- FAPI_TRY(p9_tod_utils_get_tfmr_reg(coreTarget, i_thread_num, data), "Could not read TFMR register for polling");
- data.extract(tfmr_state, TFMR_STATE_START_BIT, TFMR_STATE_NUM_BITS, 60);
+ data.flush<0>();
+ data.setBit<0>();
+ FAPI_TRY(fapi2::putScom(*target, PERV_TOD_MOVE_TOD_TO_TB_REG, data), "Could not write TOD_MOVE_TOD_TO_TB_REG");
- if (tfmr_state == TFMR_STATE_TB_RUNNING)
+ tod_init_pending_count = 0;
+
+ while(tod_init_pending_count < P9_TOD_UTIL_TIMEOUT_COUNT)
{
- FAPI_DBG("TFMR in TB_RUNNING state");
- break;
- }
+ FAPI_TRY(fapi2::delay(P9_TOD_UTILS_HW_NS_DELAY, P9_TOD_UTILS_SIM_CYCLE_DELAY), "fapiDelay error");
+ FAPI_TRY(p9_tod_utils_get_tfmr_reg(coreTarget, i_thread_num, data), "Could not read TFMR register for polling");
+ data.extract(tfmr_state, TFMR_STATE_START_BIT, TFMR_STATE_NUM_BITS, 60);
- ++tod_init_pending_count;
- }
+ if (tfmr_state == TFMR_STATE_TB_RUNNING)
+ {
+ FAPI_DBG("TFMR in TB_RUNNING state");
+ break;
+ }
- FAPI_ASSERT(tod_init_pending_count < P9_TOD_UTIL_TIMEOUT_COUNT,
- fapi2::P9_TOD_INIT_TIMEOUT().set_TARGET(target).set_COUNT(tod_init_pending_count),
- "TFMR state machine did not go to TB_RUNNING in time!");
+ ++tod_init_pending_count;
+ }
- tod_init_pending_count = 0;
+ FAPI_ASSERT(tod_init_pending_count < P9_TOD_UTIL_TIMEOUT_COUNT,
+ fapi2::P9_TOD_INIT_TIMEOUT().set_TARGET(target).set_COUNT(tod_init_pending_count),
+ "TFMR state machine did not go to TB_RUNNING in time!");
- //Poll for TFMR bit(18) = b'0'. Hardware clears the bit when the operation is complete.
- while(tod_init_pending_count < P9_TOD_UTIL_TIMEOUT_COUNT)
- {
- FAPI_TRY(fapi2::delay(P9_TOD_UTILS_HW_NS_DELAY, P9_TOD_UTILS_SIM_CYCLE_DELAY), "fapiDelay error");
- FAPI_TRY(p9_tod_utils_get_tfmr_reg(coreTarget, i_thread_num, data), "Could not read TFMR");
+ tod_init_pending_count = 0;
- if (!data.getBit<TFMR_MOVE_CHIP_TOD_TO_TB>())
+ //Poll for TFMR bit(18) = b'0'. Hardware clears the bit when the operation is complete.
+ while(tod_init_pending_count < P9_TOD_UTIL_TIMEOUT_COUNT)
{
- FAPI_DBG("TFMR_MOVE_CHIP_TOD_TO_TB cleared.");
- break;
+ FAPI_TRY(fapi2::delay(P9_TOD_UTILS_HW_NS_DELAY, P9_TOD_UTILS_SIM_CYCLE_DELAY), "fapiDelay error");
+ FAPI_TRY(p9_tod_utils_get_tfmr_reg(coreTarget, i_thread_num, data), "Could not read TFMR");
+
+ if (!data.getBit<TFMR_MOVE_CHIP_TOD_TO_TB>())
+ {
+ FAPI_DBG("TFMR_MOVE_CHIP_TOD_TO_TB cleared.");
+ break;
+ }
+
+ ++tod_init_pending_count;
}
- ++tod_init_pending_count;
+ FAPI_ASSERT(tod_init_pending_count < P9_TOD_UTIL_TIMEOUT_COUNT,
+ fapi2::P9_TOD_INIT_TIMEOUT().set_TARGET(target).set_COUNT(tod_init_pending_count),
+ "TFMR_MOVE_CHIP_TOD_TO_TB did not clear in time!");
}
- FAPI_ASSERT(tod_init_pending_count < P9_TOD_UTIL_TIMEOUT_COUNT,
- fapi2::P9_TOD_INIT_TIMEOUT().set_TARGET(target).set_COUNT(tod_init_pending_count),
- "TFMR_MOVE_CHIP_TOD_TO_TB did not clear in time!");
-
// Finish configuring downstream nodes
for (std::list<tod_topology_node*>::const_iterator child = (i_tod_node->i_children).begin();
child != (i_tod_node->i_children).end();
OpenPOWER on IntegriCloud