diff options
Diffstat (limited to 'sbe/hwpf/src/plat_ring_traverse.C')
-rw-r--r-- | sbe/hwpf/src/plat_ring_traverse.C | 468 |
1 files changed, 0 insertions, 468 deletions
diff --git a/sbe/hwpf/src/plat_ring_traverse.C b/sbe/hwpf/src/plat_ring_traverse.C deleted file mode 100644 index 17577f5c..00000000 --- a/sbe/hwpf/src/plat_ring_traverse.C +++ /dev/null @@ -1,468 +0,0 @@ -/* IBM_PROLOG_BEGIN_TAG */ -/* This is an automatically generated prolog. */ -/* */ -/* $Source: sbe/hwpf/src/plat_ring_traverse.C $ */ -/* */ -/* OpenPOWER sbe Project */ -/* */ -/* Contributors Listed Below - COPYRIGHT 2016 */ -/* [+] 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 */ - -#include <plat_ring_traverse.H> - -#include <p9_putRingUtils.H> // for RS4 decompression utilities -#include <sbeXipUtils.H> -#include <fapi2AttributeService.H> // for FAPI_ATTR_GET -#include <plat_target_utils.H> // for plat_getChipTarget - -// SEEPROM start address -const uint32_t g_seepromAddr = SBE_SEEPROM_BASE_ORIGIN; -using namespace RING_TYPES; -const uint32_t CACHE_CONTAINED_MODE = 4; -const uint32_t RISK_LEVEL_MODE = 1; -#define CACHE_CONTAINED_MODE_OFFSET_IN_TOR 1 -#define RISK_LEVEL_MODE_OFFSET_IN_TOR 2 -#define OVERRIDE_VARIANT_SIZE 1 - - -/// -/// @brief This is a plat pecific (SBE Plat) function that locates the -/// Ring Container in the image and calls the functin to decompress the -/// RS4 string and apply it to the hardware. -/// @param i_target The target of Ring apply. -/// @param i_ringID The Ring ID that identifies the ring to be applied. -/// @return FAPI2_RC_SUCCESS on success, else error code. -/// -fapi2::ReturnCode findRS4InImageAndApply( - const fapi2::Target<fapi2::TARGET_TYPE_ALL>& i_target, - const RingID i_ringID, - const fapi2::RingMode i_ringMode) -{ - SBE_TRACE(">> findRS4InImageAndApply"); - - fapi2::ReturnCode l_rc = fapi2::FAPI2_RC_SUCCESS; - bool l_applyOverride = false; - - do - { - //Apply scanring from .ring section - - // Get the address of the Section-TOR - P9XipHeader *l_hdr = getXipHdr(); - P9XipSection *l_section = - &(l_hdr->iv_section[P9_XIP_SECTION_SBE_RINGS]); - - if (!(l_section->iv_offset)) - { - SBE_TRACE("No ring data in .RING section"); - break; - } - - SectionTOR *l_sectionTOR = (SectionTOR *)(g_seepromAddr + - l_section->iv_offset); - - l_rc = getRS4ImageFromTor(i_target,i_ringID,l_sectionTOR, - l_applyOverride, - l_section->iv_offset, - i_ringMode); - - if(l_rc != fapi2::FAPI2_RC_SUCCESS) - { - break; - } - - //Apply scanring from .ring section - l_applyOverride = true; - l_section = NULL; - l_section = - &(l_hdr->iv_section[P9_XIP_SECTION_SBE_OVERRIDES]); - - if (!(l_section->iv_offset)) - { - SBE_TRACE("No ring data in .OVERRIDE section"); - break; - } - - l_sectionTOR = NULL; - l_sectionTOR = (SectionTOR *)(g_seepromAddr + - l_section->iv_offset); - - - l_rc = getRS4ImageFromTor(i_target,i_ringID,l_sectionTOR, - l_applyOverride, - l_section->iv_offset, - i_ringMode); - }while(0); - - return l_rc; -} - -fapi2::ReturnCode getRS4ImageFromTor( - const fapi2::Target<fapi2::TARGET_TYPE_ALL>& i_target, - const RingID i_ringID, - SectionTOR *i_sectionTOR, - bool i_applyOverride, - const uint32_t i_sectionOffset, - const fapi2::RingMode i_ringMode) -{ - - // Determine the Offset ID and Ring Type for the given Ring ID. - uint32_t l_torOffset = 0; - RINGTYPE l_ringType = COMMON_RING; - CHIPLET_TYPE l_chipLetType; - fapi2::ReturnCode l_rc = fapi2::FAPI2_RC_SUCCESS; - do - { - - getRingProperties(i_ringID, l_torOffset, l_ringType,l_chipLetType); - if(INVALID_RING == l_torOffset) - { - SBE_TRACE("Invalid Ring ID - %d", i_ringID); - l_rc = fapi2::FAPI2_RC_INVALID_PARAMETER; - break; - } - - CHIPLET_DATA l_chipletData; - l_chipletData.iv_base_chiplet_number = 0; - l_chipletData.iv_num_common_rings = 0; - l_chipletData.iv_num_instance_rings = 0; - - uint8_t l_chipletID = i_target.getChipletNumber(); - uint16_t l_cpltRingVariantSz = 0; - uint32_t l_sectionOffset = 0; - switch(l_chipLetType) - { - case PERV_TYPE: // PERV - l_chipletData = PERV::g_pervData; - l_cpltRingVariantSz = i_applyOverride ? OVERRIDE_VARIANT_SIZE : - (sizeof(PERV::RingVariants) / - sizeof(l_cpltRingVariantSz)); - - l_sectionOffset = i_sectionTOR->TOC_PERV_COMMON_RING; - if(INSTANCE_RING == l_ringType) - { - l_sectionOffset = i_sectionTOR->TOC_PERV_INSTANCE_RING; - } - - break; - - case N0_TYPE: // Nest - N0 - l_chipletData = N0::g_n0Data; - l_cpltRingVariantSz = i_applyOverride ? OVERRIDE_VARIANT_SIZE : - (sizeof(N0::RingVariants) / - sizeof(l_cpltRingVariantSz)); - - l_sectionOffset = i_sectionTOR->TOC_N0_COMMON_RING; - if(INSTANCE_RING == l_ringType) - { - l_sectionOffset = i_sectionTOR->TOC_N0_INSTANCE_RING; - } - - break; - - case N1_TYPE: // Nest - N1 - l_chipletData = N1::g_n1Data; - l_cpltRingVariantSz = i_applyOverride ? OVERRIDE_VARIANT_SIZE : - (sizeof(N1::RingVariants) / - sizeof(l_cpltRingVariantSz)); - - l_sectionOffset = i_sectionTOR->TOC_N1_COMMON_RING; - if(INSTANCE_RING == l_ringType) - { - l_sectionOffset = i_sectionTOR->TOC_N1_INSTANCE_RING; - } - - break; - - case N2_TYPE: // Nest - N2 - l_chipletData = N2::g_n2Data; - l_cpltRingVariantSz = i_applyOverride ? OVERRIDE_VARIANT_SIZE : - (sizeof(N2::RingVariants) / - sizeof(l_cpltRingVariantSz)); - - l_sectionOffset = i_sectionTOR->TOC_N2_COMMON_RING; - if(INSTANCE_RING == l_ringType) - { - l_sectionOffset = i_sectionTOR->TOC_N2_INSTANCE_RING; - } - - break; - - case N3_TYPE: // Nest - N3 - l_chipletData = N3::g_n3Data; - l_cpltRingVariantSz = i_applyOverride ? OVERRIDE_VARIANT_SIZE : - (sizeof(N3::RingVariants) / - sizeof(l_cpltRingVariantSz)); - - l_sectionOffset = i_sectionTOR->TOC_N3_COMMON_RING; - if(INSTANCE_RING == l_ringType) - { - l_sectionOffset = i_sectionTOR->TOC_N3_INSTANCE_RING; - } - - break; - - case XB_TYPE: // XB - XBus2 - l_chipletData = XB::g_xbData; - l_cpltRingVariantSz = i_applyOverride ? OVERRIDE_VARIANT_SIZE : - (sizeof(XB::RingVariants) / - sizeof(l_cpltRingVariantSz)); - - l_sectionOffset = i_sectionTOR->TOC_XB_COMMON_RING; - if(INSTANCE_RING == l_ringType) - { - l_sectionOffset = i_sectionTOR->TOC_XB_INSTANCE_RING; - } - - break; - - case MC_TYPE: // MC - MC23 - l_chipletData = MC::g_mcData; - l_cpltRingVariantSz = i_applyOverride ? OVERRIDE_VARIANT_SIZE : - (sizeof(MC::RingVariants)/ - sizeof(l_cpltRingVariantSz)); - - l_sectionOffset = i_sectionTOR->TOC_MC_COMMON_RING; - if(INSTANCE_RING == l_ringType) - { - l_sectionOffset = i_sectionTOR->TOC_MC_INSTANCE_RING; - } - - break; - - case OB0_TYPE: // OB0 - l_chipletData = OB0::g_ob0Data; - l_cpltRingVariantSz = i_applyOverride ? OVERRIDE_VARIANT_SIZE : - (sizeof(OB0::RingVariants) / - sizeof(l_cpltRingVariantSz)); - - l_sectionOffset = i_sectionTOR->TOC_OB0_COMMON_RING; - if(INSTANCE_RING == l_ringType) - { - l_sectionOffset = i_sectionTOR->TOC_OB0_INSTANCE_RING; - } - - break; - case OB1_TYPE: // OB1 - l_chipletData = OB1::g_ob1Data; - l_cpltRingVariantSz = i_applyOverride ? OVERRIDE_VARIANT_SIZE : - (sizeof(OB1::RingVariants) / - sizeof(l_cpltRingVariantSz)); - - l_sectionOffset = i_sectionTOR->TOC_OB1_COMMON_RING; - if(INSTANCE_RING == l_ringType) - { - l_sectionOffset = i_sectionTOR->TOC_OB1_INSTANCE_RING; - } - - break; - case OB2_TYPE: // OB2 - l_chipletData = OB2::g_ob2Data; - l_cpltRingVariantSz = i_applyOverride ? OVERRIDE_VARIANT_SIZE : - (sizeof(OB2::RingVariants) / - sizeof(l_cpltRingVariantSz)); - - l_sectionOffset = i_sectionTOR->TOC_OB2_COMMON_RING; - if(INSTANCE_RING == l_ringType) - { - l_sectionOffset = i_sectionTOR->TOC_OB2_INSTANCE_RING; - } - - break; - case OB3_TYPE: // OB3 - l_chipletData = OB3::g_ob3Data; - l_cpltRingVariantSz = i_applyOverride ? OVERRIDE_VARIANT_SIZE : - (sizeof(OB3::RingVariants) / - sizeof(l_cpltRingVariantSz)); - - l_sectionOffset = i_sectionTOR->TOC_OB3_COMMON_RING; - if(INSTANCE_RING == l_ringType) - { - l_sectionOffset = i_sectionTOR->TOC_OB3_INSTANCE_RING; - } - - break; - - - case PCI0_TYPE: // PCI - PCI0 - l_chipletData = PCI0::g_pci0Data; - l_cpltRingVariantSz = i_applyOverride ? OVERRIDE_VARIANT_SIZE : - (sizeof(PCI0::RingVariants) / - sizeof(l_cpltRingVariantSz)); - - l_sectionOffset = i_sectionTOR->TOC_PCI0_COMMON_RING; - if(INSTANCE_RING == l_ringType) - { - l_sectionOffset = i_sectionTOR->TOC_PCI0_INSTANCE_RING; - } - - break; - - case PCI1_TYPE: // PCI - PCI1 - l_chipletData = PCI1::g_pci1Data; - l_cpltRingVariantSz = i_applyOverride ? OVERRIDE_VARIANT_SIZE : - (sizeof(PCI1::RingVariants) / - sizeof(l_cpltRingVariantSz)); - - l_sectionOffset = i_sectionTOR->TOC_PCI1_COMMON_RING; - if(INSTANCE_RING == l_ringType) - { - l_sectionOffset = i_sectionTOR->TOC_PCI1_INSTANCE_RING; - } - - break; - - case PCI2_TYPE: // PCI - PCI2 - l_chipletData = PCI2::g_pci2Data; - l_cpltRingVariantSz = i_applyOverride ? OVERRIDE_VARIANT_SIZE : - (sizeof(PCI2::RingVariants) / - sizeof(l_cpltRingVariantSz)); - - l_sectionOffset = i_sectionTOR->TOC_PCI2_COMMON_RING; - if(INSTANCE_RING == l_ringType) - { - l_sectionOffset = i_sectionTOR->TOC_PCI2_INSTANCE_RING; - } - - break; - - case EQ_TYPE: // EQ - Quad 0 - Quad 5 - l_chipletData = EQ::g_eqData; - l_cpltRingVariantSz = i_applyOverride ? OVERRIDE_VARIANT_SIZE : - ( sizeof(EQ::RingVariants) / - sizeof(l_cpltRingVariantSz)); - - l_sectionOffset = i_sectionTOR->TOC_EQ_COMMON_RING; - if(INSTANCE_RING == l_ringType) - { - l_sectionOffset = i_sectionTOR->TOC_EQ_INSTANCE_RING; - } - - break; - - case EC_TYPE: // EC - Core 0 - 23 - l_chipletData = EC::g_ecData; - l_cpltRingVariantSz = i_applyOverride ? OVERRIDE_VARIANT_SIZE : - (sizeof(EC::RingVariants) / - sizeof(l_cpltRingVariantSz)); - - l_sectionOffset = i_sectionTOR->TOC_EC_COMMON_RING; - if(INSTANCE_RING == l_ringType) - { - l_sectionOffset = i_sectionTOR->TOC_EC_INSTANCE_RING; - } - - break; - - default: - SBE_TRACE("Invalid Target/ChipletID - %d", l_chipletID); - l_rc = fapi2::FAPI2_RC_INVALID_PARAMETER; - break; - - } // end of switch(l_chipletID) - - if (l_rc) - { - break; - } - - FAPI_INF("l_sectionOffset %08x",l_sectionOffset); - // Determine the section TOR address for the ring - uint32_t *l_sectionAddr = reinterpret_cast<uint32_t *>(g_seepromAddr + - i_sectionOffset + l_sectionOffset); - - SBE_TRACE ("l_sectionAddr %08X",l_sectionAddr); - - - if(INSTANCE_RING == l_ringType) - { - if ( l_chipletID > l_chipletData.iv_base_chiplet_number) - { - uint8_t l_chipletOffset = - (l_chipletID - l_chipletData.iv_base_chiplet_number); - l_sectionAddr += (l_chipletOffset * - (l_chipletData.iv_num_instance_rings )); - } - } - - // The ring variants in section TOR are expected to be in the sequence - - // 1. Base - // 2. Cache-Contained - // 3. Risk Level - - SBE_TRACE ("l_sectionAddr %08X",l_sectionAddr); - - // TOR records of Ring TOR are 2 bytes in size. - uint16_t *l_ringTorAddr = reinterpret_cast<uint16_t *>(l_sectionAddr) + - (l_torOffset * l_cpltRingVariantSz); - SBE_TRACE ("ring tor address %04X\n",l_ringTorAddr); - - // If there are non-base variants of the ring, we'll have to check - // attributes to determine the sequence of ring apply. - if( l_cpltRingVariantSz > 1) - { - // Check if this is cache-contained IPL - uint8_t l_iplPhase; - FAPI_ATTR_GET(fapi2::ATTR_SYSTEM_IPL_PHASE, - fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> (), - l_iplPhase); - - // 4 : Cache Contained mode - if(CACHE_CONTAINED_MODE == l_iplPhase) - { - l_ringTorAddr += CACHE_CONTAINED_MODE_OFFSET_IN_TOR; - } - else - { - // Check if this is risk-level IPL - uint8_t l_riskLevel; - FAPI_ATTR_GET(fapi2::ATTR_RISK_LEVEL, - fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> (), - l_riskLevel); - if(RISK_LEVEL_MODE == l_riskLevel) - { - l_ringTorAddr += RISK_LEVEL_MODE_OFFSET_IN_TOR; - } - } - } - - SBE_TRACE("l_ringTorAddr %u",*l_ringTorAddr); - if(*l_ringTorAddr != 0) - { - uint8_t *l_addr = reinterpret_cast<uint8_t *>(l_sectionAddr); - uint8_t *l_rs4Address = reinterpret_cast<uint8_t *> - (l_addr + *l_ringTorAddr); - SBE_TRACE("l_rs4Address %08x",l_rs4Address); - l_rc = rs4DecompressionSvc(i_target,l_rs4Address, - i_applyOverride,i_ringMode); - if(l_rc != fapi2::FAPI2_RC_SUCCESS) - { - SBE_TRACE("Error from applyRS4_SS"); - break; - } - } - else - { - SBE_TRACE("Ring image is not found for this is ringId %u",i_ringID); - } - }while(0); - - SBE_TRACE("<< findRS4InImageAndApply Exit for ringId %d",i_ringID); - return l_rc; -} - |