summaryrefslogtreecommitdiffstats
path: root/src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_utils.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_utils.C')
-rw-r--r--src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_utils.C1432
1 files changed, 0 insertions, 1432 deletions
diff --git a/src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_utils.C b/src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_utils.C
deleted file mode 100644
index de733a395..000000000
--- a/src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_utils.C
+++ /dev/null
@@ -1,1432 +0,0 @@
-/* IBM_PROLOG_BEGIN_TAG */
-/* This is an automatically generated prolog. */
-/* */
-/* $Source: src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_utils.C $ */
-/* */
-/* OpenPOWER HostBoot Project */
-/* */
-/* Contributors Listed Below - COPYRIGHT 2013,2015 */
-/* [+] 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 */
-// $Id: proc_a_x_pci_dmi_pll_utils.C,v 1.9 2015/08/14 16:31:17 thi Exp $
-// $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/p8/working/procedures/ipl/fapi/proc_a_x_pci_dmi_pll_utils.C,v $
-//------------------------------------------------------------------------------
-// *|
-// *! (C) Copyright International Business Machines Corp. 2015
-// *! All Rights Reserved -- Property of IBM
-// *! *** ***
-// *|
-// *! TITLE : proc_a_x_pci_dmi_pll_utils.C
-// *! DESCRIPTION : PLL configuration utility functions
-// *!
-// *! OWNER NAME : Joe McGill Email: jmcgill@us.ibm.com
-// *!
-//------------------------------------------------------------------------------
-
-
-//------------------------------------------------------------------------------
-// Includes
-//------------------------------------------------------------------------------
-#include <p8_scom_addresses.H>
-#include <proc_a_x_pci_dmi_pll_utils.H>
-#include <p8_istep_num.H>
-#include <proc_sbe_scan_service.H>
-#include <proc_use_sbe_scan_service.H>
-
-
-//------------------------------------------------------------------------------
-// Constant definitions
-//------------------------------------------------------------------------------
-
-// SBE polling constants
-const uint32_t PROC_A_X_PCI_DMI_PLL_UTILS_SBE_MAX_POLLS = 100;
-const uint32_t PROC_A_X_PCI_DMI_PLL_UTILS_SBE_POLL_DELAY_HW = 2000000;
-const uint32_t PROC_A_X_PCI_DMI_PLL_UTILS_SBE_POLL_DELAY_SIM = 0;
-
-// SBE Control Register field/bit definitions
-const uint32_t SBE_CONTROL_REG_CTL_NO_LB_BIT = 0;
-
-// SBE Mailbox0 Register scan request format constants
-const uint32_t MBOX0_REQUEST_VALID_BIT = 0;
-const uint32_t MBOX0_RING_SELECT_START_BIT = 6;
-const uint32_t MBOX0_RING_SELECT_END_BIT = 7;
-const uint32_t MBOX0_RING_OP_START_BIT = 9;
-const uint32_t MBOX0_RING_OP_END_BIT = 11;
-const uint32_t MBOX0_RING_BUS_ID_START_BIT = 13;
-const uint32_t MBOX0_RING_BUS_ID_END_BIT = 15;
-
-// SBE MBOX1 Scratch Register scan reply format constants
-const uint32_t MBOX1_SCAN_REPLY_SUCCESS_BIT = 0;
-
-// VCO PLL workaround ring offsets
-const uint32_t PB_BNDY_DMIPLL_RING_CCALLOAD_OFFSET = 580;
-const uint32_t PB_BNDY_DMIPLL_RING_CCALFMIN_OFFSET = 581;
-
-const uint32_t AB_BNDY_PLL_RING_CCALLOAD_OFFSET = 278;
-const uint32_t AB_BNDY_PLL_RING_CCALFMIN_OFFSET = 279;
-
-// PLL lock polling constants
-const uint32_t PROC_A_X_PCI_DMI_PLL_UTILS_MAX_LOCK_POLLS = 50;
-const uint32_t PROC_A_X_PCI_DMI_PLL_UTILS_POLL_DELAY_HW = 2000000;
-const uint32_t PROC_A_X_PCI_DMI_PLL_UTILS_POLL_DELAY_SIM = 1;
-
-// Pervasive LFIR Register field/bit definitions
-const uint8_t PERV_LFIR_SCAN_COLLISION_BIT = 3;
-
-// OPCG/Clock Region Register values
-const uint64_t OPCG_REG0_FOR_SETPULSE = 0x818C000000000000ull;
-const uint64_t OPCG_REG2_FOR_SETPULSE = 0x0000000000002000ull;
-const uint64_t OPCG_REG3_FOR_SETPULSE = 0x6000000000000000ull;
-const uint64_t CLK_REGION_FOR_SETPULSE = 0x0010040000000000ull;
-
-// GP3 Register field/bit definitions
-const uint8_t GP3_PLL_TEST_ENABLE_BIT = 3;
-const uint8_t GP3_PLL_RESET_BIT = 4;
-const uint8_t GP3_PLL_BYPASS_BIT = 5;
-
-// PLL Lock Register field/bit definitions
-const uint8_t PLL_LOCK_REG_LOCK_START_BIT = 0;
-const uint8_t PLL_LOCK_REG_LOCK_END_BIT = 3;
-
-
-//------------------------------------------------------------------------------
-// Function definitions
-//------------------------------------------------------------------------------
-
-extern "C"
-{
-
-using namespace fapi;
-
-//------------------------------------------------------------------------------
-// function:
-// Calculate state to apply to Centaur tp_bndy_pll ring
-//
-// parameters: i_target => chip target
-// i_pll_ring_op => modification to be made to PLL content
-// o_ring_data => data buffer containing ring state to apply
-// returns: FAPI_RC_SUCCESS if operation was successful, else error
-//------------------------------------------------------------------------------
-fapi::ReturnCode p8_pll_utils_calc_memb_tp_bndy_pll(
- const fapi::Target & i_target,
- const p8_pll_utils_ring_op i_pll_ring_op,
- ecmdDataBufferBase & o_ring_data)
-{
- // return codes
- uint32_t rc_ecmd = 0;
- fapi::ReturnCode rc;
-
- // mark function entry
- FAPI_DBG("Start");
-
- do
- {
- // determine ring length
- fapi::ATTR_MEMB_TP_BNDY_PLL_LENGTH_Type ring_length;
- rc = FAPI_ATTR_GET(ATTR_MEMB_TP_BNDY_PLL_LENGTH, &i_target, ring_length);
- if (!rc.ok())
- {
- FAPI_ERR("Failed to get attribute: ATTR_MEMB_TP_BNDY_PLL_LENGTH.");
- break;
- }
- rc_ecmd |= o_ring_data.setBitLength(ring_length);
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x setting ecmd data buffer length. Buffer must be set to length of scan chain.", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
-
- // determine starting ring state
- if (i_pll_ring_op == RING_OP_BASE)
- {
- // start from attribute data
- fapi::ATTR_MEMB_TP_BNDY_PLL_DATA_Type ring_data_attr = {0};
- rc = FAPI_ATTR_GET(ATTR_MEMB_TP_BNDY_PLL_DATA, &i_target, ring_data_attr);
- if (rc)
- {
- FAPI_ERR("Failed to get attribute: ATTR_MEMB_TP_BNDY_PLL_DATA.");
- break;
- }
- rc_ecmd |= o_ring_data.insert(ring_data_attr, 0, ring_length, 0);
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x loading scan chain attribute data into buffer.", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
- }
- else
- {
- // start from data currently in ring
- rc = fapiGetRing(i_target, RING_ADDRESS_MEMB_TP_BNDY_PLL, o_ring_data, fapi::RING_MODE_SET_PULSE);
- if (!rc.ok())
- {
- FAPI_ERR("Error from fapiGetRing (ring ID: 0x08%x)", RING_ADDRESS_MEMB_TP_BNDY_PLL);
- break;
- }
- }
-
- // modify ring data
- if (i_pll_ring_op == RING_OP_MOD_REFCLK_SEL)
- {
- fapi::ATTR_MEMB_DMI_CUPLL_REFCLKSEL_OFFSET_Type refclksel_offset;
- rc = FAPI_ATTR_GET(ATTR_MEMB_DMI_CUPLL_REFCLKSEL_OFFSET, &i_target, refclksel_offset);
- if (!rc.ok())
- {
- FAPI_ERR("Failed to get attribute: ATTR_MEMB_DMI_CUPLL_REFCLKSEL_OFFSET");
- break;
- }
-
- if (o_ring_data.isBitClear(refclksel_offset))
- {
- rc_ecmd |= o_ring_data.setBit(refclksel_offset);
- }
- else
- {
- rc_ecmd |= o_ring_data.clearBit(refclksel_offset);
- }
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x loading refclock select attribute data into buffer.", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
- }
- else if (i_pll_ring_op == RING_OP_MOD_PFD360)
- {
- fapi::ATTR_MEMB_DMI_CUPLL_PFD360_OFFSET_Type pfd360_offset;
- rc = FAPI_ATTR_GET(ATTR_MEMB_DMI_CUPLL_PFD360_OFFSET, &i_target, pfd360_offset);
- if (!rc.ok())
- {
- FAPI_ERR("Failed to get attribute: ATTR_MEMB_DMI_CUPLL_PFD360_OFFSET");
- break;
- }
-
- if (o_ring_data.isBitClear(pfd360_offset))
- {
- rc_ecmd |= o_ring_data.setBit(pfd360_offset);
- }
- else
- {
- rc_ecmd |= o_ring_data.clearBit(pfd360_offset);
- }
-
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x loading pfd360 attribute data into buffer.", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
- }
- } while(0);
-
- // mark function exit
- FAPI_DBG("End");
-
- return rc;
-}
-
-
-//------------------------------------------------------------------------------
-// function:
-// Calculate state to apply to processor pci_bndy_pll ring
-//
-// parameters: i_target => chip target
-// o_ring_data => data buffer containing ring state to apply
-// returns: FAPI_RC_SUCCESS if operation was successful, else error
-//------------------------------------------------------------------------------
-fapi::ReturnCode p8_pll_utils_calc_proc_pci_bndy_pll(
- const fapi::Target & i_target,
- ecmdDataBufferBase & o_ring_data)
-{
- // return codes
- uint32_t rc_ecmd = 0;
- fapi::ReturnCode rc;
-
- // mark function entry
- FAPI_DBG("Start");
-
- do
- {
- // determine ring length
- fapi::ATTR_PROC_PCI_BNDY_PLL_LENGTH_Type ring_length;
- rc = FAPI_ATTR_GET(ATTR_PROC_PCI_BNDY_PLL_LENGTH, &i_target, ring_length);
- if (!rc.ok())
- {
- FAPI_ERR("Failed to get attribute: ATTR_PROC_PCI_BNDY_PLL_LENGTH.");
- break;
- }
- rc_ecmd |= o_ring_data.setBitLength(ring_length);
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x setting ecmd data buffer length. Buffer must be set to length of scan chain.", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
-
- // determine starting ring state
- fapi::ATTR_PROC_PCI_BNDY_PLL_DATA_Type ring_data_attr = {0};
- rc = FAPI_ATTR_GET(ATTR_PROC_PCI_BNDY_PLL_DATA, &i_target, ring_data_attr);
- if (rc)
- {
- FAPI_ERR("Failed to get attribute: ATTR_PROC_PCI_BNDY_PLL_DATA.");
- break;
- }
- rc_ecmd |= o_ring_data.insert(ring_data_attr, 0, ring_length, 0);
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x loading scan chain attribute data into buffer.", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
- } while(0);
-
- // mark function exit
- FAPI_DBG("End");
-
- return rc;
-}
-
-
-//------------------------------------------------------------------------------
-// function:
-// Calculate state to apply to processor pb_bndy_dmipll ring
-//
-// parameters: i_target => chip target
-// i_pll_ring_op => modification to be made to base PLL content
-// i_pll_bus_id => bus instance to target for modification
-// o_ring_data => data buffer containing ring state to apply
-// returns: FAPI_RC_SUCCESS if operation was successful, else error
-//------------------------------------------------------------------------------
-fapi::ReturnCode p8_pll_utils_calc_proc_pb_bndy_dmipll(
- const fapi::Target & i_target,
- const p8_pll_utils_ring_op i_pll_ring_op,
- const p8_pll_utils_bus_id i_pll_bus_id,
- ecmdDataBufferBase & o_ring_data)
-{
- // return codes
- uint32_t rc_ecmd = 0;
- fapi::ReturnCode rc;
-
- // mark function entry
- FAPI_DBG("Start");
-
- do
- {
- // determine ring length
- fapi::ATTR_PROC_PB_BNDY_DMIPLL_LENGTH_Type ring_length;
- rc = FAPI_ATTR_GET(ATTR_PROC_PB_BNDY_DMIPLL_LENGTH, &i_target, ring_length);
- if (!rc.ok())
- {
- FAPI_ERR("Failed to get attribute: ATTR_PROC_PB_BNDY_DMIPLL_LENGTH.");
- break;
- }
- rc_ecmd |= o_ring_data.setBitLength(ring_length);
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x setting ecmd data buffer length. Buffer must be set to length of scan chain.", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
-
- // determine starting ring state
- if (i_pll_ring_op == RING_OP_BASE)
- {
- // start from attribute data
- fapi::ATTR_PROC_PB_BNDY_DMIPLL_DATA_Type ring_data_attr = {0};
- rc = FAPI_ATTR_GET(ATTR_PROC_PB_BNDY_DMIPLL_DATA, &i_target, ring_data_attr);
- if (rc)
- {
- FAPI_ERR("Failed to get attribute: ATTR_PROC_PB_BNDY_DMIPLL_DATA.");
- break;
- }
- rc_ecmd |= o_ring_data.insert(ring_data_attr, 0, ring_length, 0);
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x loading scan chain attribute data into buffer.", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
- }
- else
- {
- // start from data currently in ring
- rc = fapiGetRing(i_target, RING_ADDRESS_PROC_PB_BNDY_DMIPLL, o_ring_data, fapi::RING_MODE_SET_PULSE);
- if (!rc.ok())
- {
- FAPI_ERR("Error from fapiGetRing (ring ID: 0x08%x)", RING_ADDRESS_PROC_PB_BNDY_DMIPLL);
- break;
- }
- }
-
- // modify ring data
- if (i_pll_ring_op == RING_OP_MOD_VCO_S1)
- {
- rc_ecmd |= o_ring_data.setBit(PB_BNDY_DMIPLL_RING_CCALLOAD_OFFSET);
- rc_ecmd |= o_ring_data.setBit(PB_BNDY_DMIPLL_RING_CCALFMIN_OFFSET);
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x setting up data buffer to enable lctank PLL vco workaround (scan1)", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
- }
- else if (i_pll_ring_op == RING_OP_MOD_VCO_S2)
- {
- rc_ecmd |= o_ring_data.setBit(PB_BNDY_DMIPLL_RING_CCALLOAD_OFFSET);
- rc_ecmd |= o_ring_data.clearBit(PB_BNDY_DMIPLL_RING_CCALFMIN_OFFSET);
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x setting up data buffer to enable lctank PLL vco workaround (scan2)", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
- }
- else if (i_pll_ring_op == RING_OP_MOD_REFCLK_SEL)
- {
- fapi::ATTR_PROC_DMI_CUPLL_REFCLKSEL_OFFSET_Type refclksel_offset = {0};
- rc = FAPI_ATTR_GET(ATTR_PROC_DMI_CUPLL_REFCLKSEL_OFFSET, &i_target, refclksel_offset);
- if (!rc.ok())
- {
- FAPI_ERR("Failed to get attribute: ATTR_PROC_DMI_CUPLL_REFCLKSEL_OFFSET");
- break;
- }
-
- if (o_ring_data.isBitSet(refclksel_offset[i_pll_bus_id]))
- {
- rc_ecmd |= o_ring_data.clearBit(refclksel_offset[i_pll_bus_id]);
- }
- else
- {
- rc_ecmd |= o_ring_data.setBit(refclksel_offset[i_pll_bus_id]);
- }
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x loading refclock select attribute data into buffer.", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
- }
- else if (i_pll_ring_op == RING_OP_MOD_PFD360)
- {
- fapi::ATTR_PROC_DMI_CUPLL_PFD360_OFFSET_Type pfd360_offset;
- rc = FAPI_ATTR_GET(ATTR_PROC_DMI_CUPLL_PFD360_OFFSET, &i_target, pfd360_offset);
- if (!rc.ok())
- {
- FAPI_ERR("Failed to get attribute: ATTR_PROC_DMI_CUPLL_PFD360_OFFSET");
- break;
- }
-
- if (o_ring_data.isBitSet(pfd360_offset[i_pll_bus_id]))
- {
- rc_ecmd |= o_ring_data.clearBit(pfd360_offset[i_pll_bus_id]);
- }
- else
- {
- rc_ecmd |= o_ring_data.setBit(pfd360_offset[i_pll_bus_id]);
- }
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x loading pfd360 attribute data into buffer.", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
- }
- } while(0);
-
- // mark function exit
- FAPI_DBG("End");
-
- return rc;
-}
-
-
-//------------------------------------------------------------------------------
-// function:
-// Calculate state to apply to processor ab_bndy_pll ring
-//
-// parameters: i_target => chip target
-// i_pll_ring_op => modification to be made to base PLL content
-// i_pll_bus_id => bus instance to target for modification
-// o_ring_data => data buffer containing ring state to apply
-// returns: FAPI_RC_SUCCESS if operation was successful, else error
-//------------------------------------------------------------------------------
-fapi::ReturnCode p8_pll_utils_calc_proc_ab_bndy_pll(
- const fapi::Target & i_target,
- const p8_pll_utils_ring_op i_pll_ring_op,
- const p8_pll_utils_bus_id i_pll_bus_id,
- ecmdDataBufferBase & o_ring_data)
-{
- // return codes
- uint32_t rc_ecmd = 0;
- fapi::ReturnCode rc;
-
- // mark function entry
- FAPI_DBG("Start");
-
- do
- {
- // determine ring length
- fapi::ATTR_PROC_AB_BNDY_PLL_LENGTH_Type ring_length;
- rc = FAPI_ATTR_GET(ATTR_PROC_AB_BNDY_PLL_LENGTH, &i_target, ring_length);
- if (!rc.ok())
- {
- FAPI_ERR("Failed to get attribute: ATTR_PROC_AB_BNDY_PLL_LENGTH.");
- break;
- }
- rc_ecmd |= o_ring_data.setBitLength(ring_length);
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x setting ecmd data buffer length. Buffer must be set to length of scan chain.", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
-
- // determine starting ring state
- if (i_pll_ring_op == RING_OP_BASE)
- {
- // start from attribute data
- fapi::ATTR_PROC_AB_BNDY_PLL_DATA_Type ring_data_attr = {0};
- rc = FAPI_ATTR_GET(ATTR_PROC_AB_BNDY_PLL_DATA, &i_target, ring_data_attr);
- if (rc)
- {
- FAPI_ERR("Failed to get attribute: ATTR_PROC_AB_BNDY_PLL_DATA.");
- break;
- }
- rc_ecmd |= o_ring_data.insert(ring_data_attr, 0, ring_length, 0);
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x loading scan chain attribute data into buffer.", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
- }
- else
- {
- // start from data currently in ring
- rc = fapiGetRing(i_target, RING_ADDRESS_PROC_AB_BNDY_PLL, o_ring_data, fapi::RING_MODE_SET_PULSE);
- if (!rc.ok())
- {
- FAPI_ERR("Error from fapiGetRing (ring ID: 0x08%x)", RING_ADDRESS_PROC_AB_BNDY_PLL);
- break;
- }
- }
-
- // modify ring data
- if (i_pll_ring_op == RING_OP_MOD_VCO_S1)
- {
- rc_ecmd |= o_ring_data.setBit(AB_BNDY_PLL_RING_CCALLOAD_OFFSET);
- rc_ecmd |= o_ring_data.setBit(AB_BNDY_PLL_RING_CCALFMIN_OFFSET);
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x setting up data buffer to enable lctank PLL vco workaround (scan1)", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
- }
- else if (i_pll_ring_op == RING_OP_MOD_VCO_S2)
- {
- rc_ecmd |= o_ring_data.setBit(AB_BNDY_PLL_RING_CCALLOAD_OFFSET);
- rc_ecmd |= o_ring_data.clearBit(AB_BNDY_PLL_RING_CCALFMIN_OFFSET);
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x setting up data buffer to enable lctank PLL vco workaround (scan2)", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
- }
- else if (i_pll_ring_op == RING_OP_MOD_REFCLK_SEL)
- {
- fapi::ATTR_PROC_ABUS_CUPLL_REFCLKSEL_OFFSET_Type refclksel_offset = {0};
- rc = FAPI_ATTR_GET(ATTR_PROC_ABUS_CUPLL_REFCLKSEL_OFFSET, &i_target, refclksel_offset);
- if (!rc.ok())
- {
- FAPI_ERR("Failed to get attribute: ATTR_PROC_ABUS_CUPLL_REFCLKSEL_OFFSET");
- break;
- }
-
- if (o_ring_data.isBitSet(refclksel_offset[i_pll_bus_id]))
- {
- rc_ecmd |= o_ring_data.clearBit(refclksel_offset[i_pll_bus_id]);
- }
- else
- {
- rc_ecmd |= o_ring_data.setBit(refclksel_offset[i_pll_bus_id]);
- }
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x loading refclock select attribute data into buffer.", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
- }
- else if (i_pll_ring_op == RING_OP_MOD_PFD360)
- {
- fapi::ATTR_PROC_ABUS_CUPLL_PFD360_OFFSET_Type pfd360_offset;
- rc = FAPI_ATTR_GET(ATTR_PROC_ABUS_CUPLL_PFD360_OFFSET, &i_target, pfd360_offset);
- if (!rc.ok())
- {
- FAPI_ERR("Failed to get attribute: ATTR_PROC_ABUS_CUPLL_PFD360_OFFSET");
- break;
- }
-
- if (o_ring_data.isBitSet(pfd360_offset[i_pll_bus_id]))
- {
- rc_ecmd |= o_ring_data.clearBit(pfd360_offset[i_pll_bus_id]);
- }
- else
- {
- rc_ecmd |= o_ring_data.setBit(pfd360_offset[i_pll_bus_id]);
- }
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x loading pfd360 attribute data into buffer.", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
- }
- } while(0);
-
- // mark function exit
- FAPI_DBG("End");
- return rc;
-}
-
-
-//------------------------------------------------------------------------------
-// function:
-// Poll for SBE to reach designated state (interlocked with scan requests)
-//
-// parameters: i_target => chip target
-// i_poll_limit => number of polls permitted before timeout
-//
-// returns: FAPI_RC_SUCCESS if desired state was reached, else error
-//------------------------------------------------------------------------------
-fapi::ReturnCode p8_pll_utils_poll_sbe(
- const fapi::Target & i_target,
- const uint32_t i_num_polls)
-{
- fapi::ReturnCode rc;
- uint32_t rc_ecmd = 0;
-
- uint32_t poll_num = 0;
- bool poll_timeout = false;
- bool sbe_running = true;
- bool sbe_ready = false;
-
- ecmdDataBufferBase sbe_control_data(64);
- ecmdDataBufferBase sbe_vital_data(64);
- uint32_t istep_num;
- uint8_t substep_num;
- ecmdDataBufferBase mbox_data(64);
-
- // mark function entry
- FAPI_DBG("Start");
-
- do
- {
- do
- {
- // delay between poll attempts
- if (poll_num)
- {
- FAPI_DBG("Pausing prior to next poll...");
- rc = fapiDelay(PROC_A_X_PCI_DMI_PLL_UTILS_SBE_POLL_DELAY_HW,
- PROC_A_X_PCI_DMI_PLL_UTILS_SBE_POLL_DELAY_SIM);
- if (!rc.ok())
- {
- FAPI_ERR("Error from fapiDelay");
- break;
- }
- }
-
- // increment poll count, timeout if threshold exceeded
- poll_num++;
- if (poll_num > i_num_polls)
- {
- poll_timeout = true;
- break;
- }
-
- // determine SBE run state
- FAPI_DBG("Reading SBE state (poll %d / %d)", poll_num, i_num_polls);
- rc = fapiGetScom(i_target, PORE_SBE_CONTROL_0x000E0001, sbe_control_data);
- if (!rc.ok())
- {
- FAPI_ERR("Error reading SBE Control Register");
- break;
- }
- sbe_running = sbe_control_data.isBitClear(SBE_CONTROL_REG_CTL_NO_LB_BIT);
- FAPI_DBG("Run state: %s", ((sbe_running)?("run"):("halted")));
-
- // get SBE istep/substep information
- rc = fapiGetScom(i_target, MBOX_SBEVITAL_0x0005001C, sbe_vital_data);
- if (!rc.ok())
- {
- FAPI_ERR("Error reading SBE Vital Register");
- break;
- }
-
- rc_ecmd |= sbe_vital_data.extractToRight(&istep_num,
- ISTEP_NUM_BIT_POSITION,
- ISTEP_NUM_BIT_LENGTH);
- rc_ecmd |= sbe_vital_data.extractToRight(&substep_num,
- SUBSTEP_NUM_BIT_POSITION,
- SUBSTEP_NUM_BIT_LENGTH);
- if (rc_ecmd)
- {
- FAPI_ERR("Error (0x%x) setting up ecmdDataBufferBase", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
-
- // get HB->SBE request mailbox, check that it is clear
- rc = fapiGetScom(i_target, MBOX_SCRATCH_REG0_0x00050038, mbox_data);
- if (!rc.ok())
- {
- FAPI_ERR("Scom error reading SBE MBOX0 Register");
- break;
- }
-
- sbe_ready = (istep_num == PROC_SBE_SCAN_SERVICE_ISTEP_NUM) &&
- (substep_num == SUBSTEP_SBE_READY) &&
- (mbox_data.getDoubleWord(0) == 0);
-
- FAPI_DBG("Istep: 0x%03X, Substep: %X, MBOX: %016llX", istep_num, substep_num, mbox_data.getDoubleWord(0));
-
- } while (!poll_timeout &&
- sbe_running &&
- !sbe_ready);
-
- if (!rc.ok())
- {
- break;
- }
- if (!sbe_running)
- {
- FAPI_ERR("SBE is NOT running!");
- const fapi::Target & TARGET = i_target;
- ecmdDataBufferBase & SBE_CONTROL = sbe_control_data;
- FAPI_SET_HWP_ERROR(rc, RC_P8_PLL_UTILS_SBE_STOPPED);
- break;
- }
- if (poll_timeout || !sbe_ready)
- {
- FAPI_ERR("Poll limit reached waiting for SBE to attain expected state");
- FAPI_ERR("Expected istep 0x%03llX, substep 0x%X but found istep 0x%03X, substep 0x%X",
- PROC_SBE_SCAN_SERVICE_ISTEP_NUM, SUBSTEP_SBE_READY,
- istep_num, substep_num);
- const fapi::Target & TARGET = i_target;
- const uint32_t & POLL_COUNT = i_num_polls;
- const ecmdDataBufferBase & SBE_VITAL = sbe_vital_data;
- FAPI_SET_HWP_ERROR(rc, RC_P8_PLL_UTILS_SBE_TIMEOUT_ERROR);
- break;
- }
-
- FAPI_DBG("SBE reached expected state");
-
- } while(0);
-
- // mark function entry
- FAPI_DBG("End");
- return rc;
-}
-
-
-//------------------------------------------------------------------------------
-// function:
-// Scan PLL boundary ring with setpulse (scan executed by SBE)
-//
-// parameters: i_target => chip target
-// i_pll_ring_addr => PLL ring address
-// i_pll_ring_op => modification to be made to base PLL content
-// i_pll_bus_id => bus instance to target for modification
-// returns: FAPI_RC_SUCCESS if operation was successful, else error
-//------------------------------------------------------------------------------
-fapi::ReturnCode p8_pll_utils_scan_bndy_sbe(
- const fapi::Target & i_target,
- const p8_pll_utils_ring_address i_pll_ring_addr,
- const p8_pll_utils_ring_op i_pll_ring_op,
- const p8_pll_utils_bus_id i_pll_bus_id)
-{
- // return codes
- fapi::ReturnCode rc;
- uint32_t rc_ecmd = 0;
-
- // mark function entry
- FAPI_DBG("Start");
-
- do
- {
- // check request content
- p8_pll_utils_ring_id pll_ring_id;
- if (i_pll_ring_addr == RING_ADDRESS_PROC_AB_BNDY_PLL)
- {
- pll_ring_id = RING_ID_ABUS;
- }
- else if (i_pll_ring_addr == RING_ADDRESS_PROC_PCI_BNDY_PLL)
- {
- pll_ring_id = RING_ID_PCI;
- }
- else if (i_pll_ring_addr == RING_ADDRESS_PROC_PB_BNDY_DMIPLL)
- {
- pll_ring_id = RING_ID_DMI;
- }
- else
- {
- FAPI_ERR("Invalid/unsupported SBE ring operation requested");
- const fapi::Target & TARGET = i_target;
- const p8_pll_utils_ring_address & PLL_RING_ADDR = i_pll_ring_addr;
- const p8_pll_utils_ring_op & PLL_RING_OP = i_pll_ring_op;
- const p8_pll_utils_bus_id & PLL_BUS_ID = i_pll_bus_id;
- const bool & INVALID_RING_ADDRESS = true;
- const bool & INVALID_RING_OP = false;
- const bool & INVALID_BUS_ID = false;
- FAPI_SET_HWP_ERROR(rc, RC_P8_PLL_UTILS_INVALID_OPERATION);
- break;
- }
-
- // verify that SBE is ready to service scan operation
- // (it should be waiting for our request)
- FAPI_DBG("Checking SBE is ready to receive scan request");
- rc = p8_pll_utils_poll_sbe(i_target, 1);
- if (!rc.ok())
- {
- FAPI_ERR("Error from p8_pll_utils_poll_sbe");
- break;
- }
-
- // construct scan request format
- ecmdDataBufferBase mbox_data(64);
- rc_ecmd |= mbox_data.setBit(MBOX0_REQUEST_VALID_BIT);
- rc_ecmd |= mbox_data.insertFromRight(static_cast<uint32_t>(pll_ring_id),
- MBOX0_RING_SELECT_START_BIT,
- (MBOX0_RING_SELECT_END_BIT-
- MBOX0_RING_SELECT_START_BIT+1));
- rc_ecmd |= mbox_data.insertFromRight(static_cast<uint32_t>(i_pll_ring_op),
- MBOX0_RING_OP_START_BIT,
- (MBOX0_RING_OP_END_BIT-
- MBOX0_RING_OP_START_BIT+1));
- rc_ecmd |= mbox_data.insertFromRight(static_cast<uint32_t>(i_pll_bus_id),
- MBOX0_RING_BUS_ID_START_BIT,
- (MBOX0_RING_BUS_ID_END_BIT-
- MBOX0_RING_BUS_ID_START_BIT+1));
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x setting up SBE MBOX0 data buffer.", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
-
- // submit request to SBE
- FAPI_DBG("Submitting scan request to SBE");
- rc = fapiPutScom(i_target, MBOX_SCRATCH_REG0_0x00050038, mbox_data);
- if (!rc.ok())
- {
- FAPI_ERR("Error writing SBE MBOX0 Register");
- break;
- }
-
- // poll until SBE drops response SBE indicates scan is finished (back to 'ready' state)
- // or until maximum poll count is reached
- FAPI_DBG("Polling for SBE completion...");
- rc = p8_pll_utils_poll_sbe(i_target,
- PROC_A_X_PCI_DMI_PLL_UTILS_SBE_MAX_POLLS);
- if (!rc.ok())
- {
- FAPI_ERR("Error from p8_pll_utils_poll_sbe");
- break;
- }
-
- // check result of scan operation
- FAPI_DBG("SBE reached ready state, checking result of scan operation");
- rc = fapiGetScom(i_target, MBOX_SCRATCH_REG1_0x00050039, mbox_data);
- if (!rc.ok())
- {
- FAPI_ERR("Error reading SBE MBOX1 Register");
- break;
- }
-
- if (mbox_data.isBitClear(MBOX1_SCAN_REPLY_SUCCESS_BIT))
- {
- FAPI_ERR("SBE indicated scan operation failure!");
- const fapi::Target & TARGET = i_target;
- const p8_pll_utils_ring_address & PLL_RING_ADDR = i_pll_ring_addr;
- const p8_pll_utils_ring_op & PLL_RING_OP = i_pll_ring_op;
- const p8_pll_utils_bus_id & PLL_BUS_ID = i_pll_bus_id;
- const ecmdDataBufferBase & MBOX1_DATA = mbox_data;
- FAPI_SET_HWP_ERROR(rc, RC_P8_PLL_UTILS_SBE_SCAN_ERROR);
- break;
- }
-
- FAPI_DBG("SBE reply indicates scan was successful!");
-
- } while(0);
-
- // mark function exit
- FAPI_DBG("End");
- return rc;
-}
-
-
-//------------------------------------------------------------------------------
-// function:
-// Scan PLL boundary ring with setpulse (scan executed by HB/FSP platform)
-//
-// parameters: i_target => chip target
-// i_pll_ring_addr => PLL ring address
-// i_pll_ring_op => modification to be made to base PLL content
-// i_pll_bus_id => bus instance to target for modification
-// returns: FAPI_RC_SUCCESS if operation was successful, else error
-//------------------------------------------------------------------------------
-fapi::ReturnCode p8_pll_utils_scan_bndy_non_sbe(
- const fapi::Target & i_target,
- const p8_pll_utils_ring_address i_pll_ring_addr,
- const p8_pll_utils_ring_op i_pll_ring_op,
- const p8_pll_utils_bus_id i_pll_bus_id)
-{
- // return codes
- uint32_t rc_ecmd = 0;
- fapi::ReturnCode rc;
-
- // mark function entry
- FAPI_DBG("Start");
-
- do
- {
- // form base chiplet ID / ring data to scan
- uint32_t chiplet_base_scom_addr;
- ecmdDataBufferBase ring_data;
- if (i_pll_ring_addr == RING_ADDRESS_MEMB_TP_BNDY_PLL)
- {
- chiplet_base_scom_addr = TP_CHIPLET_0x01000000;
- rc = p8_pll_utils_calc_memb_tp_bndy_pll(i_target,
- i_pll_ring_op,
- ring_data);
- if (!rc.ok())
- {
- FAPI_ERR("Error from p8_pll_utils_calc_memb_tp_bndy_pll");
- break;
- }
- }
- else if (i_pll_ring_addr == RING_ADDRESS_PROC_PB_BNDY_DMIPLL)
- {
- chiplet_base_scom_addr = NEST_CHIPLET_0x02000000;
- rc = p8_pll_utils_calc_proc_pb_bndy_dmipll(i_target,
- i_pll_ring_op,
- i_pll_bus_id,
- ring_data);
- if (!rc.ok())
- {
- FAPI_ERR("Error from p8_pll_utils_calc_proc_pb_bndy_dmipll");
- break;
- }
- }
- else if (i_pll_ring_addr == RING_ADDRESS_PROC_AB_BNDY_PLL)
- {
- chiplet_base_scom_addr = A_BUS_CHIPLET_0x08000000;
- rc = p8_pll_utils_calc_proc_ab_bndy_pll(i_target,
- i_pll_ring_op,
- i_pll_bus_id,
- ring_data);
- if (!rc.ok())
- {
- FAPI_ERR("Error from p8_pll_utils_calc_proc_ab_bndy_pll");
- break;
- }
- }
- else
- {
- chiplet_base_scom_addr = PCIE_CHIPLET_0x09000000;
- rc = p8_pll_utils_calc_proc_pci_bndy_pll(i_target,
- ring_data);
- if (!rc.ok())
- {
- FAPI_ERR("Error from p8_pll_utils_calc_proc_pci_bndy_pll");
- break;
- }
- }
-
- // configure OPCG to generate setpulse
- ecmdDataBufferBase scom_data(64);
- FAPI_DBG("Writing OPCG Register 0 to generate setpulse ...");
- rc_ecmd |= scom_data.setDoubleWord(0, OPCG_REG0_FOR_SETPULSE);
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x setting up ecmd data buffer to write OPCG Register 0.", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
- rc = fapiPutScom(i_target, chiplet_base_scom_addr | GENERIC_OPCG_CNTL0_0x00030002, scom_data);
- if (!rc.ok())
- {
- FAPI_ERR("Error writing OPCG Register0 to generate setpulse.");
- break;
- }
-
- FAPI_DBG("Writing OPCG Register 2 to generate setpulse ...");
- rc_ecmd |= scom_data.setDoubleWord(0, OPCG_REG2_FOR_SETPULSE);
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x setting up ecmd data buffer to write OPCG Register 2.", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
- rc = fapiPutScom(i_target, chiplet_base_scom_addr | GENERIC_OPCG_CNTL2_0x00030004, scom_data);
- if (rc)
- {
- FAPI_ERR("Error writing OPCG Register2 to generate setpulse.");
- break;
- }
-
- FAPI_DBG("Writing OPCG Register 3 to generate setpulse ...");
- rc_ecmd |= scom_data.setDoubleWord(0, OPCG_REG3_FOR_SETPULSE);
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x setting up ecmd data buffer to write OPCG Register 3.", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
- rc = fapiPutScom(i_target, chiplet_base_scom_addr | GENERIC_OPCG_CNTL3_0x00030005, scom_data);
- if (rc)
- {
- FAPI_ERR("Error writing OPCG Register3 to generate setpulse.");
- break;
- }
-
- FAPI_DBG("Writing OPCG Clock Region Register to generate setpulse ...");
- rc_ecmd |= scom_data.setDoubleWord(0, CLK_REGION_FOR_SETPULSE);
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x setting up ecmd data buffer to write Clock Region Register.", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
- rc = fapiPutScom(i_target, chiplet_base_scom_addr | GENERIC_CLK_REGION_0x00030006, scom_data);
- if (rc)
- {
- FAPI_ERR("Error writing Clock Region Register to generate setpulse.");
- break;
- }
-
- // scan new ring data into PLL boundary scan ring
- rc = fapiPutRing(i_target, i_pll_ring_addr, ring_data, fapi::RING_MODE_SET_PULSE);
- if (rc)
- {
- FAPI_ERR("fapiPutRing failed with rc = 0x%x", (uint32_t) rc);
- break;
- }
- FAPI_DBG("Loading of the config bits for PLL is done.");
-
-
- // set the OPCG back to a good state
- FAPI_DBG("Writing OPCG Register 3 to clear setpulse ...");
- rc_ecmd |= scom_data.flushTo0();
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x setting up ecmd data buffer to clear OPCG Register 3.", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
- rc = fapiPutScom(i_target, chiplet_base_scom_addr | GENERIC_OPCG_CNTL3_0x00030005, scom_data);
- if (rc)
- {
- FAPI_ERR("Error writing OPCG Register3 to clear setpulse.");
- break;
- }
-
- FAPI_DBG("Writing OPCG Clock Region Register to clear setpulse ...");
- rc_ecmd |= scom_data.flushTo0();
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x setting up ecmd data buffer to clear Clock Region Register.", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
- rc = fapiPutScom(i_target, chiplet_base_scom_addr | GENERIC_CLK_REGION_0x00030006, scom_data);
- if (rc)
- {
- FAPI_ERR("Error writing Clock Region Register to clear setpulse.");
- break;
- }
-
- } while(0);
-
- // mark function exit
- FAPI_DBG("End");
- return rc;
-}
-
-
-//------------------------------------------------------------------------------
-// function:
-// Scan PLL boundary ring with setpulse
-//
-// parameters: i_target => chip target
-// i_pll_ring_addr => PLL ring address
-// i_pll_ring_op => modification to be made to base PLL content
-// i_pll_bus_id => bus instance to target for modification
-// i_mask_scan_collision => mask scan collision bit in chiplet
-// pervasive LFIR
-// returns: FAPI_RC_SUCCESS if operation was successful, else error
-//------------------------------------------------------------------------------
-fapi::ReturnCode proc_a_x_pci_dmi_pll_scan_bndy(
- const fapi::Target& i_target,
- const p8_pll_utils_ring_address i_pll_ring_addr,
- const p8_pll_utils_ring_op i_pll_ring_op,
- const p8_pll_utils_bus_id i_pll_bus_id,
- const bool i_mask_scan_collision)
-{
- // return codes
- fapi::ReturnCode rc;
- uint32_t rc_ecmd = 0;
-
- // mark function entry
- FAPI_DBG("Start");
-
- do
- {
- // check validity of arguments
- bool invalid_ring_address = ((i_pll_ring_addr != RING_ADDRESS_MEMB_TP_BNDY_PLL) &&
- (i_pll_ring_addr != RING_ADDRESS_PROC_PB_BNDY_DMIPLL) &&
- (i_pll_ring_addr != RING_ADDRESS_PROC_AB_BNDY_PLL) &&
- (i_pll_ring_addr != RING_ADDRESS_PROC_PCI_BNDY_PLL));
- bool invalid_ring_op = (((i_pll_ring_op != RING_OP_BASE) &&
- (i_pll_ring_op != RING_OP_MOD_VCO_S1) &&
- (i_pll_ring_op != RING_OP_MOD_VCO_S2) &&
- (i_pll_ring_op != RING_OP_MOD_REFCLK_SEL) &&
- (i_pll_ring_op != RING_OP_MOD_PFD360)) ||
- ((i_pll_ring_addr == RING_ADDRESS_MEMB_TP_BNDY_PLL) &&
- ((i_pll_ring_op == RING_OP_MOD_VCO_S1) ||
- (i_pll_ring_op == RING_OP_MOD_VCO_S2))) ||
- ((i_pll_ring_addr == RING_ADDRESS_PROC_PCI_BNDY_PLL) &&
- (i_pll_ring_op != RING_OP_BASE)));
- bool invalid_bus_id = ((((i_pll_ring_addr == RING_ADDRESS_MEMB_TP_BNDY_PLL) ||
- (i_pll_ring_addr == RING_ADDRESS_PROC_PCI_BNDY_PLL)) &&
- (i_pll_bus_id != RING_BUS_ID_0)) ||
- (((i_pll_ring_op == RING_OP_BASE) ||
- (i_pll_ring_op == RING_OP_MOD_VCO_S1) ||
- (i_pll_ring_op == RING_OP_MOD_VCO_S2)) &&
- (i_pll_bus_id != RING_BUS_ID_0)) ||
- ((i_pll_ring_addr == RING_ADDRESS_PROC_AB_BNDY_PLL) &&
- (i_pll_bus_id != RING_BUS_ID_0) &&
- (i_pll_bus_id != RING_BUS_ID_1) &&
- (i_pll_bus_id != RING_BUS_ID_2) &&
- (i_pll_bus_id != RING_BUS_ID_3)) ||
- ((i_pll_ring_addr == RING_ADDRESS_PROC_PB_BNDY_DMIPLL) &&
- (i_pll_bus_id != RING_BUS_ID_0) &&
- (i_pll_bus_id != RING_BUS_ID_1) &&
- (i_pll_bus_id != RING_BUS_ID_2) &&
- (i_pll_bus_id != RING_BUS_ID_3) &&
- (i_pll_bus_id != RING_BUS_ID_4) &&
- (i_pll_bus_id != RING_BUS_ID_5) &&
- (i_pll_bus_id != RING_BUS_ID_6) &&
- (i_pll_bus_id != RING_BUS_ID_7)));
-
- if (invalid_ring_address ||
- invalid_ring_op ||
- invalid_bus_id)
- {
- FAPI_ERR("Invalid/unsupported ring operation requested");
- FAPI_ERR(" ring address: %x (invalid = %d)", i_pll_ring_addr, invalid_ring_address);
- FAPI_ERR(" ring op: %x (invalid = %d)", i_pll_ring_op, invalid_ring_op);
- FAPI_ERR(" bus id: %x (invalid = %d)", i_pll_bus_id, invalid_bus_id);
-
- const fapi::Target & TARGET = i_target;
- const p8_pll_utils_ring_address & PLL_RING_ADDR = i_pll_ring_addr;
- const p8_pll_utils_ring_op & PLL_RING_OP = i_pll_ring_op;
- const p8_pll_utils_bus_id & PLL_BUS_ID = i_pll_bus_id;
- const bool & INVALID_RING_ADDRESS = invalid_ring_address;
- const bool & INVALID_RING_OP = invalid_ring_op;
- const bool & INVALID_BUS_ID = invalid_bus_id;
- FAPI_SET_HWP_ERROR(rc, RC_P8_PLL_UTILS_INVALID_OPERATION);
- break;
- }
-
- // optionally mask pervasive LFIR prior to scan operation
- bool unmask_scan_collision = false;
- uint32_t chiplet_base_scom_addr;
- ecmdDataBufferBase scom_data(64);
- if (i_pll_ring_addr == RING_ADDRESS_MEMB_TP_BNDY_PLL)
- {
- chiplet_base_scom_addr = TP_CHIPLET_0x01000000;
- }
- else if (i_pll_ring_addr == RING_ADDRESS_PROC_PB_BNDY_DMIPLL)
- {
- chiplet_base_scom_addr = NEST_CHIPLET_0x02000000;
- }
- else if (i_pll_ring_addr == RING_ADDRESS_PROC_AB_BNDY_PLL)
- {
- chiplet_base_scom_addr = A_BUS_CHIPLET_0x08000000;
- }
- else
- {
- chiplet_base_scom_addr = PCIE_CHIPLET_0x09000000;
- }
-
- if (i_mask_scan_collision)
- {
- FAPI_DBG("Reading value of Pervasive LFIR scan collision mask bit ...");
- rc = fapiGetScom(i_target, chiplet_base_scom_addr | GENERIC_PERV_LFIR_MASK_0x0004000D, scom_data);
- if (!rc.ok())
- {
- FAPI_ERR("Error reading Pervasive LFIR Mask OR Register.");
- break;
- }
- unmask_scan_collision = scom_data.isBitClear(PERV_LFIR_SCAN_COLLISION_BIT);
-
- FAPI_DBG("Masking Pervasive LFIR scan collision bit ...");
- rc_ecmd |= scom_data.flushTo0();
- rc_ecmd |= scom_data.setBit(PERV_LFIR_SCAN_COLLISION_BIT);
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x setting up ecmd data buffer to set Pervasive LFIR Mask Register.", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
- rc = fapiPutScom(i_target, chiplet_base_scom_addr | GENERIC_PERV_LFIR_MASK_OR_0x0004000F, scom_data);
- if (!rc.ok())
- {
- FAPI_ERR("Error writing Pervasive LFIR Mask OR Register.");
- break;
- }
- }
-
- // make determination of scan path to use
- bool use_sbe;
- FAPI_EXEC_HWP(rc, proc_use_sbe_scan_service, i_target, use_sbe);
- if (!rc.ok())
- {
- FAPI_ERR("Error from proc_use_sbe_scan_service");
- break;
- }
-
- // scan path determined
- // request SCAN via SBE (SBE holds data)
- if (use_sbe)
- {
- rc = p8_pll_utils_scan_bndy_sbe(i_target,
- i_pll_ring_addr,
- i_pll_ring_op,
- i_pll_bus_id);
- if (!rc.ok())
- {
- FAPI_ERR("Error from p8_pll_utils_scan_bndy_sbe");
- break;
- }
- }
- // construct ring content to scan via attributes, invoke FAPI API
- else
- {
- rc = p8_pll_utils_scan_bndy_non_sbe(i_target,
- i_pll_ring_addr,
- i_pll_ring_op,
- i_pll_bus_id);
- if (!rc.ok())
- {
- FAPI_ERR("Error from p8_pll_utils_scan_bndy_non_sbe");
- break;
- }
- }
-
- // clear & Unmask Pervasive LFIR
- if (i_mask_scan_collision)
- {
- FAPI_DBG("Clearing Pervasive LFIR scan collision bit ...");
- rc_ecmd |= scom_data.flushTo1();
- rc_ecmd |= scom_data.clearBit(PERV_LFIR_SCAN_COLLISION_BIT);
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x setting up ecmd data buffer to clear Pervasive LFIR Register.", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
- rc = fapiPutScom(i_target, chiplet_base_scom_addr | GENERIC_PERV_LFIR_AND_0x0004000B, scom_data);
- if (!rc.ok())
- {
- FAPI_ERR("Error writing Pervasive LFIR AND Register.");
- break;
- }
-
- if (unmask_scan_collision)
- {
- FAPI_DBG("Unmasking Pervasive LFIR scan collision bit ...");
- rc = fapiPutScom(i_target, chiplet_base_scom_addr | GENERIC_PERV_LFIR_MASK_AND_0x0004000E, scom_data);
- if (!rc.ok())
- {
- FAPI_ERR("Error writing Pervasive LFIR Mask And Register.");
- break;
- }
- }
- }
-
- } while(0);
-
- // mark function exit
- FAPI_DBG("End");
-
- return rc;
-}
-
-
-//------------------------------------------------------------------------------
-// function:
-// Release PLL from test mode/bypass/reset and optionally check for lock
-//
-// parameters: i_target => chip target
-// i_chiplet_base_scom_addr => aligned base address of chiplet SCOM
-// address space
-// i_check_lock => check for PLL lock?
-// returns: FAPI_RC_SUCCESS if operation was successful, else error
-//------------------------------------------------------------------------------
-fapi::ReturnCode proc_a_x_pci_dmi_pll_release_pll(
- const fapi::Target& i_target,
- const uint32_t i_chiplet_base_scom_addr,
- const bool i_check_lock)
-{
- // data buffer to hold SCOM data
- ecmdDataBufferBase data(64);
-
- // return codes
- uint32_t rc_ecmd = 0;
- fapi::ReturnCode rc;
-
- // mark function entry
- FAPI_DBG("Start");
-
- do
- {
- FAPI_DBG("Release PLL test enable");
- rc_ecmd |= data.flushTo1();
- rc_ecmd |= data.clearBit(GP3_PLL_TEST_ENABLE_BIT);
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x setting up data buffer to clear GP3 PLL test enable", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
- rc = fapiPutScom(i_target, i_chiplet_base_scom_addr | GENERIC_GP3_AND_0x000F0013, data);
- if (rc)
- {
- FAPI_ERR("Error writing GP3 to clear PLL test enable");
- break;
- }
-
- FAPI_DBG("Release PLL reset");
- rc_ecmd |= data.flushTo1();
- rc_ecmd |= data.clearBit(GP3_PLL_RESET_BIT);
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x setting up data buffer to clear GP3 PLL reset", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
- rc = fapiPutScom(i_target, i_chiplet_base_scom_addr | GENERIC_GP3_AND_0x000F0013, data);
- if (rc)
- {
- FAPI_ERR("Error writing GP3 to clear PLL reset");
- break;
- }
-
- FAPI_DBG("Release PLL bypass");
- // 24july2012 mfred moved this before checking PLL lock as this is required for analog PLLs.
- rc_ecmd |= data.flushTo1();
- rc_ecmd |= data.clearBit(GP3_PLL_BYPASS_BIT);
- if (rc_ecmd)
- {
- FAPI_ERR("Error 0x%x setting up data buffer to clear GP3 PLL bypass", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
- rc = fapiPutScom(i_target, i_chiplet_base_scom_addr | GENERIC_GP3_AND_0x000F0013, data);
- if (rc)
- {
- FAPI_ERR("Error writing GP3 to clear PLL bypass");
- break;
- }
-
- if (i_check_lock)
- {
- FAPI_DBG("Checking for PLL lock...");
- uint32_t num = 0;
- bool timeout = false;
-
- // poll until PLL is locked or max count is reached
- do
- {
- num++;
- if (num > PROC_A_X_PCI_DMI_PLL_UTILS_MAX_LOCK_POLLS)
- {
- timeout = 1;
- break;
- }
- rc = fapiGetScom(i_target, i_chiplet_base_scom_addr | GENERIC_PLLLOCKREG_0x000F0019, data);
- if (rc)
- {
- FAPI_ERR("Error reading PLL lock register");
- break;
- }
- rc = fapiDelay(PROC_A_X_PCI_DMI_PLL_UTILS_POLL_DELAY_HW,
- PROC_A_X_PCI_DMI_PLL_UTILS_POLL_DELAY_SIM);
- if (rc)
- {
- FAPI_ERR("Error from fapiDelay");
- break;
- }
- } while (!timeout &&
- !data.isBitSet(PLL_LOCK_REG_LOCK_START_BIT,
- (PLL_LOCK_REG_LOCK_END_BIT-
- PLL_LOCK_REG_LOCK_START_BIT+1)));
-
- if (rc)
- {
- break;
- }
- if (timeout)
- {
- FAPI_ERR("Timed out polling for PLL lock");
- const uint8_t LOCK_STATUS = data.getByte(0);
- const fapi::Target & CHIP_IN_ERROR = i_target;
- if (i_chiplet_base_scom_addr == NEST_CHIPLET_0x02000000)
- {
- FAPI_SET_HWP_ERROR(rc, RC_PROC_A_X_PCI_DMI_PLL_SETUP_DMI_PLL_NO_LOCK);
- }
- else if (i_chiplet_base_scom_addr == A_BUS_CHIPLET_0x08000000)
- {
- FAPI_SET_HWP_ERROR(rc, RC_PROC_A_X_PCI_DMI_PLL_SETUP_ABUS_PLL_NO_LOCK);
- }
- else if (i_chiplet_base_scom_addr == PCIE_CHIPLET_0x09000000)
- {
- FAPI_SET_HWP_ERROR(rc, RC_PROC_A_X_PCI_DMI_PLL_SETUP_PCIE_PLL_NO_LOCK);
- }
- break;
- }
- else
- {
- FAPI_DBG("PLL is locked.");
- }
- }
- } while(0);
-
- // mark function entry
- FAPI_DBG("End");
- return rc;
-}
-
-
-} // extern "C"
OpenPOWER on IntegriCloud