summaryrefslogtreecommitdiffstats
path: root/src/usr/hwpf/hwp/nest_chiplets
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/hwpf/hwp/nest_chiplets')
-rw-r--r--src/usr/hwpf/hwp/nest_chiplets/makefile61
-rw-r--r--src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_initf.C422
-rw-r--r--src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_initf.H87
-rw-r--r--src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_setup.C383
-rw-r--r--src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_setup.H94
-rw-r--r--src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_utils.C1432
-rw-r--r--src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_utils.H136
-rw-r--r--src/usr/hwpf/hwp/nest_chiplets/proc_pcie_slot_power/proc_pcie_slot_power.C685
-rw-r--r--src/usr/hwpf/hwp/nest_chiplets/proc_pcie_slot_power/proc_pcie_slot_power.H90
-rw-r--r--src/usr/hwpf/hwp/nest_chiplets/proc_start_clocks_chiplets/proc_start_clocks_chiplets.C890
-rw-r--r--src/usr/hwpf/hwp/nest_chiplets/proc_start_clocks_chiplets/proc_start_clocks_chiplets.H115
11 files changed, 0 insertions, 4395 deletions
diff --git a/src/usr/hwpf/hwp/nest_chiplets/makefile b/src/usr/hwpf/hwp/nest_chiplets/makefile
deleted file mode 100644
index c300c808e..000000000
--- a/src/usr/hwpf/hwp/nest_chiplets/makefile
+++ /dev/null
@@ -1,61 +0,0 @@
-# IBM_PROLOG_BEGIN_TAG
-# This is an automatically generated prolog.
-#
-# $Source: src/usr/hwpf/hwp/nest_chiplets/makefile $
-#
-# OpenPOWER HostBoot Project
-#
-# Contributors Listed Below - COPYRIGHT 2012,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
-ROOTPATH = ../../../../..
-
-MODULE = nest_chiplets
-
-## support for Targeting and fapi
-EXTRAINCDIR += ${ROOTPATH}/src/include/usr/ecmddatabuffer
-EXTRAINCDIR += ${ROOTPATH}/src/include/usr/hwpf/fapi
-EXTRAINCDIR += ${ROOTPATH}/src/include/usr/hwpf/plat
-EXTRAINCDIR += ${ROOTPATH}/src/include/usr/hwpf/hwp
-
-## pointer to common HWP files
-EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/include
-
-## Include sub dirs
-## NOTE: add a new EXTRAINCDIR when you add a new HWP
-EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/nest_chiplets
-EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/nest_chiplets/proc_start_clocks_chiplets
-EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup
-EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/slave_sbe/proc_cen_ref_clk_enable
-EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/nest_chiplets/proc_pcie_slot_power
-EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/secure_boot
-
-## NOTE: add new object files when you add a new HWP
-OBJS += proc_start_clocks_chiplets.o
-OBJS += proc_a_x_pci_dmi_pll_initf.o
-OBJS += proc_a_x_pci_dmi_pll_setup.o
-OBJS += proc_a_x_pci_dmi_pll_utils.o
-OBJS += proc_pcie_slot_power.o
-
-
-## NOTE: add a new directory onto the vpaths when you add a new HWP
-VPATH += ${ROOTPATH}/src/usr/hwpf/hwp/nest_chiplets/proc_start_clocks_chiplets
-VPATH += ${ROOTPATH}/src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup
-VPATH += ${ROOTPATH}/src/usr/hwpf/hwp/nest_chiplets/proc_pcie_slot_power
-
-include ${ROOTPATH}/config.mk
-
diff --git a/src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_initf.C b/src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_initf.C
deleted file mode 100644
index b58d55429..000000000
--- a/src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_initf.C
+++ /dev/null
@@ -1,422 +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_initf.C $ */
-/* */
-/* OpenPOWER HostBoot Project */
-/* */
-/* Contributors Listed Below - COPYRIGHT 2012,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_initf.C,v 1.20 2015/05/14 21:03:40 jmcgill Exp $
-// $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/p8/working/procedures/ipl/fapi/proc_a_x_pci_dmi_pll_initf.C,v $
-//------------------------------------------------------------------------------
-// *|
-// *! (C) Copyright International Business Machines Corp. 2012
-// *! All Rights Reserved -- Property of IBM
-// *! *** ***
-// *|
-// *! TITLE : proc_a_x_pci_dmi_pll_initf.C
-// *! DESCRIPTION : Scan PLL settings for A/X/PCI/DMI PLLs
-// *!
-// *! OWNER NAME : Ralph Koester Email: rkoester@de.ibm.com
-// *!
-// *! The purpose of this procedure is to scan in runtime PLL settings
-// *! for the X/A/PCIE/DMI PLLs
-// *!
-// *! - prerequisite is that the PLLs are in bypass mode
-// *! - setup the PLLs by a ring load of PLL config bits
-// *!
-//------------------------------------------------------------------------------
-
-
-//------------------------------------------------------------------------------
-// Includes
-//------------------------------------------------------------------------------
-#include <p8_scom_addresses.H>
-#include <proc_a_x_pci_dmi_pll_initf.H>
-#include <proc_a_x_pci_dmi_pll_utils.H>
-
-
-//------------------------------------------------------------------------------
-// Constant definitons
-//------------------------------------------------------------------------------
-const uint32_t DMI_PLL_VCO_WORKAROUND_THRESHOLD_FREQ = 4800;
-
-
-//------------------------------------------------------------------------------
-// Function definition
-//------------------------------------------------------------------------------
-
-extern "C"
-{
-
-
-//------------------------------------------------------------------------------
-// function:
-// Scan PLL settings for A/X/PCI/DMI PLLs
-//
-// parameters: i_target => chip target
-// i_startX => True to start X BUS PLL, else false
-// i_startA => True to start A BUS PLL, else false
-// i_startPCIE => True to start PCIE PLL, else false
-// i_startDMI => True to start DMI PLL, else false
-// returns: FAPI_RC_SUCCESS if operation was successful, else error
-//------------------------------------------------------------------------------
-fapi::ReturnCode proc_a_x_pci_dmi_pll_initf(
- const fapi::Target & i_target,
- const bool i_startX,
- const bool i_startA,
- const bool i_startPCIE,
- const bool i_startDMI)
-{
- // attribute data
- uint8_t pcie_enable_attr;
- uint8_t abus_enable_attr;
- uint8_t is_simulation;
- uint8_t lctank_pll_vco_workaround = 0;
-
- // return codes
- fapi::ReturnCode rc;
-
- // mark function entry
- FAPI_INF("\n Parameter1, start_XBUS=%s\n Parameter2, start_ABUS=%s\n Parameter3, start_PCIE=%s\n Parameter4, start_DMI=%s \n" ,
- i_startX ? "true":"false",
- i_startA ? "true":"false",
- i_startPCIE ? "true":"false",
- i_startDMI ? "true":"false");
- do
- {
- //------------//
- // Workaround //
- //------------//
- rc = FAPI_ATTR_GET(ATTR_IS_SIMULATION,
- NULL,
- is_simulation);
- if (!rc.ok())
- {
- FAPI_ERR("Error querying ATTR_IS_SIMULATION");
- break;
- }
-
- if (!is_simulation)
- {
- rc = FAPI_ATTR_GET(ATTR_CHIP_EC_FEATURE_LCTANK_PLL_VCO_BUG,
- &i_target,
- lctank_pll_vco_workaround);
- if (!rc.ok())
- {
- FAPI_ERR("Error querying Chip EC feature: ATTR_CHIP_EC_FEATURE_LCTANK_PLL_VCO_BUG");
- break;
- }
- }
-
- FAPI_DBG("lctank PLL VCO bug circumvention is %s",
- (lctank_pll_vco_workaround ? "enabled" : "disabled"));
-
-
- //------------//
- // X Bus PLL //
- //------------//
- if (!i_startX)
- {
- FAPI_DBG("X BUS PLL not selected for setup in this routine.");
- }
- else
- {
- FAPI_INF("This routine does not do X-BUS PLL setup at this time!.");
- FAPI_INF("It is assumed that the X-BUS PLL is already set up in synchronous mode for use with the NEST logic.");
- }
- // end X-bus PLL setup
-
-
- //------------//
- // A Bus PLL //
- //------------//
-
- // query ABUS partial good attribute
- rc = FAPI_ATTR_GET(ATTR_PROC_A_ENABLE,
- &i_target,
- abus_enable_attr);
- if (!rc.ok())
- {
- FAPI_ERR("Error querying ATTR_PROC_A_ENABLE");
- break;
- }
-
- if (!i_startA)
- {
- FAPI_DBG("A BUS PLL not selected for setup in this routine.");
- }
- else if (abus_enable_attr != fapi::ENUM_ATTR_PROC_A_ENABLE_ENABLE)
- {
- FAPI_DBG("A BUS PLL setup skipped (partial good).");
- }
- else
- {
- // apply workaround for A PLL for all frequencies
- bool a_lctank_pll_vco_workaround = (lctank_pll_vco_workaround != 0);
- FAPI_DBG("A-Bus PLL VCO bug circumvention is %s",
- (a_lctank_pll_vco_workaround ? "enabled" : "disabled"));
-
- // establish base ring state
- rc = proc_a_x_pci_dmi_pll_scan_bndy(i_target,
- RING_ADDRESS_PROC_AB_BNDY_PLL,
- RING_OP_BASE,
- RING_BUS_ID_0,
- false);
- if (!rc.ok())
- {
- FAPI_ERR("Error from proc_a_x_pci_dmi_pll_scan_bndy");
- break;
- }
-
- if (a_lctank_pll_vco_workaround)
- {
- rc = proc_a_x_pci_dmi_pll_scan_bndy(i_target,
- RING_ADDRESS_PROC_AB_BNDY_PLL,
- RING_OP_MOD_VCO_S1,
- RING_BUS_ID_0,
- false);
- if (!rc.ok())
- {
- FAPI_ERR("Error from proc_a_x_pci_dmi_pll_scan_bndy");
- break;
- }
-
- // release PLL (skip lock check) & re-scan
- rc = proc_a_x_pci_dmi_pll_release_pll(i_target,
- A_BUS_CHIPLET_0x08000000,
- false);
- if (!rc.ok())
- {
- FAPI_ERR("Error from proc_a_x_pci_dmi_pll_release_pll");
- break;
- }
-
- rc = proc_a_x_pci_dmi_pll_scan_bndy(i_target,
- RING_ADDRESS_PROC_AB_BNDY_PLL,
- RING_OP_MOD_VCO_S2,
- RING_BUS_ID_0,
- false);
- if (!rc.ok())
- {
- FAPI_ERR("Error from proc_a_x_pci_dmi_pll_scan_bndy");
- break;
- }
- }
- FAPI_INF("Done setting up A-Bus PLL. ");
- } // end A PLL
-
-
- //----------//
- // DMI PLL //
- //----------//
- if (!i_startDMI)
- {
- FAPI_DBG("DMI PLL not selected for setup in this routine.");
- }
- else
- {
- // only apply DMI workaround if needed when frequency < 4800 MHz,
- bool dmi_lctank_pll_vco_workaround = (lctank_pll_vco_workaround != 0);
- uint32_t dmi_freq;
- if (dmi_lctank_pll_vco_workaround)
- {
- // frequency reported via X attribute should be equivalent to DMI freq
- // given that we are running NEST off of X-bus PLL (NEST=X/2) and
- // DMI=NEST*2
- rc = FAPI_ATTR_GET(ATTR_FREQ_X, NULL, dmi_freq);
- if (!rc.ok())
- {
- FAPI_ERR("Failed to get attribute: ATTR_FREQ_X");
- break;
- }
-
- if (dmi_freq >= DMI_PLL_VCO_WORKAROUND_THRESHOLD_FREQ)
- {
- dmi_lctank_pll_vco_workaround = false;
- }
- }
- FAPI_DBG("DMI PLL VCO bug circumvention is %s",
- (dmi_lctank_pll_vco_workaround ? "enabled" : "disabled"));
-
- // establish base ring state
- rc = proc_a_x_pci_dmi_pll_scan_bndy(i_target,
- RING_ADDRESS_PROC_PB_BNDY_DMIPLL,
- RING_OP_BASE,
- RING_BUS_ID_0,
- true);
- if (!rc.ok())
- {
- FAPI_ERR("Error from proc_a_x_pci_dmi_pll_scan_bndy");
- break;
- }
-
- if (dmi_lctank_pll_vco_workaround)
- {
- rc = proc_a_x_pci_dmi_pll_scan_bndy(i_target,
- RING_ADDRESS_PROC_PB_BNDY_DMIPLL,
- RING_OP_MOD_VCO_S1,
- RING_BUS_ID_0,
- true);
- if (!rc.ok())
- {
- FAPI_ERR("Error from proc_a_x_pci_dmi_pll_scan_bndy");
- break;
- }
-
- // release PLL (skip lock check) & re-scan
- rc = proc_a_x_pci_dmi_pll_release_pll(i_target,
- NEST_CHIPLET_0x02000000,
- false);
- if (!rc.ok())
- {
- FAPI_ERR("Error from proc_a_x_pci_dmi_pll_release_pll");
- break;
- }
-
- rc = proc_a_x_pci_dmi_pll_scan_bndy(i_target,
- RING_ADDRESS_PROC_PB_BNDY_DMIPLL,
- RING_OP_MOD_VCO_S2,
- RING_BUS_ID_0,
- true);
- if (!rc.ok())
- {
- FAPI_ERR("Error from proc_a_x_pci_dmi_pll_scan_bndy");
- break;
- }
- }
-
- FAPI_INF("Done setting up DMI PLL. ");
- } // end DMI PLL
-
-
- //-----------//
- // PCIE PLL //
- //-----------//
-
- // query PCIE partial good attribute
- rc = FAPI_ATTR_GET(ATTR_PROC_PCIE_ENABLE,
- &i_target,
- pcie_enable_attr);
- if (!rc.ok())
- {
- FAPI_ERR("Error querying ATTR_PROC_PCIE_ENABLE");
- break;
- }
-
- if (!i_startPCIE)
- {
- FAPI_DBG("PCIE PLL not selected for setup in this routine.");
- }
- else if (pcie_enable_attr != fapi::ENUM_ATTR_PROC_PCIE_ENABLE_ENABLE)
- {
- FAPI_DBG("PCIE PLL setup skipped (partial good).");
- }
- else
- {
- // establish base ring state
- rc = proc_a_x_pci_dmi_pll_scan_bndy(i_target,
- RING_ADDRESS_PROC_PCI_BNDY_PLL,
- RING_OP_BASE,
- RING_BUS_ID_0,
- false);
- if (!rc.ok())
- {
- FAPI_ERR("Error from proc_a_x_pci_dmi_pll_scan_bndy");
- break;
- }
-
- FAPI_INF("Done setting up PCIE PLL.");
- } // end PCIE PLL
-
- } while (0); // end do
-
- // mark function exit
- FAPI_INF("Exit");
- return rc;
-} // end FAPI procedure proc_a_x_pci_dmi_pll_initf
-
-
-} // extern "C"
-
-/*
-*************** Do not edit this area ***************
-This section is automatically updated by CVS when you check in this file.
-Be sure to create CVS comments when you commit so that they can be included here.
-$Log: proc_a_x_pci_dmi_pll_initf.C,v $
-Revision 1.20 2015/05/14 21:03:40 jmcgill
-Update to use modified proc_a_x_pci_dmi_pll_utils API
-
-Revision 1.19 2014/12/02 00:17:23 szhong
-remove hardcoded bndy pll length in code
-
-Revision 1.18 2014/11/13 20:17:22 szhong
-adjust pb_bndy_dmi_pll length to 240
-
-Revision 1.17 2014/11/11 22:10:35 szhong
-increased attribute data length to support Naples
-
-Revision 1.16 2014/01/07 14:43:23 mfred
-Checking in updates from Andrea Ma: Include statements fixed and one fapi dbg statement changed.
-
-Revision 1.15 2013/09/30 16:09:56 jmcgill
-fix HW268965
-
-Revision 1.14 2013/04/29 16:38:51 jmcgill
-add constants for Murano DD1 ccalload/ccalfmin ring offsets used in workaround
-
-Revision 1.13 2013/04/18 17:33:35 jmcgill
-qualify workaround for DMI bus based on frequency
-
-Revision 1.12 2013/04/17 22:38:38 jmcgill
-implement A/DMI PLL workaround for SW194943, reorganize code to use common subroutines for PLL scan/setup
-
-Revision 1.11 2013/01/24 16:34:45 jmcgill
-fix comment as well...
-
-Revision 1.10 2013/01/24 16:33:40 jmcgill
-adjust for DMI attribute change
-
-Revision 1.9 2013/01/20 19:21:03 jmcgill
-update for A chiplet partial good support
-
-Revision 1.8 2013/01/10 14:42:53 jmcgill
-add partial good support
-
-Revision 1.6 2012/12/07 17:09:39 mfred
-fix to add DMI PLL settings for MC1 for Venice.
-
-Revision 1.5 2012/12/06 22:59:18 mfred
-adjust DMI PLL settings based on chip type.
-
-Revision 1.4 2012/08/27 15:29:03 mfred
-Fixed some findings from the latest FW code review.
-
-Revision 1.3 2012/08/20 16:00:09 jmcgill
-adjust ring offsets for 39 model
-
-Revision 1.2 2012/08/14 18:32:42 mfred
-Changed input parms from bool & to const bool.
-
-Revision 1.1 2012/08/14 14:18:02 mfred
-Separating proc_a_x_pci_dmi_pll_setup into two hwp. And update code to use real scanning instead of sim cheats.
-
-
-*/
-
diff --git a/src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_initf.H b/src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_initf.H
deleted file mode 100644
index c7f14c671..000000000
--- a/src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_initf.H
+++ /dev/null
@@ -1,87 +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_initf.H $ */
-/* */
-/* OpenPOWER HostBoot Project */
-/* */
-/* Contributors Listed Below - COPYRIGHT 2012,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_initf.H,v 1.5 2015/05/14 21:03:42 jmcgill Exp $
-// $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/p8/working/procedures/ipl/fapi/proc_a_x_pci_dmi_pll_initf.H,v $
-//------------------------------------------------------------------------------
-// *|
-// *! (C) Copyright International Business Machines Corp. 2012
-// *! All Rights Reserved -- Property of IBM
-// *! *** ***
-// *|
-// *! TITLE : proc_a_x_pci_dmi_pll_initf.H
-// *! DESCRIPTION : Scan PLL settings for A/X/PCI/DMI PLLs
-// *!
-// *! OWNER NAME : Ralph Koester Email: rkoester@de.ibm.com
-// *!
-//------------------------------------------------------------------------------
-
-#ifndef _PROC_A_X_PCI_DMI_PLL_INITF_H_
-#define _PROC_A_X_PCI_DMI_PLL_INITF_H_
-
-
-//------------------------------------------------------------------------------
-// Includes
-//------------------------------------------------------------------------------
-#include <fapi.H>
-
-
-//------------------------------------------------------------------------------
-// Structure definitions
-//------------------------------------------------------------------------------
-
-// function pointer typedef definition for HWP call support
-typedef fapi::ReturnCode (*proc_a_x_pci_dmi_pll_initf_FP_t)(const fapi::Target &,
- const bool,
- const bool,
- const bool,
- const bool);
-
-//------------------------------------------------------------------------------
-// Function prototypes
-//------------------------------------------------------------------------------
-
-extern "C"
-{
-
-/**
- * @brief Scan PLL settings for A/X/PCI/DMI PLLs
- *
- * @param[in] i_target Reference to target
- * @param[in] i_startX True if X PLL should be initalized, else false
- * @param[in] i_startA True if A PLL should be initalized, else false
- * @param[in] i_startPCIE True if PCIE PLL should be initalized, else false
- * @param[in] i_startDMI True if DMI PLL should be initalized, else false
- *
- * @return ReturnCode
- */
-fapi::ReturnCode proc_a_x_pci_dmi_pll_initf(const fapi::Target & i_target,
- const bool i_startX,
- const bool i_startA,
- const bool i_startPCIE,
- const bool i_startDMI);
-
-} // extern "C"
-
-#endif // _PROC_A_X_PCI_DMI_PLL_INITF_H_
diff --git a/src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_setup.C b/src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_setup.C
deleted file mode 100644
index 004ed3b44..000000000
--- a/src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_setup.C
+++ /dev/null
@@ -1,383 +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_setup.C $ */
-/* */
-/* OpenPOWER HostBoot Project */
-/* */
-/* Contributors Listed Below - COPYRIGHT 2012,2014 */
-/* [+] 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_setup.C,v 1.16 2014/08/27 14:53:40 jmcgill Exp $
-// $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/p8/working/procedures/ipl/fapi/proc_a_x_pci_dmi_pll_setup.C,v $
-//------------------------------------------------------------------------------
-// *|
-// *! (C) Copyright International Business Machines Corp. 2012
-// *! All Rights Reserved -- Property of IBM
-// *! *** ***
-// *|
-// *! TITLE : proc_a_x_pci_dmi_pll_setup.C
-// *! DESCRIPTION : Initialize and lock A/X/PCI/DMI PLLs
-// *!
-// *! OWNER NAME : Ralph Koester Email: rkoester@de.ibm.com
-// *!
-// *! The purpose of this procedure is to initialize (remove from reset/bypass)
-// *! and lock the X/A/PCIE/DMI PLLs
-// *!
-//------------------------------------------------------------------------------
-
-
-//------------------------------------------------------------------------------
-// Includes
-//------------------------------------------------------------------------------
-#include <p8_scom_addresses.H>
-#include <proc_a_x_pci_dmi_pll_setup.H>
-#include <proc_a_x_pci_dmi_pll_utils.H>
-
-
-
-//------------------------------------------------------------------------------
-// Constant definitions
-//------------------------------------------------------------------------------
-
-const uint64_t GENERIC_PCB_CONFIG_0x000F001E = 0x000F001EULL;
-
-
-//------------------------------------------------------------------------------
-// Function definition
-//------------------------------------------------------------------------------
-
-extern "C"
-{
-
-//------------------------------------------------------------------------------
-// function:
-// Clear and unmask chiplet PLL lock indication
-//
-// parameters: i_target => chip target
-// i_chiplet_base_scom_addr => aligned base address of chiplet SCOM
-// address space
-// returns: FAPI_RC_SUCCESS if operation was successful, else error
-//------------------------------------------------------------------------------
-fapi::ReturnCode proc_a_x_pci_dmi_pll_setup_unmask_lock(const fapi::Target & i_target,
- const uint32_t i_chiplet_base_scom_addr)
-{
- // return codes
- fapi::ReturnCode rc;
- uint32_t rc_ecmd = 0;
-
- // data buffer to hold register values
- ecmdDataBufferBase data(64);
-
- do
- {
- rc = fapiGetScom(i_target,
- i_chiplet_base_scom_addr | GENERIC_PCB_ERR_0x000F001F,
- data);
- if (!rc.ok())
- {
- FAPI_ERR("Error reading PCB Slave PLL Lock Indication");
- break;
- }
-
- rc_ecmd |= data.setBit(25); // set bit to clear previous lock errors
- rc_ecmd |= data.setBit(26); // set bit to clear previous lock errors
- rc_ecmd |= data.setBit(27); // set bit to clear previous lock errors
- rc_ecmd |= data.setBit(28); // set bit to clear previous lock errors
-
- if (rc_ecmd)
- {
- FAPI_ERR("Error (0x%x) setting up PLL Lock Indication ecmdDataBufferBase", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
-
- FAPI_INF("Clearing PCB Slave Lock Indication Bit 25,26,27,28");
- rc = fapiPutScom(i_target,
- i_chiplet_base_scom_addr | GENERIC_PCB_ERR_0x000F001F,
- data);
- if (!rc.ok())
- {
- FAPI_ERR("Error writing PCB Slave PLL Lock Indication");
- break;
- }
-
- rc = fapiGetScom(i_target,
- i_chiplet_base_scom_addr | GENERIC_PCB_CONFIG_0x000F001E,
- data);
- if (!rc.ok())
- {
- FAPI_ERR("Error reading PCB Slave PLL Lock Mask");
- break;
- }
-
- rc_ecmd |= data.clearBit(12); // set bit to clear PLL Lock Mask
-
- if (rc_ecmd)
- {
- FAPI_ERR("Error (0x%x) setting up PLL Lock Mask ecmdDataBufferBase", rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
-
- FAPI_INF("Clearing PCB Slave Lock Mask Bit 12");
- rc = fapiPutScom(i_target,
- i_chiplet_base_scom_addr | GENERIC_PCB_CONFIG_0x000F001E,
- data);
- if (!rc.ok())
- {
- FAPI_ERR("Error writing PCB Slave Lock Mask");
- break;
- }
- } while(0);
-
- return rc;
-}
-
-
-//------------------------------------------------------------------------------
-// function:
-// Initialize and lock A/X/PCI/DMI PLLs
-//
-// parameters: i_target => chip target
-// i_startX => True to start X BUS PLL, else false
-// i_startA => True to start A BUS PLL, else false
-// i_startPCIE => True to start PCIE PLL, else false
-// i_startDMI => True to start DMI PLL, else false
-// returns: FAPI_RC_SUCCESS if operation was successful, else error
-//------------------------------------------------------------------------------
- fapi::ReturnCode proc_a_x_pci_dmi_pll_setup(const fapi::Target & i_target,
- const bool i_startX,
- const bool i_startA,
- const bool i_startPCIE,
- const bool i_startDMI)
- {
- // data buffer to hold register values
- ecmdDataBufferBase gp_data(64);
- ecmdDataBufferBase scom_data(64);
-
-
- // return codes
- fapi::ReturnCode rc;
-
- // locals
- uint8_t pcie_enable_attr;
- uint8_t abus_enable_attr;
-
- // mark function entry
- FAPI_INF("Entry1, start_XBUS=%s\n, Entry2, start_ABUS=%s\n, Entry3, start_PCIE=%s\n, Entry4, start_DMI=%s \n" ,
- i_startX? "true":"false",
- i_startA? "true":"false",
- i_startPCIE? "true":"false",
- i_startDMI? "true":"false");
-
- do
- {
- //------------//
- // X Bus PLL //
- //------------//
- if (!i_startX)
- {
- FAPI_DBG("X BUS PLL not selected for setup in this routine.");
- }
- else
- {
- FAPI_INF("This routine does not do X-BUS PLL setup at this time!.");
- FAPI_INF("It is assumed that the X-BUS PLL is already set up in synchronous mode for use with the NEST logic.");
-
- rc = proc_a_x_pci_dmi_pll_setup_unmask_lock(
- i_target,
- TP_CHIPLET_0x01000000);
- if (!rc.ok())
- {
- FAPI_ERR("Error from proc_a_x_pci_dmi_pll_setup_unmask_lock");
- break;
- }
- }
- // end X-bus PLL setup
-
-
-
- //------------//
- // A Bus PLL //
- //------------//
-
- // query ABUS partial good attribute
- rc = FAPI_ATTR_GET(ATTR_PROC_A_ENABLE,
- &i_target,
- abus_enable_attr);
- if (!rc.ok())
- {
- FAPI_ERR("Error querying ATTR_PROC_A_ENABLE");
- break;
- }
-
- if (!i_startA)
- {
- FAPI_DBG("A BUS PLL not selected for setup in this routine.");
- }
- else if (abus_enable_attr != fapi::ENUM_ATTR_PROC_A_ENABLE_ENABLE)
- {
- FAPI_DBG("A BUS PLL setup skipped (partial good).");
- }
- else
- {
- FAPI_DBG("Starting PLL setup for A BUS PLL ...");
- rc = proc_a_x_pci_dmi_pll_release_pll(
- i_target,
- A_BUS_CHIPLET_0x08000000,
- true);
- if (!rc.ok())
- {
- FAPI_ERR("Error from proc_a_x_pci_dmi_pll_release_pll");
- break;
- }
-
- rc = proc_a_x_pci_dmi_pll_setup_unmask_lock(
- i_target,
- A_BUS_CHIPLET_0x08000000);
- if (!rc.ok())
- {
- FAPI_ERR("Error from proc_a_x_pci_dmi_pll_setup_unmask_lock");
- break;
- }
-
- FAPI_INF("Done setting up A-Bus PLL. ");
- } // end A PLL
-
-
- //----------//
- // DMI PLL //
- //----------//
- if (!i_startDMI)
- {
- FAPI_DBG("DMI PLL not selected for setup in this routine.");
- }
- else
- {
- FAPI_DBG("Starting PLL setup for DMI PLL ...");
- rc = proc_a_x_pci_dmi_pll_release_pll(
- i_target,
- NEST_CHIPLET_0x02000000,
- true);
- if (!rc.ok())
- {
- FAPI_ERR("Error from proc_a_x_pci_dmi_pll_release_pll");
- break;
- }
- rc = proc_a_x_pci_dmi_pll_setup_unmask_lock(
- i_target,
- NEST_CHIPLET_0x02000000);
- if (!rc.ok())
- {
- FAPI_ERR("Error from proc_a_x_pci_dmi_pll_setup_unmask_lock");
- break;
- }
-
- FAPI_INF("Done setting up DMI PLL. ");
- } // end DMI PLL
-
-
- //-----------//
- // PCIE PLL //
- //-----------//
-
- // query PCIE partial good attribute
- rc = FAPI_ATTR_GET(ATTR_PROC_PCIE_ENABLE,
- &i_target,
- pcie_enable_attr);
- if (!rc.ok())
- {
- FAPI_ERR("Error querying ATTR_PROC_PCIE_ENABLE");
- break;
- }
-
- if (!i_startPCIE)
- {
- FAPI_DBG("PCIE PLL not selected for setup in this routine.");
- }
- else if (pcie_enable_attr != fapi::ENUM_ATTR_PROC_PCIE_ENABLE_ENABLE)
- {
- FAPI_DBG("PCIE PLL setup skipped (partial good).");
- }
- else
- {
- FAPI_DBG("Starting PLL setup for PCIE PLL ...");
- rc = proc_a_x_pci_dmi_pll_release_pll(
- i_target,
- PCIE_CHIPLET_0x09000000,
- true);
- if (!rc.ok())
- {
- FAPI_ERR("Error from proc_a_x_pci_dmi_pll_release_pll");
- break;
- }
-
- FAPI_INF("Done setting up PCIE PLL. ");
-
- } // end PCIE PLL
-
- } while (0); // end do
-
- // mark function exit
- FAPI_INF("Exit");
- return rc;
- } // end FAPI procedure proc_a_x_pci_dmi_pll_setup
-
-} // extern "C"
-
-/*
-*************** Do not edit this area ***************
-This section is automatically updated by CVS when you check in this file.
-Be sure to create CVS comments when you commit so that they can be included here.
-$Log: proc_a_x_pci_dmi_pll_setup.C,v $
-Revision 1.16 2014/08/27 14:53:40 jmcgill
-shift PCI PLL unlock reporting from istep 7 -> 14 (SW273877)
-
-Revision 1.15 2014/04/02 14:02:33 jmcgill
-respect function input parameters/partial good in unlock error clear/unmask logic (SW252901)
-
-Revision 1.14 2014/03/28 15:25:39 bgeukes
-updates for SW252901 after RAS review
-
-Revision 1.13 2014/03/27 17:58:08 bgeukes
-fix for the scominit updates
-
-Revision 1.12 2014/01/07 14:43:34 mfred
-Checking in updates from Andrea Ma: Include statements fixed and one fapi dbg statement changed.
-
-Revision 1.11 2013/04/17 22:38:42 jmcgill
-implement A/DMI PLL workaround for SW194943, reorganize code to use common subroutines for PLL scan/setup
-
-Revision 1.10 2013/01/25 19:30:22 mfred
-Release PLLs from bypass before checking for PLL lock. Also, check for two lock bits on DMI PLL to support Venice.
-
-Revision 1.9 2013/01/20 19:22:44 jmcgill
-update for A chiplet partial good support
-
-Revision 1.8 2013/01/10 14:40:13 jmcgill
-add partial good support
-
-Revision 1.7 2012/08/14 18:32:45 mfred
-Changed input parms from bool & to const bool.
-
-Revision 1.6 2012/08/14 14:18:06 mfred
-Separating proc_a_x_pci_dmi_pll_setup into two hwp. And update code to use real scanning instead of sim cheats.
-
-
-*/
-
diff --git a/src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_setup.H b/src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_setup.H
deleted file mode 100644
index ce3df4d2e..000000000
--- a/src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_setup.H
+++ /dev/null
@@ -1,94 +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_setup.H $ */
-/* */
-/* OpenPOWER HostBoot Project */
-/* */
-/* Contributors Listed Below - COPYRIGHT 2012,2014 */
-/* [+] 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_setup.H,v 1.8 2014/08/27 14:53:48 jmcgill Exp $
-// $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/p8/working/procedures/ipl/fapi/proc_a_x_pci_dmi_pll_setup.H,v $
-//------------------------------------------------------------------------------
-// *|
-// *! (C) Copyright International Business Machines Corp. 2012
-// *! All Rights Reserved -- Property of IBM
-// *! *** ***
-// *|
-// *! TITLE : proc_a_x_pci_dmi_pll_setup.H
-// *! DESCRIPTION : Initialize and lock A/X/PCI/DMI PLLs
-// *!
-// *! OWNER NAME : Ralph Koester Email: rkoester@de.ibm.com
-// *!
-//------------------------------------------------------------------------------
-
-#ifndef _PROC_A_X_PCI_DMI_PLL_SETUP_H_
-#define _PROC_A_X_PCI_DMI_PLL_SETUP_H_
-
-//------------------------------------------------------------------------------
-// Includes
-//------------------------------------------------------------------------------
-
-#include <fapi.H>
-
-
-//------------------------------------------------------------------------------
-// Structure definitions
-//------------------------------------------------------------------------------
-
-// function pointer typedef definition for HWP call support
-typedef fapi::ReturnCode (*proc_a_x_pci_dmi_pll_setup_FP_t)(const fapi::Target &,
- const bool, const bool, const bool, const bool);
-
-//------------------------------------------------------------------------------
-// Function prototypes
-//------------------------------------------------------------------------------
-
-extern "C"
-{
-
-/*
- * @brief Clear and unmask chiplet PLL lock indication
- * @param[in] i_target Reference to target
- * @param[in] i_chiplet_base_scom_addr Aligned base address of chiplet SCOM
- * address space
- * @return ReturnCode
- */
- fapi::ReturnCode proc_a_x_pci_dmi_pll_setup_unmask_lock(const fapi::Target & i_target,
- const uint32_t i_chiplet_base_scom_addr);
-
-/**
- * @brief Initialize and lock A/X/PCI/DMI PLLs
- *
- * @param[in] i_target Reference to target
- * @param[in] i_startX True if x_bus PLL should be started, else false
- * @param[in] i_startA True if A PLL should be started, else false
- * @param[in] i_startPCIE True if PCIE PLL should be started, else false
- * @param[in] i_startDMI True if DMI PLL should be started, else false
- *
- * @return ReturnCode
- */
- fapi::ReturnCode proc_a_x_pci_dmi_pll_setup(const fapi::Target & i_target,
- const bool i_startX,
- const bool i_startA,
- const bool i_startPCIE,
- const bool i_startDMI);
-
-} // extern "C"
-
-#endif // _PROC_A_X_PCI_DMI_PLL_SETUP_H_
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"
diff --git a/src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_utils.H b/src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_utils.H
deleted file mode 100644
index c1a16c4de..000000000
--- a/src/usr/hwpf/hwp/nest_chiplets/proc_a_x_pci_dmi_pll_setup/proc_a_x_pci_dmi_pll_utils.H
+++ /dev/null
@@ -1,136 +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.H $ */
-/* */
-/* 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.H,v 1.4 2015/05/14 21:18:32 jmcgill Exp $
-// $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/p8/working/procedures/ipl/fapi/proc_a_x_pci_dmi_pll_utils.H,v $
-//------------------------------------------------------------------------------
-// *|
-// *! (C) Copyright International Business Machines Corp. 2015
-// *! All Rights Reserved -- Property of IBM
-// *! *** ***
-// *|
-// *! TITLE : proc_a_x_pci_dmi_pll_utils.H
-// *! DESCRIPTION : PLL configuration utility functions
-// *!
-// *! OWNER NAME : Joe McGill Email: jmcgill@us.ibm.com
-// *!
-//------------------------------------------------------------------------------
-
-#ifndef _PROC_A_X_PCI_DMI_PLL_UTILS_H_
-#define _PROC_A_X_PCI_DMI_PLL_UTILS_H_
-
-//------------------------------------------------------------------------------
-// Includes
-//------------------------------------------------------------------------------
-#include <fapi.H>
-
-
-//------------------------------------------------------------------------------
-// Constant definitions
-//------------------------------------------------------------------------------
-enum p8_pll_utils_ring_address
-{
- RING_ADDRESS_MEMB_TP_BNDY_PLL = 0x01030088,
- RING_ADDRESS_PROC_AB_BNDY_PLL = 0x08030088,
- RING_ADDRESS_PROC_PCI_BNDY_PLL = 0x09030088,
- RING_ADDRESS_PROC_PB_BNDY_DMIPLL = 0x02030088
-};
-
-enum p8_pll_utils_ring_id
-{
- RING_ID_ABUS = 1,
- RING_ID_PCI = 2,
- RING_ID_DMI = 3
-};
-
-enum p8_pll_utils_ring_op
-{
- RING_OP_BASE = 0,
- RING_OP_MOD_VCO_S1 = 1,
- RING_OP_MOD_VCO_S2 = 2,
- RING_OP_MOD_REFCLK_SEL = 3,
- RING_OP_MOD_PFD360 = 4
-};
-
-enum p8_pll_utils_bus_id
-{
- RING_BUS_ID_0 = 0,
- RING_BUS_ID_1 = 1,
- RING_BUS_ID_2 = 2,
- RING_BUS_ID_3 = 3,
- RING_BUS_ID_4 = 4,
- RING_BUS_ID_5 = 5,
- RING_BUS_ID_6 = 6,
- RING_BUS_ID_7 = 7
-};
-
-
-//------------------------------------------------------------------------------
-// Function prototypes
-//------------------------------------------------------------------------------
-
-extern "C"
-{
-
-//------------------------------------------------------------------------------
-// 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);
-
-
-//------------------------------------------------------------------------------
-// function:
-// Release chiplet 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);
-
-
-} // extern "C"
-
-#endif // _PROC_A_X_PCI_DMI_PLL_UTILS_H_
diff --git a/src/usr/hwpf/hwp/nest_chiplets/proc_pcie_slot_power/proc_pcie_slot_power.C b/src/usr/hwpf/hwp/nest_chiplets/proc_pcie_slot_power/proc_pcie_slot_power.C
deleted file mode 100644
index 92069c833..000000000
--- a/src/usr/hwpf/hwp/nest_chiplets/proc_pcie_slot_power/proc_pcie_slot_power.C
+++ /dev/null
@@ -1,685 +0,0 @@
-/* IBM_PROLOG_BEGIN_TAG */
-/* This is an automatically generated prolog. */
-/* */
-/* $Source: src/usr/hwpf/hwp/activate_powerbus/proc_pcie_slot_power/proc_pcie_slot_power.C $ */
-/* */
-/* OpenPOWER HostBoot Project */
-/* */
-/* Contributors Listed Below - COPYRIGHT 2014 */
-/* [+] 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_pcie_slot_power.C,v 1.3 2014/07/28 21:40:12 ricmata Exp $
-//$Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/p8/working/procedures/ipl/fapi/proc_pcie_slot_power.C,v $
-//------------------------------------------------------------------------------
-// *! (C) Copyright International Business Machines Corp. 2012
-// *! All Rights Reserved -- Property of IBM
-//------------------------------------------------------------------------------
-// *! TITLE : proc_pcie_slot_power.C
-// *! DESCRIPTION : Disable/Enable slot power on hot-plug controlled slots.
-// *!
-// *! OWNER NAME : Rick Mata Email: ricmata@us.ibm.com
-// *! BACKUP NAME : Rick Mata Email: ricmata@us.ibm.com
-// *!
-// *! ADDITIONAL COMMENTS :
-// *!
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-// Version Date Owner Description
-//------------------------------------------------------------------------------
-// 1.0 7/22/14 ricmata Initial release: Brazos support only.
-//------------------------------------------------------------------------------
-
-//------------------------------------------------------------------------------
-// Includes
-//------------------------------------------------------------------------------
-#include "proc_pcie_slot_power.H"
-
-
-extern "C"
-{
-
- //---------------------------//
- // Function protoptypes //
- //---------------------------//
-
- /**
- * @brief Issues i2c write command of 1-Byte length.
- *
- * @param[in] i_target Reference to chip target.
- * @param[in] i_i2c_sel_dev The i2c slave address to the hotplug controller.
- * @param[in] i_i2c_addr The Register offset to load into the FIFO.
- * @param[in] i_i2c_data The Register data to load into the FIFO.
- *
- * @return ReturnCode
- *
- *
- */
- fapi::ReturnCode proc_perv_i2cms_write(const fapi::Target &i_target, const uint8_t i_i2c_sel_dev, const uint8_t i_i2c_addr, const uint8_t i_i2c_data);
-
-
- /**
- * @brief Issues i2c read command of 1-Byte length.
- *
- * @param[in] i_target Reference to chip target.
- * @param[in] i_i2c_sel_dev The i2c slave address to the hotplug controller.
- * @param[in] i_i2c_addr The Register offset to load into the FIFO.
- * @param[in] 0_i2c_data The Register data to read from the FIFO.
- *
- * @return ReturnCode
- *
- *
- */
- fapi::ReturnCode proc_perv_i2cms_read(const fapi::Target &i_target, const uint8_t i_i2c_sel_dev, const uint8_t i_i2c_addr, uint8_t *o_i2c_data);
-
-
- /**
- * @brief Checks P8 I2C Master Status register for command complete and errors.
- *
- * @param[in] i_target Reference to chip target
- *
- * @return ReturnCode
- *
- *
- */
- fapi::ReturnCode check_not_ready_bits(const fapi::Target &i_target);
-
-
- /**
- * @brief Checks P8 I2C Master Status register for the FIFO to be flushed.
- *
- * @param[in] i_target Reference to chip target
- *
- * @return ReturnCode
- *
- *
- */
- fapi::ReturnCode check_fifo_entry_bits(const fapi::Target &i_target);
-
-
-//------------------------------------------------------------------------------
-//
-// Function definitions
-//------------------------------------------------------------------------------
-
-
- //------------------------------------------------------------------------------
- // name: proc_pcie_slot_power
- //------------------------------------------------------------------------------
- // purpose:
- // Enables/Disables slot power to hot-plug controlled pcie slots.
- //
- // parameters:
- // 'i_target' is reference to chip target.
- // 'i_enable_slot_power' TRUE to enable slot power, else FALSE to disable slot power.
- //
- //
- // returns:
- // FAPI_RC_SUCCESS (success)
- //
- // getscom/putscom fapi errors
- // fapi error assigned from eCMD function failure
- //
- // RC_UNKNOWN_PCIE_SLOT_POWER_RC
- // ekb/eclipz/chips/p8/working/procedures/xml/error_info/proc_pcie_slot_power_errors.xml
- //------------------------------------------------------------------------------
- fapi::ReturnCode proc_pcie_slot_power(const fapi::Target &i_target, const bool i_enable_slot_power) {
-
- fapi::ReturnCode rc; //fapi return code value
- ecmdDataBufferBase fsi_data(64);
- //const uint8_t led9551_reg_pgood = 0x00; // Register to read pgood state on LED9551 Controller.
- const int MAX_PORTS = 2; // Max number of ports for LED9551 Controller.
- const uint8_t ary_led9551_reg_en[MAX_PORTS] = {0x05, 0x06}; // Port target on LED9551 register to enable and disable power.
- const uint8_t led9551_data_slot_off = 0x54; //Data to disable power on LED9551 controller.
- const uint8_t led9551_data_slot_on = 0x55; //Data to enable power on LED9551 controller.
- const uint8_t led9551_dev_addr = 0xC4; //I2C address to target i2c device.
- //uint8_t pgood_data; //Data contents to store the read for the PGOOD register access.
- //uint64_t nano_sec_delay = 250000000; //(250000000 ns = 250 ms) to wait
- //uint64_t sim_cyc_delay = 2500000; //2,500,000 simulation cycles to wait
-
- // mark function entry
- FAPI_INF("proc_pcie_slot_power: Start");
-
- fapi::ATTR_NAME_Type chip_type;
- rc = FAPI_ATTR_GET_PRIVILEGED(ATTR_NAME, &i_target, chip_type);
- if (rc) {
- FAPI_ERR("fapiGetAttribute (Privildged) of ATTR_NAME failed");
- return rc;
- }
-
- if (chip_type == fapi::ENUM_ATTR_NAME_VENICE) { // This is a Venice-based system, Brazos.
- FAPI_INF("%s: ATTR_NAME retrieve is %x", i_target.toEcmdString(), chip_type);
-
- for (int counter = 0; counter < MAX_PORTS; counter++) {
- //DISABLE_SLOT_POWER
- if(!i_enable_slot_power) {
- rc = proc_perv_i2cms_write(i_target, led9551_dev_addr, ary_led9551_reg_en[counter], led9551_data_slot_off);
- if (rc) {
- FAPI_ERR("Error occurred while disabling slot power on I2C addr=%X, target=%s", led9551_dev_addr, i_target.toEcmdString());
- return rc;
- }
- FAPI_INF("Disabled slot power on I2C addr=%X, target=%s", led9551_dev_addr, i_target.toEcmdString());
- }
-
- //ENABLE_SLOT_POWER
- else { // (i_enable_slot_power)
- rc = proc_perv_i2cms_write(i_target, led9551_dev_addr, ary_led9551_reg_en[counter], led9551_data_slot_on);
- if (rc) {
- FAPI_ERR("Error occurred while enabling slot power on I2C addr=%X, target=%s", led9551_dev_addr, i_target.toEcmdString());
- return rc;
- }
- FAPI_INF("Enabled slot power on I2C addr=%X, target=%s", led9551_dev_addr, i_target.toEcmdString());
- }
- }
-
-
-/* //Removing this section as we decussed in a broader meeting that we don't need to check for PGOOD. We will let PHYP or Sapphire do the checking.
- //Wait before checking PGOOD state.
- rc = fapiDelay(nano_sec_delay, sim_cyc_delay);
- if (rc) {
- FAPI_ERR("%s: fapiDelay error");
- return rc;
- }
-
- //Read PGOOD State
- rc = proc_perv_i2cms_read(i_target, led9551_dev_addr, led9551_reg_pgood, &pgood_data);
- if (rc) {
- FAPI_ERR("Error occurred while reading pgood register on I2C addr=%X, target=%s", led9551_dev_addr, i_target.toEcmdString());
- return rc;
- }
- FAPI_INF("PGOOD register read on I2C addr=%X, value=%x, target=%s", led9551_dev_addr, pgood_data, i_target.toEcmdString());
-*/
- }
- else {
- FAPI_INF("%s: This chip type is not supported. ATTR_NAME retrieve is %x", i_target.toEcmdString(), chip_type);
- }
-
- // mark function entry
- FAPI_INF("proc_pcie_slot_power: End");
- return rc;
- }
-
-
-
- //------------------------------------------------------------------------------
- // name: proc_perv_i2cms_write
- //------------------------------------------------------------------------------
- // purpose:
- // Set up of P8 I2C Master engine for I2C write operations.
- //
- // parameters:
- // 'i_target' is reference to chip target
- // 'i_i2c_sel_dev' is reference to i2c device target
- // 'i_i2c_addr' is reference to the address entered into the FIFO
- // 'i_i2c_data' is reference to data for write operation
- //
- // returns:
- //
- // (Note: refer to file eclipz/chips/p8/working/procedures/xml/error_info/proc_pcie_slot_power_errors.xml)
- //
- // getscom/putscom fapi errors
- // fapi error assigned from eCMD function failure
- //
- //------------------------------------------------------------------------------
- fapi::ReturnCode proc_perv_i2cms_write(const fapi::Target &i_target, const uint8_t i_i2c_sel_dev, const uint8_t i_i2c_addr, const uint8_t i_i2c_data) {
-
- fapi::ReturnCode rc; //fapi return code value
- uint32_t rc_ecmd; //ecmd return code value
- const uint32_t data_size = 64; //Size of data buffer
- ecmdDataBufferBase fsi_data(data_size);
-
- // mark function entry
- FAPI_INF("proc_perv_i2cms_write: Start");
-
- //1. Check I2C Status for I2C errors or complete bit not set
- FAPI_DBG("Checking I2C Status on target=%s (addr: 0x%08llX) for at least 1 error bit", i_target.toEcmdString(), I2CMS_STATUS_0x000A002B);
- rc = check_not_ready_bits(i_target);
- if(rc) {
- FAPI_ERR("Error occurred while checking target=%s P8 I2C regster (addr: 0x%08llX) for a error bit", i_target.toEcmdString(), I2CMS_STATUS_0x000A002B);
- return rc;
- }
-
- //2. Initialize I2C Mode register
- rc_ecmd = fsi_data.insertFromRight(I2C_MODE_DATA, 0, 32);
- if(rc_ecmd) {
- FAPI_ERR("Error (%u) setting first word on %s", rc_ecmd, i_target.toEcmdString());
- rc.setEcmdError(rc_ecmd);
- return rc;
- }
- FAPI_DBG("Load I2C Mode register target=%s, value=0x%016llX", i_target.toEcmdString(), fsi_data.getDoubleWord(0));
- rc = fapiPutScom(i_target, I2CMS_MODE_0x000A0026, fsi_data);
- if (rc) {
- FAPI_ERR("fapiPutScom error (addr: 0x%08llX), target=%s", I2CMS_MODE_0x000A0026, i_target.toEcmdString());
- return rc;
- }
-
- //3. Initialize I2C Command register
- rc_ecmd = fsi_data.setWord(0, I2C_CMD_DATA_2B);
- if(rc_ecmd) {
- FAPI_ERR("Error (%u) setting first word on %s", rc_ecmd, i_target.toEcmdString());
- rc.setEcmdError(rc_ecmd);
- return rc;
- }
- rc_ecmd = fsi_data.insertFromRight(i_i2c_sel_dev, 8, 8);
- if(rc_ecmd) {
- FAPI_ERR("Error (%u) inserting data on %s", rc_ecmd, i_target.toEcmdString());
- rc.setEcmdError(rc_ecmd);
- return rc;
- }
- rc_ecmd = fsi_data.clearBit(15);
- if(rc_ecmd) {
- FAPI_ERR("Error (%u) setting bit on %s", rc_ecmd, i_target.toEcmdString());
- rc.setEcmdError(rc_ecmd);
- return rc;
- }
- FAPI_DBG("Load I2C Command register target=%s, value=0x%016llX", i_target.toEcmdString(), fsi_data.getDoubleWord(0));
- rc = fapiPutScom(i_target, I2CMS_COMMAND_0x000A0025, fsi_data);
- if (rc) {
- FAPI_ERR("fapiPutScom error (addr: 0x%08llX), target=%s", I2CMS_COMMAND_0x000A0025, i_target.toEcmdString());
- return rc;
- }
-
- //4. Write address offset into the I2C FIFO
- rc_ecmd = fsi_data.insertFromRight(i_i2c_addr, 0, 8);
- if(rc_ecmd) {
- FAPI_ERR("Error (%u) inserting data on %s", rc_ecmd, i_target.toEcmdString());
- rc.setEcmdError(rc_ecmd);
- return rc;
- }
- FAPI_DBG("Write the I2C FIFO with the address to slave device on target=%s, value=0x%016llX", i_target.toEcmdString(), fsi_data.getDoubleWord(0));
- rc = fapiPutScom(i_target, I2CMS_FIFO1_READ_0x000A0024, fsi_data );
- if (rc) {
- FAPI_ERR("fapiPutScom error (addr: 0x%08llX), target=%s", I2CMS_FIFO1_READ_0x000A0024, i_target.toEcmdString());
- return rc;
- }
-
- //5. Poll for the FIFO Entry count in the status to ensure all data was checked in.
-
- FAPI_DBG("Checking I2C Status on target=%s (addr: 0x%08llX) for at least 1 error bit", i_target.toEcmdString(), I2CMS_STATUS_0x000A002B);
- rc = check_fifo_entry_bits(i_target);
- if(rc) {
- FAPI_ERR("Error occurred while checking target=%s P8 I2C regster (addr: 0x%08llX) for a error bit", i_target.toEcmdString(), I2CMS_STATUS_0x000A002B);
- return rc;
- }
-
- //6. Write data into the I2C FIFO
- rc_ecmd = fsi_data.insertFromRight(i_i2c_data, 0, 8);
- if(rc_ecmd) {
- FAPI_ERR("Error (%u) inserting data on %s", rc_ecmd, i_target.toEcmdString());
- rc.setEcmdError(rc_ecmd);
- return rc;
- }
- FAPI_DBG("Write the I2C FIFO with data to slave device on target=%s, value=0x%016llX", i_target.toEcmdString(), fsi_data.getDoubleWord(0));
- rc = fapiPutScom(i_target, I2CMS_FIFO1_READ_0x000A0024, fsi_data);
- if (rc) {
- FAPI_ERR("fapiPutScom error (addr: 0x%08llX), target=%s", I2CMS_FIFO1_READ_0x000A0024, i_target.toEcmdString());
- return rc;
- }
-
- //TODO: Step 7. is not required for 1-byte length transfers. Instead, will go straight to check for complete bit and errors. Leaving it here for possible future enhancements.
- //7. Repeat 5. and 6. above until all data is transferred.
-
- //8. Poll for complete bit to be set and check for errors.
- FAPI_DBG("Checking I2C Status on target=%s (addr: 0x%08llX) for at least 1 error bit", i_target.toEcmdString(), I2CMS_STATUS_0x000A002B);
- rc = check_not_ready_bits(i_target);
- if(rc) {
- FAPI_ERR("Error occurred while checking target=%s P8 I2C regster (addr: 0x%08llX) for a error bit", i_target.toEcmdString(), I2CMS_STATUS_0x000A002B);
- return rc;
- }
-
- // mark function entry
- FAPI_INF("proc_perv_i2cms_write: End");
- return rc;
- }
-
-
- //------------------------------------------------------------------------------
- // name: proc_perv_i2cms_read
- //------------------------------------------------------------------------------
- // purpose:
- // Set up of P8 I2C Master engine for I2C write operations.
- //
- // parameters:
- // 'i_target' is reference to chip target
- // 'i_i2c_sel_dev' is reference to i2c device target
- // 'i_i2c_addr' is reference to the address entered into the FIFO
- // 'o_i2c_data' is reference to the data read from the FIFO
- //
- // returns:
- //
- // (Note: refer to file eclipz/chips/p8/working/procedures/xml/error_info/proc_pcie_slot_power_errors.xml)
- //
- // getscom/putscom fapi errors
- // fapi error assigned from eCMD function failure
- //
- //------------------------------------------------------------------------------
- fapi::ReturnCode proc_perv_i2cms_read(const fapi::Target &i_target, const uint8_t i_i2c_sel_dev, const uint8_t i_i2c_addr, uint8_t *o_i2c_data) {
-
- fapi::ReturnCode rc; //fapi return code value
- uint32_t rc_ecmd; //ecmd return code value
- const uint32_t data_size = 64; //Size of data buffer
- ecmdDataBufferBase fsi_data(data_size);
-
- // mark function entry
- FAPI_INF("proc_perv_i2cms_read: Start");
-
- //1. Check I2C Status for I2C errors or complete bit not set
- FAPI_DBG("Checking I2C Status on target=%s (addr: 0x%08llX) for at least 1 error bit", i_target.toEcmdString(), I2CMS_STATUS_0x000A002B);
- rc = check_not_ready_bits(i_target);
- if(rc) {
- FAPI_ERR("Error occurred while checking target=%s P8 I2C regster (addr: 0x%08llX) for a error bit", i_target.toEcmdString(), I2CMS_STATUS_0x000A002B);
- return rc;
- }
-
- //2. Initialize I2C Mode register
- rc_ecmd = fsi_data.insertFromRight(I2C_MODE_DATA, 0, 32);
- if(rc_ecmd) {
- FAPI_ERR("Error (%u) inserting data on %s", rc_ecmd, i_target.toEcmdString());
- rc.setEcmdError(rc_ecmd);
- return rc;
- }
- FAPI_DBG("Load I2C Mode register target=%s, value=0x%016llX", i_target.toEcmdString(), fsi_data.getDoubleWord(0));
- rc = fapiPutScom(i_target, I2CMS_MODE_0x000A0026, fsi_data);
- if (rc) {
- FAPI_ERR("fapiPutScom error (addr: 0x%08llX), target=%s", I2CMS_MODE_0x000A0026, i_target.toEcmdString());
- return rc;
- }
-
- //3. Initialize I2C Command register
- rc_ecmd = fsi_data.setWord(0, I2C_CMD_DATA_1B);
- if(rc_ecmd) {
- FAPI_ERR("Error (%u) setting first word on %s", rc_ecmd, i_target.toEcmdString());
- rc.setEcmdError(rc_ecmd);
- return rc;
- }
- rc_ecmd = fsi_data.insertFromRight(i_i2c_sel_dev, 8, 8);
- if(rc_ecmd) {
- FAPI_ERR("Error (%u) inserting data on %s", rc_ecmd, i_target.toEcmdString());
- rc.setEcmdError(rc_ecmd);
- return rc;
- }
- rc_ecmd = fsi_data.clearBit(15);
- if(rc_ecmd) {
- FAPI_ERR("Error (%u) clearing bit on %s", rc_ecmd, i_target.toEcmdString());
- rc.setEcmdError(rc_ecmd);
- return rc;
- }
- FAPI_DBG("Load I2C Command register target=%s, value=0x%016llX", i_target.toEcmdString(), fsi_data.getDoubleWord(0));
- rc = fapiPutScom(i_target, I2CMS_COMMAND_0x000A0025, fsi_data);
- if (rc) {
- FAPI_ERR("fapiPutScom error (addr: 0x%08llX), target=%s", I2CMS_COMMAND_0x000A0025, i_target.toEcmdString());
- return rc;
- }
-
- //4. Write address offset into the I2C FIFO
- rc_ecmd = fsi_data.insertFromRight(i_i2c_addr, 0, 8);
- if(rc_ecmd) {
- FAPI_ERR("Error (%u) inserting data on %s", rc_ecmd, i_target.toEcmdString());
- rc.setEcmdError(rc_ecmd);
- return rc;
- }
- FAPI_DBG("Write the I2C FIFO with the address to slave device on target=%s, value=0x%016llX", i_target.toEcmdString(), fsi_data.getDoubleWord(0));
- rc = fapiPutScom(i_target, I2CMS_FIFO1_READ_0x000A0024, fsi_data );
- if (rc) {
- FAPI_ERR("fapiPutScom error (addr: 0x%08llX), target=%s", I2CMS_FIFO1_READ_0x000A0024, i_target.toEcmdString());
- return rc;
- }
-
- //5. Poll for complete bit to be set and check for errors.
- FAPI_DBG("Checking I2C Status on target=%s (addr: 0x%08llX) for at least 1 error bit", i_target.toEcmdString(), I2CMS_STATUS_0x000A002B);
- rc = check_not_ready_bits(i_target);
- if(rc) {
- FAPI_ERR("Error occurred while checking target=%s P8 I2C regster (addr: 0x%08llX) for a error bit", i_target.toEcmdString(), I2CMS_STATUS_0x000A002B);
- return rc;
- }
-
- //6. Initialize I2C Command register
- rc_ecmd = fsi_data.setWord(0, I2C_CMD_DATA_1B);
- if(rc_ecmd) {
- FAPI_ERR("Error (%u) setting first word on %s", rc_ecmd, i_target.toEcmdString());
- rc.setEcmdError(rc_ecmd);
- return rc;
- }
- rc_ecmd = fsi_data.insertFromRight(i_i2c_sel_dev, 8, 8);
- if(rc_ecmd) {
- FAPI_ERR("Error (%u) inserting data on %s", rc_ecmd, i_target.toEcmdString());
- rc.setEcmdError(rc_ecmd);
- return rc;
- }
- rc_ecmd = fsi_data.setBit(15);
- if(rc_ecmd) {
- FAPI_ERR("Error (%u) setting bit on %s", rc_ecmd, i_target.toEcmdString());
- rc.setEcmdError(rc_ecmd);
- return rc;
- }
- FAPI_DBG("Load I2C Command register target=%s, value=0x%016llX", i_target.toEcmdString(), fsi_data.getDoubleWord(0));
- rc = fapiPutScom(i_target, I2CMS_COMMAND_0x000A0025, fsi_data);
- if (rc) {
- FAPI_ERR("fapiPutScom error (addr: 0x%08llX), target=%s", I2CMS_COMMAND_0x000A0025, i_target.toEcmdString());
- return rc;
- }
-
- //7. Read data from the I2C FIFO
- FAPI_DBG("Read I2C data from the FIFO");
- rc = fapiGetScom(i_target, I2CMS_FIFO1_READ_0x000A0024, fsi_data );
- if (rc) {
- FAPI_ERR("fapiGetScom error (addr: 0x%08llX), target=%s", I2CMS_FIFO1_READ_0x000A0024, i_target.toEcmdString());
- return rc;
- }
- FAPI_DBG("Read data from the I2C FIFO to slave device on target=%s, value=0x%X", i_target.toEcmdString(), fsi_data.getByte(0));
- *o_i2c_data = fsi_data.getByte(0);
-
- //8. Poll status register's FIFO_ENTRY_COUNT to know if entire FIFO has been read.
- FAPI_DBG("Checking I2C Status on target=%s (addr: 0x%08llX)", i_target.toEcmdString(), I2CMS_STATUS_0x000A002B);
- rc = check_fifo_entry_bits(i_target);
- if(rc) {
- FAPI_ERR("Error occurred while checking target=%s P8 I2C regster (addr: 0x%08llX) for a error bit", i_target.toEcmdString(), I2CMS_STATUS_0x000A002B);
- return rc;
- }
-
- //TODO: Step 9. is not required for 1-byte length transfers. Instead, will go straight to check for complete bit and errors. Leaving it here for possible future enhancements.
-
- //9. Repeat 7. and 8. above until all data is read from the FIFO.
-
- //10. Poll for complete bit and check for any errors.
- FAPI_DBG("Checking I2C Status on target=%s (addr: 0x%08llX)", i_target.toEcmdString(), I2CMS_STATUS_0x000A002B);
- rc = check_not_ready_bits(i_target);
- if(rc) {
- FAPI_ERR("Error occurred while checking target=%s P8 I2C regster (addr: 0x%08llX) for a error bit", i_target.toEcmdString(), I2CMS_STATUS_0x000A002B);
- return rc;
- }
-
- // mark function entry
- FAPI_INF("proc_perv_i2cms_read: End");
- return rc;
- }
-
-
- //------------------------------------------------------------------------------
- //------------------------------------------------------------------------------
- // name: check_not_ready_bits
- //------------------------------------------------------------------------------
- // purpose:
- // Checks P8 I2C Status register for complete bit and errors.
- //
- // Bits that indicate P8 I2C Master engine is not ready for operation.
- // bit 0 Invalid Command.
- // bit 1 Local Bus Parity Error.
- // bit 2 Back End Overrun Error.
- // bit 3 Back End Access Error.
- // bit 4 Arbitration Lost Error.
- // bit 5 NACK Recieved Error.
- // bit 6 Data Request.
- // bit 8 Stop Error.
- //
- // parameters:
- // 'i_target' is reference to chip target
- //
- // returns:
- //
- // (Note: refer to file eclipz/chips/p8/working/procedures/xml/error_info/proc_pcie_slot_power_errors.xml)
- //
- // getscom/putscom fapi errors
- // fapi error assigned from eCMD function failure
- //
- //------------------------------------------------------------------------------
- fapi::ReturnCode check_not_ready_bits(const fapi::Target &i_target) {
-
- fapi::ReturnCode rc;
- const uint32_t data_size = 64; //Size of data buffer
- ecmdDataBufferBase fsi_data(data_size);
- const int MAX_NUM_NOT_RDY_BITS = 8; //Maximum number of bits that indicate P8 I2C Master engine is not ready.
- const uint32_t ARY_NOT_RDY_BITS[MAX_NUM_NOT_RDY_BITS] = {0, 1, 2, 3, 4, 5, 6, 8}; //Array of bits that indicate P8 I2C Master engine is not ready.
- uint64_t nano_sec_delay = 1000000; //(1000000 ns = 1 ms ) to wait
- uint64_t sim_cyc_delay = 10000; //10,000 simulation cycles to wait
- int poll_counter; //Number of iterations while polling
- const int MAX_NUM_POLLS = 100; //Maximum number of iterations (So, 1ms * 100 = 100ms before timeout)
-
- // mark function entry
- FAPI_INF("check_not_ready_bits: Start");
-
- //1. Read I2C Status register and poll for complete bit to be set then check for errors.
- rc = fapiGetScom(i_target, I2CMS_STATUS_0x000A002B, fsi_data);
- if (rc) {
- FAPI_ERR("fapiGetScom error (addr: 0x%08llX)", I2CMS_STATUS_0x000A002B);
- return rc;
- }
- poll_counter = 0;
- while (!fsi_data.isBitSet(7)) {
- poll_counter++;
-
- //Exceed max number of polls
- if(poll_counter > MAX_NUM_POLLS) {
- FAPI_ERR("Exceeded max number of polls (%d) for target=%s", MAX_NUM_POLLS, i_target.toEcmdString());
- const fapi::Target & CHIP_TARGET = i_target;
- const uint64_t & ADDRESS_VAL = I2CMS_STATUS_0x000A002B;
- ecmdDataBufferBase & DATA_REG = fsi_data;
- FAPI_SET_HWP_ERROR(rc, RC_I2C_COMPLETE_BIT_TIMEOUT_RC);
- return rc;
- }
- FAPI_DBG("target=%s, Poll Iter: %d", i_target.toEcmdString(), poll_counter);
-
- //Wait before checking again
- rc = fapiDelay(nano_sec_delay, sim_cyc_delay);
- if (rc) {
- FAPI_ERR("fapiDelay error");
- return rc;
- }
-
- //Get data from I2C Status register
- FAPI_DBG("Checking I2C Status on target=%s (addr: 0x%08llX) for at least 1 error bit", i_target.toEcmdString(), I2CMS_STATUS_0x000A002B);
- rc = fapiGetScom(i_target, I2CMS_STATUS_0x000A002B, fsi_data);
- if (rc) {
- FAPI_ERR("fapiGetScom error (addr: 0x%08llX)", I2CMS_STATUS_0x000A002B);
- return rc;
- }
- }
-
- //2. Check P8 I2C Master engine is ready for new operation.
- for(int counter = 0; counter < MAX_NUM_NOT_RDY_BITS; counter++) {
- if( fsi_data.isBitSet(ARY_NOT_RDY_BITS[counter] )) {
- FAPI_ERR("Error in bit pos %u of I2CMS_STATUS_0x000A002B, (addr: 0x%08llX) ",ARY_NOT_RDY_BITS[counter], I2CMS_STATUS_0x000A002B);
- const fapi::Target & CHIP_TARGET = i_target;
- const uint64_t & ADDRESS_VAL = I2CMS_STATUS_0x000A002B;
- ecmdDataBufferBase & DATA_REG = fsi_data;
- FAPI_SET_HWP_ERROR(rc, RC_I2C_ERROR_BIT_PRESENT_RC);
- return rc;
- }
- }
-
- // mark function exit
- FAPI_INF("check_not_ready_bits: End");
- return rc;
- }
-
-
- //------------------------------------------------------------------------------
- //------------------------------------------------------------------------------
- // name: check_fifo_entry_bits
- //------------------------------------------------------------------------------
- // purpose:
- // Checks P8 I2C Status register for FIFO entry to read 00 indicating FIFO has been flushed..
- //
- // Bits that indicate P8 I2C Master engine is not ready for operation.
- // bit[28:31] - FIFO Entry Count
- //
- // parameters:
- // 'i_target' is reference to chip target
- //
- // returns:
- //
- // (Note: refer to file eclipz/chips/p8/working/procedures/xml/error_info/proc_pcie_slot_power_errors.xml)
- //
- // getscom/putscom fapi errors
- // fapi error assigned from eCMD function failure
- //
- //------------------------------------------------------------------------------
- fapi::ReturnCode check_fifo_entry_bits(const fapi::Target &i_target) {
-
- fapi::ReturnCode rc;
- const uint32_t data_size = 64; //Size of data buffer
- ecmdDataBufferBase fsi_data(data_size);
- uint64_t nano_sec_delay = 1000000; //(1000000 ns = 1 ms ) to wait
- uint64_t sim_cyc_delay = 10000; //10,000 simulation cycles to wait
- int poll_counter; //Number of iterations while polling
- const int MAX_NUM_POLLS = 100; //Maximum number of iterations (So, 1ms * 100 = 100ms before timeout)
-
- // mark function entry
- FAPI_INF("check_fifo_entry_bits: Start");
-
- //Read I2C Status register and poll for FIFO entry count to reach 00.
- rc = fapiGetScom(i_target, I2CMS_STATUS_0x000A002B, fsi_data);
- if (rc) {
- FAPI_ERR("fapiGetScom error (addr: 0x%08llX)", I2CMS_STATUS_0x000A002B);
- return rc;
- }
- poll_counter = 0;
- while (!fsi_data.isBitClear(28, 4)) {
- poll_counter++;
-
- //Exceed max number of polls
- if(poll_counter > MAX_NUM_POLLS) {
- FAPI_ERR("Exceeded max number of polls (%d) for target=%s", MAX_NUM_POLLS, i_target.toEcmdString());
- const fapi::Target & CHIP_TARGET = i_target;
- const uint64_t & ADDRESS_VAL = I2CMS_STATUS_0x000A002B;
- ecmdDataBufferBase & DATA_REG = fsi_data;
- FAPI_SET_HWP_ERROR(rc, RC_I2C_FIFO_INCOMPLETE_RC);
- return rc;
- }
- FAPI_DBG("target=%s, Poll Iter: %d", i_target.toEcmdString(), poll_counter);
-
-
- //Wait before checking again
- rc = fapiDelay(nano_sec_delay, sim_cyc_delay);
- if (rc) {
- FAPI_ERR("fapiDelay error");
- return rc;
- }
-
- //Get data from I2C Status register
- rc = fapiGetScom(i_target, I2CMS_STATUS_0x000A002B, fsi_data);
- if (rc) {
- FAPI_ERR("fapiGetScom error (addr: 0x%08llX)", I2CMS_STATUS_0x000A002B);
- return rc;
- }
- }
-
- // mark function exit
- FAPI_INF("check_fifio_entry_bits: End");
- return rc;
- }
-
-} // extern "C"
diff --git a/src/usr/hwpf/hwp/nest_chiplets/proc_pcie_slot_power/proc_pcie_slot_power.H b/src/usr/hwpf/hwp/nest_chiplets/proc_pcie_slot_power/proc_pcie_slot_power.H
deleted file mode 100644
index 6795dc883..000000000
--- a/src/usr/hwpf/hwp/nest_chiplets/proc_pcie_slot_power/proc_pcie_slot_power.H
+++ /dev/null
@@ -1,90 +0,0 @@
-/* IBM_PROLOG_BEGIN_TAG */
-/* This is an automatically generated prolog. */
-/* */
-/* $Source: src/usr/hwpf/hwp/activate_powerbus/proc_pcie_slot_power/proc_pcie_slot_power.H $ */
-/* */
-/* OpenPOWER HostBoot Project */
-/* */
-/* Contributors Listed Below - COPYRIGHT 2014 */
-/* [+] 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_pcie_slot_power.H,v 1.3 2014/07/28 21:40:41 ricmata Exp $
-// $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/p8/working/procedures/ipl/fapi/proc_pcie_slot_power.H,v $
-//------------------------------------------------------------------------------
-// *! (C) Copyright International Business Machines Corp. 2012
-// *! All Rights Reserved -- Property of IBM
-//------------------------------------------------------------------------------
-// *! TITLE : proc_pcie_slot_power.C
-// *! DESCRIPTION : Disable/Enable slot power on hot-plug controlled slots.
-// *!
-// *! OWNER NAME : Rick Mata Email: ricmata@us.ibm.com
-// */ BACKUP NAME : Rick Mata Email: ricmata@us.ibm.com
-// *!
-// *! ADDITIONAL COMMENTS :
-// *!
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-// Version Date Owner Description
-//------------------------------------------------------------------------------
-// 1.0 7/22/14 ricmata Initial release: Brazos support only.
-//------------------------------------------------------------------------------
-#ifndef _PROC_PCIE_SLOT_POWER_H_
-#define _PROC_PCIE_SLOT_POWER_H_
-
-//------------------------------------------------------------------------------
-// Includes
-//------------------------------------------------------------------------------
-#include "fapi.H"
-
-//------------------------------------------------------------------------------
-// Constant definitions
-//------------------------------------------------------------------------------
-
-const uint32_t I2C_MODE_DATA = 0x01760000;
-const uint32_t I2C_CMD_DATA_2B = 0xD0000002;
-const uint32_t I2C_CMD_DATA_1B = 0xD0000001;
-const uint64_t I2CMS_FIFO1_READ_0x000A0024 = 0x00000000000A0024ULL;
-const uint64_t I2CMS_COMMAND_0x000A0025 = 0x00000000000A0025ULL;
-const uint64_t I2CMS_MODE_0x000A0026 = 0x00000000000A0026ULL;
-const uint64_t I2CMS_STATUS_0x000A002B = 0x00000000000A002BULL;
-const uint64_t I2CMS_EXT_STATUS_0x000A002C = 0x00000000000A002CULL;
-
-//------------------------------------------------------------------------------
-// Structure Definition(s)
-//------------------------------------------------------------------------------
-
-// function pointer typedef definition for HWP call support
-typedef fapi::ReturnCode
-(*proc_pcie_slot_power_FP_t)(const fapi::Target &i_target, const bool);
-
-extern "C"
-{
- /**
- * @brief Disable/enable slot power to hot-plug controlled slots.
- *
- * @param[in] (1) 'i_target' is reference to chip target
- * (2) 'i_enable_slot_power' is reference to boolean object: True = ON, False = OFF.
- *
- * @return ReturnCode
- *
- *
- */
- fapi::ReturnCode proc_pcie_slot_power(const fapi::Target &i_target, const bool i_enable_slot_power);
-
-} //extern "C"
-
-#endif
diff --git a/src/usr/hwpf/hwp/nest_chiplets/proc_start_clocks_chiplets/proc_start_clocks_chiplets.C b/src/usr/hwpf/hwp/nest_chiplets/proc_start_clocks_chiplets/proc_start_clocks_chiplets.C
deleted file mode 100644
index 025c3d0c9..000000000
--- a/src/usr/hwpf/hwp/nest_chiplets/proc_start_clocks_chiplets/proc_start_clocks_chiplets.C
+++ /dev/null
@@ -1,890 +0,0 @@
-/* IBM_PROLOG_BEGIN_TAG */
-/* This is an automatically generated prolog. */
-/* */
-/* $Source: src/usr/hwpf/hwp/nest_chiplets/proc_start_clocks_chiplets/proc_start_clocks_chiplets.C $ */
-/* */
-/* OpenPOWER HostBoot Project */
-/* */
-/* Contributors Listed Below - COPYRIGHT 2012,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_start_clocks_chiplets.C,v 1.19 2015/05/14 21:21:34 jmcgill Exp $
-// $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/p8/working/procedures/ipl/fapi/proc_start_clocks_chiplets.C,v $
-//------------------------------------------------------------------------------
-// *|
-// *! (C) Copyright International Business Machines Corp. 2011
-// *! All Rights Reserved -- Property of IBM
-// *! *** ****
-// *|
-// *! TITLE : proc_start_clocks_chiplets.H
-// *! DESCRIPTION : Start X/A/PCIE chiplet clocks (FAPI)
-// *!
-// *! OWNER NAME : Ralph Koester Email: rkoester@de.ibm.com
-// *! BACKUP NAME : Gebhard Weber Email: gweber@de.ibm.com
-// *!
-//------------------------------------------------------------------------------
-
-//------------------------------------------------------------------------------
-// Includes
-//------------------------------------------------------------------------------
-#include "proc_start_clocks_chiplets.H"
-
-extern "C"
-{
-
-
-//------------------------------------------------------------------------------
-// function: utility subroutine to clear chiplet fence in GP3 register
-// parameters: i_target => chip target
-// i_chiplet_base_addr => base SCOM address for chiplet
-// returns: FAPI_RC_SUCCESS if operation was successful, else error
-//------------------------------------------------------------------------------
-fapi::ReturnCode proc_start_clocks_chiplet_clear_chiplet_fence(
- const fapi::Target& i_target,
- const uint32_t i_chiplet_base_addr)
-{
- fapi::ReturnCode rc;
- uint32_t rc_ecmd = 0;
- ecmdDataBufferBase mask_data(64);
- uint32_t scom_addr = i_chiplet_base_addr |
- GENERIC_GP3_AND_0x000F0013;
-
- FAPI_DBG("proc_start_clocks_chiplet_clear_chiplet_fence: Start");
-
- do
- {
- // form AND mask to clear chiplet fence bit
- rc_ecmd |= mask_data.flushTo1();
- rc_ecmd |= mask_data.clearBit(GP3_FENCE_EN_BIT);
- if (rc_ecmd)
- {
- FAPI_ERR("proc_start_clocks_chiplet_clear_chiplet_fence: Error 0x%x setting up data buffer to clear chiplet fence",
- rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
-
- // write chiplet GP3 AND mask register to clear fence bit
- rc = fapiPutScom(i_target, scom_addr, mask_data);
- if (rc)
- {
- FAPI_ERR("proc_start_clocks_chiplet_clear_chiplet_fence: fapiPutScom error (GP3_AND_0x%08X)",
- scom_addr);
- break;
- }
-
- } while(0);
-
- FAPI_DBG("proc_start_clocks_chiplet_clear_chiplet_fence: End");
-
- return rc;
-}
-
-
-//------------------------------------------------------------------------------
-// function: utility subroutine to clear pervasive fence in GP0 register
-// parameters: i_target => chip target
-// i_chiplet_base_addr => base SCOM address for chiplet
-// returns: FAPI_RC_SUCCESS if operation was successful, else error
-//------------------------------------------------------------------------------
-fapi::ReturnCode proc_start_clocks_chiplet_clear_perv_fence(
- const fapi::Target& i_target,
- const uint32_t i_chiplet_base_addr)
-{
- fapi::ReturnCode rc;
- uint32_t rc_ecmd = 0;
- ecmdDataBufferBase mask_data(64);
- uint32_t scom_addr = i_chiplet_base_addr |
- GENERIC_GP0_AND_0x00000004;
-
- FAPI_DBG("proc_start_clocks_chiplet_clear_perv_fence: Start");
-
- do
- {
- // form AND mask to clear pervasive fence bit
- rc_ecmd |= mask_data.flushTo1();
- rc_ecmd |= mask_data.clearBit(GP0_PERV_FENCE_BIT);
- if (rc_ecmd)
- {
- FAPI_ERR("proc_start_clocks_chiplet_clear_perv_fence: Error 0x%x setting up data buffer to clear pervasive fence",
- rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
-
- // write chiplet GP0 AND mask register to clear pervasive fence bit
- rc = fapiPutScom(i_target, scom_addr, mask_data);
- if (rc)
- {
- FAPI_ERR("proc_start_clocks_chiplet_clear_perv_fence: fapiPutScom error (GP0_AND_0x%08X)",
- scom_addr);
- break;
- }
-
- } while(0);
-
- FAPI_DBG("proc_start_clocks_chiplet_clear_perv_fence: End");
-
- return rc;
-}
-
-
-//------------------------------------------------------------------------------
-// function: utility subroutine to set functional mode clock mux selects
-// in GP0 register
-// parameters: i_target => chip target
-// i_chiplet_base_addr => base SCOM address for chiplet
-// returns: FAPI_RC_SUCCESS if operation was successful, else error
-//------------------------------------------------------------------------------
-fapi::ReturnCode proc_start_clocks_chiplet_set_mux_selects(
- const fapi::Target& i_target,
- const uint32_t i_chiplet_base_addr)
-{
- fapi::ReturnCode rc;
- uint32_t rc_ecmd = 0;
- ecmdDataBufferBase mask_data(64);
- uint32_t scom_addr = i_chiplet_base_addr |
- GENERIC_GP0_AND_0x00000004;
-
- FAPI_DBG("proc_start_clocks_chiplet_set_mux_selects: Start");
-
- do
- {
- // form AND mask to clear mux selects
- rc_ecmd |= mask_data.flushTo1();
- rc_ecmd |= mask_data.clearBit(GP0_ABSTCLK_MUXSEL_BIT);
- rc_ecmd |= mask_data.clearBit(GP0_SYNCCLK_MUXSEL_BIT);
- if (rc_ecmd)
- {
- FAPI_ERR("proc_start_clocks_chiplet_set_mux_selects: Error 0x%x setting up data buffer to clear chiplet mux selects",
- rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
-
- // write chiplet GP0 AND mask register to clear mux selects
- rc = fapiPutScom(i_target, scom_addr, mask_data);
- if (rc)
- {
- FAPI_ERR("proc_start_clocks_chiplet_set_mux_selects: fapiPutScom error (GP0_AND_0x%08X)",
- scom_addr);
- break;
- }
-
- } while(0);
-
- FAPI_DBG("proc_start_clocks_chiplet_set_mux_selects: End");
-
- return rc;
-}
-
-
-//------------------------------------------------------------------------------
-// function: utility subroutine to get partial good vector from SEEPROM
-// parameters: i_target => chip target
-// i_chiplet_base_addr => base SCOM address for chiplet
-// o_chiplet_reg_vec => output vector
-// returns: FAPI_RC_SUCCESS if operation was successful, else error
-//------------------------------------------------------------------------------
-
-// note:
-// expected value out of SEEPROM (in case of "all good", the "Partial Good Region"-Pattern are:
-// XBUS = 0xF00, ABUS = 0xE100, PCIE = 0xF700
-
-fapi::ReturnCode proc_start_clocks_get_partial_good_vector(
- const fapi::Target& i_target,
- const uint32_t i_chiplet_base_addr,
- uint64_t * o_chiplet_reg_vec
- )
-{
- fapi::ReturnCode rc;
- uint64_t partial_good_regions[32];
-
- FAPI_DBG("proc_start_clocks_get_partial_good_vector: Start");
-
- do
- {
-
- FAPI_DBG("proc_start_clocks_get_partial_good_vector: Get attribute ATTR_CHIP_REGIONS_TO_ENABLE (partial good region data) " );
- rc = FAPI_ATTR_GET( ATTR_CHIP_REGIONS_TO_ENABLE, &i_target, partial_good_regions);
- if (rc) {
- FAPI_ERR("fapi_attr_get( ATTR_CHIP_REGIONS_TO_ENABLE ) failed. With rc = 0x%x",
- (uint32_t) rc );
- break;
- }
-
-
- FAPI_DBG("proc_start_clocks_get_partial_good_vector: start assignment of the partial good vector per chiplet");
-
- switch (i_chiplet_base_addr)
- {
-
- case X_BUS_CHIPLET_0x04000000:
- FAPI_DBG("proc_start_clocks_get_partial_good_vector: XBUS, attribute for XBUS (%016llX)", partial_good_regions[4]);
- *o_chiplet_reg_vec = partial_good_regions[4];
- break;
-
-
- case A_BUS_CHIPLET_0x08000000:
- FAPI_DBG("proc_start_clocks_get_partial_good_vector: ABUS, attribute for ABUS (%016llX)", partial_good_regions[8]);
- *o_chiplet_reg_vec = partial_good_regions[8];
- break;
-
- case PCIE_CHIPLET_0x09000000:
- FAPI_DBG("proc_start_clocks_get_partial_good_vector: PCIE, attribute for PCIE (%016llX)", partial_good_regions[9]);
- *o_chiplet_reg_vec = partial_good_regions[9];
- break;
-
- default:
-
- FAPI_ERR("proc_start_clocks_get_partial_good_vector: invalid chiplet base address selected when selecting par. good vector (0x%08X)",
- i_chiplet_base_addr);
- uint32_t CHIPLET_BASE_SCOM_ADDR = i_chiplet_base_addr;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_START_CLOCKS_CHIPLETS_PARTIAL_GOOD_ERR);
- break;
-
- }
-
-
- } while(0);
-
- FAPI_DBG("proc_start_clocks_get_partial_good_vector: End");
-
- return rc;
-}
-
-
-//------------------------------------------------------------------------------
-// function: utility subroutine to set clock region register (starts clocks)
-// parameters: i_target => chip target
-// i_chiplet_base_addr => base SCOM address for chiplet
-// i_chiplet_reg_vec => vector from SEEPROM with partial good
-// clock regions
-// o_chiplet_clkreg_vec => output vector which contains
-// the masked vector -> used to set the
-// clock region register
-// returns: FAPI_RC_SUCCESS if operation was successful, else error
-//------------------------------------------------------------------------------
-fapi::ReturnCode proc_start_clocks_chiplet_set_clk_region_reg(
- const fapi::Target& i_target,
- const uint32_t i_chiplet_base_addr,
- const uint64_t i_chiplet_reg_vec,
- uint64_t * o_chiplet_clkreg_vec
- )
-
-
-{
- fapi::ReturnCode rc;
- uint32_t rc_ecmd = 0;
- ecmdDataBufferBase data(64);
- uint32_t scom_addr = i_chiplet_base_addr |
- GENERIC_CLK_REGION_0x00030006;
- uint64_t extracted_rec_vec;
- uint64_t clk_region_start_nsl_ary_masked;
- uint64_t clk_region_start_all_masked;
-
- FAPI_DBG("proc_start_clocks_chiplet_set_clk_region_reg: Start");
-
- do
- {
-
-
- // bitwise ORing of input vector
- extracted_rec_vec = PROC_START_CLOCKS_CHIPLETS_CLOCK_REGION_MANIPULATION | i_chiplet_reg_vec;
-
- // start NSL/array clocks
-
- clk_region_start_nsl_ary_masked = PROC_START_CLOCKS_CHIPLETS_CLK_REGION_REG_START_NSL_ARY & extracted_rec_vec;
-
- rc_ecmd |= data.setDoubleWord(0, clk_region_start_nsl_ary_masked);
- if (rc_ecmd)
- {
- FAPI_ERR("proc_start_clocks_chiplet_set_clk_region_reg: Error 0x%x setting up data buffer for NSL/ARY clock start",
- rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
-
- rc = fapiPutScom(i_target, scom_addr, data);
- if (rc)
- {
- FAPI_ERR("proc_start_clocks_chiplet_set_clk_region_reg: fapiPutScom error (CLK_REGION_0x%08X)",
- scom_addr);
- break;
- }
-
- // start all clocks
-
- clk_region_start_all_masked = PROC_START_CLOCKS_CHIPLETS_CLK_REGION_REG_START_ALL & extracted_rec_vec;
-
- // output: value written into clk_region register, reused for status register checking
-
- *o_chiplet_clkreg_vec = clk_region_start_all_masked;
-
- rc_ecmd |= data.setDoubleWord(0, clk_region_start_all_masked);
- if (rc_ecmd)
- {
- FAPI_ERR("proc_start_clocks_chiplet_set_clk_region_reg: Error 0x%x setting up data buffer for SL/NSL/ARY clock start",
- rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
-
- rc = fapiPutScom(i_target, scom_addr, data);
- if (rc)
- {
- FAPI_ERR("proc_start_clocks_chiplet_set_clk_region_reg: fapiPutScom error (CLK_REGION_0x%08X)",
- scom_addr);
- break;
- }
-
- } while(0);
-
- FAPI_DBG("proc_start_clocks_chiplet_set_clk_region_reg: End");
-
- return rc;
-}
-
-
-//------------------------------------------------------------------------------
-// function: utility subroutine to check clock status register to ensure
-// all desired clock domains have been started
-// parameters: i_target => chip target
-// i_chiplet_base_addr => base SCOM address for chiplet
-// i_chiplet_clkreg_vec => region vector of SEEPROM for clock regions
-// need to be turned on
-// returns: FAPI_RC_SUCCESS if operation was successful, else
-// RC_PROC_START_CLOCKS_CHIPLETS_CLK_STATUS_ERR if status register
-// data does not match expected pattern
-//------------------------------------------------------------------------------
-fapi::ReturnCode proc_start_clocks_chiplet_check_clk_status_reg(
- const fapi::Target& i_target,
- const uint32_t i_chiplet_base_addr,
- const uint64_t i_chiplet_clkreg_vec)
-{
- fapi::ReturnCode rc;
- uint32_t rc_ecmd = 0;
- ecmdDataBufferBase vec_data(64);
- ecmdDataBufferBase status_data(64);
- ecmdDataBufferBase exp_data(64);
- uint32_t scom_addr = i_chiplet_base_addr |
- GENERIC_CLK_STATUS_0x00030008;
- const uint32_t xbus = X_BUS_CHIPLET_0x04000000;
- const uint32_t abus = A_BUS_CHIPLET_0x08000000;
- const uint32_t pcie = PCIE_CHIPLET_0x09000000;
-
- FAPI_DBG("proc_start_clocks_chiplet_check_clk_status_reg: Start");
-
- do
- {
-
- // read clock status register
- rc = fapiGetScom(i_target, scom_addr, status_data);
- if (rc)
- {
- FAPI_ERR("proc_start_clocks_chiplet_check_clk_status_reg: fapiGetScom error (CLK_STATUS_0x%08X)",
- scom_addr);
- break;
- }
-
- // load it with reference data
- rc_ecmd |= vec_data.setDoubleWord(0, i_chiplet_clkreg_vec);
- // generate expected value databuffer
- rc_ecmd |= exp_data.flushTo1();
-
- if ( i_chiplet_base_addr == xbus)
- {
-
- if ( vec_data.isBitSet(4)) { rc_ecmd |= exp_data.clearBit(0,3); }
- if ( vec_data.isBitSet(5)) { rc_ecmd |= exp_data.clearBit(3,6); }
- if ( vec_data.isBitSet(6)) { rc_ecmd |= exp_data.clearBit(9,6); }
- if ( vec_data.isBitSet(7)) { rc_ecmd |= exp_data.clearBit(15,3);}
-
- }
-
- else
- {
-
- if ( vec_data.isBitSet(4)) { rc_ecmd |= exp_data.clearBit(0,3); }
- if ( vec_data.isBitSet(5)) { rc_ecmd |= exp_data.clearBit(3,3); }
- if ( vec_data.isBitSet(6)) { rc_ecmd |= exp_data.clearBit(6,3); }
- if ( vec_data.isBitSet(7)) { rc_ecmd |= exp_data.clearBit(9,3); }
- if ( vec_data.isBitSet(9)) { rc_ecmd |= exp_data.clearBit(15,3);}
- if ( vec_data.isBitSet(10)) { rc_ecmd |= exp_data.clearBit(18,3);}
- if ( vec_data.isBitSet(11)) { rc_ecmd |= exp_data.clearBit(21,3);}
-
- }
-
-
- if (rc_ecmd)
- {
- FAPI_ERR("proc_start_clocks_chiplet_check_clk_status_reg: Error 0x%x setting up data buffer to set clock status",
- rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
-
-
- // check that value matches expected pattern
- // set a unique HWP_ERROR
- if (status_data.getDoubleWord(0) != exp_data.getDoubleWord(0))
- {
- FAPI_ERR("proc_start_clocks_chiplet_check_clk_status_reg: Clock status register actual value (%016llX) does not match expected value (%016llX)",
- status_data.getDoubleWord(0), exp_data.getDoubleWord(0));
- ecmdDataBufferBase & STATUS_REG = status_data;
- ecmdDataBufferBase & EXPECTED_REG = exp_data;
-
- if ( i_chiplet_base_addr == xbus)
- {
- FAPI_SET_HWP_ERROR(rc, RC_PROC_START_CLOCKS_XBUS_CHIPLET_CLK_STATUS_ERR);
- break;
- }
- if ( i_chiplet_base_addr == abus)
- {
- FAPI_SET_HWP_ERROR(rc, RC_PROC_START_CLOCKS_ABUS_CHIPLET_CLK_STATUS_ERR);
- break;
- }
- if ( i_chiplet_base_addr == pcie)
- {
- const fapi::Target & CHIP_IN_ERROR = i_target;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_START_CLOCKS_PCIE_CHIPLET_CLK_STATUS_ERR);
- break;
- }
-
- }
-
- } while(0);
-
- FAPI_DBG("proc_start_clocks_chiplet_check_clk_status_reg: End");
-
- return rc;
-}
-
-
-//------------------------------------------------------------------------------
-// function: utility subroutine to clear force align in GP0 register
-// parameters: i_target => chip target
-// i_chiplet_base_addr => base SCOM address for chiplet
-// returns: FAPI_RC_SUCCESS if operation was successful, else error
-//------------------------------------------------------------------------------
-fapi::ReturnCode proc_start_clocks_chiplet_clear_force_align(
- const fapi::Target& i_target,
- const uint32_t i_chiplet_base_addr)
-{
- fapi::ReturnCode rc;
- uint32_t rc_ecmd = 0;
- ecmdDataBufferBase mask_data(64);
- uint32_t scom_addr = i_chiplet_base_addr |
- GENERIC_GP0_AND_0x00000004;
-
- FAPI_DBG("proc_start_clocks_chiplet_clear_force_align: Start");
-
- do
- {
- // form AND mask to clear force align bit
- rc_ecmd |= mask_data.flushTo1();
- rc_ecmd |= mask_data.clearBit(GP0_FORCE_ALIGN_BIT);
- if (rc_ecmd)
- {
- FAPI_ERR("proc_start_clocks_chiplet_clear_force_align: Error 0x%x setting up data buffer to clear force align",
- rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
-
- // write chiplet GP0 AND mask register to clear force align bit
- rc = fapiPutScom(i_target, scom_addr, mask_data);
- if (rc)
- {
- FAPI_ERR("proc_start_clocks_chiplet_clear_force_align: fapiPutScom error (GP0_AND_0x%08X)",
- scom_addr);
- break;
- }
-
- } while(0);
-
- FAPI_DBG("proc_start_clocks_chiplet_clear_force_align: End");
-
- return rc;
-}
-
-
-//------------------------------------------------------------------------------
-// function: utility subroutine to clear flushmode inhibit in GP0 register
-// parameters: i_target => chip target
-// i_chiplet_base_addr => base SCOM address for chiplet
-// returns: FAPI_RC_SUCCESS if operation was successful, else error
-//------------------------------------------------------------------------------
-fapi::ReturnCode proc_start_clocks_chiplet_clear_flushmode_inhibit(
- const fapi::Target& i_target,
- const uint32_t i_chiplet_base_addr)
-{
- fapi::ReturnCode rc;
- uint32_t rc_ecmd = 0;
- ecmdDataBufferBase mask_data(64);
- uint32_t scom_addr = i_chiplet_base_addr |
- GENERIC_GP0_AND_0x00000004;
-
- FAPI_DBG("proc_start_clocks_chiplet_clear_flushmode_inhibit: Start");
-
- do
- {
- // form AND mask to clear force align bit
- rc_ecmd |= mask_data.flushTo1();
- rc_ecmd |= mask_data.clearBit(GP0_FLUSHMODE_INHIBIT_BIT);
- if (rc_ecmd)
- {
- FAPI_ERR("proc_start_clocks_chiplet_clear_flushmode_inhibit: Error 0x%x setting up data buffer to clear flushmode inhibit",
- rc_ecmd);
- rc.setEcmdError(rc_ecmd);
- break;
- }
-
- // write chiplet GP0 AND mask register to clear force align bit
- rc = fapiPutScom(i_target, scom_addr, mask_data);
- if (rc)
- {
- FAPI_ERR("proc_start_clocks_chiplet_clear_flushmode_inhibit: fapiPutScom error (GP0_AND_0x%08X)",
- scom_addr);
- break;
- }
-
- } while(0);
-
- FAPI_DBG("proc_start_clocks_chiplet_clear_flushmode_inhibit: End");
-
- return rc;
-}
-
-
-//------------------------------------------------------------------------------
-// function: utility subroutine to check chiplet FIR register for errors
-// after clocks have been started
-// parameters: i_target => chip target
-// i_chiplet_base_addr => base SCOM address for chiplet
-// returns: FAPI_RC_SUCCESS if operation was successful, else
-// RC_PROC_START_CLOCKS_CHIPLETS_FIR_ERR if FIR register data doesn't
-// match expected pattern
-//------------------------------------------------------------------------------
-fapi::ReturnCode proc_start_clocks_chiplet_check_fir(
- const fapi::Target& i_target,
- const uint32_t i_chiplet_base_addr)
-{
- fapi::ReturnCode rc;
- ecmdDataBufferBase fir_data(64);
- uint32_t scom_addr = i_chiplet_base_addr |
- GENERIC_XSTOP_0x00040000;
- const uint32_t xbus = X_BUS_CHIPLET_0x04000000;
- const uint32_t abus = A_BUS_CHIPLET_0x08000000;
- const uint32_t pcie = PCIE_CHIPLET_0x09000000;
-
-
- FAPI_DBG("proc_start_clocks_chiplet_check_fir: Start");
-
- do
- {
- // read chiplet FIR register
- rc = fapiGetScom(i_target, scom_addr, fir_data);
- if (rc)
- {
- FAPI_ERR("proc_start_clocks_chiplet_check_fir: fapiGetScom error (XSTOP_0x%08X)",
- scom_addr);
- break;
- }
-
- // check that value matches expected pattern
- // set a unique HWP_ERROR
- if (fir_data.getDoubleWord(0) !=
- PROC_START_CLOCKS_CHIPLETS_CHIPLET_FIR_REG_EXP)
- {
- FAPI_ERR("proc_start_clocks_chiplet_check_fir: FIR register actual value (%016llX) does not match expected value (%016llX)",
- fir_data.getDoubleWord(0), PROC_START_CLOCKS_CHIPLETS_CHIPLET_FIR_REG_EXP);
- ecmdDataBufferBase & FIR_REG = fir_data;
- const uint64_t & FIR_EXP_REG = PROC_START_CLOCKS_CHIPLETS_CHIPLET_FIR_REG_EXP;
-
-
- if ( i_chiplet_base_addr == xbus)
- {
- FAPI_SET_HWP_ERROR(rc, RC_PROC_START_CLOCKS_XBUS_CHIPLET_FIR_ERR);
- break;
- }
- if ( i_chiplet_base_addr == abus)
- {
- FAPI_SET_HWP_ERROR(rc, RC_PROC_START_CLOCKS_ABUS_CHIPLET_FIR_ERR);
- break;
- }
- if ( i_chiplet_base_addr == pcie)
- {
-
- const fapi::Target & CHIP_IN_ERROR = i_target;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_START_CLOCKS_PCIE_CHIPLET_FIR_ERR);
- break;
- }
-
- }
-
- } while(0);
-
- FAPI_DBG("proc_start_clocks_chiplet_check_fir: End");
-
- return rc;
-}
-
-
-//------------------------------------------------------------------------------
-// function: utility subroutine to run clock start sequence on a generic chiplet
-// parameters: i_target => chip target
-// i_chiplet_base_addr => base SCOM address for chiplet
-// returns: FAPI_RC_SUCCESS if operation was successful, else error
-//------------------------------------------------------------------------------
-fapi::ReturnCode proc_start_clocks_generic_chiplet(
- const fapi::Target& i_target,
- const uint32_t i_chiplet_base_addr)
-
-{
- fapi::ReturnCode rc;
- uint64_t chiplet_reg_vec;
- uint64_t chiplet_clkreg_vec;
-
- FAPI_DBG("proc_start_clocks_generic_chiplet: Start");
-
- do
- {
-
-
- // clear chiplet fence in GP3 register
- FAPI_DBG("Writing GP3 AND mask to clear chiplet fence ...");
- rc = proc_start_clocks_chiplet_clear_chiplet_fence(i_target,
- i_chiplet_base_addr);
- if (rc)
- {
- FAPI_ERR("proc_start_clocks_generic_chiplet: Error writing GP3 AND mask to clear chiplet fence");
- break;
- }
-
- // clear pervasive fence in GP0 register
- FAPI_DBG("Writing GP0 AND mask to clear pervasive fence ...");
- rc = proc_start_clocks_chiplet_clear_perv_fence(i_target,
- i_chiplet_base_addr);
- if (rc)
- {
- FAPI_ERR("proc_start_clocks_generic_chiplet: Error writing GP0 AND mask to clear pervasive fence");
- break;
- }
-
- // set functional clock mux selects in GP0 register
- FAPI_DBG("Writing GP0 AND mask to set functional clock mux selects ...");
- rc = proc_start_clocks_chiplet_set_mux_selects(i_target,
- i_chiplet_base_addr);
- if (rc)
- {
- FAPI_ERR("proc_start_clocks_generic_chiplet: Error writing GP0 AND mask to set functional clock mux selects");
- break;
- }
-
- // pick partial good region vector from SEEPROM
- FAPI_DBG("Get partial good region vector ...");
- rc = proc_start_clocks_get_partial_good_vector(i_target,
- i_chiplet_base_addr,
- & chiplet_reg_vec
- );
- if (rc)
- {
- FAPI_ERR("proc_start_clocks_generic_chiplet: Error getting partial good region vector");
- break;
- }
-
-
- // write clock region register to start clocks
- FAPI_DBG("Writing clock region register to start clocks ...");
- rc = proc_start_clocks_chiplet_set_clk_region_reg(i_target,
- i_chiplet_base_addr,
- chiplet_reg_vec,
- & chiplet_clkreg_vec
- );
-
-
- if (rc)
- {
- FAPI_ERR("proc_start_clocks_generic_chiplet: Error writing clock region register");
- break;
- }
-
- // check clock status register to ensure that all clocks are started
- FAPI_DBG("Checking clock status register ...");
- rc = proc_start_clocks_chiplet_check_clk_status_reg(i_target,
- i_chiplet_base_addr,
- chiplet_clkreg_vec);
- if (rc)
- {
- FAPI_ERR("proc_start_clocks_generic_chiplet: Error checking clock status register");
- break;
- }
-
- // clear force align bit in GP0 register
- FAPI_DBG("Writing GP0 AND mask to clear force align ...");
- rc = proc_start_clocks_chiplet_clear_force_align(i_target,
- i_chiplet_base_addr);
- if (rc)
- {
- FAPI_ERR("proc_start_clocks_generic_chiplet: Error writing GP0 AND mask to clear force align");
- break;
- }
-
- // clear flushmode inhibit bit in GP0 register
- FAPI_DBG("Writing GP0 AND mask to clear flushmode inhibit ...");
- rc = proc_start_clocks_chiplet_clear_flushmode_inhibit(i_target,
- i_chiplet_base_addr);
- if (rc)
- {
- FAPI_ERR("proc_start_clocks_generic_chiplet: Error writing GP0 AND mask to clear flushmode inhibit");
- break;
- }
-
- // check chiplet FIR register
- FAPI_DBG("Checking chiplet FIR register for errors after clock start ...");
- rc = proc_start_clocks_chiplet_check_fir(i_target,
- i_chiplet_base_addr);
- if (rc)
- {
- FAPI_ERR("proc_start_clocks_generic_chiplet: Error checking chiplet FIR register after clock start");
- break;
- }
-
- } while(0);
-
- FAPI_DBG("proc_start_clocks_generic_chiplet: End");
-
- return rc;
-}
-
-
-//------------------------------------------------------------------------------
-// Hardware Procedure
-//------------------------------------------------------------------------------
-fapi::ReturnCode proc_start_clocks_chiplets(const fapi::Target& i_target,
- bool xbus, bool abus, bool pcie)
-{
- fapi::ReturnCode rc;
- uint8_t xbus_enable_attr;
- uint8_t abus_enable_attr;
- uint8_t pcie_enable_attr;
-
- // mark HWP entry
- FAPI_IMP("proc_start_clocks_chiplets: Entering ...");
-
- do
- {
- if (xbus)
- {
- // query XBUS partial good attribute
- rc = FAPI_ATTR_GET(ATTR_PROC_X_ENABLE,
- &i_target,
- xbus_enable_attr);
- if (!rc.ok())
- {
- FAPI_ERR("proc_start_clocks_chiplets: Error querying ATTR_PROC_X_ENABLE");
- break;
- }
-
- if (xbus_enable_attr == fapi::ENUM_ATTR_PROC_X_ENABLE_ENABLE)
- {
- FAPI_DBG("Starting X bus chiplet clocks ...");
- rc = proc_start_clocks_generic_chiplet(
- i_target,
- X_BUS_CHIPLET_0x04000000);
- if (rc)
- {
- FAPI_ERR("proc_start_clocks_chiplets: Error from proc_start_clocks_generic_chiplet (X)");
- break;
- }
- }
- else
- {
- FAPI_DBG("Skipping XBUS chiplet clock start (partial good).");
- }
- }
-
- if (abus)
- {
- // query ABUS partial good attribute
- rc = FAPI_ATTR_GET(ATTR_PROC_A_ENABLE,
- &i_target,
- abus_enable_attr);
- if (!rc.ok())
- {
- FAPI_ERR("proc_start_clocks_chiplets: Error querying ATTR_PROC_A_ENABLE");
- break;
- }
-
- if (abus_enable_attr == fapi::ENUM_ATTR_PROC_A_ENABLE_ENABLE)
- {
- FAPI_DBG("Starting A bus chiplet clocks ...");
- rc = proc_start_clocks_generic_chiplet(
- i_target,
- A_BUS_CHIPLET_0x08000000);
- if (rc)
- {
- FAPI_ERR("proc_start_clocks_chiplets: Error from proc_start_clocks_generic_chiplet (A)");
- break;
- }
- }
- else
- {
- FAPI_DBG("Skipping ABUS chiplet clock start (partial good).");
- }
- }
-
- if (pcie)
- {
- // query PCIE partial good attribute
- rc = FAPI_ATTR_GET(ATTR_PROC_PCIE_ENABLE,
- &i_target,
- pcie_enable_attr);
- if (!rc.ok())
- {
- FAPI_ERR("proc_start_clocks_chiplets: Error querying ATTR_PROC_PCIE_ENABLE");
- break;
- }
-
- if (pcie_enable_attr == fapi::ENUM_ATTR_PROC_PCIE_ENABLE_ENABLE)
- {
- FAPI_DBG("Starting PCIE chiplet clocks ...");
- rc = proc_start_clocks_generic_chiplet(
- i_target,
- PCIE_CHIPLET_0x09000000);
- if (rc)
- {
- FAPI_ERR("proc_start_clocks_chiplets: Error from proc_start_clocks_generic_chiplet (PCIE)");
- break;
- }
- }
- else
- {
- FAPI_DBG("Skipping PCIE chiplet clock start (partial good).");
- }
- }
-
- } while (0);
-
- // mark HWP exit
- FAPI_IMP("proc_start_clocks_chiplets: Exiting ...");
- return rc;
-}
-
-
-} // extern "C"
diff --git a/src/usr/hwpf/hwp/nest_chiplets/proc_start_clocks_chiplets/proc_start_clocks_chiplets.H b/src/usr/hwpf/hwp/nest_chiplets/proc_start_clocks_chiplets/proc_start_clocks_chiplets.H
deleted file mode 100644
index 3a0a52e47..000000000
--- a/src/usr/hwpf/hwp/nest_chiplets/proc_start_clocks_chiplets/proc_start_clocks_chiplets.H
+++ /dev/null
@@ -1,115 +0,0 @@
-/* IBM_PROLOG_BEGIN_TAG */
-/* This is an automatically generated prolog. */
-/* */
-/* $Source: src/usr/hwpf/hwp/nest_chiplets/proc_start_clocks_chiplets/proc_start_clocks_chiplets.H $ */
-/* */
-/* OpenPOWER HostBoot Project */
-/* */
-/* Contributors Listed Below - COPYRIGHT 2012,2014 */
-/* [+] 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_start_clocks_chiplets.H,v 1.7 2014/09/26 19:01:22 jmcgill Exp $
-// $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/p8/working/procedures/ipl/fapi/proc_start_clocks_chiplets.H,v $
-//------------------------------------------------------------------------------
-// *|
-// *! (C) Copyright International Business Machines Corp. 2011
-// *! All Rights Reserved -- Property of IBM
-// *! *** ****
-// *|
-// *! TITLE : proc_start_clocks_chiplets.H
-// *! DESCRIPTION : Start X/A/PCIE chiplet clocks (FAPI)
-// *!
-// *! OWNER NAME : Ralph Koester Email: rkoester@de.ibm.com
-// *! BACKUP NAME : Gebhard Weber Email: gweber@de.ibm.com
-// *!
-// *! ADDITIONAL COMMENTS :
-// *!
-// *! The purpose of this procedure is to start the clocks for X/A/PCIe chiplets
-// *! Reference: FW specification: 7.3, PRV POR specification spreadsheet
-// *! - Start Xbus, ABus, PCIe clocks
-// *! - Drop fences
-// *!
-// *! Prerequisites: proc_a_x_pci_pll_setup
-// *!
-//------------------------------------------------------------------------------
-
-#ifndef _PROC_START_CLOCKS_CHIPLETS_H_
-#define _PROC_START_CLOCKS_CHIPLETS_H_
-
-//------------------------------------------------------------------------------
-// Includes
-//------------------------------------------------------------------------------
-
-#include <fapi.H>
-#include "p8_scom_addresses.H"
-
-//------------------------------------------------------------------------------
-// Structure definitions
-//------------------------------------------------------------------------------
-
-// function pointer typedef definition for HWP call support
-typedef fapi::ReturnCode
-(*proc_start_clocks_chiplets_FP_t)(const fapi::Target&, bool, bool, bool);
-
-extern "C" {
-
-//------------------------------------------------------------------------------
-// Constant definitions
-//------------------------------------------------------------------------------
-
-// GP3 register bit/field definitions
-const uint8_t GP3_FENCE_EN_BIT = 18;
-
-// GP0 register bit/field definitions
-const uint8_t GP0_ABSTCLK_MUXSEL_BIT = 0;
-const uint8_t GP0_SYNCCLK_MUXSEL_BIT = 1;
-const uint8_t GP0_FLUSHMODE_INHIBIT_BIT = 2;
-const uint8_t GP0_FORCE_ALIGN_BIT = 3;
-const uint8_t GP0_PERV_FENCE_BIT = 63;
-
-// Clock Region Register clock start data patterns
-const uint64_t PROC_START_CLOCKS_CHIPLETS_CLK_REGION_REG_START_NSL_ARY = 0x4FE0060000000000ull;
-const uint64_t PROC_START_CLOCKS_CHIPLETS_CLK_REGION_REG_START_ALL = 0x4FE00E0000000000ull;
-
-// Chiplet FIR register expected pattern
-const uint64_t PROC_START_CLOCKS_CHIPLETS_CHIPLET_FIR_REG_EXP = 0x0000000000000000ull;
-
-
-// Input clock region vector mask (for bit manipulation of clock regions)
-const uint64_t PROC_START_CLOCKS_CHIPLETS_CLOCK_REGION_MANIPULATION = 0xF0000FFFFFFFFFFFull;
-
-
-//------------------------------------------------------------------------------
-// Function prototype
-//------------------------------------------------------------------------------
-
-// function: FAPI proc_start_clocks_chiplets HWP entry point
-// start clocks for X/A/PCIE chiplets
-// parameters: i_target => P8 chip target
-// i_xbus => start X chiplet clocks?
-// i_abus => start A chiplet clocks?
-// i_pcie => start PCIE chiplet clocks?
-// returns: FAPI_RC_SUCCESS if clock start sequence completes successfully
-// else FAPI getscom/putscom return code for failing operation
-fapi::ReturnCode proc_start_clocks_chiplets(const fapi::Target& i_target,
- bool i_xbus,
- bool i_abus,
- bool i_pcie);
-
-} // extern "C"
-
-#endif // _PROC_START_CLOCKS_CHIPLETS_H_
OpenPOWER on IntegriCloud