Merge pull request #1523 from wghoffa/tor

op-build Update 10-4-2017
diff --git a/openpower/package/hostboot-binaries/hostboot_binaries.mk b/openpower/package/hostboot-binaries/hostboot_binaries.mk
index 4c5b3b6..4ea66d7 100644
--- a/openpower/package/hostboot-binaries/hostboot_binaries.mk
+++ b/openpower/package/hostboot-binaries/hostboot_binaries.mk
@@ -4,7 +4,8 @@
 #
 ################################################################################
 
-HOSTBOOT_BINARIES_VERSION ?= cddd766c40f1fbcc91dee315158438ad48a0c5ea
+
+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 0000000..f13ec7f
--- /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 0000000..721f9ee
--- /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 891d992..35bdd1d 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