diff options
4 files changed, 3129 insertions, 2 deletions
diff --git a/openpower/package/hostboot-binaries/hostboot_binaries.mk b/openpower/package/hostboot-binaries/hostboot_binaries.mk index e65dea44..f8105a3d 100644 --- a/openpower/package/hostboot-binaries/hostboot_binaries.mk +++ b/openpower/package/hostboot-binaries/hostboot_binaries.mk @@ -4,7 +4,7 @@ # ################################################################################ -HOSTBOOT_BINARIES_VERSION ?= d45f5e3c086decb9c437cc3c6410108487334663 +HOSTBOOT_BINARIES_VERSION ?= ed06137f062d6a716d2a89d852aac984036db256 HOSTBOOT_BINARIES_SITE ?= $(call github,open-power,hostboot-binaries,$(HOSTBOOT_BINARIES_VERSION)) HOSTBOOT_BINARIES_LICENSE = Apache-2.0 diff --git a/openpower/package/hostboot/p9Patches/hostboot-0002-TOR-Magic-header-support.patch b/openpower/package/hostboot/p9Patches/hostboot-0002-TOR-Magic-header-support.patch new file mode 100644 index 00000000..f13ec7fe --- /dev/null +++ b/openpower/package/hostboot/p9Patches/hostboot-0002-TOR-Magic-header-support.patch @@ -0,0 +1,1429 @@ +From 583cf99ed879916632f823444129c21056267d4c Mon Sep 17 00:00:00 2001 +From: Claus Michael Olsen <cmolsen@us.ibm.com> +Date: Tue, 24 Jan 2017 23:42:50 -0600 +Subject: [PATCH] TOR Magic header support + +HW-Image-Coreq=Yes +SBE-Image-Coreq=No (SBE image is back compatible) + +This commit adds an 12-byte header to all TOR ring sections: +- for improved self-containment of TOR ring sections incl + stand-alone ring sections like .overrides which, currently, + has no meaningful size info associated with it in the PNOR, +- to support a more data-driven implementation of TOR API, +- to eliminate the current usage of XIP_MAGIC ids to inform the + TOR APIs which ring section they are dealing with, and +- to improve debugging binary ring sections. + +The TOR header expands on the current TorNumDdLevels field in the +HW ring section and is added to all other ring sections as well, +e.g. for the SBE and OVRD ring sections. Most importantly, the +TOR header adds the TOR magic number which is unique for each +possible TOR ring section. Also, of quite practical importance, +a size field has been added so that the size of a true standalone +section like .overrides can be extracted (since its size in PNOR +is not indicative of its size). + +Further, to support the use of ddLevel and chipType in the TOR +header fields, these two data points need to be always supplied +whenever calling ring_apply. Thus, updates have been made to the +ring_apply.mk file as well as the override .pl script. While +making these changes, we also decided to change the --type arg +to the --bOverrides arg to make the arguments being passed less +confusing in view of the Centaur commit that's coming and its +demands to make codes less data dependent, incl make and script +files which should simply inform the functional intent of the +"user". The user shouldn't presume it knows about which specific +type of ring section needs to be produced. + +Further, the DD level block struct has been increased from 8B +to 12B to avoid the unnecessarily complex merging of the +ddLevel and offset into the same 4B field. It's included in +this commit since this is also going to break the lab and +because the required code changes are in the same places +where the code changes needed for the TOR header are. + +Further, xip_tool has been updated to support the new TOR +header so that it can be called by supplying a standalone +ring section, such as overrides.bin. Various changes have +been made in xip_tool's dissect section to support overrides +as well. + +This code uses many of the code changes in 33778 except +changes to p9_tor.C|H are at a bare minimum focusing on the +functional changes and keeping any cleanups to a minimum changing +only some variable names associated with the functional changes +for improved readability of the code. + +CMVC-Prereq: 1034144 +CMVC-Prereq: 1035575 +Change-Id: I29ba8905ac55dad5c10878a94fb94468e5580ea0 +Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/35372 +Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> +Tested-by: HWSV CI <hwsv-ci+hostboot@us.ibm.com> +Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com> +Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/37994 +Reviewed-by: Christian R. Geddes <crgeddes@us.ibm.com> +--- + src/build/citest/etc/bbuild | 2 +- + src/build/citest/etc/workarounds.postsimsetup | 23 +- + .../p9/procedures/hwp/customize/p9_xip_customize.C | 1 - + .../p9/procedures/hwp/pm/p9_hcode_image_build.C | 7 - + src/import/chips/p9/utils/imageProcs/p9_ringId.H | 23 +- + src/import/chips/p9/utils/imageProcs/p9_tor.C | 362 +++++++++++---------- + src/import/chips/p9/utils/imageProcs/p9_tor.H | 97 +++--- + 7 files changed, 286 insertions(+), 229 deletions(-) + +diff --git a/src/build/citest/etc/bbuild b/src/build/citest/etc/bbuild +index aaea664..fac4cb6 100644 +--- a/src/build/citest/etc/bbuild ++++ b/src/build/citest/etc/bbuild +@@ -1,3 +1,3 @@ +-/esw/fips910/Builds/b0908a_1738.910 ++/esw/fips910/Builds/b0930a_1740.910 + + +diff --git a/src/build/citest/etc/workarounds.postsimsetup b/src/build/citest/etc/workarounds.postsimsetup +index cced000..70d7f20 100755 +--- a/src/build/citest/etc/workarounds.postsimsetup ++++ b/src/build/citest/etc/workarounds.postsimsetup +@@ -32,22 +32,29 @@ + #mkdir -p $sb/simu/data/cec-chip/ + #cp $BACKING_BUILD/src/simu/data/cec-chip/base_cec_chip_file $sb/simu/data/cec-chip + #patch -p0 $sb/simu/data/cec-chip/base_cec_chip_file $PROJECT_ROOT/src/build/citest/etc/patches/my_patch_File +-#pull in new actions in p9_memory.act RTC 171066 +-#pull in SBE makefile change for DD2.1 +-sbex -t 1032604 +-cd $sb/sbei/sbfw/ +-mk -a && mk install_all +-cd - ++ + + #changes needed for Cumulus + #@TODO RTC:178949 + echo "Applying SIMICS workaround to support Cumulus" + sbex -t 1031560 +-sbex -t 1032617 +-sbex -t 1033442 + cd $sb/simu + mk -a + + echo "Copying centaur and p9c action files" + sbex -t 1032952 + sbex -t 1033805 ++ ++#pull in href tor ++sbex -t 1035576 ++#pull in hwsv tor ++sbex -t 1034144 ++ ++ ++mkdir $sb/../obj/ppc/hwsv/server/buildhwpfimport/hwpf2/tools/x86_binaries -p ++cp /gsa/rchgsa/home/c/r/crgeddes/documents/hbBuild/p9_ipl_build $sb/../obj/ppc/hwsv/server/buildhwpfimport/hwpf2/tools/x86_binaries/ ++ ++ ++ ++ ++ +diff --git a/src/import/chips/p9/procedures/hwp/customize/p9_xip_customize.C b/src/import/chips/p9/procedures/hwp/customize/p9_xip_customize.C +index c30f31e..cd6e494 100644 +--- a/src/import/chips/p9/procedures/hwp/customize/p9_xip_customize.C ++++ b/src/import/chips/p9/procedures/hwp/customize/p9_xip_customize.C +@@ -302,7 +302,6 @@ fapi2::ReturnCode get_overlays_ring( + // Get Gptr overlay ring from overlays section into ringBuf2 + l_rc = P9_TOR::tor_get_single_ring( + i_overlaysSection, +- P9_XIP_MAGIC_SEEPROM, + l_ddLevel, + i_ringId, + P9_TOR::SBE, +diff --git a/src/import/chips/p9/procedures/hwp/pm/p9_hcode_image_build.C b/src/import/chips/p9/procedures/hwp/pm/p9_hcode_image_build.C +index 781208b..e34a97d 100644 +--- a/src/import/chips/p9/procedures/hwp/pm/p9_hcode_image_build.C ++++ b/src/import/chips/p9/procedures/hwp/pm/p9_hcode_image_build.C +@@ -1893,7 +1893,6 @@ uint32_t getPpeScanRings( void* const i_pHwImage, + sgpeOvrdRings.getRingName( quadCmnOvrdRingId ) ); + + rc = tor_get_single_ring( i_pOverride, +- P9_XIP_MAGIC_SEEPROM, + i_chipState.getChipLevel(), + quadCmnOvrdRingId, + P9_TOR::SBE, +@@ -2373,7 +2372,6 @@ fapi2::ReturnCode layoutCmnRingsForCme( Homerlayout_t* i_pHomer, + } + + rc = tor_get_single_ring( i_ringData.iv_pRingBuffer, +- P9_XIP_MAGIC_CME, + i_chipState.getChipLevel(), + coreCmnRingId, + P9_TOR::CME, +@@ -2491,7 +2489,6 @@ fapi2::ReturnCode layoutInstRingsForCme( Homerlayout_t* i_pHomer, + + tempSize = i_ringData.iv_sizeWorkBuf1; + rc = tor_get_single_ring( i_ringData.iv_pRingBuffer, +- P9_XIP_MAGIC_CME, + i_chipState.getChipLevel(), + io_cmeRings.getInstRingId(0), + P9_TOR::CME, +@@ -2556,7 +2553,6 @@ fapi2::ReturnCode layoutInstRingsForCme( Homerlayout_t* i_pHomer, + + tempSize = i_ringData.iv_sizeWorkBuf1; + rc = tor_get_single_ring( i_ringData.iv_pRingBuffer, +- P9_XIP_MAGIC_CME, + i_chipState.getChipLevel(), + io_cmeRings.getInstRingId(0), + P9_TOR::CME, +@@ -2667,7 +2663,6 @@ fapi2::ReturnCode layoutCmeScanOverride( Homerlayout_t* i_pHomer, + cmeOvrdRings.getRingName( coreCmnOvrdRingId ) ); + + rc = tor_get_single_ring( i_pOverride, +- P9_XIP_MAGIC_SEEPROM, + i_chipState.getChipLevel(), + coreCmnOvrdRingId, + P9_TOR::SBE, +@@ -3019,7 +3014,6 @@ fapi2::ReturnCode layoutCmnRingsForSgpe( Homerlayout_t* i_pHomer, + l_ringVariant = BASE; + } + rc = tor_get_single_ring( i_ringData.iv_pRingBuffer, +- P9_XIP_MAGIC_SGPE, + i_chipState.getChipLevel(), + torRingId, + P9_TOR::SGPE, +@@ -3138,7 +3132,6 @@ fapi2::ReturnCode layoutInstRingsForSgpe( Homerlayout_t* i_pHomer, + + quadSpecRingId = io_sgpeRings.getInstRingId( ringIndex ); + rc = tor_get_single_ring( i_ringData.iv_pRingBuffer, +- P9_XIP_MAGIC_SGPE, + i_chipState.getChipLevel(), + quadSpecRingId, + P9_TOR::SGPE, +diff --git a/src/import/chips/p9/utils/imageProcs/p9_ringId.H b/src/import/chips/p9/utils/imageProcs/p9_ringId.H +index 2c29ba3..d78e52b 100644 +--- a/src/import/chips/p9/utils/imageProcs/p9_ringId.H ++++ b/src/import/chips/p9/utils/imageProcs/p9_ringId.H +@@ -68,9 +68,10 @@ typedef enum RingVariant // Base variables + NOT_VALID = 0xff + } RingVariant_t; + ++#define P9_RINGID_VARIANT_ORDER_SIZE 3 + typedef struct + { +- uint8_t variant[3]; ++ uint8_t variant[P9_RINGID_VARIANT_ORDER_SIZE]; + } RingVariantOrder; + + +@@ -244,6 +245,7 @@ const uint8_t INSTANCE_RING_MASK = 0x7F; + + namespace PERV + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -289,6 +291,7 @@ static const CHIPLET_DATA g_pervData = + + namespace N0 + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -318,12 +321,13 @@ static const CHIPLET_DATA g_n0Data = + 2, // N0 Chiplet ID is 2. + 9, // 9 common rings for N0 Chiplet + 3, // 3 instance specific rings for N0 chiplet +- 3 ++ 3 // FIXME: number of variants? doesn't match RingVariants below! + }; + }; + + namespace N1 + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -363,6 +367,7 @@ static const CHIPLET_DATA g_n1Data = + + namespace N2 + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -398,6 +403,7 @@ static const CHIPLET_DATA g_n2Data = + + namespace N3 + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -434,6 +440,7 @@ static const CHIPLET_DATA g_n3Data = + + namespace XB + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -476,6 +483,7 @@ static const CHIPLET_DATA g_xbData = + + namespace MC + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -519,6 +527,7 @@ static const CHIPLET_DATA g_mcData = + + namespace OB0 + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -551,6 +560,7 @@ static const CHIPLET_DATA g_ob0Data = + + namespace OB1 + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -584,6 +594,7 @@ static const CHIPLET_DATA g_ob1Data = + + namespace OB2 + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -616,6 +627,7 @@ static const CHIPLET_DATA g_ob2Data = + + namespace OB3 + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -647,6 +659,7 @@ static const CHIPLET_DATA g_ob3Data = + }; // end of namespace OB2 + namespace PCI0 + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -676,6 +689,7 @@ static const CHIPLET_DATA g_pci0Data = + + namespace PCI1 + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -705,6 +719,7 @@ static const CHIPLET_DATA g_pci1Data = + + namespace PCI2 + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -735,6 +750,7 @@ static const CHIPLET_DATA g_pci2Data = + + namespace EQ + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -832,6 +848,7 @@ static const CHIPLET_DATA g_eqData = + + namespace EC + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -868,7 +885,7 @@ static const uint8_t INVALID_RING = 0xFF; + #ifndef __PPE__ + struct ringProperties_t + { +- uint8_t iv_torOffSet; ++ uint8_t iv_torOffSet; // FIXME: misnomer + char iv_name[50]; + CHIPLET_TYPE iv_type; + }; +diff --git a/src/import/chips/p9/utils/imageProcs/p9_tor.C b/src/import/chips/p9/utils/imageProcs/p9_tor.C +index b9b793a..d4879c8 100644 +--- a/src/import/chips/p9/utils/imageProcs/p9_tor.C ++++ b/src/import/chips/p9/utils/imageProcs/p9_tor.C +@@ -41,9 +41,7 @@ + // While using tor_tor_get_block_of_rings and tor_get_single_ring API, + // it is used pass by value + // +-#include "p9_ringId.H" + #include "p9_tor.H" +-#include "p9_xip_image.h" + #include "p9_scan_compression.H" + #include "p9_infrastruct_help.H" + +@@ -72,7 +70,6 @@ const char* ringVariantName[] = { "BASE", + ////////////////////////////////////////////////////////////////////////////////// + static + int get_ring_from_sbe_image( void* i_ringSection, // Ring section ptr +- uint64_t i_magic, // Image Magic Number + RingID i_ringId, // Ring ID + uint16_t i_ddLevelOffset, // DD level offset (wrt i_ringSection) + RingType_t& io_RingType, // Common, Instance +@@ -85,11 +82,13 @@ int get_ring_from_sbe_image( void* i_ringSection, // Ring section + uint32_t i_dbgl ) // Debug option + { + int rc = TOR_SUCCESS; ++ uint32_t torMagic; + uint32_t tor_slot_no = 0; // TOR slot number (within a TOR chiplet section) + uint16_t dd_level_offset; // Local DD level offset, if any (wrt i_ringSection) + uint32_t acc_offset = 0; // Accumulating offset to next TOR offset +- uint32_t ppe_offset = 0; // Local offset to where SBE PPE section starts +- uint32_t cplt_offset = 0; // Local offset to where SBE chiplet section starts ++ uint32_t ppe_offset = 0; // Local offset to where SBE PPE ring section starts ++ uint32_t ppe_cplt_offset = 0; // Local offset to where the pool of chiplets starts ++ uint32_t cplt_offset = 0; // Local offset to where a specific chiplet section starts + uint16_t ring_offset = 0; // Local offset to where SBE ring container/block starts + uint32_t ring_size = 0; // Size of whole ring container/block. + RingVariantOrder* ring_variant_order; +@@ -98,23 +97,35 @@ int get_ring_from_sbe_image( void* i_ringSection, // Ring section + CHIPLET_DATA* l_cpltData; + uint8_t l_num_variant; + +- if (i_magic == P9_XIP_MAGIC_HW) ++ torMagic = be32toh( ((TorHeader_t*)i_ringSection)->magic ); ++ ++ // Calculate the offset (wrt start of ringSection) to the SBE PPE ++ // ring section. This offset, ppe_offset, will point to the ++ // TORB header of the SBE PPE ring section. ++ if (torMagic == TOR_MAGIC_HW) + { + dd_level_offset = i_ddLevelOffset; + ppe_offset = *(uint32_t*)((uint8_t*)i_ringSection + dd_level_offset); + ppe_offset = be32toh(ppe_offset); + } +- else if (i_magic == P9_XIP_MAGIC_SEEPROM) ++ else if (torMagic == TOR_MAGIC_SBE || ++ torMagic == TOR_MAGIC_OVRD || ++ torMagic == TOR_MAGIC_OVLY) + { + ppe_offset = 0; + dd_level_offset = 0; + } + else + { +- MY_ERR("Magic number i_magic=0x%016lX is not valid for SBE\n", (uintptr_t)i_magic); ++ MY_ERR("torMagic=0x%08x is not valid for SBE\n", torMagic); + return TOR_INVALID_MAGIC_NUMBER; + } + ++ // Calculate the offset (wrt start of ringSection) to where the ++ // pool of chiplet offsets begins in the SBE PPE ring section, ++ // which is right after the TORB header. ++ ppe_cplt_offset = ppe_offset + sizeof(TorHeader_t); ++ + // Looper for each SBE chiplet + for (int iCplt = 0; iCplt < SBE_NOOF_CHIPLETS; iCplt++) + { +@@ -129,7 +140,7 @@ int get_ring_from_sbe_image( void* i_ringSection, // Ring section + return TOR_INVALID_CHIPLET; + } + +- l_num_variant = (i_RingVariant == OVERRIDE || i_RingVariant == OVERLAY) ? 1 : l_num_variant; ++ l_num_variant = (torMagic == TOR_MAGIC_OVRD || torMagic == TOR_MAGIC_OVLY) ? 1 : l_num_variant; + + if (i_dbgl > 1) + { +@@ -154,19 +165,20 @@ int get_ring_from_sbe_image( void* i_ringSection, // Ring section + (ring_id_list_common + i)->ringName, i, iVariant); + } + +- if ((strcmp( (ring_id_list_common + i)->ringName, +- RING_PROPERTIES[i_ringId].iv_name) == 0) +- && ( i_RingVariant == ring_variant_order->variant[iVariant] +- || ( (i_RingVariant == OVERRIDE || i_RingVariant == OVERLAY) && i_magic == P9_XIP_MAGIC_SEEPROM))) ++ if ( ( strcmp( (ring_id_list_common + i)->ringName, ++ RING_PROPERTIES[i_ringId].iv_name) == 0 ) && ++ ( i_RingVariant == ring_variant_order->variant[iVariant] || ++ torMagic == TOR_MAGIC_OVRD || ++ torMagic == TOR_MAGIC_OVLY ) ) + { + strcpy(o_ringName, RING_PROPERTIES[i_ringId].iv_name); +- +- acc_offset = dd_level_offset + ppe_offset + iCplt * sizeof(TorPpeBlock_t); ++ acc_offset = dd_level_offset + ++ ppe_cplt_offset + ++ iCplt * sizeof(TorPpeBlock_t); + cplt_offset = *(uint32_t*)( (uint8_t*)i_ringSection + + acc_offset ); + cplt_offset = be32toh(cplt_offset); +- +- acc_offset = dd_level_offset + ppe_offset + cplt_offset; ++ acc_offset = dd_level_offset + ppe_cplt_offset + cplt_offset; + ring_offset = *(uint16_t*)( (uint8_t*)i_ringSection + + acc_offset + + tor_slot_no * sizeof(ring_offset) ); +@@ -175,7 +187,7 @@ int get_ring_from_sbe_image( void* i_ringSection, // Ring section + if (i_RingBlockType == GET_SINGLE_RING) + { + acc_offset = dd_level_offset + +- ppe_offset + ++ ppe_cplt_offset + + cplt_offset + + ring_offset; + ring_size = be16toh( ((CompressedScanData*) +@@ -233,7 +245,7 @@ int get_ring_from_sbe_image( void* i_ringSection, // Ring section + " Chiplet section's offset to RS4 header = 0x%08x \n" + " Full offset to RS4 header = 0x%08x \n" + " Ring size = 0x%08x \n", +- i, dd_level_offset, ppe_offset, cplt_offset, ring_offset, acc_offset, ring_size); ++ i, dd_level_offset, ppe_cplt_offset, cplt_offset, ring_offset, acc_offset, ring_size); + } + + return rc; +@@ -296,14 +308,16 @@ int get_ring_from_sbe_image( void* i_ringSection, // Ring section + strcpy(o_ringName, RING_PROPERTIES[i_ringId].iv_name); + + acc_offset = dd_level_offset + +- ppe_offset + ++ ppe_cplt_offset + + iCplt * sizeof(TorPpeBlock_t) + + sizeof(cplt_offset); // Jump to instance offset + cplt_offset = *(uint32_t*)( (uint8_t*)i_ringSection + + acc_offset ); + cplt_offset = be32toh(cplt_offset); + +- acc_offset = cplt_offset + dd_level_offset + ppe_offset; ++ acc_offset = cplt_offset + ++ dd_level_offset + ++ ppe_cplt_offset; + ring_offset = *(uint16_t*)( (uint8_t*)i_ringSection + + acc_offset + + tor_slot_no * sizeof(ring_offset) ); +@@ -312,7 +326,7 @@ int get_ring_from_sbe_image( void* i_ringSection, // Ring section + if (i_RingBlockType == GET_SINGLE_RING) + { + acc_offset = dd_level_offset + +- ppe_offset + ++ ppe_cplt_offset + + cplt_offset + + ring_offset; + ring_size = be16toh( ((CompressedScanData*) +@@ -376,7 +390,7 @@ int get_ring_from_sbe_image( void* i_ringSection, // Ring section + " Chiplet section's offset to RS4 header = 0x%08x \n" + " Full offset to RS4 header = 0x%08x \n" + " Ring size = 0x%08x \n", +- i, dd_level_offset, ppe_offset, cplt_offset, ring_offset, acc_offset, ring_size); ++ i, dd_level_offset, ppe_cplt_offset, cplt_offset, ring_offset, acc_offset, ring_size); + } + + return rc; +@@ -441,7 +455,6 @@ int get_ring_from_sbe_image( void* i_ringSection, // Ring section + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + static + int get_ring_from_sgpe_image ( void* i_ringSection, // Ring section ptr +- uint64_t i_magic, // Image Magic Number + RingID i_ringId, // Ring ID + uint16_t i_ddLevelOffset, // DD level offset + RingType_t& io_RingType, // Common, Instance +@@ -453,24 +466,42 @@ int get_ring_from_sgpe_image ( void* i_ringSection, // Ring sectio + char* o_ringName, // Name of ring + uint32_t i_dbgl ) // Debug option + { ++ uint32_t torMagic; + uint32_t acc_offset = 0; // Accumulating offset to next TOR offset slot + uint32_t ring_offset = 0; + uint16_t chiplet_offset = 0; + uint32_t ringSize = 0; + int temp = (i_ddLevelOffset >> 2) + 4; // converting byte to word counter + uint32_t spge_offset = 0; ++ uint32_t ppe_cplt_offset = 0; // Local offset to where the pool of chiplets starts ++ ++ torMagic = be32toh( ((TorHeader_t*)i_ringSection)->magic ); + +- if (i_magic == P9_XIP_MAGIC_HW) ++ // Calculate the offset (wrt start of ringSection) to the SGPE PPE ++ // ring section. This offset, inappropriately denoted "temp" here ++ // but which needs to be renamed to "ppe_offset" asap, will point ++ // to the TORG header of the SGPE PPE ring section. ++ if (torMagic == TOR_MAGIC_HW) + { + spge_offset = *((uint32_t*)i_ringSection + temp); //DD level offset index + temp = be32toh(spge_offset); + } +- else if (i_magic == P9_XIP_MAGIC_SGPE) ++ else if (torMagic == TOR_MAGIC_SGPE) + { + spge_offset = 0; + i_ddLevelOffset = 0; + temp = be32toh(spge_offset); + } ++ else ++ { ++ MY_ERR("torMagic=0x%08x is not valid for SGPE\n", torMagic); ++ return TOR_INVALID_MAGIC_NUMBER; ++ } ++ ++ // Calculate the offset (wrt start of ringSection) to where the ++ // pool of chiplet offsets begins in the SGPE PPE ring section, ++ // which is right after the TORG header. ++ ppe_cplt_offset = temp + sizeof(TorHeader_t); + + GenRingIdList* ring_id_list_common = NULL; + GenRingIdList* ring_id_list_instance = NULL; +@@ -494,18 +525,18 @@ int get_ring_from_sgpe_image ( void* i_ringSection, // Ring sectio + RING_PROPERTIES[i_ringId].iv_name) == 0) && ( i_RingVariant == j )) + { + strcpy(o_ringName, RING_PROPERTIES[i_ringId].iv_name); +- uint32_t var = 0 + i_ddLevelOffset + temp; ++ uint32_t var = 0 + i_ddLevelOffset + ppe_cplt_offset; + int temp1 = var / sizeof(uint32_t); + ring_offset = *((uint32_t*)i_ringSection + temp1); + ring_offset = be32toh(ring_offset); +- var = ring_offset + i_ddLevelOffset + temp; ++ var = ring_offset + i_ddLevelOffset + ppe_cplt_offset; + temp1 = var / sizeof(uint16_t) + local; + chiplet_offset = *((uint16_t*)i_ringSection + temp1); + chiplet_offset = be16toh(chiplet_offset); + + if (i_RingBlockType == GET_SINGLE_RING) + { +- var = ring_offset + chiplet_offset + i_ddLevelOffset + temp; ++ var = ring_offset + chiplet_offset + i_ddLevelOffset + ppe_cplt_offset; + ringSize = be16toh( ((CompressedScanData*) + ((uint8_t*)i_ringSection + + var))->iv_size ); +@@ -545,7 +576,7 @@ int get_ring_from_sgpe_image ( void* i_ringSection, // Ring sectio + { + MY_INF(" Hex details (SGPE): Chiplet #%d offset 0x%08x local offset 0x%08x " \ + "ring offset 0x%08x start adr 0x%08x ringSize=0x%08x \n", +- i, var, temp, ring_offset, chiplet_offset, ringSize); ++ i, var, ppe_cplt_offset, ring_offset, chiplet_offset, ringSize); + } + + return TOR_RING_FOUND; +@@ -611,18 +642,18 @@ int get_ring_from_sgpe_image ( void* i_ringSection, // Ring sectio + if ( i == io_instanceId && k == i_RingVariant ) + { + strcpy(o_ringName, RING_PROPERTIES[i_ringId].iv_name); +- uint32_t var = CPLT_OFFSET_SIZE + i_ddLevelOffset + temp; ++ uint32_t var = CPLT_OFFSET_SIZE + i_ddLevelOffset + ppe_cplt_offset; + int temp1 = var / sizeof(uint32_t); + ring_offset = *((uint32_t*)i_ringSection + temp1); + ring_offset = be32toh(ring_offset); +- var = ring_offset + i_ddLevelOffset + temp; ++ var = ring_offset + i_ddLevelOffset + ppe_cplt_offset; + temp1 = var / sizeof(uint16_t) + local; + chiplet_offset = *((uint16_t*)i_ringSection + temp1); + chiplet_offset = be16toh(chiplet_offset); + + if (i_RingBlockType == GET_SINGLE_RING) + { +- var = ring_offset + chiplet_offset + i_ddLevelOffset + temp; ++ var = ring_offset + chiplet_offset + i_ddLevelOffset + ppe_cplt_offset; + ringSize = be16toh( ((CompressedScanData*) + ((uint8_t*)i_ringSection + + var))->iv_size ); +@@ -667,7 +698,7 @@ int get_ring_from_sgpe_image ( void* i_ringSection, // Ring sectio + { + MY_INF(" Hex details (SGPE): Chiplet #%d offset 0x%08x local offset 0x%08x " \ + "ring offset 0x%08x start adr 0x%08x ringSize=0x%08x \n", +- i, var, temp, ring_offset, chiplet_offset, ringSize); ++ i, var, ppe_cplt_offset, ring_offset, chiplet_offset, ringSize); + } + + return TOR_RING_FOUND; +@@ -735,7 +766,6 @@ int get_ring_from_sgpe_image ( void* i_ringSection, // Ring sectio + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + static + int get_ring_from_cme_image ( void* i_ringSection, // Ring section ptr +- uint64_t i_magic, // Image Magic Number + RingID i_ringId, // Ring ID + uint16_t i_ddLevelOffset, // DD level offset + RingType_t& io_RingType, // Common, Instance +@@ -747,24 +777,38 @@ int get_ring_from_cme_image ( void* i_ringSection, // Ring section + char* o_ringName, // Name of ring + uint32_t i_dbgl ) // Debug option + { ++ uint32_t torMagic; + uint32_t acc_offset = 0; // Accumulating offset to next TOR offset slot + uint32_t ring_offset = 0; + uint16_t chiplet_offset = 0; + uint32_t ringSize = 0; + int temp = (i_ddLevelOffset >> 2) + 2; // converting byte to word counter + uint32_t cme_offset = 0; ++ uint32_t ppe_cplt_offset = 0; // Local offset to where the pool of chiplets starts + +- if (i_magic == P9_XIP_MAGIC_HW) ++ torMagic = be32toh( ((TorHeader_t*)i_ringSection)->magic ); ++ ++ if (torMagic == TOR_MAGIC_HW) + { + cme_offset = *((uint32_t*)i_ringSection + temp); //DD level offset index + temp = be32toh(cme_offset); + } +- else if (i_magic == P9_XIP_MAGIC_CME) ++ else if (torMagic == TOR_MAGIC_CME) + { + cme_offset = 0; + i_ddLevelOffset = 0; + temp = be32toh(cme_offset); + } ++ else ++ { ++ MY_ERR("torMagic=0x%08x is not valid for CME\n", torMagic); ++ return TOR_INVALID_MAGIC_NUMBER; ++ } ++ ++ // Calculate the offset (wrt start of ringSection) to where the ++ // pool of chiplet offsets begins in the CME PPE ring section, ++ // which is right after the TORC header. ++ ppe_cplt_offset = temp + sizeof(TorHeader_t); + + GenRingIdList* ring_id_list_common = NULL; + GenRingIdList* ring_id_list_instance = NULL; +@@ -788,18 +832,18 @@ int get_ring_from_cme_image ( void* i_ringSection, // Ring section + RING_PROPERTIES[i_ringId].iv_name) == 0) && ( i_RingVariant == j )) + { + strcpy(o_ringName, RING_PROPERTIES[i_ringId].iv_name); +- uint32_t var = 0 + i_ddLevelOffset + temp; ++ uint32_t var = 0 + i_ddLevelOffset + ppe_cplt_offset; + int temp1 = var / sizeof(uint32_t); + ring_offset = *((uint32_t*)i_ringSection + temp1); + ring_offset = be32toh(ring_offset); +- var = ring_offset + i_ddLevelOffset + temp; ++ var = ring_offset + i_ddLevelOffset + ppe_cplt_offset; + temp1 = var / sizeof(uint16_t) + local; + chiplet_offset = *((uint16_t*)i_ringSection + temp1); + chiplet_offset = be16toh(chiplet_offset); + + if (i_RingBlockType == GET_SINGLE_RING) + { +- var = ring_offset + chiplet_offset + i_ddLevelOffset + temp; ++ var = ring_offset + chiplet_offset + i_ddLevelOffset + ppe_cplt_offset; + ringSize = be16toh( ((CompressedScanData*) + ((uint8_t*)i_ringSection + + var))->iv_size ); +@@ -839,7 +883,7 @@ int get_ring_from_cme_image ( void* i_ringSection, // Ring section + { + MY_INF(" Hex details (CME): Chiplet #%d offset 0x%08x local offset 0x%08x " \ + "ring offset 0x%08x start adr 0x%08x ringSize=0x%08x \n", +- i, var, temp, ring_offset, chiplet_offset, ringSize); ++ i, var, ppe_cplt_offset, ring_offset, chiplet_offset, ringSize); + } + + return TOR_RING_FOUND; +@@ -905,18 +949,18 @@ int get_ring_from_cme_image ( void* i_ringSection, // Ring section + if ( i == io_instanceId && k == i_RingVariant ) + { + strcpy(o_ringName, RING_PROPERTIES[i_ringId].iv_name); +- uint32_t var = CPLT_OFFSET_SIZE + i_ddLevelOffset + temp; ++ uint32_t var = i_ddLevelOffset + ppe_cplt_offset + CPLT_OFFSET_SIZE; + int temp1 = var / CPLT_OFFSET_SIZE; + ring_offset = *((uint32_t*)i_ringSection + temp1); + ring_offset = be32toh(ring_offset); +- var = ring_offset + i_ddLevelOffset + temp; ++ var = ring_offset + i_ddLevelOffset + ppe_cplt_offset; + temp1 = var / sizeof(uint16_t) + local; + chiplet_offset = *((uint16_t*)i_ringSection + temp1); + chiplet_offset = be16toh(chiplet_offset); + + if (i_RingBlockType == GET_SINGLE_RING) + { +- var = ring_offset + chiplet_offset + i_ddLevelOffset + temp; ++ var = ring_offset + chiplet_offset + i_ddLevelOffset + ppe_cplt_offset; + ringSize = be16toh( ((CompressedScanData*) + ((uint8_t*)i_ringSection + + var))->iv_size ); +@@ -947,7 +991,7 @@ int get_ring_from_cme_image ( void* i_ringSection, // Ring section + { + MY_INF(" Hex details (CME): Chiplet #%d offset 0x%08x local offset 0x%08x " \ + "ring offset 0x%08x start adr 0x%08x ringSize=0x%08x \n", +- i, var, temp, ring_offset, chiplet_offset, ringSize); ++ i, var, ppe_cplt_offset, ring_offset, chiplet_offset, ringSize); + } + + memcpy( (uint8_t*)(*io_ringBlockPtr), (uint8_t*)i_ringSection + var, +@@ -960,14 +1004,6 @@ int get_ring_from_cme_image ( void* i_ringSection, // Ring section + MY_INF(" After get_ring_from_cme_image Size %d \n", io_ringBlockSize); + } + +- if (i_dbgl > 1) +- { +- MY_INF(" 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x \n", +- var, temp, ring_offset, chiplet_offset, ringSize); +- MY_INF("Chiplet %d ChipletRing TOR offset %d %d Size %d %d \t\n", +- i, ring_offset, chiplet_offset, ringSize, temp); +- } +- + return TOR_RING_FOUND; + } + else +@@ -986,6 +1022,7 @@ int get_ring_from_cme_image ( void* i_ringSection, // Ring section + if (chiplet_offset) + { + MY_ERR("Ring container is already present in the CME section \n"); ++ + return TOR_RING_AVAILABLE_IN_RINGSECTION; + } + +@@ -1032,7 +1069,6 @@ int get_ring_from_cme_image ( void* i_ringSection, // Ring section + /// + ////////////////////////////////////////////////////////////////////////////////////////// + int tor_access_ring( void* i_ringSection, // Ring section ptr +- uint64_t i_magic, // Image Magic Number + RingID i_ringId, // Ring ID + uint16_t i_ddLevel, // DD level + PpeType_t i_PpeType, // SBE, CME, SGPE +@@ -1046,12 +1082,15 @@ int tor_access_ring( void* i_ringSection, // Ring section ptr + uint32_t i_dbgl ) // Debug option + { + int rc = 0; ++ uint32_t torMagic; ++ TorHeader_t* torHeader; ++ TorDdBlock_t* torDdBlock; + uint8_t bDdCheck = 0; + uint32_t ddLevelOffset = 0; + uint32_t ddLevelCount = 0; + uint32_t ddLevel = 0; + uint32_t ddBlockSize = 0; +- uint32_t temp = 0, local = 0; ++ uint32_t temp = 0; + + + if (i_dbgl > 1) +@@ -1059,10 +1098,12 @@ int tor_access_ring( void* i_ringSection, // Ring section ptr + MY_INF("Entering tor_access_ring()... \n"); + } + +- if (i_magic == P9_XIP_MAGIC_HW) ++ torHeader = (TorHeader_t*)i_ringSection; ++ torMagic = be32toh(torHeader->magic); ++ ++ if (torMagic == TOR_MAGIC_HW) + { +- ddLevelCount = *((uint32_t*)i_ringSection + 0); +- ddLevelCount = be32toh(ddLevelCount); ++ ddLevelCount = torHeader->numDdLevels; + + if (ddLevelCount > MAX_NOOF_DD_LEVELS_IN_IMAGE) + { +@@ -1078,14 +1119,14 @@ int tor_access_ring( void* i_ringSection, // Ring section ptr + MY_INF("tor_access_ring(): No of DD levels: %d \n", ddLevelCount); + } + +- // start at one since we use that as an offset +- for (uint8_t i = 1; i <= ddLevelCount; i++) ++ for (uint8_t i = 0; i < ddLevelCount; i++) + { +- local = 2 * i; +- ddLevelOffset = *((uint32_t*)i_ringSection + local); +- +- ddLevel = be32toh(ddLevelOffset) >> 24 & 0x000000FF; +- ddLevelOffset = be32toh(ddLevelOffset) & 0x00FFFFFF; ++ torDdBlock = (TorDdBlock_t*)( (uint8_t*)torHeader + ++ sizeof(TorHeader_t) + ++ i * sizeof(TorDdBlock_t) ); ++ ddLevel = torDdBlock->ddLevel; ++ // Local ddLevelOffset ++ ddLevelOffset = be32toh(torDdBlock->offset); + + if (i_dbgl > 1) + { +@@ -1095,11 +1136,10 @@ int tor_access_ring( void* i_ringSection, // Ring section ptr + + if ( ddLevel == i_ddLevel) + { +- ddLevelOffset = ddLevelOffset + sizeof(TorNumDdLevels_t); +- local = local + 1; +- ddBlockSize = *((uint32_t*)i_ringSection + local); +- ddBlockSize = be32toh(ddBlockSize); +- ++ // Convert to global ddLevelOffset ++ ddLevelOffset = ddLevelOffset + ++ sizeof(TorHeader_t); ++ ddBlockSize = htobe32(torDdBlock->size); + bDdCheck = 1; + break; + } +@@ -1115,7 +1155,9 @@ int tor_access_ring( void* i_ringSection, // Ring section ptr + return TOR_DD_LEVEL_NOT_FOUND; + } + } +- else if ( i_magic == P9_XIP_MAGIC_SEEPROM) ++ else if ( torMagic == TOR_MAGIC_SBE || ++ torMagic == TOR_MAGIC_OVRD || ++ torMagic == TOR_MAGIC_OVLY ) + { + if ( i_PpeType == CME || i_PpeType == SGPE + || i_RingBlockType == GET_DD_LEVEL_RINGS +@@ -1126,11 +1168,11 @@ int tor_access_ring( void* i_ringSection, // Ring section ptr + } + else + { +- ddLevelOffset = 0; ++ ddLevelOffset = sizeof(TorHeader_t); + ddBlockSize = 0; + } + } +- else if ( i_magic == P9_XIP_MAGIC_CME) ++ else if (torMagic == TOR_MAGIC_CME) + { + if ( i_PpeType == SBE || i_PpeType == SGPE + || i_RingBlockType == GET_DD_LEVEL_RINGS +@@ -1141,11 +1183,11 @@ int tor_access_ring( void* i_ringSection, // Ring section ptr + } + else + { +- ddLevelOffset = 0; ++ ddLevelOffset = sizeof(TorHeader_t); + ddBlockSize = 0; + } + } +- else if ( i_magic == P9_XIP_MAGIC_SGPE) ++ else if (torMagic == TOR_MAGIC_SGPE) + { + if ( i_PpeType == SBE || i_PpeType == CME + || i_RingBlockType == GET_DD_LEVEL_RINGS +@@ -1156,15 +1198,18 @@ int tor_access_ring( void* i_ringSection, // Ring section ptr + } + else + { +- ddLevelOffset = 0; ++ ddLevelOffset = sizeof(TorHeader_t); + ddBlockSize = 0; + } + } + else + { +- MY_ERR("Magic number i_magic=0x%016lX\n is not valid.\n", (uintptr_t)i_magic); ++ if (i_dbgl > 0) ++ { ++ MY_ERR("torMagic=0x%08x is not valid\n", torMagic); ++ } + +- return TOR_AMBIGUOUS_API_PARMS; ++ return TOR_INVALID_MAGIC_NUMBER; + } + + if (i_RingBlockType == GET_DD_LEVEL_RINGS) +@@ -1275,22 +1320,23 @@ int tor_access_ring( void* i_ringSection, // Ring section ptr + else if ( i_RingBlockType == GET_SINGLE_RING || + i_RingBlockType == PUT_SINGLE_RING ) + { +- if (i_PpeType == SBE && +- ( i_magic == P9_XIP_MAGIC_HW || +- i_magic == P9_XIP_MAGIC_SEEPROM)) ++ if ( i_PpeType == SBE && ++ ( torMagic == TOR_MAGIC_HW || ++ torMagic == TOR_MAGIC_SBE || ++ torMagic == TOR_MAGIC_OVRD || ++ torMagic == TOR_MAGIC_OVLY ) ) + { +- rc = get_ring_from_sbe_image ( i_ringSection, +- i_magic, +- i_ringId, +- ddLevelOffset, +- io_RingType, +- i_RingVariant, +- io_instanceId, +- i_RingBlockType, +- io_ringBlockPtr, +- io_ringBlockSize, +- o_ringName, +- i_dbgl); ++ rc = get_ring_from_sbe_image( i_ringSection, ++ i_ringId, ++ ddLevelOffset, ++ io_RingType, ++ i_RingVariant, ++ io_instanceId, ++ i_RingBlockType, ++ io_ringBlockPtr, ++ io_ringBlockSize, ++ o_ringName, ++ i_dbgl ); + + if (rc) + { +@@ -1312,22 +1358,21 @@ int tor_access_ring( void* i_ringSection, // Ring section ptr + return TOR_RING_BLOCKS_FOUND; + } + } +- else if (i_PpeType == CME && +- ( i_magic == P9_XIP_MAGIC_HW || +- i_magic == P9_XIP_MAGIC_CME)) ++ else if ( i_PpeType == CME && ++ ( torMagic == TOR_MAGIC_HW || ++ torMagic == TOR_MAGIC_CME ) ) + { +- rc = get_ring_from_cme_image ( i_ringSection, +- i_magic, +- i_ringId, +- ddLevelOffset, +- io_RingType, +- i_RingVariant, +- io_instanceId, +- i_RingBlockType, +- io_ringBlockPtr, +- io_ringBlockSize, +- o_ringName, +- i_dbgl); ++ rc = get_ring_from_cme_image( i_ringSection, ++ i_ringId, ++ ddLevelOffset, ++ io_RingType, ++ i_RingVariant, ++ io_instanceId, ++ i_RingBlockType, ++ io_ringBlockPtr, ++ io_ringBlockSize, ++ o_ringName, ++ i_dbgl ); + + if (rc == TOR_RING_NOT_FOUND) + { +@@ -1379,22 +1424,21 @@ int tor_access_ring( void* i_ringSection, // Ring section ptr + return TOR_RING_BLOCKS_FOUND; + } + } +- else if (i_PpeType == SGPE && +- ( i_magic == P9_XIP_MAGIC_HW || +- i_magic == P9_XIP_MAGIC_SGPE)) ++ else if ( i_PpeType == SGPE && ++ ( torMagic == TOR_MAGIC_HW || ++ torMagic == TOR_MAGIC_SGPE ) ) + { +- rc = get_ring_from_sgpe_image ( i_ringSection, +- i_magic, +- i_ringId, +- ddLevelOffset, +- io_RingType, +- i_RingVariant, +- io_instanceId, +- i_RingBlockType, +- io_ringBlockPtr, +- io_ringBlockSize, +- o_ringName, +- i_dbgl); ++ rc = get_ring_from_sgpe_image( i_ringSection, ++ i_ringId, ++ ddLevelOffset, ++ io_RingType, ++ i_RingVariant, ++ io_instanceId, ++ i_RingBlockType, ++ io_ringBlockPtr, ++ io_ringBlockSize, ++ o_ringName, ++ i_dbgl ); + + if (rc == TOR_RING_NOT_FOUND) + { +@@ -1448,10 +1492,11 @@ int tor_access_ring( void* i_ringSection, // Ring section ptr + } + else + { +- MY_ERR("\t Code bug: We are unpreparred for this input parm combination: \n" +- "\t i_PpeType=%d\n" +- "\t i_magic=0x%016lX\n", +- i_PpeType, (uintptr_t)i_magic); ++ if (i_dbgl > 0) ++ { ++ MY_ERR("\t Unsupported combination of i_PpeType=%d and torMagic=0x%08x\n", ++ i_PpeType, torMagic); ++ } + + return TOR_AMBIGUOUS_API_PARMS; + } +@@ -1466,7 +1511,8 @@ int tor_access_ring( void* i_ringSection, // Ring section ptr + } + + return TOR_AMBIGUOUS_API_PARMS; +-} ++ ++} // End of tor_access_ring() + + + +@@ -1476,7 +1522,6 @@ int tor_access_ring( void* i_ringSection, // Ring section ptr + // + ///////////////////////////////////////////////////////////////////////////////////// + int tor_get_single_ring ( void* i_ringSection, // Ring section ptr +- uint64_t i_magic, // Image Magic Number + uint16_t i_ddLevel, // DD level + RingID i_ringId, // Ring ID + PpeType_t i_PpeType, // SBE, CME, SGPE +@@ -1489,7 +1534,7 @@ int tor_get_single_ring ( void* i_ringSection, // Ring section ptr + + uint32_t rc; + char i_ringName[25]; +- uint8_t l_instanceId = i_instanceId; ++ //@FIXME: This should really be ALLRING. But it's not used as input. + RingType_t l_ringType; + l_ringType = COMMON; + +@@ -1499,13 +1544,12 @@ int tor_get_single_ring ( void* i_ringSection, // Ring section ptr + } + + rc = tor_access_ring( i_ringSection, +- i_magic, + i_ringId, + i_ddLevel, + i_PpeType, + l_ringType, + i_RingVariant, +- l_instanceId, ++ i_instanceId, + GET_SINGLE_RING, + io_ringBlockPtr, + io_ringBlockSize, +@@ -1531,7 +1575,7 @@ int tor_get_single_ring ( void* i_ringSection, // Ring section ptr + int tor_get_block_of_rings ( void* i_ringSection, // Ring section ptr + uint16_t i_ddLevel, // DD level + PpeType_t i_PpeType, // SBE,CME,SGPE +- RingType_t i_RingType, // Common, Instance ++ RingType_t i_ringType, // Common, Instance + RingVariant_t i_RingVariant, // Base,CC, RL, Ovrd, Ovly + uint8_t i_instanceId, // Instance ID + void** io_ringBlockPtr, // Output ring buffer +@@ -1545,20 +1589,17 @@ int tor_get_block_of_rings ( void* i_ringSection, // Ring section + + uint32_t rc = 0; + char i_ringName[25]; +- uint8_t l_instanceId = i_instanceId; +- RingType_t l_ringType = i_RingType; + +- if (l_ringType == ALLRING && i_PpeType != NUM_PPE_TYPES) ++ if (i_ringType == ALLRING && i_PpeType != NUM_PPE_TYPES) + { + // Get block of rings specific to a PPE type + rc = tor_access_ring( i_ringSection, +- P9_XIP_MAGIC_HW, + NUM_RING_IDS, + i_ddLevel, + i_PpeType, +- l_ringType, ++ i_ringType, + i_RingVariant, +- l_instanceId, ++ i_instanceId, + GET_PPE_LEVEL_RINGS, + io_ringBlockPtr, + io_ringBlockSize, +@@ -1566,17 +1607,16 @@ int tor_get_block_of_rings ( void* i_ringSection, // Ring section + i_dbgl ); + + } +- else if (l_ringType == ALLRING && i_PpeType == NUM_PPE_TYPES) ++ else if (i_ringType == ALLRING && i_PpeType == NUM_PPE_TYPES) + { + // Get DD level block of rings + rc = tor_access_ring( i_ringSection, +- P9_XIP_MAGIC_HW, + NUM_RING_IDS, + i_ddLevel, + i_PpeType, +- l_ringType, ++ i_ringType, + i_RingVariant, +- l_instanceId, ++ i_instanceId, + GET_DD_LEVEL_RINGS, + io_ringBlockPtr, + io_ringBlockSize, +@@ -1622,39 +1662,17 @@ int tor_append_ring( void* i_ringSection, // Ring section ptr + char i_ringName[25]; + uint32_t l_buf = 0; + uint32_t* l_cpltSection = &l_buf; +- uint8_t l_instanceId = i_instanceId; +- RingType_t l_RingType = i_RingType; + uint32_t l_ringBlockSize; + uint16_t l_ringOffset16; +- uint64_t l_magic; + uint32_t l_torOffsetSlot; + +- if (i_PpeType == SBE) // Assign i_magic variant as SBE image +- { +- l_magic = P9_XIP_MAGIC_SEEPROM; +- } +- else if (i_PpeType == CME) // Assign i_magic variant as CME image +- { +- l_magic = P9_XIP_MAGIC_CME; +- } +- else if (i_PpeType == SGPE) // Assign i_magic variant as SGPE image +- { +- l_magic = P9_XIP_MAGIC_SGPE; +- } +- else +- { +- MY_ERR("PPE type (i_PpeType=%d) is not supported \n", i_PpeType); +- return TOR_AMBIGUOUS_API_PARMS; +- } +- + rc = tor_access_ring( i_ringSection, +- l_magic, + i_ringId, + 0x00, + i_PpeType, +- l_RingType, ++ i_RingType, + i_RingVariant, +- l_instanceId, ++ i_instanceId, + PUT_SINGLE_RING, + (void**)&l_cpltSection, // On return, contains offset (wrt ringSection) of + // chiplet section's common or instance section +@@ -1665,7 +1683,11 @@ int tor_append_ring( void* i_ringSection, // Ring section ptr + + if (rc) + { +- MY_ERR("tor_access_ring() failed w/rc=0x%x \n", rc); ++ if (i_dbgl > 0) ++ { ++ MY_ERR("tor_append_ring() failed in call to tor_access_ring w/rc=0x%x \n", rc); ++ } ++ + return rc; + } + +@@ -1700,6 +1722,10 @@ int tor_append_ring( void* i_ringSection, // Ring section ptr + // Update the ringSectionSize + io_ringSectionSize += l_ringBlockSize; + ++ // Update also the size in the TOR header ++ TorHeader_t* torHeader = (TorHeader_t*)i_ringSection; ++ torHeader->size = htobe32(be32toh(torHeader->size) + l_ringBlockSize); ++ + return TOR_SUCCESS; + } + +diff --git a/src/import/chips/p9/utils/imageProcs/p9_tor.H b/src/import/chips/p9/utils/imageProcs/p9_tor.H +index 94b5274..cc8f15a 100644 +--- a/src/import/chips/p9/utils/imageProcs/p9_tor.H ++++ b/src/import/chips/p9/utils/imageProcs/p9_tor.H +@@ -25,7 +25,6 @@ + #ifndef _P9_TOR_H_ + #define _P9_TOR_H_ + +-#include "p9_ring_id.h" + #include "p9_ringId.H" + + #define MAX_TOR_RING_OFFSET (256*256-1) // Max value of 2Byte uint +@@ -36,7 +35,7 @@ namespace P9_TOR + extern const char* ppeTypeName[]; + extern const char* ringVariantName[]; + +-#define TOR_VERSION 2 ++#define TOR_VERSION 3 + + // + // TOR Magic values for top-level TOR image and TOR sub-images +@@ -53,7 +52,34 @@ enum TorMagicNum + TOR_MAGIC_CEN = (uint32_t)0x544F524E, // "TORN" + }; + ++// ++// Chip types to represent p9n, p9c, centaur ++// ++enum ChipType ++{ ++ CT_P9N, ++ CT_P9C, ++ CT_CEN, ++ NUM_CHIP_TYPES ++}; ++ + typedef uint8_t ChipType_t; ++const ChipType_t INVALID_CHIP_TYPE = 0xff; ++ ++typedef struct ChipTypeList ++{ ++ const char* name; ++ ChipType_t type; ++} ChipTypeList_t; ++ ++const ChipTypeList_t CHIP_TYPE_LIST[] = ++{ ++ {"p9n", CT_P9N}, ++ {"p9c", CT_P9C}, ++ {"cen", CT_CEN}, ++}; ++ ++ + + // + // TOR header field (appears in top of every HW, SBE, CEN, OVRD, etc ring section) +@@ -65,26 +91,26 @@ typedef struct + ChipType_t chipType; // Value from ChipType enum + uint8_t ddLevel; // =0xff if MAGIC_HW, >0 all other MAGICs + uint8_t numDdLevels; // >0 if MAGIC_HW, =1 all other MAGICs +- uint32_t size; // Size of the TOR ringSection. ++ uint32_t size; // A place holder for now, but will be used in a later commit. + } TorHeader_t; + ++#define UNDEFINED_DD_LEVEL (uint8_t)0xff + ++// ++// Subsequent TOR fields (listed in order they appear in TOR for easier understanding) ++// + typedef struct + { +- uint32_t TorNumDdLevels; +- uint32_t reserved; +-} TorNumDdLevels_t; +- +-typedef struct +-{ +- uint32_t TorDdLevelAndOffset; +- uint32_t TorDdBlockSize; +-} TorDdLevelBlock_t; ++ uint32_t offset; ++ uint32_t size; ++ uint8_t ddLevel; ++ uint8_t reserved[3]; ++} TorDdBlock_t; + + typedef struct + { +- uint32_t TorPpeTypeOffset; +- uint32_t TorPpeBlockSize; ++ uint32_t offset; ++ uint32_t size; + } TorPpeBlock_t; + + typedef struct +@@ -95,6 +121,13 @@ typedef struct + + typedef uint16_t TorRingOffset_t; // Ring offset value in TOR offset slot + ++//@FIXME Discard asap ++typedef enum TorOffsetSize ++{ ++ RING_OFFSET_SIZE = 2, ++ CPLT_OFFSET_SIZE = 4 ++} TorOffsetSize_t; ++ + #define TOR_SUCCESS 0 + #define TOR_RING_FOUND 0 + #define TOR_RING_BLOCKS_FOUND 0 +@@ -117,6 +150,7 @@ typedef uint16_t TorRingOffset_t; // Ring offset value in TOR offset slot + #define TOR_BUFFER_TOO_SMALL 17 + #define TOR_TOO_MANY_DD_LEVELS 18 + #define TOR_OFFSET_TOO_BIG 19 ++#define TOR_INVALID_VARIANT 20 + + // Different options to extract data using tor_access_ring API + typedef enum RingBlockType +@@ -142,12 +176,6 @@ typedef enum PpeType + NUM_PPE_TYPES = 0x03 + } PpeType_t; + +-typedef enum TorOffsetSize +-{ +- RING_OFFSET_SIZE = 2, +- CPLT_OFFSET_SIZE = 4 +-} TorOffsetSize_t; +- + /// + /// **************************************************************************** + /// Function declares. +@@ -161,9 +189,6 @@ typedef enum TorOffsetSize + /// TOR API supports two type of binary image. 1) HW image format and 2) + /// SEEPROM image format binary + /// +-/// \param[in] i_magic A uint64_t variable to indicate XIP image format +-/// ring section passed +-/// + /// \param[in] i_ringId A enum to indicate unique ID for the ring + /// + /// \param[in] i_ddLevel A variable to indicate chip DD level. TOR API +@@ -211,8 +236,7 @@ typedef enum TorOffsetSize + /// and the following n number of operation based on the call. + /// + /// GET_SINGLE_RING (\a i_ringVariant) - traverse on \a i_ringSection buffer +-/// based on the following input param \a i_magic which gives details of image +-/// type, \a i_ringId which gives ring info, \a i_ddLevel which gives dd spec ++/// based on \a i_ringId which gives ring info, \a i_ddLevel which gives dd spec + /// (Used only for HW image/optional for other image) i_ppeType which gives ppe + /// type info, \a i_ringVarint gives ring variant info and \a io_instance which + /// gives chiplet instance specific while accessing instance specific ring and +@@ -222,33 +246,29 @@ typedef enum TorOffsetSize + /// data copied into io_ringBlockPtr. \a o_ringName returns ring string name. + /// + /// GET_DD_LEVEL_RINGS (\a i_ringVariant) - traverse on \a i_ringSection +-/// buffer based on the following input param \a i_magic which gives details +-/// of image type and \a i_ddLevel which gives dd spec(Used only for HW image ++/// buffer based on \a i_ddLevel which gives dd spec (used only for HW image + /// /optional for other image) On return, \a io_ringBlockPtr contains DD level + /// specific ring section and \a io_ringBlockSize contains size of the data + /// copied into io_ringBlockPtr. \a Other params are optional. + /// This ringVariant works on HW image. + /// + /// GET_PPE_LEVEL_RINGS (\a i_ringVariant) - traverse on \a i_ringSection +-/// buffer based on the following input param \a i_magic which gives the detail +-/// of image type, i_ppeType which gives ppe type info and \a i_ddLevel which +-/// gives dd spec(Used only for HW image/optional for other image) On return, ++/// buffer based on \a i_ppeType which gives ppe type info and \a i_ddLevel which ++/// gives dd spec used only for HW image/optional for other image) On return, + /// \a io_ringBlockPtr contains PPE type specific ring section and + /// \a io_ringBlockSize contains size of the data copied into io_ringBlockPtr. + /// \a Other params are optional. This ringVariant works on HW image. + /// + /// GET_CPLT_LEVEL_RINGS (\a i_ringVariant) - traverse on \a i_ringSection +-/// buffer based on the following input param \a i_magic which gives the detail +-/// of image type, i_ppeType which gives ppe type info, \a i_ddLevel which gives +-/// dd spec(Used only for HW image/optional for other image) and \a io_RingType ++/// buffer based on \a i_ppeType which gives ppe type info, \a i_ddLevel which gives ++/// dd spec (used only for HW image/optional for other image) and \a io_RingType + /// which gives ring type info. On return, \a io_ringBlockPtr contains chiplet + /// specific ring type ring section and \a io_ringBlockSize contains size of + /// the data copied into io_ringBlockPtr. \a Other params are optional. + /// + /// PUT_SINGLE_RING (\a i_ringVariant) - traverse on \a i_ringSection buffer +-/// based on the following input param \a i_magic which gives detail of image +-/// type, \a i_ringId which gives ring info, \a i_ddLevel which gives dd spec +-/// (Used only for HW image/optional for other image), i_ppeType which gives ++/// based on \a i_ringId which gives ring info, \a i_ddLevel which gives dd spec ++/// (used only for HW image/optional for other image), i_ppeType which gives + /// ppe type info, \a i_ringVarint gives ring variant info and \a io_instance + /// which gives chiplet instance specific while accessing instance specific + /// ring and returns chiplet number while accessing common ring. On return, +@@ -261,7 +281,6 @@ typedef enum TorOffsetSize + /// + /// \retval non-0 See \ref TOR API RETURN errors + int tor_access_ring( void* i_ringSection, // Ring address Ptr any of .rings, .overrides and .overlays. +- uint64_t i_magic, // Image Magic Number + RingID i_ringId, // Unique ring ID + uint16_t i_ddLevel, // DD level info + PpeType_t i_PpeType, // PPE type : SBE, CME, etc +@@ -282,9 +301,6 @@ int tor_access_ring( void* i_ringSection, // Ring address Ptr any of . + /// It contain details of p9 Ring which is used for scanning operation. + /// TOR API supports HW image format only + /// +-/// \param[in] i_magic A uint64_t variable to indicate XIP image format +-/// ring section passed +-/// + /// \param[in] i_ringId A enum to indicate unique ID for the ring + /// + /// \param[in] i_ddLevel A variable to indicate chip DD level. TOR API +@@ -316,7 +332,6 @@ int tor_access_ring( void* i_ringSection, // Ring address Ptr any of . + /// + /// \retval non-0 See \ref TOR API RETURN errors + int tor_get_single_ring ( void* i_ringSection, +- uint64_t i_magic, // Image Magic Number + uint16_t i_ddLevel, + RingID i_ringId, + PpeType_t i_PpeType, +-- +1.8.2.2 + diff --git a/openpower/package/sbe/sbe-0001-TOR-Magic-header-support.patch b/openpower/package/sbe/sbe-0001-TOR-Magic-header-support.patch new file mode 100755 index 00000000..721f9ee2 --- /dev/null +++ b/openpower/package/sbe/sbe-0001-TOR-Magic-header-support.patch @@ -0,0 +1,1698 @@ +From 7272bdf8e74ae803609f6dfcf00092618cfb242e Mon Sep 17 00:00:00 2001 +From: Claus Michael Olsen <cmolsen@us.ibm.com> +Date: Tue, 24 Jan 2017 23:42:50 -0600 +Subject: [PATCH] TOR Magic header support + +HW-Image-Coreq=Yes +SBE-Image-Coreq=No (SBE image is back compatible) + +This commit adds an 12-byte header to all TOR ring sections: +- for improved self-containment of TOR ring sections incl + stand-alone ring sections like .overrides which, currently, + has no meaningful size info associated with it in the PNOR, +- to support a more data-driven implementation of TOR API, +- to eliminate the current usage of XIP_MAGIC ids to inform the + TOR APIs which ring section they are dealing with, and +- to improve debugging binary ring sections. + +The TOR header expands on the current TorNumDdLevels field in the +HW ring section and is added to all other ring sections as well, +e.g. for the SBE and OVRD ring sections. Most importantly, the +TOR header adds the TOR magic number which is unique for each +possible TOR ring section. Also, of quite practical importance, +a size field has been added so that the size of a true standalone +section like .overrides can be extracted (since its size in PNOR +is not indicative of its size). + +Further, to support the use of ddLevel and chipType in the TOR +header fields, these two data points need to be always supplied +whenever calling ring_apply. Thus, updates have been made to the +ring_apply.mk file as well as the override .pl script. While +making these changes, we also decided to change the --type arg +to the --bOverrides arg to make the arguments being passed less +confusing in view of the Centaur commit that's coming and its +demands to make codes less data dependent, incl make and script +files which should simply inform the functional intent of the +"user". The user shouldn't presume it knows about which specific +type of ring section needs to be produced. + +Further, the DD level block struct has been increased from 8B +to 12B to avoid the unnecessarily complex merging of the +ddLevel and offset into the same 4B field. It's included in +this commit since this is also going to break the lab and +because the required code changes are in the same places +where the code changes needed for the TOR header are. + +Further, xip_tool has been updated to support the new TOR +header so that it can be called by supplying a standalone +ring section, such as overrides.bin. Various changes have +been made in xip_tool's dissect section to support overrides +as well. + +This code uses many of the code changes in 33778 except +changes to p9_tor.C|H are at a bare minimum focusing on the +functional changes and keeping any cleanups to a minimum changing +only some variable names associated with the functional changes +for improved readability of the code. + +CMVC-Coreq: 1033988 +Change-Id: I29ba8905ac55dad5c10878a94fb94468e5580ea0 +--- + src/import/chips/p9/utils/imageProcs/p9_ringId.H | 23 +- + src/import/chips/p9/utils/imageProcs/p9_tor.C | 362 ++++++++++++----------- + src/import/chips/p9/utils/imageProcs/p9_tor.H | 97 +++--- + src/import/chips/p9/xip/p9_xip_tool.C | 245 +++++++++------ + src/test/framework/etc/workarounds.presimsetup | 8 +- + 5 files changed, 431 insertions(+), 304 deletions(-) + +diff --git a/src/import/chips/p9/utils/imageProcs/p9_ringId.H b/src/import/chips/p9/utils/imageProcs/p9_ringId.H +index bd89194..8c8fbdc 100644 +--- a/src/import/chips/p9/utils/imageProcs/p9_ringId.H ++++ b/src/import/chips/p9/utils/imageProcs/p9_ringId.H +@@ -68,9 +68,10 @@ typedef enum RingVariant // Base variables + NOT_VALID = 0xff + } RingVariant_t; + ++#define P9_RINGID_VARIANT_ORDER_SIZE 3 + typedef struct + { +- uint8_t variant[3]; ++ uint8_t variant[P9_RINGID_VARIANT_ORDER_SIZE]; + } RingVariantOrder; + + +@@ -244,6 +245,7 @@ const uint8_t INSTANCE_RING_MASK = 0x7F; + + namespace PERV + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -289,6 +291,7 @@ static const CHIPLET_DATA g_pervData = + + namespace N0 + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -318,12 +321,13 @@ static const CHIPLET_DATA g_n0Data = + 2, // N0 Chiplet ID is 2. + 9, // 9 common rings for N0 Chiplet + 3, // 3 instance specific rings for N0 chiplet +- 3 ++ 3 // FIXME: number of variants? doesn't match RingVariants below! + }; + }; + + namespace N1 + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -363,6 +367,7 @@ static const CHIPLET_DATA g_n1Data = + + namespace N2 + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -398,6 +403,7 @@ static const CHIPLET_DATA g_n2Data = + + namespace N3 + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -434,6 +440,7 @@ static const CHIPLET_DATA g_n3Data = + + namespace XB + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -476,6 +483,7 @@ static const CHIPLET_DATA g_xbData = + + namespace MC + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -519,6 +527,7 @@ static const CHIPLET_DATA g_mcData = + + namespace OB0 + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -551,6 +560,7 @@ static const CHIPLET_DATA g_ob0Data = + + namespace OB1 + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -584,6 +594,7 @@ static const CHIPLET_DATA g_ob1Data = + + namespace OB2 + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -616,6 +627,7 @@ static const CHIPLET_DATA g_ob2Data = + + namespace OB3 + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -647,6 +659,7 @@ static const CHIPLET_DATA g_ob3Data = + }; // end of namespace OB2 + namespace PCI0 + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -676,6 +689,7 @@ static const CHIPLET_DATA g_pci0Data = + + namespace PCI1 + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -705,6 +719,7 @@ static const CHIPLET_DATA g_pci1Data = + + namespace PCI2 + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -735,6 +750,7 @@ static const CHIPLET_DATA g_pci2Data = + + namespace EQ + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -832,6 +848,7 @@ static const CHIPLET_DATA g_eqData = + + namespace EC + { ++// FIXME: this struct is nonsense - no one uses these fields (we only need the variant number) + struct RingVariants + { + uint16_t iv_base; +@@ -868,7 +885,7 @@ static const uint8_t INVALID_RING = 0xFF; + #ifndef __PPE__ + struct ringProperties_t + { +- uint8_t iv_torOffSet; ++ uint8_t iv_torOffSet; // FIXME: misnomer + char iv_name[50]; + CHIPLET_TYPE iv_type; + }; +diff --git a/src/import/chips/p9/utils/imageProcs/p9_tor.C b/src/import/chips/p9/utils/imageProcs/p9_tor.C +index 05f9ff3..827621a 100644 +--- a/src/import/chips/p9/utils/imageProcs/p9_tor.C ++++ b/src/import/chips/p9/utils/imageProcs/p9_tor.C +@@ -41,9 +41,7 @@ + // While using tor_tor_get_block_of_rings and tor_get_single_ring API, + // it is used pass by value + // +-#include "p9_ringId.H" + #include "p9_tor.H" +-#include "p9_xip_image.h" + #include "p9_scan_compression.H" + #include "p9_infrastruct_help.H" + +@@ -72,7 +70,6 @@ const char* ringVariantName[] = { "BASE", + ////////////////////////////////////////////////////////////////////////////////// + static + int get_ring_from_sbe_image( void* i_ringSection, // Ring section ptr +- uint64_t i_magic, // Image Magic Number + RingID i_ringId, // Ring ID + uint16_t i_ddLevelOffset, // DD level offset (wrt i_ringSection) + RingType_t& io_RingType, // Common, Instance +@@ -85,11 +82,13 @@ int get_ring_from_sbe_image( void* i_ringSection, // Ring section + uint32_t i_dbgl ) // Debug option + { + int rc = TOR_SUCCESS; ++ uint32_t torMagic; + uint32_t tor_slot_no = 0; // TOR slot number (within a TOR chiplet section) + uint16_t dd_level_offset; // Local DD level offset, if any (wrt i_ringSection) + uint32_t acc_offset = 0; // Accumulating offset to next TOR offset +- uint32_t ppe_offset = 0; // Local offset to where SBE PPE section starts +- uint32_t cplt_offset = 0; // Local offset to where SBE chiplet section starts ++ uint32_t ppe_offset = 0; // Local offset to where SBE PPE ring section starts ++ uint32_t ppe_cplt_offset = 0; // Local offset to where the pool of chiplets starts ++ uint32_t cplt_offset = 0; // Local offset to where a specific chiplet section starts + uint16_t ring_offset = 0; // Local offset to where SBE ring container/block starts + uint32_t ring_size = 0; // Size of whole ring container/block. + RingVariantOrder* ring_variant_order; +@@ -98,23 +97,35 @@ int get_ring_from_sbe_image( void* i_ringSection, // Ring section + CHIPLET_DATA* l_cpltData; + uint8_t l_num_variant; + +- if (i_magic == P9_XIP_MAGIC_HW) ++ torMagic = be32toh( ((TorHeader_t*)i_ringSection)->magic ); ++ ++ // Calculate the offset (wrt start of ringSection) to the SBE PPE ++ // ring section. This offset, ppe_offset, will point to the ++ // TORB header of the SBE PPE ring section. ++ if (torMagic == TOR_MAGIC_HW) + { + dd_level_offset = i_ddLevelOffset; + ppe_offset = *(uint32_t*)((uint8_t*)i_ringSection + dd_level_offset); + ppe_offset = be32toh(ppe_offset); + } +- else if (i_magic == P9_XIP_MAGIC_SEEPROM) ++ else if (torMagic == TOR_MAGIC_SBE || ++ torMagic == TOR_MAGIC_OVRD || ++ torMagic == TOR_MAGIC_OVLY) + { + ppe_offset = 0; + dd_level_offset = 0; + } + else + { +- MY_ERR("Magic number i_magic=0x%016lX is not valid for SBE\n", (uintptr_t)i_magic); ++ MY_ERR("torMagic=0x%08x is not valid for SBE\n", torMagic); + return TOR_INVALID_MAGIC_NUMBER; + } + ++ // Calculate the offset (wrt start of ringSection) to where the ++ // pool of chiplet offsets begins in the SBE PPE ring section, ++ // which is right after the TORB header. ++ ppe_cplt_offset = ppe_offset + sizeof(TorHeader_t); ++ + // Looper for each SBE chiplet + for (int iCplt = 0; iCplt < SBE_NOOF_CHIPLETS; iCplt++) + { +@@ -129,7 +140,7 @@ int get_ring_from_sbe_image( void* i_ringSection, // Ring section + return TOR_INVALID_CHIPLET; + } + +- l_num_variant = (i_RingVariant == OVERRIDE || i_RingVariant == OVERLAY) ? 1 : l_num_variant; ++ l_num_variant = (torMagic == TOR_MAGIC_OVRD || torMagic == TOR_MAGIC_OVLY) ? 1 : l_num_variant; + + if (i_dbgl > 1) + { +@@ -154,19 +165,20 @@ int get_ring_from_sbe_image( void* i_ringSection, // Ring section + (ring_id_list_common + i)->ringName, i, iVariant); + } + +- if ((strcmp( (ring_id_list_common + i)->ringName, +- RING_PROPERTIES[i_ringId].iv_name) == 0) +- && ( i_RingVariant == ring_variant_order->variant[iVariant] +- || ( (i_RingVariant == OVERRIDE || i_RingVariant == OVERLAY) && i_magic == P9_XIP_MAGIC_SEEPROM))) ++ if ( ( strcmp( (ring_id_list_common + i)->ringName, ++ RING_PROPERTIES[i_ringId].iv_name) == 0 ) && ++ ( i_RingVariant == ring_variant_order->variant[iVariant] || ++ torMagic == TOR_MAGIC_OVRD || ++ torMagic == TOR_MAGIC_OVLY ) ) + { + strcpy(o_ringName, RING_PROPERTIES[i_ringId].iv_name); +- +- acc_offset = dd_level_offset + ppe_offset + iCplt * sizeof(TorPpeBlock_t); ++ acc_offset = dd_level_offset + ++ ppe_cplt_offset + ++ iCplt * sizeof(TorPpeBlock_t); + cplt_offset = *(uint32_t*)( (uint8_t*)i_ringSection + + acc_offset ); + cplt_offset = be32toh(cplt_offset); +- +- acc_offset = dd_level_offset + ppe_offset + cplt_offset; ++ acc_offset = dd_level_offset + ppe_cplt_offset + cplt_offset; + ring_offset = *(uint16_t*)( (uint8_t*)i_ringSection + + acc_offset + + tor_slot_no * sizeof(ring_offset) ); +@@ -175,7 +187,7 @@ int get_ring_from_sbe_image( void* i_ringSection, // Ring section + if (i_RingBlockType == GET_SINGLE_RING) + { + acc_offset = dd_level_offset + +- ppe_offset + ++ ppe_cplt_offset + + cplt_offset + + ring_offset; + ring_size = be16toh( ((CompressedScanData*) +@@ -233,7 +245,7 @@ int get_ring_from_sbe_image( void* i_ringSection, // Ring section + " Chiplet section's offset to RS4 header = 0x%08x \n" + " Full offset to RS4 header = 0x%08x \n" + " Ring size = 0x%08x \n", +- i, dd_level_offset, ppe_offset, cplt_offset, ring_offset, acc_offset, ring_size); ++ i, dd_level_offset, ppe_cplt_offset, cplt_offset, ring_offset, acc_offset, ring_size); + } + + return rc; +@@ -296,14 +308,16 @@ int get_ring_from_sbe_image( void* i_ringSection, // Ring section + strcpy(o_ringName, RING_PROPERTIES[i_ringId].iv_name); + + acc_offset = dd_level_offset + +- ppe_offset + ++ ppe_cplt_offset + + iCplt * sizeof(TorPpeBlock_t) + + sizeof(cplt_offset); // Jump to instance offset + cplt_offset = *(uint32_t*)( (uint8_t*)i_ringSection + + acc_offset ); + cplt_offset = be32toh(cplt_offset); + +- acc_offset = cplt_offset + dd_level_offset + ppe_offset; ++ acc_offset = cplt_offset + ++ dd_level_offset + ++ ppe_cplt_offset; + ring_offset = *(uint16_t*)( (uint8_t*)i_ringSection + + acc_offset + + tor_slot_no * sizeof(ring_offset) ); +@@ -312,7 +326,7 @@ int get_ring_from_sbe_image( void* i_ringSection, // Ring section + if (i_RingBlockType == GET_SINGLE_RING) + { + acc_offset = dd_level_offset + +- ppe_offset + ++ ppe_cplt_offset + + cplt_offset + + ring_offset; + ring_size = be16toh( ((CompressedScanData*) +@@ -376,7 +390,7 @@ int get_ring_from_sbe_image( void* i_ringSection, // Ring section + " Chiplet section's offset to RS4 header = 0x%08x \n" + " Full offset to RS4 header = 0x%08x \n" + " Ring size = 0x%08x \n", +- i, dd_level_offset, ppe_offset, cplt_offset, ring_offset, acc_offset, ring_size); ++ i, dd_level_offset, ppe_cplt_offset, cplt_offset, ring_offset, acc_offset, ring_size); + } + + return rc; +@@ -441,7 +455,6 @@ int get_ring_from_sbe_image( void* i_ringSection, // Ring section + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + static + int get_ring_from_sgpe_image ( void* i_ringSection, // Ring section ptr +- uint64_t i_magic, // Image Magic Number + RingID i_ringId, // Ring ID + uint16_t i_ddLevelOffset, // DD level offset + RingType_t& io_RingType, // Common, Instance +@@ -453,24 +466,42 @@ int get_ring_from_sgpe_image ( void* i_ringSection, // Ring sectio + char* o_ringName, // Name of ring + uint32_t i_dbgl ) // Debug option + { ++ uint32_t torMagic; + uint32_t acc_offset = 0; // Accumulating offset to next TOR offset slot + uint32_t ring_offset = 0; + uint16_t chiplet_offset = 0; + uint32_t ringSize = 0; + int temp = (i_ddLevelOffset >> 2) + 4; // converting byte to word counter + uint32_t spge_offset = 0; ++ uint32_t ppe_cplt_offset = 0; // Local offset to where the pool of chiplets starts ++ ++ torMagic = be32toh( ((TorHeader_t*)i_ringSection)->magic ); + +- if (i_magic == P9_XIP_MAGIC_HW) ++ // Calculate the offset (wrt start of ringSection) to the SGPE PPE ++ // ring section. This offset, inappropriately denoted "temp" here ++ // but which needs to be renamed to "ppe_offset" asap, will point ++ // to the TORG header of the SGPE PPE ring section. ++ if (torMagic == TOR_MAGIC_HW) + { + spge_offset = *((uint32_t*)i_ringSection + temp); //DD level offset index + temp = be32toh(spge_offset); + } +- else if (i_magic == P9_XIP_MAGIC_SGPE) ++ else if (torMagic == TOR_MAGIC_SGPE) + { + spge_offset = 0; + i_ddLevelOffset = 0; + temp = be32toh(spge_offset); + } ++ else ++ { ++ MY_ERR("torMagic=0x%08x is not valid for SGPE\n", torMagic); ++ return TOR_INVALID_MAGIC_NUMBER; ++ } ++ ++ // Calculate the offset (wrt start of ringSection) to where the ++ // pool of chiplet offsets begins in the SGPE PPE ring section, ++ // which is right after the TORG header. ++ ppe_cplt_offset = temp + sizeof(TorHeader_t); + + GenRingIdList* ring_id_list_common = NULL; + GenRingIdList* ring_id_list_instance = NULL; +@@ -494,18 +525,18 @@ int get_ring_from_sgpe_image ( void* i_ringSection, // Ring sectio + RING_PROPERTIES[i_ringId].iv_name) == 0) && ( i_RingVariant == j )) + { + strcpy(o_ringName, RING_PROPERTIES[i_ringId].iv_name); +- uint32_t var = 0 + i_ddLevelOffset + temp; ++ uint32_t var = 0 + i_ddLevelOffset + ppe_cplt_offset; + int temp1 = var / sizeof(uint32_t); + ring_offset = *((uint32_t*)i_ringSection + temp1); + ring_offset = be32toh(ring_offset); +- var = ring_offset + i_ddLevelOffset + temp; ++ var = ring_offset + i_ddLevelOffset + ppe_cplt_offset; + temp1 = var / sizeof(uint16_t) + local; + chiplet_offset = *((uint16_t*)i_ringSection + temp1); + chiplet_offset = be16toh(chiplet_offset); + + if (i_RingBlockType == GET_SINGLE_RING) + { +- var = ring_offset + chiplet_offset + i_ddLevelOffset + temp; ++ var = ring_offset + chiplet_offset + i_ddLevelOffset + ppe_cplt_offset; + ringSize = be16toh( ((CompressedScanData*) + ((uint8_t*)i_ringSection + + var))->iv_size ); +@@ -545,7 +576,7 @@ int get_ring_from_sgpe_image ( void* i_ringSection, // Ring sectio + { + MY_INF(" Hex details (SGPE): Chiplet #%d offset 0x%08x local offset 0x%08x " \ + "ring offset 0x%08x start adr 0x%08x ringSize=0x%08x \n", +- i, var, temp, ring_offset, chiplet_offset, ringSize); ++ i, var, ppe_cplt_offset, ring_offset, chiplet_offset, ringSize); + } + + return TOR_RING_FOUND; +@@ -611,18 +642,18 @@ int get_ring_from_sgpe_image ( void* i_ringSection, // Ring sectio + if ( i == io_instanceId && k == i_RingVariant ) + { + strcpy(o_ringName, RING_PROPERTIES[i_ringId].iv_name); +- uint32_t var = CPLT_OFFSET_SIZE + i_ddLevelOffset + temp; ++ uint32_t var = CPLT_OFFSET_SIZE + i_ddLevelOffset + ppe_cplt_offset; + int temp1 = var / sizeof(uint32_t); + ring_offset = *((uint32_t*)i_ringSection + temp1); + ring_offset = be32toh(ring_offset); +- var = ring_offset + i_ddLevelOffset + temp; ++ var = ring_offset + i_ddLevelOffset + ppe_cplt_offset; + temp1 = var / sizeof(uint16_t) + local; + chiplet_offset = *((uint16_t*)i_ringSection + temp1); + chiplet_offset = be16toh(chiplet_offset); + + if (i_RingBlockType == GET_SINGLE_RING) + { +- var = ring_offset + chiplet_offset + i_ddLevelOffset + temp; ++ var = ring_offset + chiplet_offset + i_ddLevelOffset + ppe_cplt_offset; + ringSize = be16toh( ((CompressedScanData*) + ((uint8_t*)i_ringSection + + var))->iv_size ); +@@ -667,7 +698,7 @@ int get_ring_from_sgpe_image ( void* i_ringSection, // Ring sectio + { + MY_INF(" Hex details (SGPE): Chiplet #%d offset 0x%08x local offset 0x%08x " \ + "ring offset 0x%08x start adr 0x%08x ringSize=0x%08x \n", +- i, var, temp, ring_offset, chiplet_offset, ringSize); ++ i, var, ppe_cplt_offset, ring_offset, chiplet_offset, ringSize); + } + + return TOR_RING_FOUND; +@@ -735,7 +766,6 @@ int get_ring_from_sgpe_image ( void* i_ringSection, // Ring sectio + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + static + int get_ring_from_cme_image ( void* i_ringSection, // Ring section ptr +- uint64_t i_magic, // Image Magic Number + RingID i_ringId, // Ring ID + uint16_t i_ddLevelOffset, // DD level offset + RingType_t& io_RingType, // Common, Instance +@@ -747,24 +777,38 @@ int get_ring_from_cme_image ( void* i_ringSection, // Ring section + char* o_ringName, // Name of ring + uint32_t i_dbgl ) // Debug option + { ++ uint32_t torMagic; + uint32_t acc_offset = 0; // Accumulating offset to next TOR offset slot + uint32_t ring_offset = 0; + uint16_t chiplet_offset = 0; + uint32_t ringSize = 0; + int temp = (i_ddLevelOffset >> 2) + 2; // converting byte to word counter + uint32_t cme_offset = 0; ++ uint32_t ppe_cplt_offset = 0; // Local offset to where the pool of chiplets starts + +- if (i_magic == P9_XIP_MAGIC_HW) ++ torMagic = be32toh( ((TorHeader_t*)i_ringSection)->magic ); ++ ++ if (torMagic == TOR_MAGIC_HW) + { + cme_offset = *((uint32_t*)i_ringSection + temp); //DD level offset index + temp = be32toh(cme_offset); + } +- else if (i_magic == P9_XIP_MAGIC_CME) ++ else if (torMagic == TOR_MAGIC_CME) + { + cme_offset = 0; + i_ddLevelOffset = 0; + temp = be32toh(cme_offset); + } ++ else ++ { ++ MY_ERR("torMagic=0x%08x is not valid for CME\n", torMagic); ++ return TOR_INVALID_MAGIC_NUMBER; ++ } ++ ++ // Calculate the offset (wrt start of ringSection) to where the ++ // pool of chiplet offsets begins in the CME PPE ring section, ++ // which is right after the TORC header. ++ ppe_cplt_offset = temp + sizeof(TorHeader_t); + + GenRingIdList* ring_id_list_common = NULL; + GenRingIdList* ring_id_list_instance = NULL; +@@ -788,18 +832,18 @@ int get_ring_from_cme_image ( void* i_ringSection, // Ring section + RING_PROPERTIES[i_ringId].iv_name) == 0) && ( i_RingVariant == j )) + { + strcpy(o_ringName, RING_PROPERTIES[i_ringId].iv_name); +- uint32_t var = 0 + i_ddLevelOffset + temp; ++ uint32_t var = 0 + i_ddLevelOffset + ppe_cplt_offset; + int temp1 = var / sizeof(uint32_t); + ring_offset = *((uint32_t*)i_ringSection + temp1); + ring_offset = be32toh(ring_offset); +- var = ring_offset + i_ddLevelOffset + temp; ++ var = ring_offset + i_ddLevelOffset + ppe_cplt_offset; + temp1 = var / sizeof(uint16_t) + local; + chiplet_offset = *((uint16_t*)i_ringSection + temp1); + chiplet_offset = be16toh(chiplet_offset); + + if (i_RingBlockType == GET_SINGLE_RING) + { +- var = ring_offset + chiplet_offset + i_ddLevelOffset + temp; ++ var = ring_offset + chiplet_offset + i_ddLevelOffset + ppe_cplt_offset; + ringSize = be16toh( ((CompressedScanData*) + ((uint8_t*)i_ringSection + + var))->iv_size ); +@@ -839,7 +883,7 @@ int get_ring_from_cme_image ( void* i_ringSection, // Ring section + { + MY_INF(" Hex details (CME): Chiplet #%d offset 0x%08x local offset 0x%08x " \ + "ring offset 0x%08x start adr 0x%08x ringSize=0x%08x \n", +- i, var, temp, ring_offset, chiplet_offset, ringSize); ++ i, var, ppe_cplt_offset, ring_offset, chiplet_offset, ringSize); + } + + return TOR_RING_FOUND; +@@ -905,18 +949,18 @@ int get_ring_from_cme_image ( void* i_ringSection, // Ring section + if ( i == io_instanceId && k == i_RingVariant ) + { + strcpy(o_ringName, RING_PROPERTIES[i_ringId].iv_name); +- uint32_t var = CPLT_OFFSET_SIZE + i_ddLevelOffset + temp; ++ uint32_t var = i_ddLevelOffset + ppe_cplt_offset + CPLT_OFFSET_SIZE; + int temp1 = var / CPLT_OFFSET_SIZE; + ring_offset = *((uint32_t*)i_ringSection + temp1); + ring_offset = be32toh(ring_offset); +- var = ring_offset + i_ddLevelOffset + temp; ++ var = ring_offset + i_ddLevelOffset + ppe_cplt_offset; + temp1 = var / sizeof(uint16_t) + local; + chiplet_offset = *((uint16_t*)i_ringSection + temp1); + chiplet_offset = be16toh(chiplet_offset); + + if (i_RingBlockType == GET_SINGLE_RING) + { +- var = ring_offset + chiplet_offset + i_ddLevelOffset + temp; ++ var = ring_offset + chiplet_offset + i_ddLevelOffset + ppe_cplt_offset; + ringSize = be16toh( ((CompressedScanData*) + ((uint8_t*)i_ringSection + + var))->iv_size ); +@@ -947,7 +991,7 @@ int get_ring_from_cme_image ( void* i_ringSection, // Ring section + { + MY_INF(" Hex details (CME): Chiplet #%d offset 0x%08x local offset 0x%08x " \ + "ring offset 0x%08x start adr 0x%08x ringSize=0x%08x \n", +- i, var, temp, ring_offset, chiplet_offset, ringSize); ++ i, var, ppe_cplt_offset, ring_offset, chiplet_offset, ringSize); + } + + memcpy( (uint8_t*)(*io_ringBlockPtr), (uint8_t*)i_ringSection + var, +@@ -960,14 +1004,6 @@ int get_ring_from_cme_image ( void* i_ringSection, // Ring section + MY_INF(" After get_ring_from_cme_image Size %d \n", io_ringBlockSize); + } + +- if (i_dbgl > 1) +- { +- MY_INF(" 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x \n", +- var, temp, ring_offset, chiplet_offset, ringSize); +- MY_INF("Chiplet %d ChipletRing TOR offset %d %d Size %d %d \t\n", +- i, ring_offset, chiplet_offset, ringSize, temp); +- } +- + return TOR_RING_FOUND; + } + else +@@ -986,6 +1022,7 @@ int get_ring_from_cme_image ( void* i_ringSection, // Ring section + if (chiplet_offset) + { + MY_ERR("Ring container is already present in the CME section \n"); ++ + return TOR_RING_AVAILABLE_IN_RINGSECTION; + } + +@@ -1032,7 +1069,6 @@ int get_ring_from_cme_image ( void* i_ringSection, // Ring section + /// + ////////////////////////////////////////////////////////////////////////////////////////// + int tor_access_ring( void* i_ringSection, // Ring section ptr +- uint64_t i_magic, // Image Magic Number + RingID i_ringId, // Ring ID + uint16_t i_ddLevel, // DD level + PpeType_t i_PpeType, // SBE, CME, SGPE +@@ -1046,12 +1082,15 @@ int tor_access_ring( void* i_ringSection, // Ring section ptr + uint32_t i_dbgl ) // Debug option + { + int rc = 0; ++ uint32_t torMagic; ++ TorHeader_t* torHeader; ++ TorDdBlock_t* torDdBlock; + uint8_t bDdCheck = 0; + uint32_t ddLevelOffset = 0; + uint32_t ddLevelCount = 0; + uint32_t ddLevel = 0; + uint32_t ddBlockSize = 0; +- uint32_t temp = 0, local = 0; ++ uint32_t temp = 0; + + + if (i_dbgl > 1) +@@ -1059,10 +1098,12 @@ int tor_access_ring( void* i_ringSection, // Ring section ptr + MY_INF("Entering tor_access_ring()... \n"); + } + +- if (i_magic == P9_XIP_MAGIC_HW) ++ torHeader = (TorHeader_t*)i_ringSection; ++ torMagic = be32toh(torHeader->magic); ++ ++ if (torMagic == TOR_MAGIC_HW) + { +- ddLevelCount = *((uint32_t*)i_ringSection + 0); +- ddLevelCount = be32toh(ddLevelCount); ++ ddLevelCount = torHeader->numDdLevels; + + if (ddLevelCount > MAX_NOOF_DD_LEVELS_IN_IMAGE) + { +@@ -1078,14 +1119,14 @@ int tor_access_ring( void* i_ringSection, // Ring section ptr + MY_INF("tor_access_ring(): No of DD levels: %d \n", ddLevelCount); + } + +- // start at one since we use that as an offset +- for (uint8_t i = 1; i <= ddLevelCount; i++) ++ for (uint8_t i = 0; i < ddLevelCount; i++) + { +- local = 2 * i; +- ddLevelOffset = *((uint32_t*)i_ringSection + local); +- +- ddLevel = be32toh(ddLevelOffset) >> 24 & 0x000000FF; +- ddLevelOffset = be32toh(ddLevelOffset) & 0x00FFFFFF; ++ torDdBlock = (TorDdBlock_t*)( (uint8_t*)torHeader + ++ sizeof(TorHeader_t) + ++ i * sizeof(TorDdBlock_t) ); ++ ddLevel = torDdBlock->ddLevel; ++ // Local ddLevelOffset ++ ddLevelOffset = be32toh(torDdBlock->offset); + + if (i_dbgl > 1) + { +@@ -1095,11 +1136,10 @@ int tor_access_ring( void* i_ringSection, // Ring section ptr + + if ( ddLevel == i_ddLevel) + { +- ddLevelOffset = ddLevelOffset + sizeof(TorNumDdLevels_t); +- local = local + 1; +- ddBlockSize = *((uint32_t*)i_ringSection + local); +- ddBlockSize = be32toh(ddBlockSize); +- ++ // Convert to global ddLevelOffset ++ ddLevelOffset = ddLevelOffset + ++ sizeof(TorHeader_t); ++ ddBlockSize = htobe32(torDdBlock->size); + bDdCheck = 1; + break; + } +@@ -1115,7 +1155,9 @@ int tor_access_ring( void* i_ringSection, // Ring section ptr + return TOR_DD_LEVEL_NOT_FOUND; + } + } +- else if ( i_magic == P9_XIP_MAGIC_SEEPROM) ++ else if ( torMagic == TOR_MAGIC_SBE || ++ torMagic == TOR_MAGIC_OVRD || ++ torMagic == TOR_MAGIC_OVLY ) + { + if ( i_PpeType == CME || i_PpeType == SGPE + || i_RingBlockType == GET_DD_LEVEL_RINGS +@@ -1126,11 +1168,11 @@ int tor_access_ring( void* i_ringSection, // Ring section ptr + } + else + { +- ddLevelOffset = 0; ++ ddLevelOffset = sizeof(TorHeader_t); + ddBlockSize = 0; + } + } +- else if ( i_magic == P9_XIP_MAGIC_CME) ++ else if (torMagic == TOR_MAGIC_CME) + { + if ( i_PpeType == SBE || i_PpeType == SGPE + || i_RingBlockType == GET_DD_LEVEL_RINGS +@@ -1141,11 +1183,11 @@ int tor_access_ring( void* i_ringSection, // Ring section ptr + } + else + { +- ddLevelOffset = 0; ++ ddLevelOffset = sizeof(TorHeader_t); + ddBlockSize = 0; + } + } +- else if ( i_magic == P9_XIP_MAGIC_SGPE) ++ else if (torMagic == TOR_MAGIC_SGPE) + { + if ( i_PpeType == SBE || i_PpeType == CME + || i_RingBlockType == GET_DD_LEVEL_RINGS +@@ -1156,15 +1198,18 @@ int tor_access_ring( void* i_ringSection, // Ring section ptr + } + else + { +- ddLevelOffset = 0; ++ ddLevelOffset = sizeof(TorHeader_t); + ddBlockSize = 0; + } + } + else + { +- MY_ERR("Magic number i_magic=0x%016lX\n is not valid.\n", (uintptr_t)i_magic); ++ if (i_dbgl > 0) ++ { ++ MY_ERR("torMagic=0x%08x is not valid\n", torMagic); ++ } + +- return TOR_AMBIGUOUS_API_PARMS; ++ return TOR_INVALID_MAGIC_NUMBER; + } + + if (i_RingBlockType == GET_DD_LEVEL_RINGS) +@@ -1275,22 +1320,23 @@ int tor_access_ring( void* i_ringSection, // Ring section ptr + else if ( i_RingBlockType == GET_SINGLE_RING || + i_RingBlockType == PUT_SINGLE_RING ) + { +- if (i_PpeType == SBE && +- ( i_magic == P9_XIP_MAGIC_HW || +- i_magic == P9_XIP_MAGIC_SEEPROM)) ++ if ( i_PpeType == SBE && ++ ( torMagic == TOR_MAGIC_HW || ++ torMagic == TOR_MAGIC_SBE || ++ torMagic == TOR_MAGIC_OVRD || ++ torMagic == TOR_MAGIC_OVLY ) ) + { +- rc = get_ring_from_sbe_image ( i_ringSection, +- i_magic, +- i_ringId, +- ddLevelOffset, +- io_RingType, +- i_RingVariant, +- io_instanceId, +- i_RingBlockType, +- io_ringBlockPtr, +- io_ringBlockSize, +- o_ringName, +- i_dbgl); ++ rc = get_ring_from_sbe_image( i_ringSection, ++ i_ringId, ++ ddLevelOffset, ++ io_RingType, ++ i_RingVariant, ++ io_instanceId, ++ i_RingBlockType, ++ io_ringBlockPtr, ++ io_ringBlockSize, ++ o_ringName, ++ i_dbgl ); + + if (rc) + { +@@ -1312,22 +1358,21 @@ int tor_access_ring( void* i_ringSection, // Ring section ptr + return TOR_RING_BLOCKS_FOUND; + } + } +- else if (i_PpeType == CME && +- ( i_magic == P9_XIP_MAGIC_HW || +- i_magic == P9_XIP_MAGIC_CME)) ++ else if ( i_PpeType == CME && ++ ( torMagic == TOR_MAGIC_HW || ++ torMagic == TOR_MAGIC_CME ) ) + { +- rc = get_ring_from_cme_image ( i_ringSection, +- i_magic, +- i_ringId, +- ddLevelOffset, +- io_RingType, +- i_RingVariant, +- io_instanceId, +- i_RingBlockType, +- io_ringBlockPtr, +- io_ringBlockSize, +- o_ringName, +- i_dbgl); ++ rc = get_ring_from_cme_image( i_ringSection, ++ i_ringId, ++ ddLevelOffset, ++ io_RingType, ++ i_RingVariant, ++ io_instanceId, ++ i_RingBlockType, ++ io_ringBlockPtr, ++ io_ringBlockSize, ++ o_ringName, ++ i_dbgl ); + + if (rc == TOR_RING_NOT_FOUND) + { +@@ -1379,22 +1424,21 @@ int tor_access_ring( void* i_ringSection, // Ring section ptr + return TOR_RING_BLOCKS_FOUND; + } + } +- else if (i_PpeType == SGPE && +- ( i_magic == P9_XIP_MAGIC_HW || +- i_magic == P9_XIP_MAGIC_SGPE)) ++ else if ( i_PpeType == SGPE && ++ ( torMagic == TOR_MAGIC_HW || ++ torMagic == TOR_MAGIC_SGPE ) ) + { +- rc = get_ring_from_sgpe_image ( i_ringSection, +- i_magic, +- i_ringId, +- ddLevelOffset, +- io_RingType, +- i_RingVariant, +- io_instanceId, +- i_RingBlockType, +- io_ringBlockPtr, +- io_ringBlockSize, +- o_ringName, +- i_dbgl); ++ rc = get_ring_from_sgpe_image( i_ringSection, ++ i_ringId, ++ ddLevelOffset, ++ io_RingType, ++ i_RingVariant, ++ io_instanceId, ++ i_RingBlockType, ++ io_ringBlockPtr, ++ io_ringBlockSize, ++ o_ringName, ++ i_dbgl ); + + if (rc == TOR_RING_NOT_FOUND) + { +@@ -1448,10 +1492,11 @@ int tor_access_ring( void* i_ringSection, // Ring section ptr + } + else + { +- MY_ERR("\t Code bug: We are unpreparred for this input parm combination: \n" +- "\t i_PpeType=%d\n" +- "\t i_magic=0x%016lX\n", +- i_PpeType, (uintptr_t)i_magic); ++ if (i_dbgl > 0) ++ { ++ MY_ERR("\t Unsupported combination of i_PpeType=%d and torMagic=0x%08x\n", ++ i_PpeType, torMagic); ++ } + + return TOR_AMBIGUOUS_API_PARMS; + } +@@ -1466,7 +1511,8 @@ int tor_access_ring( void* i_ringSection, // Ring section ptr + } + + return TOR_AMBIGUOUS_API_PARMS; +-} ++ ++} // End of tor_access_ring() + + + +@@ -1476,7 +1522,6 @@ int tor_access_ring( void* i_ringSection, // Ring section ptr + // + ///////////////////////////////////////////////////////////////////////////////////// + int tor_get_single_ring ( void* i_ringSection, // Ring section ptr +- uint64_t i_magic, // Image Magic Number + uint16_t i_ddLevel, // DD level + RingID i_ringId, // Ring ID + PpeType_t i_PpeType, // SBE, CME, SGPE +@@ -1489,7 +1534,7 @@ int tor_get_single_ring ( void* i_ringSection, // Ring section ptr + + uint32_t rc; + char i_ringName[25]; +- uint8_t l_instanceId = i_instanceId; ++ //@FIXME: This should really be ALLRING. But it's not used as input. + RingType_t l_ringType; + l_ringType = COMMON; + +@@ -1499,13 +1544,12 @@ int tor_get_single_ring ( void* i_ringSection, // Ring section ptr + } + + rc = tor_access_ring( i_ringSection, +- i_magic, + i_ringId, + i_ddLevel, + i_PpeType, + l_ringType, + i_RingVariant, +- l_instanceId, ++ i_instanceId, + GET_SINGLE_RING, + io_ringBlockPtr, + io_ringBlockSize, +@@ -1531,7 +1575,7 @@ int tor_get_single_ring ( void* i_ringSection, // Ring section ptr + int tor_get_block_of_rings ( void* i_ringSection, // Ring section ptr + uint16_t i_ddLevel, // DD level + PpeType_t i_PpeType, // SBE,CME,SGPE +- RingType_t i_RingType, // Common, Instance ++ RingType_t i_ringType, // Common, Instance + RingVariant_t i_RingVariant, // Base,CC, RL, Ovrd, Ovly + uint8_t i_instanceId, // Instance ID + void** io_ringBlockPtr, // Output ring buffer +@@ -1545,20 +1589,17 @@ int tor_get_block_of_rings ( void* i_ringSection, // Ring section + + uint32_t rc = 0; + char i_ringName[25]; +- uint8_t l_instanceId = i_instanceId; +- RingType_t l_ringType = i_RingType; + +- if (l_ringType == ALLRING && i_PpeType != NUM_PPE_TYPES) ++ if (i_ringType == ALLRING && i_PpeType != NUM_PPE_TYPES) + { + // Get block of rings specific to a PPE type + rc = tor_access_ring( i_ringSection, +- P9_XIP_MAGIC_HW, + NUM_RING_IDS, + i_ddLevel, + i_PpeType, +- l_ringType, ++ i_ringType, + i_RingVariant, +- l_instanceId, ++ i_instanceId, + GET_PPE_LEVEL_RINGS, + io_ringBlockPtr, + io_ringBlockSize, +@@ -1566,17 +1607,16 @@ int tor_get_block_of_rings ( void* i_ringSection, // Ring section + i_dbgl ); + + } +- else if (l_ringType == ALLRING && i_PpeType == NUM_PPE_TYPES) ++ else if (i_ringType == ALLRING && i_PpeType == NUM_PPE_TYPES) + { + // Get DD level block of rings + rc = tor_access_ring( i_ringSection, +- P9_XIP_MAGIC_HW, + NUM_RING_IDS, + i_ddLevel, + i_PpeType, +- l_ringType, ++ i_ringType, + i_RingVariant, +- l_instanceId, ++ i_instanceId, + GET_DD_LEVEL_RINGS, + io_ringBlockPtr, + io_ringBlockSize, +@@ -1622,39 +1662,17 @@ int tor_append_ring( void* i_ringSection, // Ring section ptr + char i_ringName[25]; + uint32_t l_buf = 0; + uint32_t* l_cpltSection = &l_buf; +- uint8_t l_instanceId = i_instanceId; +- RingType_t l_RingType = i_RingType; + uint32_t l_ringBlockSize; + uint16_t l_ringOffset16; +- uint64_t l_magic; + uint32_t l_torOffsetSlot; + +- if (i_PpeType == SBE) // Assign i_magic variant as SBE image +- { +- l_magic = P9_XIP_MAGIC_SEEPROM; +- } +- else if (i_PpeType == CME) // Assign i_magic variant as CME image +- { +- l_magic = P9_XIP_MAGIC_CME; +- } +- else if (i_PpeType == SGPE) // Assign i_magic variant as SGPE image +- { +- l_magic = P9_XIP_MAGIC_SGPE; +- } +- else +- { +- MY_ERR("PPE type (i_PpeType=%d) is not supported \n", i_PpeType); +- return TOR_AMBIGUOUS_API_PARMS; +- } +- + rc = tor_access_ring( i_ringSection, +- l_magic, + i_ringId, + 0x00, + i_PpeType, +- l_RingType, ++ i_RingType, + i_RingVariant, +- l_instanceId, ++ i_instanceId, + PUT_SINGLE_RING, + (void**)&l_cpltSection, // On return, contains offset (wrt ringSection) of + // chiplet section's common or instance section +@@ -1665,7 +1683,11 @@ int tor_append_ring( void* i_ringSection, // Ring section ptr + + if (rc) + { +- MY_ERR("tor_access_ring() failed w/rc=0x%x \n", rc); ++ if (i_dbgl > 0) ++ { ++ MY_ERR("tor_append_ring() failed in call to tor_access_ring w/rc=0x%x \n", rc); ++ } ++ + return rc; + } + +@@ -1700,6 +1722,10 @@ int tor_append_ring( void* i_ringSection, // Ring section ptr + // Update the ringSectionSize + io_ringSectionSize += l_ringBlockSize; + ++ // Update also the size in the TOR header ++ TorHeader_t* torHeader = (TorHeader_t*)i_ringSection; ++ torHeader->size = htobe32(be32toh(torHeader->size) + l_ringBlockSize); ++ + return TOR_SUCCESS; + } + +diff --git a/src/import/chips/p9/utils/imageProcs/p9_tor.H b/src/import/chips/p9/utils/imageProcs/p9_tor.H +index d4b4250..7d57872 100644 +--- a/src/import/chips/p9/utils/imageProcs/p9_tor.H ++++ b/src/import/chips/p9/utils/imageProcs/p9_tor.H +@@ -25,7 +25,6 @@ + #ifndef _P9_TOR_H_ + #define _P9_TOR_H_ + +-#include "p9_ring_id.h" + #include "p9_ringId.H" + + #define MAX_TOR_RING_OFFSET (256*256-1) // Max value of 2Byte uint +@@ -36,7 +35,7 @@ namespace P9_TOR + extern const char* ppeTypeName[]; + extern const char* ringVariantName[]; + +-#define TOR_VERSION 2 ++#define TOR_VERSION 3 + + // + // TOR Magic values for top-level TOR image and TOR sub-images +@@ -53,7 +52,34 @@ enum TorMagicNum + TOR_MAGIC_CEN = (uint32_t)0x544F524E, // "TORN" + }; + ++// ++// Chip types to represent p9n, p9c, centaur ++// ++enum ChipType ++{ ++ CT_P9N, ++ CT_P9C, ++ CT_CEN, ++ NUM_CHIP_TYPES ++}; ++ + typedef uint8_t ChipType_t; ++const ChipType_t INVALID_CHIP_TYPE = 0xff; ++ ++typedef struct ChipTypeList ++{ ++ const char* name; ++ ChipType_t type; ++} ChipTypeList_t; ++ ++const ChipTypeList_t CHIP_TYPE_LIST[] = ++{ ++ {"p9n", CT_P9N}, ++ {"p9c", CT_P9C}, ++ {"cen", CT_CEN}, ++}; ++ ++ + + // + // TOR header field (appears in top of every HW, SBE, CEN, OVRD, etc ring section) +@@ -65,26 +91,26 @@ typedef struct + ChipType_t chipType; // Value from ChipType enum + uint8_t ddLevel; // =0xff if MAGIC_HW, >0 all other MAGICs + uint8_t numDdLevels; // >0 if MAGIC_HW, =1 all other MAGICs +- uint32_t size; // Size of the TOR ringSection. ++ uint32_t size; // A place holder for now, but will be used in a later commit. + } TorHeader_t; + ++#define UNDEFINED_DD_LEVEL (uint8_t)0xff + ++// ++// Subsequent TOR fields (listed in order they appear in TOR for easier understanding) ++// + typedef struct + { +- uint32_t TorNumDdLevels; +- uint32_t reserved; +-} TorNumDdLevels_t; +- +-typedef struct +-{ +- uint32_t TorDdLevelAndOffset; +- uint32_t TorDdBlockSize; +-} TorDdLevelBlock_t; ++ uint32_t offset; ++ uint32_t size; ++ uint8_t ddLevel; ++ uint8_t reserved[3]; ++} TorDdBlock_t; + + typedef struct + { +- uint32_t TorPpeTypeOffset; +- uint32_t TorPpeBlockSize; ++ uint32_t offset; ++ uint32_t size; + } TorPpeBlock_t; + + typedef struct +@@ -95,6 +121,13 @@ typedef struct + + typedef uint16_t TorRingOffset_t; // Ring offset value in TOR offset slot + ++//@FIXME Discard asap ++typedef enum TorOffsetSize ++{ ++ RING_OFFSET_SIZE = 2, ++ CPLT_OFFSET_SIZE = 4 ++} TorOffsetSize_t; ++ + #define TOR_SUCCESS 0 + #define TOR_RING_FOUND 0 + #define TOR_RING_BLOCKS_FOUND 0 +@@ -117,6 +150,7 @@ typedef uint16_t TorRingOffset_t; // Ring offset value in TOR offset slot + #define TOR_BUFFER_TOO_SMALL 17 + #define TOR_TOO_MANY_DD_LEVELS 18 + #define TOR_OFFSET_TOO_BIG 19 ++#define TOR_INVALID_VARIANT 20 + + // Different options to extract data using tor_access_ring API + typedef enum RingBlockType +@@ -142,12 +176,6 @@ typedef enum PpeType + NUM_PPE_TYPES = 0x03 + } PpeType_t; + +-typedef enum TorOffsetSize +-{ +- RING_OFFSET_SIZE = 2, +- CPLT_OFFSET_SIZE = 4 +-} TorOffsetSize_t; +- + /// + /// **************************************************************************** + /// Function declares. +@@ -161,9 +189,6 @@ typedef enum TorOffsetSize + /// TOR API supports two type of binary image. 1) HW image format and 2) + /// SEEPROM image format binary + /// +-/// \param[in] i_magic A uint64_t variable to indicate XIP image format +-/// ring section passed +-/// + /// \param[in] i_ringId A enum to indicate unique ID for the ring + /// + /// \param[in] i_ddLevel A variable to indicate chip DD level. TOR API +@@ -211,8 +236,7 @@ typedef enum TorOffsetSize + /// and the following n number of operation based on the call. + /// + /// GET_SINGLE_RING (\a i_ringVariant) - traverse on \a i_ringSection buffer +-/// based on the following input param \a i_magic which gives details of image +-/// type, \a i_ringId which gives ring info, \a i_ddLevel which gives dd spec ++/// based on \a i_ringId which gives ring info, \a i_ddLevel which gives dd spec + /// (Used only for HW image/optional for other image) i_ppeType which gives ppe + /// type info, \a i_ringVarint gives ring variant info and \a io_instance which + /// gives chiplet instance specific while accessing instance specific ring and +@@ -222,33 +246,29 @@ typedef enum TorOffsetSize + /// data copied into io_ringBlockPtr. \a o_ringName returns ring string name. + /// + /// GET_DD_LEVEL_RINGS (\a i_ringVariant) - traverse on \a i_ringSection +-/// buffer based on the following input param \a i_magic which gives details +-/// of image type and \a i_ddLevel which gives dd spec(Used only for HW image ++/// buffer based on \a i_ddLevel which gives dd spec (used only for HW image + /// /optional for other image) On return, \a io_ringBlockPtr contains DD level + /// specific ring section and \a io_ringBlockSize contains size of the data + /// copied into io_ringBlockPtr. \a Other params are optional. + /// This ringVariant works on HW image. + /// + /// GET_PPE_LEVEL_RINGS (\a i_ringVariant) - traverse on \a i_ringSection +-/// buffer based on the following input param \a i_magic which gives the detail +-/// of image type, i_ppeType which gives ppe type info and \a i_ddLevel which +-/// gives dd spec(Used only for HW image/optional for other image) On return, ++/// buffer based on \a i_ppeType which gives ppe type info and \a i_ddLevel which ++/// gives dd spec used only for HW image/optional for other image) On return, + /// \a io_ringBlockPtr contains PPE type specific ring section and + /// \a io_ringBlockSize contains size of the data copied into io_ringBlockPtr. + /// \a Other params are optional. This ringVariant works on HW image. + /// + /// GET_CPLT_LEVEL_RINGS (\a i_ringVariant) - traverse on \a i_ringSection +-/// buffer based on the following input param \a i_magic which gives the detail +-/// of image type, i_ppeType which gives ppe type info, \a i_ddLevel which gives +-/// dd spec(Used only for HW image/optional for other image) and \a io_RingType ++/// buffer based on \a i_ppeType which gives ppe type info, \a i_ddLevel which gives ++/// dd spec (used only for HW image/optional for other image) and \a io_RingType + /// which gives ring type info. On return, \a io_ringBlockPtr contains chiplet + /// specific ring type ring section and \a io_ringBlockSize contains size of + /// the data copied into io_ringBlockPtr. \a Other params are optional. + /// + /// PUT_SINGLE_RING (\a i_ringVariant) - traverse on \a i_ringSection buffer +-/// based on the following input param \a i_magic which gives detail of image +-/// type, \a i_ringId which gives ring info, \a i_ddLevel which gives dd spec +-/// (Used only for HW image/optional for other image), i_ppeType which gives ++/// based on \a i_ringId which gives ring info, \a i_ddLevel which gives dd spec ++/// (used only for HW image/optional for other image), i_ppeType which gives + /// ppe type info, \a i_ringVarint gives ring variant info and \a io_instance + /// which gives chiplet instance specific while accessing instance specific + /// ring and returns chiplet number while accessing common ring. On return, +@@ -261,7 +281,6 @@ typedef enum TorOffsetSize + /// + /// \retval non-0 See \ref TOR API RETURN errors + int tor_access_ring( void* i_ringSection, // Ring address Ptr any of .rings, .overrides and .overlays. +- uint64_t i_magic, // Image Magic Number + RingID i_ringId, // Unique ring ID + uint16_t i_ddLevel, // DD level info + PpeType_t i_PpeType, // PPE type : SBE, CME, etc +@@ -282,9 +301,6 @@ int tor_access_ring( void* i_ringSection, // Ring address Ptr any of . + /// It contain details of p9 Ring which is used for scanning operation. + /// TOR API supports HW image format only + /// +-/// \param[in] i_magic A uint64_t variable to indicate XIP image format +-/// ring section passed +-/// + /// \param[in] i_ringId A enum to indicate unique ID for the ring + /// + /// \param[in] i_ddLevel A variable to indicate chip DD level. TOR API +@@ -316,7 +332,6 @@ int tor_access_ring( void* i_ringSection, // Ring address Ptr any of . + /// + /// \retval non-0 See \ref TOR API RETURN errors + int tor_get_single_ring ( void* i_ringSection, +- uint64_t i_magic, // Image Magic Number + uint16_t i_ddLevel, + RingID i_ringId, + PpeType_t i_PpeType, +diff --git a/src/import/chips/p9/xip/p9_xip_tool.C b/src/import/chips/p9/xip/p9_xip_tool.C +index 0455510..069cb42 100644 +--- a/src/import/chips/p9/xip/p9_xip_tool.C ++++ b/src/import/chips/p9/xip/p9_xip_tool.C +@@ -149,9 +149,16 @@ const char* g_usage = + "section of the image at the time it is deleted, or must be empty. The\n" + "'delete' command writes the size of the final modified image to stdout.\n" + "\n" +- "The 'dissect' command dissects the ring section named by the section argument\n" +- "and summarizes the content of the ring section. The second argument to\n" +- "'dissect', i.e. [table,short,normal(default),long,raw], specifies how much information\n" ++ "The 'dissect' command dissects a ring section. It accepts two different\n" ++ "types of images, namely the regular XIP image and now also stand-alone\n" ++ "ring section images (that have the TOR header). Wrt an XIP image, the\n" ++ "'dissect' command dissects the ring section named by the section argument.\n" ++ "Wrt a stand-alone ring section image, the 'dissect' command dissects\n" ++ "the ring section based on the TOR magic word embedded in the top of the\n" ++ "image. It does so regardless of what the section argument is (so for now\n" ++ "pass it .rings in this argument). In both cases, 'dissect' summarizes\n" ++ "the content of the ring section. The second argument to 'dissect', i.e.\n" ++ "[table,short,normal(default),long,raw], specifies how much information\n" + "is included in the listing:\n" + " table: Tabular overview.\n" + " short: The bare necessities.\n" +@@ -1751,9 +1758,7 @@ TEST(void* io_image, const int i_argc, const char** i_argv) + /// + /// \param[in] i_ringSection A pointer to a TOR compliant ring section. + /// +-/// \param[in] i_imageMagicNo The image's MAGIC number. +-/// +-/// \param[in] i_listingModeId The listing mode: {table, short, normal(default), long, raw}. ++/// \param[in] i_listingModeId The listing mode: {table, short, normal(default), long}. + /// + /// Assumptions: + /// - Dissection only works with .rings section. It does not work with .overrides +@@ -1761,13 +1766,14 @@ TEST(void* io_image, const int i_argc, const char** i_argv) + /// + static + int dissectRingSectionTor( void* i_ringSection, +- uint64_t i_imageMagicNo, + uint8_t i_listingModeId ) + { + int rc = 0; + uint32_t i; +- uint32_t numDdLevels; +- uint8_t iDdLevel, ddLevel; ++ uint32_t torMagic = 0xffffffff; // Undefined value ++ uint8_t chipType = 0xff; // Undefined value ++ uint32_t numDdLevels = 0; // Undefined value ++ uint8_t iDdLevel, ddLevel = 0xff; // Undefined value + uint8_t ppeType; + uint8_t ringId; + RingType_t ringType; +@@ -1789,6 +1795,33 @@ int dissectRingSectionTor( void* i_ringSection, + double comprRate; + uint8_t cmskRingIteration = 0; + char ringSuffix = ' '; ++ uint8_t* buf = (uint8_t*)i_ringSection; ++ TorHeader_t* torHeader = (TorHeader_t*)i_ringSection; ++ int offset = sizeof(TorHeader_t); ++ TorDdBlock_t* torDdBlock; ++ ++ // ++ // Get TOR magic, chip type and DD level info from TOR header field ++ // ++ torMagic = be32toh(torHeader->magic); ++ chipType = torHeader->chipType; ++ ddLevel = torHeader->ddLevel; ++ numDdLevels = torHeader->numDdLevels; ++ ++ fprintf(stdout, "---------------------------------\n"); ++ fprintf(stdout, "* TOR header summary *\n"); ++ fprintf(stdout, "---------------------------------\n"); ++ fprintf(stdout, "TOR magic: 0x%4x=>%c%c%c%c\n", torMagic, ++ (uint8_t)(torMagic >> 24), ++ (uint8_t)(torMagic >> 16), ++ (uint8_t)(torMagic >> 8), ++ (uint8_t)(torMagic)); ++ fprintf(stdout, "TOR version: %d\n", torHeader->version); ++ fprintf(stdout, "Chip type: %d=>%s\n", chipType, CHIP_TYPE_LIST[chipType].name); ++ fprintf(stdout, "DD level: 0x%x\n", ddLevel); ++ fprintf(stdout, "Num DD levels: %d\n", numDdLevels); ++ fprintf(stdout, "---------------------------------\n"); ++ fprintf(stdout, "\n\n"); + + if (i_listingModeId != LMID_TABLE) + { +@@ -1802,20 +1835,6 @@ int dissectRingSectionTor( void* i_ringSection, + ringBlockSize = RING_BUF_SIZE_MAX; + ringBlockPtr = malloc(ringBlockSize); + +- // +- // Get number of DD levels from TOR structure in ring section +- // +- if (i_imageMagicNo == P9_XIP_MAGIC_HW) +- { +- numDdLevels = htobe32( ( (TorNumDdLevels_t*)i_ringSection )->TorNumDdLevels ); +- fprintf( stderr, "numDdLevels (=%d) read from top of ring section.\n", numDdLevels); +- } +- else +- { +- numDdLevels = 1; +- ddLevel = 0xff; // This means it's unknown. +- fprintf( stderr, "Image contains only one DD level set of rings.\n"); +- } + + if (i_listingModeId == LMID_TABLE) + { +@@ -1826,11 +1845,11 @@ int dissectRingSectionTor( void* i_ringSection, + // DD level loop. + for (iDdLevel = 0; iDdLevel < numDdLevels; iDdLevel++) + { +- +- if (i_imageMagicNo == P9_XIP_MAGIC_HW) ++ if (torMagic == TOR_MAGIC_HW) + { +- ddLevel = ( ( htobe32( ( ( (TorDdLevelBlock_t*)((uintptr_t)i_ringSection + sizeof(TorNumDdLevels_t)) ) + +- iDdLevel )->TorDdLevelAndOffset ) & 0xff000000 ) >> 24 ); ++ torDdBlock = (TorDdBlock_t*)&buf[offset]; ++ offset += sizeof(TorDdBlock_t); ++ ddLevel = torDdBlock->ddLevel; + } + + //---------------- +@@ -1839,9 +1858,10 @@ int dissectRingSectionTor( void* i_ringSection, + for (ppeType = 0; ppeType < NUM_PPE_TYPES; ppeType++) + { + +- if ((i_imageMagicNo == P9_XIP_MAGIC_SGPE && ppeType != SGPE) || +- (i_imageMagicNo == P9_XIP_MAGIC_CME && ppeType != CME) || +- (i_imageMagicNo == P9_XIP_MAGIC_SEEPROM && ppeType != SBE)) ++ if ((torMagic == TOR_MAGIC_SGPE && ppeType != SGPE) || ++ (torMagic == TOR_MAGIC_CME && ppeType != CME) || ++ (torMagic == TOR_MAGIC_SBE && ppeType != SBE) || ++ (torMagic == TOR_MAGIC_OVRD && ppeType != SBE)) + { + continue; + } +@@ -1849,8 +1869,13 @@ int dissectRingSectionTor( void* i_ringSection, + //-------------------- + // Ring variant loop. + // - Base, cache, risk, override, overlay +- for (ringVariant = 0; ringVariant < OVERRIDE; ringVariant++) ++ for (ringVariant = 0; ringVariant <= OVERRIDE; ringVariant++) + { ++ if ((torMagic != TOR_MAGIC_OVRD && ringVariant == OVERRIDE) || ++ (torMagic == TOR_MAGIC_OVRD && ringVariant != OVERRIDE)) ++ { ++ continue; ++ } + + //---------------------- + // Unique ring ID loop. +@@ -1876,7 +1901,6 @@ int dissectRingSectionTor( void* i_ringSection, + + ringBlockSize = RING_BUF_SIZE_MAX; + rc = tor_access_ring( i_ringSection, +- i_imageMagicNo, + (RingID)ringId, + ddLevel, + (PpeType_t)ppeType, +@@ -1894,12 +1918,25 @@ int dissectRingSectionTor( void* i_ringSection, + if (rc == TOR_RING_FOUND) + { + rs4 = (CompressedScanData*)ringBlockPtr; +- ringSize = be16toh(rs4->iv_size); ++ ++ // Sanity check RS4 container's ringId matches the requested. ++ uint16_t l_ringId = be16toh(rs4->iv_ringId); ++ ++ if ( l_ringId != ringId ) ++ { ++ fprintf(stderr, "tor_access_ring() was successful and found a ring. But " ++ "RS4 header's iv_ringId(=0x%x) differs from requested ringId(=0x%x).\n", ++ l_ringId, ringId); ++ exit(1); ++ } ++ + + // Check ring block size. ++ ringSize = be16toh(rs4->iv_size); ++ + if ( ringSize != ringBlockSize || ringSize == 0 ) + { +- fprintf(stderr, "tor_access_ring() was successful and found a ring but " ++ fprintf(stderr, "tor_access_ring() was successful and found a ring. But " + "RS4 header's iv_size(=0x%04x) is either zero or doesn't match " + "size of ring buffer (ringBlockSize=0x%04x).\n", + ringSize, ringBlockSize); +@@ -2077,6 +2114,8 @@ int dissectRingSectionTor( void* i_ringSection, + } + else if (rc == TOR_RING_NOT_FOUND || + rc == TOR_INVALID_INSTANCE_ID || ++ rc == TOR_INVALID_CHIPLET || ++ rc == TOR_INVALID_VARIANT || + rc == TOR_AMBIGUOUS_API_PARMS || + rc == TOR_INVALID_RING_ID) + { +@@ -2087,7 +2126,9 @@ int dissectRingSectionTor( void* i_ringSection, + else + { + fprintf(stderr, "tor_access_ring() returned error code rc=%d\n", rc); +- exit(1); ++ { ++ exit(1); ++ } + } + + } // End of for(instanceId) +@@ -2154,60 +2195,101 @@ int dissectRingSection(void* i_image, + listingModeName = i_argv[1]; + } + +- p9_xip_translate_header(&hostHeader, (P9XipHeader*)i_image); +- +- // Determine P9-XIP ring section ID from the section name, e.g. +- // .rings => P9_XIP_SECTION_HW_RINGS +- if (strcmp(sectionName, ".rings") == 0) ++ // Determine whether i_image is an XIP image or an isolated TOR ring section image. ++ // ++ if (be64toh(((P9XipHeader*)i_image)->iv_magic) >> 32 == P9_XIP_MAGIC) + { +- if (hostHeader.iv_magic == P9_XIP_MAGIC_SEEPROM) +- { +- sectionId = P9_XIP_SECTION_SBE_RINGS; +- } +- else if (hostHeader.iv_magic == P9_XIP_MAGIC_HW) ++ ++ p9_xip_translate_header(&hostHeader, (P9XipHeader*)i_image); ++ ++ // Determine P9-XIP ring section ID from the section name, e.g. ++ // .rings => P9_XIP_SECTION_HW_RINGS ++ if (strcmp(sectionName, ".rings") == 0) + { +- sectionId = P9_XIP_SECTION_HW_RINGS; ++ if (hostHeader.iv_magic == P9_XIP_MAGIC_SEEPROM) ++ { ++ sectionId = P9_XIP_SECTION_SBE_RINGS; ++ } ++ else if (hostHeader.iv_magic == P9_XIP_MAGIC_HW) ++ { ++ sectionId = P9_XIP_SECTION_HW_RINGS; ++ } ++ else ++ { ++ fprintf(stderr, "ERROR: .rings is not a valid section for image w/magic=0x%016lx\n", ++ hostHeader.iv_magic); ++ exit(1); ++ } + } +- else ++ else if (strcmp(sectionName, ".overrides") == 0) + { +- fprintf(stderr, "ERROR: .rings is not a valid section for image w/magic=0x%016lx\n", +- hostHeader.iv_magic); +- exit(1); ++ if (hostHeader.iv_magic == P9_XIP_MAGIC_SEEPROM) ++ { ++ sectionId = P9_XIP_SECTION_SBE_OVERRIDES; ++ } ++ else ++ { ++ fprintf(stderr, "ERROR: .overrides is not a valid section for image w/magic=0x%016lx\n", ++ hostHeader.iv_magic); ++ exit(1); ++ } + } +- } +- else if (strcmp(sectionName, ".overrides") == 0) +- { +- if (hostHeader.iv_magic == P9_XIP_MAGIC_SEEPROM) ++ else if (strcmp(sectionName, ".overlays") == 0) + { +- sectionId = P9_XIP_SECTION_SBE_OVERRIDES; ++ if (hostHeader.iv_magic == P9_XIP_MAGIC_SEEPROM) ++ { ++ sectionId = P9_XIP_SECTION_SBE_OVERLAYS; ++ } ++ else ++ { ++ fprintf(stderr, "ERROR: .overlays is not a valid section for image w/magic=0x%016lx\n", ++ hostHeader.iv_magic); ++ exit(1); ++ } + } + else + { +- fprintf(stderr, "ERROR: .overrides is not a valid section for image w/magic=0x%016lx\n", +- hostHeader.iv_magic); ++ fprintf(stderr, "ERROR : %s is an invalid ring section name.\n", sectionName); ++ fprintf(stderr, "Valid ring <section> names for the 'dissect' function are:\n"); ++ fprintf(stderr, "\t.rings\n"); ++ fprintf(stderr, "\t.overrides\n"); ++ fprintf(stderr, "\t.overlays\n"); + exit(1); + } +- } +- else if (strcmp(sectionName, ".overlays") == 0) +- { +- if (hostHeader.iv_magic == P9_XIP_MAGIC_SEEPROM) ++ ++ // Get ring section. ++ // ++ rc = p9_xip_get_section( i_image, sectionId, &hostSection); ++ ++ if (rc) + { +- sectionId = P9_XIP_SECTION_SBE_OVERLAYS; ++ fprintf( stderr, "p9_xip_get_section() failed : %s\n", P9_XIP_ERROR_STRING(g_errorStrings, rc)); ++ return P9_XIP_DISASSEMBLER_ERROR; + } +- else ++ ++ if (hostSection.iv_offset == 0) + { +- fprintf(stderr, "ERROR: .overlays is not a valid section for image w/magic=0x%016lx\n", +- hostHeader.iv_magic); ++ fprintf( stdout, "Ring section (w/ID=%d) is empty. Nothing to do. Quitting.\n", sectionId); + exit(1); + } ++ ++ if (be32toh(((TorHeader_t*)i_image)->magic) >> 8 != TOR_MAGIC) ++ { ++ fprintf( stderr, ++ "ERROR: The XIP section is not a TOR compatible ring section. Possibly, the image is outdated and has the old TOR-headerless layout which is no longer supported. Try dissecting with an older version of p9_xip_tool.\n"); ++ exit(EXIT_FAILURE); ++ } ++ ++ ringSectionPtr = (void*)(hostSection.iv_offset + (uintptr_t)i_image); ++ ++ } ++ else if (be32toh(((TorHeader_t*)i_image)->magic) >> 8 == TOR_MAGIC) ++ { ++ ringSectionPtr = i_image; + } + else + { +- fprintf(stderr, "ERROR : %s is an invalid ring section name.\n", sectionName); +- fprintf(stderr, "Valid ring <section> names for the 'dissect' function are:\n"); +- fprintf(stderr, "\t.rings\n"); +- fprintf(stderr, "\t.overrides\n"); +- fprintf(stderr, "\t.overlays\n"); ++ fprintf(stderr, "ERROR : Input image is neither an XIP image nor an TOR ringSection image.\n"); + exit(1); + } + +@@ -2249,25 +2331,7 @@ int dissectRingSection(void* i_image, + exit(1); + } + +- // Get ring section. +- // +- rc = p9_xip_get_section( i_image, sectionId, &hostSection); +- +- if (rc) +- { +- fprintf( stderr, "p9_xip_get_section() failed : %s\n", P9_XIP_ERROR_STRING(g_errorStrings, rc)); +- return P9_XIP_DISASSEMBLER_ERROR; +- } +- +- if (hostSection.iv_offset == 0) +- { +- fprintf( stdout, "Ring section (w/ID=%d) is empty. Nothing to do. Quitting.\n", sectionId); +- exit(1); +- } +- +- ringSectionPtr = (void*)(hostSection.iv_offset + (uintptr_t)i_image); +- +- rc = dissectRingSectionTor(ringSectionPtr, hostHeader.iv_magic, listingModeId); ++ rc = dissectRingSectionTor(ringSectionPtr, listingModeId); + + return rc; + +@@ -2326,7 +2390,8 @@ openAndMap(const char* i_fileName, int i_writable, int* o_fd, void** o_image, co + exit(1); + } + +- if ( !(i_maskIgnores & P9_XIP_IGNORE_ALL) ) ++ if ( !(i_maskIgnores & P9_XIP_IGNORE_ALL) && ++ (be64toh(((P9XipHeader*)o_image)->iv_magic) >> 32 == P9_XIP_MAGIC) ) + { + rc = p9_xip_validate2(*o_image, g_imageSize, i_maskIgnores); + +diff --git a/src/test/framework/etc/workarounds.presimsetup b/src/test/framework/etc/workarounds.presimsetup +index 8f0c2d1..ba4d156 100755 +--- a/src/test/framework/etc/workarounds.presimsetup ++++ b/src/test/framework/etc/workarounds.presimsetup +@@ -29,7 +29,11 @@ + #egrep -v "WSALIAS DEFAULT FIPSLEVEL|WSALIAS DEFAULT SIMICSLEVEL" $BACKING_BUILD/src/simu/data/simicsInfo > $sb/simu/data/simicsInfo + #echo "WSALIAS DEFAULT FIPSLEVEL env/gfwb/simics-4.2.0/simics-4.2.83/fips/fld36/fi120201a700.42" >> $sb/simu/data/simicsInfo + #echo "WSALIAS DEFAULT SIMICSLEVEL env/vtechb/simics-4.2.0/simics-4.2.83/bin" >> $sb/simu/data/simicsInfo ++#cp /gsa/ausgsa/home/t/h/thi/public/p9n.hw_image.bin $SANDBOXBASE/src/engd/href/p9n.temp_hw_ref_image.bin ++#cp /gsa/ausgsa/home/t/h/thi/public/p9_ipl_build.exe $SANDBOXBASE/obj/ppc/hwsv/server/buildhwpf2/hwpf2/tools/x86_binaries/p9_ipl_build + #mkdir -p $SANDBOXBASE/obj/ppc/hwsv/server/buildhwpf2/hwpf2/tools/x86_binaries/ + #mkdir -p $SANDBOXBASE/src/engd/href +-#cp /gsa/ausgsa/home/t/h/thi/public/p9n.hw_image.bin $SANDBOXBASE/src/engd/href/p9n.temp_hw_ref_image.bin +-#cp /gsa/ausgsa/home/t/h/thi/public/p9_ipl_build.exe $SANDBOXBASE/obj/ppc/hwsv/server/buildhwpf2/hwpf2/tools/x86_binaries/p9_ipl_build ++#cp /esw/san5/cmolsen/sb/hw/tests/refs/ppe-ci/p9_ipl_build_magic_20170817.exe $SANDBOXBASE/obj/ppc/hwsv/server/buildhwpf2/hwpf2/tools/x86_binaries/p9_ipl_build ++#cp /esw/san5/cmolsen/sb/hw/tests/refs/ppe-ci/p9n.hw_image_magic_20170817.bin $SANDBOXBASE/src/engd/href/p9n.temp_hw_ref_image.bin ++#cp /esw/san5/cmolsen/sb/hw/tests/refs/ppe-ci/p9c.hw_image_magic_20170817.bin $SANDBOXBASE/src/engd/href/p9c.temp_hw_ref_image.bin ++ +-- +1.8.2.2 + diff --git a/openpower/package/sbe/sbe.mk b/openpower/package/sbe/sbe.mk index 891d9927..35bdd1df 100644 --- a/openpower/package/sbe/sbe.mk +++ b/openpower/package/sbe/sbe.mk @@ -4,7 +4,7 @@ # ################################################################################ -SBE_VERSION ?= ff713dfd14ecf97b050a737cc5da2d6f01db493f +SBE_VERSION ?= adbd88cd772fd7eb6ccd10f38983ef401e01ed9d SBE_SITE ?= $(call github,open-power,sbe,$(SBE_VERSION)) SBE_LICENSE = Apache-2.0 |