summaryrefslogtreecommitdiffstats
path: root/src/import/chips/p9/procedures/hwp/nest/p9_fbc_utils.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/import/chips/p9/procedures/hwp/nest/p9_fbc_utils.C')
-rw-r--r--src/import/chips/p9/procedures/hwp/nest/p9_fbc_utils.C61
1 files changed, 33 insertions, 28 deletions
diff --git a/src/import/chips/p9/procedures/hwp/nest/p9_fbc_utils.C b/src/import/chips/p9/procedures/hwp/nest/p9_fbc_utils.C
index 025667cf..aaa63711 100644
--- a/src/import/chips/p9/procedures/hwp/nest/p9_fbc_utils.C
+++ b/src/import/chips/p9/procedures/hwp/nest/p9_fbc_utils.C
@@ -39,7 +39,7 @@
// *HWP HWP Owner: Joe McGill <jmcgill@us.ibm.com>
// *HWP FW Owner: Thi Tran <thi@us.ibm.com>
// *HWP Team: Nest
-// *HWP Level: 2
+// *HWP Level: 3
// *HWP Consumed by: SBE,HB,FSP
//
@@ -48,39 +48,34 @@
//------------------------------------------------------------------------------
#include <p9_fbc_utils.H>
#include <p9_misc_scom_addresses.H>
+#include <p9_misc_scom_addresses_fld.H>
//------------------------------------------------------------------------------
// Constant definitions
//------------------------------------------------------------------------------
-// ADU PMisc Register field/bit definitions
-const uint32_t ALTD_SND_MODE_DISABLE_CHECKSTOP_BIT = 19;
-const uint32_t ALTD_SND_MODE_MANUAL_CLR_PB_STOP_BIT = 21;
-const uint32_t ALTD_SND_MODE_PB_STOP_BIT = 22;
-
-// FBC Mode Register field/bit definitions
-const uint32_t PU_FBC_MODE_PB_INITIALIZED_BIT = 0;
-
// FBC base address determination constants
// system ID (large system)
const uint8_t FABRIC_ADDR_LS_SYSTEM_ID_START_BIT = 8;
const uint8_t FABRIC_ADDR_LS_SYSTEM_ID_END_BIT = 12;
+// msel bits (large & small system)
+const uint8_t FABRIC_ADDR_MSEL_START_BIT = 13;
+const uint8_t FABRIC_ADDR_MSEL_END_BIT = 14;
// group ID (large system)
const uint8_t FABRIC_ADDR_LS_GROUP_ID_START_BIT = 15;
const uint8_t FABRIC_ADDR_LS_GROUP_ID_END_BIT = 18;
// chip ID (large system)
const uint8_t FABRIC_ADDR_LS_CHIP_ID_START_BIT = 19;
const uint8_t FABRIC_ADDR_LS_CHIP_ID_END_BIT = 21;
-// msel bits (large & small system)
-const uint8_t FABRIC_ADDR_MSEL_START_BIT = 13;
-const uint8_t FABRIC_ADDR_MSEL_END_BIT = 14;
//------------------------------------------------------------------------------
// Function definitions
//------------------------------------------------------------------------------
+
+// NOTE: see comments above function prototype in header
fapi2::ReturnCode p9_fbc_utils_get_fbc_state(
const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
bool& o_is_initialized,
@@ -88,25 +83,34 @@ fapi2::ReturnCode p9_fbc_utils_get_fbc_state(
{
FAPI_DBG("Start");
- // TODO: HW328175
- // fapi2::buffer<uint64_t> l_fbc_mode_data;
- // FAPI_TRY(fapi2::getScom(i_target, PU_FBC_MODE_REG, l_fbc_mode_data),
- // "Error reading FBC Mode Register");
- // // fabric is initialized if PB_INITIALIZED bit is one/set
- // o_is_initialized = l_fbc_mode_data.getBit<PU_FBC_MODE_PB_INITIALIZED_BIT>();
+ fapi2::ATTR_CHIP_EC_FEATURE_HW328175_Type l_hw328175;
+ fapi2::buffer<uint64_t> l_fbc_mode_data;
+ fapi2::buffer<uint64_t> l_pmisc_mode_data;
- // currently, sampling FBC init from PB Mode register is unreliable
- // as init can drop perodically at runtime (based on legacy sleep backoff)
- // until this issue is fixed, just return true to caller
- o_is_initialized = true;
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CHIP_EC_FEATURE_HW328175, i_target, l_hw328175),
+ "Error from FAPI_ATTR_GET (ATTR_CHIP_EC_FEATURE_HW328175");
+
+ if (l_hw328175)
+ {
+ // sampling FBC init from PB Mode register is unreliable
+ // as init can drop perodically at runtime (based on legacy sleep backoff),
+ // just return true to caller
+ o_is_initialized = true;
+ }
+ else
+ {
+ FAPI_TRY(fapi2::getScom(i_target, PU_PB_CENT_SM0_PB_CENT_MODE, l_fbc_mode_data),
+ "Error reading FBC Mode Register");
+ // fabric is initialized if PB_INITIALIZED bit is one/set
+ o_is_initialized = l_fbc_mode_data.getBit<PU_PB_CENT_SM0_PB_CENT_MODE_PB_CENT_PBIXXX_INIT>();
+ }
// read ADU PMisc Mode Register state
- fapi2::buffer<uint64_t> l_pmisc_mode_data;
FAPI_TRY(fapi2::getScom(i_target, PU_SND_MODE_REG, l_pmisc_mode_data),
"Error reading ADU PMisc Mode register");
// fabric is running if FBC_STOP bit is zero/clear
- o_is_running = !(l_pmisc_mode_data.getBit<ALTD_SND_MODE_PB_STOP_BIT>());
+ o_is_running = !(l_pmisc_mode_data.getBit<PU_SND_MODE_REG_PB_STOP>());
fapi_try_exit:
FAPI_DBG("End");
@@ -114,6 +118,7 @@ fapi_try_exit:
}
+// NOTE: see comments above function prototype in header
fapi2::ReturnCode p9_fbc_utils_override_fbc_stop(
const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target)
{
@@ -125,12 +130,12 @@ fapi2::ReturnCode p9_fbc_utils_override_fbc_stop(
"Error reading ADU PMisc Mode register");
// set bit to disable checkstop forwarding and write back
- l_pmisc_mode_data.setBit<ALTD_SND_MODE_DISABLE_CHECKSTOP_BIT>();
+ l_pmisc_mode_data.setBit<PU_SND_MODE_REG_DISABLE_CHECKSTOP>();
FAPI_TRY(fapi2::putScom(i_target, PU_SND_MODE_REG, l_pmisc_mode_data),
"Error writing ADU PMisc Mode register to disable checkstop forwarding to FBC");
// set bit to manually clear stop control and write back
- l_pmisc_mode_data.setBit<ALTD_SND_MODE_MANUAL_CLR_PB_STOP_BIT>();
+ l_pmisc_mode_data.setBit<PU_SND_MODE_REG_MANUAL_CLR_PB_STOP>();
FAPI_TRY(fapi2::putScom(i_target, PU_SND_MODE_REG, l_pmisc_mode_data),
"Error writing ADU PMisc Mode register to manually clear FBC stop control");
@@ -140,6 +145,7 @@ fapi_try_exit:
}
+// NOTE: see comments above function prototype in header
fapi2::ReturnCode p9_fbc_utils_get_chip_base_address(
const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
const p9_fbc_utils_addr_mode_t i_addr_mode,
@@ -155,7 +161,6 @@ fapi2::ReturnCode p9_fbc_utils_get_chip_base_address(
fapi2::buffer<uint64_t> l_base_address;
const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM;
-
FAPI_DBG("Start");
// retreive attributes which statically determine chips position in memory map
@@ -186,7 +191,7 @@ fapi2::ReturnCode p9_fbc_utils_get_chip_base_address(
"Error from FAPI_ATTR_GET (ATTR_MEM_MIRROR_PLACEMENT_POLICY)");
// apply system ID
- // occupies one field for large system map (three fields for small system map)
+ // occupies one field for large system map
l_base_address.insertFromRight < FABRIC_ADDR_LS_SYSTEM_ID_START_BIT,
(FABRIC_ADDR_LS_SYSTEM_ID_END_BIT - FABRIC_ADDR_LS_SYSTEM_ID_START_BIT + 1) > (l_fabric_system_id);
OpenPOWER on IntegriCloud