diff --git a/openpower/configs/habanero_defconfig b/openpower/configs/habanero_defconfig
index b16df59..0d94114 100644
--- a/openpower/configs/habanero_defconfig
+++ b/openpower/configs/habanero_defconfig
@@ -17,7 +17,7 @@
 BR2_OPENPOWER_TARGETING_BIN_FILENAME="HABANERO_HB.targeting.bin"
 BR2_OPENPOWER_TARGETING_ECC_FILENAME="HABANERO_HB.targeting.bin.ecc"
 
-BR2_OPENPOWER_PNOR_XML_LAYOUT_FILENAME="HabaneroPnorLayout.xml"
+BR2_OPENPOWER_PNOR_XML_LAYOUT_FILENAME="defaultPnorLayoutWithGoldenSide.xml"
 BR2_OPENPOWER_PNOR_FILENAME="habanero.pnor"
 
 # skiboot requirements
diff --git a/openpower/configs/palmetto_defconfig b/openpower/configs/palmetto_defconfig
index 6de6c4c..bbdaca1 100644
--- a/openpower/configs/palmetto_defconfig
+++ b/openpower/configs/palmetto_defconfig
@@ -16,7 +16,7 @@
 BR2_OPENPOWER_TARGETING_BIN_FILENAME="PALMETTO_HB.targeting.bin"
 BR2_OPENPOWER_TARGETING_ECC_FILENAME="PALMETTO_HB.targeting.bin.ecc"
 
-BR2_OPENPOWER_PNOR_XML_LAYOUT_FILENAME="PalmettoPnorLayout.xml"
+BR2_OPENPOWER_PNOR_XML_LAYOUT_FILENAME="defaultPnorLayoutSingleSide.xml"
 BR2_OPENPOWER_PNOR_FILENAME="palmetto.pnor"
 
 # skiboot requirements
diff --git a/openpower/package/hostboot/hostboot-0005-GCC-4.9-Make-compiler-use-ELFv1-ABI-and-use-O2.patch b/openpower/package/hostboot/hostboot-0003-GCC-4.9-Make-compiler-use-ELFv1-ABI-and-use-O2.patch
similarity index 100%
rename from openpower/package/hostboot/hostboot-0005-GCC-4.9-Make-compiler-use-ELFv1-ABI-and-use-O2.patch
rename to openpower/package/hostboot/hostboot-0003-GCC-4.9-Make-compiler-use-ELFv1-ABI-and-use-O2.patch
diff --git a/openpower/package/hostboot/hostboot-0006-revert-OCC-v3.patch b/openpower/package/hostboot/hostboot-0004-revert-OCC-v3.patch
similarity index 100%
rename from openpower/package/hostboot/hostboot-0006-revert-OCC-v3.patch
rename to openpower/package/hostboot/hostboot-0004-revert-OCC-v3.patch
diff --git a/openpower/package/hostboot/hostboot-0007-Revert-PNOR-goldenside.patch b/openpower/package/hostboot/hostboot-0007-Revert-PNOR-goldenside.patch
deleted file mode 100644
index 038fd09..0000000
--- a/openpower/package/hostboot/hostboot-0007-Revert-PNOR-goldenside.patch
+++ /dev/null
@@ -1,6095 +0,0 @@
-From f4ca5fb46a11c947cc1a334a6e846a9f8a8852cd Mon Sep 17 00:00:00 2001
-From: Matt Ploetz <maploetz@us.ibm.com>
-Date: Fri, 20 Feb 2015 10:59:29 -0600
-Subject: [PATCH 01/10] Revert "Support for PNOR version string sections in
- openPOWER"
-
-This reverts commit 3a15c8bd258a5cb61821b9325f214a47b8faffbf.
----
- src/include/usr/pnor/pnorif.H | 1 -
- src/usr/pnor/pnor_common.C    | 3 +--
- 2 files changed, 1 insertion(+), 3 deletions(-)
-
-diff --git a/src/include/usr/pnor/pnorif.H b/src/include/usr/pnor/pnorif.H
-index 7229466..00f80f4 100644
---- a/src/include/usr/pnor/pnorif.H
-+++ b/src/include/usr/pnor/pnorif.H
-@@ -61,7 +61,6 @@ enum SectionId
-     ATTR_TMP,       /**< Temporary Attribute Override */
-     ATTR_PERM,      /**< Permanent Attribute Override */
-     CAPP,           /**< CAPP lid */
--    VERSION,        /**< PNOR version string section */
-     TEST,           /**< Scratch space for PNOR test cases */
-     TESTRO,         /**< Scratch space for PNOR ReadOnly test cases */
- 
-diff --git a/src/usr/pnor/pnor_common.C b/src/usr/pnor/pnor_common.C
-index c8c1e14..00931ec 100644
---- a/src/usr/pnor/pnor_common.C
-+++ b/src/usr/pnor/pnor_common.C
-@@ -66,8 +66,7 @@ const char* cv_EYECATCHER[] = {
-     "FIRDATA",   /**< PNOR::FIRDATA        : FIRDATA */
-     "ATTR_TMP",  /**< PNOR::ATTR_TMP       : Temporary Attribute Overrides */
-     "ATTR_PERM", /**< PNOR::ATTR_PERM      : Permanent Attribute Overrides */
--    "CAPP",      /**< PNOR::CAPP           : CAPP LID */
--    "VERSION",   /**< PNOR::VERSION        : PNOR Version string */
-+    "CAPP",      /**< PNOR::CAPP            : CAPP LID */
-     "TEST",      /**< PNOR::TEST           : Test space for PNOR*/
-     "TESTRO",    /**< PNOR::TESTRO         : ReadOnly Test space for PNOR */
-     //Not currently used
--- 
-1.8.2.2
-
-
-From a67aea13a1a3227e47a782bb7a5b965f22c9524b Mon Sep 17 00:00:00 2001
-From: Matt Ploetz <maploetz@us.ibm.com>
-Date: Fri, 20 Feb 2015 10:59:41 -0600
-Subject: [PATCH 02/10] Revert "Increasing size of HBRT to 3MB+ECC in
- defaultPnorLayout"
-
-This reverts commit 110da83dad46fd3ac100bf60375ff1b7716114c9.
----
- src/build/buildpnor/defaultPnorLayout.xml | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
-
-diff --git a/src/build/buildpnor/defaultPnorLayout.xml b/src/build/buildpnor/defaultPnorLayout.xml
-index adb04fd..18c309d 100644
---- a/src/build/buildpnor/defaultPnorLayout.xml
-+++ b/src/build/buildpnor/defaultPnorLayout.xml
-@@ -165,10 +165,10 @@ Layout Description
-         <ecc/>
-     </section>
-     <section>
--        <description>Hostboot Runtime Services for Sapphire (3.375MB)</description>
-+        <description>Hostboot Runtime Services for Sapphire (2.25MB)</description>
-         <eyeCatch>HBRT</eyeCatch>
-         <physicalOffset>0xA35000</physicalOffset>
--        <physicalRegionSize>0x360000</physicalRegionSize>
-+        <physicalRegionSize>0x240000</physicalRegionSize>
-         <sha512Version/>
-         <side>sideless</side>
-         <ecc/>
-@@ -176,7 +176,7 @@ Layout Description
-     <section>
-         <description>Payload (22.5MB)</description>
-         <eyeCatch>PAYLOAD</eyeCatch>
--        <physicalOffset>0xD95000</physicalOffset>
-+        <physicalOffset>0xC75000</physicalOffset>
-         <physicalRegionSize>0x1680000</physicalRegionSize>
-         <side>sideless</side>
-         <ecc/>
-@@ -184,7 +184,7 @@ Layout Description
-     <section>
-         <description>Special PNOR Test Space (36K)</description>
-         <eyeCatch>TEST</eyeCatch>
--        <physicalOffset>0x2415000</physicalOffset>
-+        <physicalOffset>0x3590000</physicalOffset>
-         <physicalRegionSize>0x9000</physicalRegionSize>
-         <testonly/>
-         <side>sideless</side>
-@@ -193,7 +193,7 @@ Layout Description
-     <section>
-         <description>Special PNOR Test Space (36K)</description>
-         <eyeCatch>TESTRO</eyeCatch>
--        <physicalOffset>0x241E000</physicalOffset>
-+        <physicalOffset>0x3599000</physicalOffset>
-         <physicalRegionSize>0x9000</physicalRegionSize>
-         <side>sideless</side>
-         <testonly/>
--- 
-1.8.2.2
-
-
-From 2a5e7bdd359976c1c87096fd78b21fa235a067f1 Mon Sep 17 00:00:00 2001
-From: Matt Ploetz <maploetz@us.ibm.com>
-Date: Fri, 20 Feb 2015 10:59:51 -0600
-Subject: [PATCH 03/10] Revert "New interfaces to get FSI and PNOR info for
- Xstop code"
-
-This reverts commit 79ea7abf6d31c146c680d39b9f3ae007e434a573.
----
- src/include/usr/fsi/fsiif.H   |  7 +---
- src/include/usr/pnor/pnorif.H | 16 --------
- src/usr/fsi/fsidd.C           | 31 ++++++---------
- src/usr/fsi/test/fsiddtest.H  | 92 +------------------------------------------
- src/usr/pnor/pnordd.C         | 33 ----------------
- src/usr/pnor/pnordd.H         | 16 +-------
- src/usr/pnor/sfcdd.H          | 11 +-----
- 7 files changed, 16 insertions(+), 190 deletions(-)
-
-diff --git a/src/include/usr/fsi/fsiif.H b/src/include/usr/fsi/fsiif.H
-index 5ab2e44..756dbb7 100644
---- a/src/include/usr/fsi/fsiif.H
-+++ b/src/include/usr/fsi/fsiif.H
-@@ -5,9 +5,7 @@
- /*                                                                        */
- /* OpenPOWER HostBoot Project                                             */
- /*                                                                        */
--/* Contributors Listed Below - COPYRIGHT 2011,2015                        */
--/* [+] International Business Machines Corp.                              */
--/*                                                                        */
-+/* COPYRIGHT International Business Machines Corp. 2011,2014              */
- /*                                                                        */
- /* Licensed under the Apache License, Version 2.0 (the "License");        */
- /* you may not use this file except in compliance with the License.       */
-@@ -111,11 +109,10 @@ struct FsiLinkInfo_t
-     uint8_t link; ///< Which link is this chip hanging off of
-     uint8_t cascade; ///< Slave cascade position
-     uint8_t mPort; ///< FSI Master port (0=A,1=B)
--    uint32_t baseAddr; ///< Base FSI Address for this chip
- 
-     FsiLinkInfo_t() :
-       master(NULL), type(TARGETING::FSI_MASTER_TYPE_NO_MASTER),
--    link(0xFF), cascade(0), mPort(0), baseAddr(UINT32_MAX)
-+    link(0xFF), cascade(0), mPort(0)
-     {};
- };
- 
-diff --git a/src/include/usr/pnor/pnorif.H b/src/include/usr/pnor/pnorif.H
-index 00f80f4..2689077 100644
---- a/src/include/usr/pnor/pnorif.H
-+++ b/src/include/usr/pnor/pnorif.H
-@@ -183,22 +183,6 @@ enum sbeSeepromSide_t
- errlHndl_t getSbeBootSeeprom(TARGETING::Target* i_target,
-                              sbeSeepromSide_t& o_bootSide);
- 
--
--/** Information about PNOR Layout */
--struct PnorInfo_t
--{
--    uint32_t mmioOffset; //< Address of MMIO access
--    uint32_t norWorkarounds; //< NOR flash workarounds
--    uint32_t flashSize; //< Size of PNOR in bytes
--};
--
--/**
-- * @brief Retrieve some information about the PNOR/SFC hardware
-- *
-- * @param[out] o_pnorInfo Information about PNOR
-- */
--void getPnorInfo( PnorInfo_t& o_pnorInfo );
--
- }
- 
- #endif
-diff --git a/src/usr/fsi/fsidd.C b/src/usr/fsi/fsidd.C
-index 6e7ae8a..7f313aa 100644
---- a/src/usr/fsi/fsidd.C
-+++ b/src/usr/fsi/fsidd.C
-@@ -1806,15 +1806,15 @@ errlHndl_t FsiDD::genFullFsiAddr(FsiAddrInfo_t& io_addrInfo)
-     //start off with the addresses being the same
-     io_addrInfo.absAddr = io_addrInfo.relAddr;
- 
--    //pull the FSI info out for this target
--    io_addrInfo.accessInfo = getFsiInfo( io_addrInfo.fsiTarg );
--
-     //target matches master so the address is correct as-is
-     if( io_addrInfo.fsiTarg == iv_master )
-     {
-         return NULL;
-     }
- 
-+    //pull the FSI info out for this target
-+    io_addrInfo.accessInfo = getFsiInfo( io_addrInfo.fsiTarg );
-+
-     TRACU1COMP( g_trac_fsi, "target=%.8X : Link Id=%.8X", TARGETING::get_huid(io_addrInfo.fsiTarg), io_addrInfo.accessInfo.linkid.id );
- 
-     //FSI master is the master proc, find the port
-@@ -3011,26 +3011,17 @@ FsiDD::FsiChipInfo_t FsiDD::getFsiInfo( TARGETING::Target* i_target )
- void FsiDD::getFsiLinkInfo( TARGETING::Target* i_slave,
-                             FSI::FsiLinkInfo_t& o_info )
- {
--    FsiAddrInfo_t addr_info( i_slave, 0x0 );
--    errlHndl_t tmp_err = genFullFsiAddr( addr_info );
--    if( tmp_err )
--    {
--        TRACFCOMP( g_trac_fsi, "Error getting FsiLinkInfo for %.8X", TARGETING::get_huid(i_slave) );
--        delete tmp_err;
--        return;
--    }
--
--    o_info.master = addr_info.accessInfo.master;
--    o_info.type = addr_info.accessInfo.type;
--    o_info.link = addr_info.accessInfo.port;
--    o_info.cascade = addr_info.accessInfo.cascade;
-+    FsiChipInfo_t info = getFsiInfo( i_slave );
-+    o_info.master = info.master;
-+    o_info.type = info.type;
-+    o_info.link = info.port;
-+    o_info.cascade = info.cascade;
-     o_info.mPort = 0;
--    if( addr_info.accessInfo.master
--        && (addr_info.accessInfo.master != iv_master )
--        && (getFsiInfo(addr_info.accessInfo.master).flagbits.flipPort) )
-+    if( info.master
-+        && (info.master != iv_master )
-+        && (getFsiInfo(info.master).flagbits.flipPort) )
-     {
-         o_info.mPort = 1;
-     }
--    o_info.baseAddr = addr_info.absAddr;
- }
- 
-diff --git a/src/usr/fsi/test/fsiddtest.H b/src/usr/fsi/test/fsiddtest.H
-index ab409bc..5d6eaaa 100644
---- a/src/usr/fsi/test/fsiddtest.H
-+++ b/src/usr/fsi/test/fsiddtest.H
-@@ -5,9 +5,7 @@
- /*                                                                        */
- /* OpenPOWER HostBoot Project                                             */
- /*                                                                        */
--/* Contributors Listed Below - COPYRIGHT 2011,2015                        */
--/* [+] International Business Machines Corp.                              */
--/*                                                                        */
-+/* COPYRIGHT International Business Machines Corp. 2011,2014              */
- /*                                                                        */
- /* Licensed under the Apache License, Version 2.0 (the "License");        */
- /* you may not use this file except in compliance with the License.       */
-@@ -447,94 +445,6 @@ class FsiDDTest : public CxxTest::TestSuite
- 
-         TRACFCOMP( g_trac_fsi, "FsiDDTest::test_FFDC> Finish" );
-     };
--
--    /**
--     * @brief FSI DD test - FSI Link Info
--     *        Spot check getFsiLinkInfo results
--     */
--    void test_getFsiLinkInfo(void)
--    {
--        TRACFCOMP( g_trac_fsi, "FsiDDTest::test_getFsiLinkInfo> Start" );
--
--        enum {
--            PROC0,
--            CENTAUR4,
--            NUM_TARGETS
--        };
--        TARGETING::Target* fsi_targets[NUM_TARGETS];
--        for( size_t x = 0; x < NUM_TARGETS; x++ )
--        {
--            fsi_targets[x] = NULL;
--        }
--
--        TARGETING::Target* fsi_target = NULL;
--
--        // master processor target
--        TARGETING::EntityPath epath(TARGETING::EntityPath::PATH_PHYSICAL);
--        epath.addLast(TARGETING::TYPE_SYS,0);
--        epath.addLast(TARGETING::TYPE_NODE,0);
--        epath.addLast(TARGETING::TYPE_PROC,0);
--        fsi_target = TARGETING::targetService().toTarget(epath);
--        fsi_targets[PROC0] = fsi_target;
--
--        // local centaur target (physical:sys-0/node-0/membuf-4)
--        epath.removeLast();
--        epath.addLast(TARGETING::TYPE_MEMBUF,4);
--        fsi_target = TARGETING::targetService().toTarget(epath);
--        fsi_targets[CENTAUR4] = fsi_target;
--
--
--
--        // loop through all of the targets we defined to
--        //  check the data
--        for( size_t x = 0; x < NUM_TARGETS; x++ )
--        {
--            if( fsi_targets[x] == NULL )
--            {
--                continue;
--            }
--
--            // Get the FSI port info for this target
--            TARGETING::FSI_MASTER_TYPE type =
--              fsi_targets[x]->getAttr<TARGETING::ATTR_FSI_MASTER_TYPE>();
--            uint8_t slave_port =
--              fsi_targets[x]->getAttr<TARGETING::ATTR_FSI_MASTER_PORT>();
--            TARGETING::EntityPath masterpath =
--              fsi_targets[x]->getAttr<TARGETING::ATTR_FSI_MASTER_CHIP>();
--            TARGETING::Target* master =
--              TARGETING::targetService().toTarget(masterpath);
--            uint8_t master_port = 0;
--            if( type != TARGETING::FSI_MASTER_TYPE_NO_MASTER )
--            {
--                master_port =
--                  master->getAttr<TARGETING::ATTR_FSI_MASTER_PORT>()+1;
--            }
--
--            TRACFCOMP( g_trac_fsi, "sport=%d, mport=%d, master=%.8X, type=%d",slave_port,master_port, TARGETING::get_huid(master), master_port);
--            // Compute the offset
--            //   CMFSI ports start at 0x040000 and increment by 0x008000
--            //   MFSI ports start at 0x080000 and increment by 0x080000
--            //    (local CMFSI ports have no MFSI offset)
--            uint32_t offset = (master_port * 0x080000);
--            if( type == TARGETING::FSI_MASTER_TYPE_CMFSI )
--            {
--                offset += ((slave_port * 0x008000) + 0x040000);
--            }
--
--            // Now call the interface we want to test
--            FSI::FsiLinkInfo_t linkinfo;
--            FSI::getFsiLinkInfo( fsi_targets[x], linkinfo );
--
--            // Compare the results
--            TRACFCOMP( g_trac_fsi, "FsiDDTest::test_getFsiLinkInfo> Data for %.8X: exp=%.6X, act=%.6X", TARGETING::get_huid(fsi_targets[x]), offset, linkinfo.baseAddr );
--            if( linkinfo.baseAddr != offset )
--            {
--                TS_FAIL( "FsiDDTest::test_getFsiLinkInfo> Mismatch for %.8X: exp=%.6X, act=%.6X", TARGETING::get_huid(fsi_targets[x]), offset, linkinfo.baseAddr );
--            }
--        }
--
--        TRACFCOMP( g_trac_fsi, "FsiDDTest::test_getFsiLinkInfo> End" );
--    }
- };     
- 
- 
-diff --git a/src/usr/pnor/pnordd.C b/src/usr/pnor/pnordd.C
-index 13667ce..0d47898 100644
---- a/src/usr/pnor/pnordd.C
-+++ b/src/usr/pnor/pnordd.C
-@@ -191,19 +191,6 @@ bool usingL3Cache()
-     return Singleton<PnorDD>::instance().usingL3Cache();
- }
- 
--/**
-- * @brief Retrieve some information about the PNOR/SFC hardware
-- */
--void getPnorInfo( PnorInfo_t& o_pnorInfo )
--{
--    o_pnorInfo.mmioOffset = 0; //LPC_SFC_MMIO_OFFSET;//@fixme-need Prachi's code for this
--    o_pnorInfo.norWorkarounds =
--      Singleton<PnorDD>::instance().getNorWorkarounds();
--    o_pnorInfo.flashSize =
--      Singleton<PnorDD>::instance().getNorSize();
--}
--
--
- 
- // Register PNORDD access functions to DD framework
- DEVICE_REGISTER_ROUTE(DeviceFW::READ,
-@@ -878,23 +865,3 @@ errlHndl_t PnorDD::_eraseFlash( uint32_t i_addr )
- 
-     return l_err;
- }
--
--/**
-- * @brief Retrieve bitstring of NOR workarounds
-- */
--uint32_t PnorDD::getNorWorkarounds( void )
--{
--    return iv_sfc->getNorWorkarounds();
--}
--
--/**
-- * @brief Retrieve size of NOR flash
-- */
--uint32_t PnorDD::getNorSize( void )
--{
--#ifdef CONFIG_PNOR_IS_32MB
--    return (32*MEGABYTE);
--#else //default to 64MB
--    return (64*MEGABYTE);
--#endif
--}
-diff --git a/src/usr/pnor/pnordd.H b/src/usr/pnor/pnordd.H
-index 94c393b..589f60e 100644
---- a/src/usr/pnor/pnordd.H
-+++ b/src/usr/pnor/pnordd.H
-@@ -5,7 +5,7 @@
- /*                                                                        */
- /* OpenPOWER HostBoot Project                                             */
- /*                                                                        */
--/* Contributors Listed Below - COPYRIGHT 2011,2015                        */
-+/* Contributors Listed Below - COPYRIGHT 2011,2014                        */
- /* [+] Google Inc.                                                        */
- /* [+] International Business Machines Corp.                              */
- /*                                                                        */
-@@ -82,19 +82,6 @@ class PnorDD
-     bool usingL3Cache( );
- 
- 
--    /**
--     * @brief Retrieve bitstring of NOR workarounds
--     * @return NOR workarounds (see VendorWorkarounds in norflash.H)
--     */
--    uint32_t getNorWorkarounds( void );
--
--    /**
--     * @brief Retrieve size of NOR flash
--     * @return Size of PNOR in bytes
--     */
--    uint32_t getNorSize( void );
--
--
-     // Enumeration values must match those in debug framework.
-     enum PnorMode_t {
-         MODEL_UNKNOWN,   /**< Invalid */
-@@ -353,7 +340,6 @@ class PnorDD
-      */
-     errlHndl_t _eraseFlash( uint32_t i_address );
- 
--
-   private: // Variables
- 
-    /**
-diff --git a/src/usr/pnor/sfcdd.H b/src/usr/pnor/sfcdd.H
-index 72285f5..7c27a1e 100644
---- a/src/usr/pnor/sfcdd.H
-+++ b/src/usr/pnor/sfcdd.H
-@@ -5,7 +5,7 @@
- /*                                                                        */
- /* OpenPOWER HostBoot Project                                             */
- /*                                                                        */
--/* Contributors Listed Below - COPYRIGHT 2014,2015                        */
-+/* Contributors Listed Below - COPYRIGHT 2014                             */
- /* [+] Google Inc.                                                        */
- /* [+] International Business Machines Corp.                              */
- /*                                                                        */
-@@ -149,15 +149,6 @@ class SfcDD
-     };
- 
-     /**
--     * @brief Retrieve bitstring of NOR workarounds
--     * @return NOR workarounds (see VendorWorkarounds in norflash.H)
--     */
--    uint32_t getNorWorkarounds( void )
--    {
--        return iv_flashWorkarounds;
--    };
--
--    /**
-      * @brief Destructor
-      */
-     virtual ~SfcDD();
--- 
-1.8.2.2
-
-
-From d54db81391beca781b7a5e4f233dea8971ced5c7 Mon Sep 17 00:00:00 2001
-From: Matt Ploetz <maploetz@us.ibm.com>
-Date: Fri, 20 Feb 2015 11:00:00 -0600
-Subject: [PATCH 04/10] Revert "Skipping over readTOC if hostInterface for
- pnor_read/write doesn't exist"
-
-This reverts commit 7c5d303237f2bec25b7072ec3119d6d4fef875fc.
----
- src/usr/pnor/runtime/rt_pnor.C            | 50 ++++++++++++++-----------------
- src/usr/util/runtime/test/testlidmgr_rt.H |  7 ++---
- 2 files changed, 26 insertions(+), 31 deletions(-)
-
-diff --git a/src/usr/pnor/runtime/rt_pnor.C b/src/usr/pnor/runtime/rt_pnor.C
-index f616e98..c61aa1d 100644
---- a/src/usr/pnor/runtime/rt_pnor.C
-+++ b/src/usr/pnor/runtime/rt_pnor.C
-@@ -588,35 +588,31 @@ errlHndl_t RtPnor::readTOC ()
-             break;
-         }
- 
--        if (g_hostInterfaces && g_hostInterfaces->pnor_read)
-+        // @TODO RTC:120733
-+        // RT code needs a way to get the active side tocs vs just defaulting
-+        // to SIDE_A
-+        l_err = readFromDevice (l_procId, PNOR::TOC, PNOR::SIDE_A_TOC_0_OFFSET,
-+                PAGESIZE,false,toc0Buffer);
-+        if (l_err)
-         {
--            //@TODO RTC:120733
--            //RT code needs a way to get the active side tocs vs just defaulting
--            //to SIDE_A
--            l_err = readFromDevice(l_procId,PNOR::TOC,PNOR::SIDE_A_TOC_0_OFFSET,
--                    PAGESIZE,false,toc0Buffer);
--            if (l_err)
--            {
--                TRACFCOMP(g_trac_pnor,"RtPnor::readTOC:readFromDevice failed"
--                          " for TOC0");
--                break;
--            }
--
--            l_err = readFromDevice(l_procId,PNOR::TOC,PNOR::SIDE_A_TOC_1_OFFSET,
--                    PAGESIZE, false,toc1Buffer);
--            if (l_err)
--            {
--                TRACFCOMP(g_trac_pnor, "RtPnor::readTOC:readFromDevice failed"
--                          " for TOC1");
--                break;
--            }
-+            TRACFCOMP(g_trac_pnor,"RtPnor::readTOC:readFromDevice failed"
-+                      " for TOC0");
-+            break;
-+        }
-+        l_err = readFromDevice (l_procId, PNOR::TOC, PNOR::SIDE_A_TOC_1_OFFSET,
-+                PAGESIZE, false,toc1Buffer);
-+        if (l_err)
-+        {
-+            TRACFCOMP(g_trac_pnor, "RtPnor::readTOC:readFromDevice failed"
-+                      " for TOC1");
-+            break;
-+        }
- 
--            l_err = PNOR::parseTOC(toc0Buffer,toc1Buffer,iv_TOC_used,iv_TOC,0);
--            if (l_err)
--            {
--                TRACFCOMP(g_trac_pnor, "RtPnor::readTOC: parseTOC failed");
--                break;
--            }
-+        l_err = PNOR::parseTOC(toc0Buffer, toc1Buffer, iv_TOC_used, iv_TOC, 0);
-+        if (l_err)
-+        {
-+            TRACFCOMP(g_trac_pnor, "RtPnor::readTOC: parseTOC failed");
-+            break;
-         }
-     } while (0);
- 
-diff --git a/src/usr/util/runtime/test/testlidmgr_rt.H b/src/usr/util/runtime/test/testlidmgr_rt.H
-index d869e3c..4514684 100644
---- a/src/usr/util/runtime/test/testlidmgr_rt.H
-+++ b/src/usr/util/runtime/test/testlidmgr_rt.H
-@@ -26,7 +26,6 @@
- #include <cxxtest/TestSuite.H>
- #include <errl/errlmanager.H>
- #include <utilbase.H>
--#include <config.h>
- 
- class LidMgrRtTest : public CxxTest::TestSuite
- {
-@@ -65,11 +64,11 @@ class LidMgrRtTest : public CxxTest::TestSuite
- 
-                 PNOR::SectionInfo_t l_lidPnorInfo;
-                 l_errl = PNOR::getSectionInfo(PNOR::TEST, l_lidPnorInfo);
-+                // Section only present in openPOWER systems
-                 if (l_errl)
-                 {
--                    errlCommit(l_errl,UTIL_COMP_ID);
--                    TS_FAIL("testLidInPnor: Error getting lidId=0x%.8x",
--                            Util::TEST_LIDID);
-+                    delete l_errl;
-+                    l_errl = NULL;
-                     break;
-                 }
- 
--- 
-1.8.2.2
-
-
-From 6ee93d64558e1d536cc10cd47fef5ce33416a288 Mon Sep 17 00:00:00 2001
-From: Matt Ploetz <maploetz@us.ibm.com>
-Date: Fri, 20 Feb 2015 11:04:00 -0600
-Subject: [PATCH 05/10] Revert "Support BIOS framework"
-
-This reverts commit b24f1ca24db62f833c7f46e4244dbe8f00ee8a4c.
----
- src/build/mkrules/dist.targets.mk                  |    2 -
- src/usr/targeting/common/xmltohb/bios.xsd          |  302 ------
- .../common/xmltohb/bios_metadata_petitboot.xslt    |   93 --
- src/usr/targeting/common/xmltohb/xmltohb.pl        | 1030 +-------------------
- 4 files changed, 3 insertions(+), 1424 deletions(-)
- delete mode 100644 src/usr/targeting/common/xmltohb/bios.xsd
- delete mode 100644 src/usr/targeting/common/xmltohb/bios_metadata_petitboot.xslt
-
-diff --git a/src/build/mkrules/dist.targets.mk b/src/build/mkrules/dist.targets.mk
-index 42a1525..ca28150 100644
---- a/src/build/mkrules/dist.targets.mk
-+++ b/src/build/mkrules/dist.targets.mk
-@@ -81,8 +81,6 @@ COPY_FILES = \
-     src/usr/targeting/common/xmltohb/target_types_hb.xml:openpower \
-     src/usr/targeting/common/xmltohb/xmltohb.pl:openpower \
-     src/include/usr/vmmconst.h:openpower \
--    src/usr/targeting/common/xmltohb/bios.xsd:openpower \
--    src/usr/targeting/common/xmltohb/bios_metadata_petitboot.xslt:openpower \
-     $(foreach file, $(call ROOTPATH_WILDCARD,releaseNotes.html), $(file):fsp)\
- 
- #
-diff --git a/src/usr/targeting/common/xmltohb/bios.xsd b/src/usr/targeting/common/xmltohb/bios.xsd
-deleted file mode 100644
-index 6cd7ff4..0000000
---- a/src/usr/targeting/common/xmltohb/bios.xsd
-+++ /dev/null
-@@ -1,302 +0,0 @@
--<?xml version="1.0" encoding="utf-8"?>
--<!-- IBM_PROLOG_BEGIN_TAG                                                   -->
--<!-- This is an automatically generated prolog.                             -->
--<!--                                                                        -->
--<!-- $Source: src/usr/targeting/common/xmltohb/bios.xsd $                   -->
--<!--                                                                        -->
--<!-- OpenPOWER HostBoot Project                                             -->
--<!--                                                                        -->
--<!-- Contributors Listed Below - COPYRIGHT 2015                             -->
--<!-- [+] International Business Machines Corp.                              -->
--<!--                                                                        -->
--<!--                                                                        -->
--<!-- Licensed under the Apache License, Version 2.0 (the "License");        -->
--<!-- you may not use this file except in compliance with the License.       -->
--<!-- You may obtain a copy of the License at                                -->
--<!--                                                                        -->
--<!--     http://www.apache.org/licenses/LICENSE-2.0                         -->
--<!--                                                                        -->
--<!-- Unless required by applicable law or agreed to in writing, software    -->
--<!-- distributed under the License is distributed on an "AS IS" BASIS,      -->
--<!-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or        -->
--<!-- implied. See the License for the specific language governing           -->
--<!-- permissions and limitations under the License.                         -->
--<!--                                                                        -->
--<!-- IBM_PROLOG_END_TAG                                                     -->
--
--<xs:schema
--    xmlns:xs="http://www.w3.org/2001/XMLSchema" >
--
--  <xs:element name="firmware-overrides">
--    <xs:annotation>
--      <xs:documentation>The firmware-overrides element is the root element.  An
--        empty firmware-overrides element implies there are no firmware overrides
--        for a given platform.  The firmware-overrides element can have any
--        number of attribute or group elements.
--      </xs:documentation>
--    </xs:annotation>
--    <xs:complexType>
--      <xs:sequence>
--        <xs:choice minOccurs="0" maxOccurs="unbounded">
--          <xs:element ref="group"/>
--          <xs:element ref="attribute"/>
--        </xs:choice>
--      </xs:sequence>
--    </xs:complexType>
--  </xs:element>
--
--  <xs:element name="group">
--    <xs:annotation>
--      <xs:documentation>A group element defines a logical collection of
--        firmware-overrides, and sub-groups of the same.  A group element
--        contains a name element and any number of attribute + group elements,
--        but it must have at least one element other than the name element.
--  </xs:documentation>
--    </xs:annotation>
--    <xs:complexType>
--      <xs:sequence>
--        <xs:element ref="name"/>
--        <xs:sequence>
--          <xs:choice maxOccurs="unbounded">
--            <xs:element ref="group"/>
--            <xs:element ref="attribute"/>
--          </xs:choice>
--        </xs:sequence>
--      </xs:sequence>
--    </xs:complexType>
--  </xs:element>
--
--  <xs:element name="attribute">
--    <xs:annotation>
--      <xs:documentation>An attribute element must have an id element, and up to
--        one each of a description element, display-name element,
--        targetRestriction element.  It may also have either a numericOverride
--        element (if signed/unsigned number) or enumerationOverride element (if
--        enumeration), in that order.
--      </xs:documentation>
--    </xs:annotation>
--    <xs:complexType>
--      <xs:sequence>
--        <xs:element ref="id"/>
--        <xs:element ref="description" minOccurs="0"/>
--        <xs:element ref="display-name" minOccurs="0"/>
--        <xs:element ref="targetRestriction" minOccurs="0"/>
--        <xs:choice minOccurs="0">
--          <xs:element ref="enumerationOverride" minOccurs="0"/>
--          <xs:element ref="numericOverride" minOccurs="0"/>
--        </xs:choice>
--      </xs:sequence>
--    </xs:complexType>
--  </xs:element>
--
--  <xs:element name="numericOverride">
--    <xs:annotation>
--      <xs:documentation>A numeric override limits the set of values an
--        attribute can be set to.  A numericOverride element must have a start
--        and end element in any order.
--      </xs:documentation>
--    </xs:annotation>
--    <xs:complexType>
--      <xs:choice>
--        <xs:sequence>
--          <xs:element ref="start" minOccurs="1" maxOccurs="1"/>
--          <xs:element ref="end" minOccurs="0" maxOccurs="1"/>
--        </xs:sequence>
--        <xs:sequence>
--          <xs:element ref="end" minOccurs="1" maxOccurs="1"/>
--          <xs:element ref="start" minOccurs="0" maxOccurs="1"/>
--        </xs:sequence>
--      </xs:choice>
--    </xs:complexType>
--  </xs:element>
--
--  <xs:element name="targetRestriction">
--    <xs:annotation>
--      <xs:documentation>A target restriction restricts the attribute to apply
--         only to the target indicated by the sub-restrictions.  A
--         targetRestriction element may have up to one each of
--         a type, node, position, and unit element, in any order, provided at
--         least one of those appears.  This schema cannot easily restrict the
--         latter condition, so the code must ensure at least one child element is
--         present.
--      </xs:documentation>
--    </xs:annotation>
--    <xs:complexType>
--       <xs:all minOccurs="0" maxOccurs="1">
--         <xs:element ref="type"     minOccurs="0"/>
--         <xs:element ref="node"     minOccurs="0"/>
--         <xs:element ref="position" minOccurs="0"/>
--         <xs:element ref="unit"     minOccurs="0"/>
--       </xs:all>
--    </xs:complexType>
--  </xs:element>
--
--  <xs:element name="enumerationOverride">
--    <xs:annotation>
--      <xs:documentation>An enumerationOverride allows an attribute to change
--        the behavior of the underlying enumeration.  An enumerationOverride
--        element can have one allowedEnumerator element, any number of
--        enumeratorOverride elements, or a union of those.
--      </xs:documentation>
--    </xs:annotation>
--    <xs:complexType>
--      <xs:choice>
--        <xs:sequence>
--          <xs:element ref="allowedEnumerators"/>
--          <xs:element ref="enumeratorOverride"
--            minOccurs="0" maxOccurs="unbounded"/>
--        </xs:sequence>
--        <xs:sequence>
--          <xs:element ref="enumeratorOverride" maxOccurs="unbounded"/>
--          <xs:element ref="allowedEnumerators" minOccurs="0"/>
--        </xs:sequence>
--      </xs:choice>
--    </xs:complexType>
--  </xs:element>
--
--  <xs:element name="allowedEnumerators">
--    <xs:annotation>
--      <xs:documentation>An allowedEnumerator restricts which enumerators can be
--        used by the attribute.An allowedEnumerators element requires one or more
--        name elements.
--      </xs:documentation>
--    </xs:annotation>
--    <xs:complexType>
--      <xs:sequence>
--        <xs:element ref="name" maxOccurs="unbounded"/>
--      </xs:sequence>
--    </xs:complexType>
--  </xs:element>
--
--  <xs:element name="enumeratorOverride">
--    <xs:annotation>
--      <xs:documentation>An enumeratorOverride allows an attribute to change the
--        default text associated with an enumerator.  An enumeratorOverride
--        requires a name element and a display-name element, descriptionElement,
--        or union of both.
--      </xs:documentation>
--    </xs:annotation>
--    <xs:complexType>
--      <xs:sequence>
--        <xs:element ref="name"/>
--        <xs:choice>
--          <xs:sequence>
--            <xs:element ref="display-name"/>
--            <xs:element ref="description" minOccurs="0"/>
--          </xs:sequence>
--          <xs:sequence>
--            <xs:element ref="description"/>
--            <xs:element ref="display-name" minOccurs="0"/>
--          </xs:sequence>
--        </xs:choice>
--      </xs:sequence>
--    </xs:complexType>
--  </xs:element>
--
--  <xs:element name="id" type="xs:string">
--    <xs:annotation>
--      <xs:documentation>An id element provides a symbolic attribute ID that maps
--        to a valid attribute in targeting
--      </xs:documentation>
--    </xs:annotation>
--  </xs:element>
--
--  <xs:element name="description" type="xs:string">
--    <xs:annotation>
--      <xs:documentation>A description element provides a longer help text for an
--        attribute, enumeration, etc.
--      </xs:documentation>
--    </xs:annotation>
--  </xs:element>
--
--  <xs:element name="display-name" type="xs:string">
--    <xs:annotation>
--      <xs:documentation>A display-name element provides a short name for an
--        enumeration, attribute, etc.
--      </xs:documentation>
--    </xs:annotation>
--  </xs:element>
--
--  <xs:element name="type" type="xs:string">
--    <xs:annotation>
--      <xs:documentation>A type element restricts the attribute to a specific
--        named attribute type.
--      </xs:documentation>
--    </xs:annotation>
--  </xs:element>
--
--  <xs:element name="start" type="xs:decimal">
--    <xs:annotation>
--      <xs:documentation>A start element gives the first value, inclusive, of one
--        of the valid ranges for a numerical attribute. It cannot fall outside
--        of the base range allowed for the given attribute type, and must be at
--        least one less than the max of the base range.
--      </xs:documentation>
--    </xs:annotation>
--  </xs:element>
--
--  <xs:element name="end" type="xs:decimal">
--    <xs:annotation>
--      <xs:documentation>An end element gives the last value, inclusive, of one
--        of the valid ranges for a numerical attribute. It cannot fall outside
--        of the base range allowed for the given attribute type, and must be at
--        least one less than the max of the base range.
--      </xs:documentation>
--    </xs:annotation>
--  </xs:element>
--
--  <xs:element name="name" type="xs:string">
--    <xs:annotation>
--      <xs:documentation>A name element gives the name of the attribute group,
--        etc.
--      </xs:documentation>
--    </xs:annotation>
--  </xs:element>
--
--  <xs:element name="unit">
--    <xs:annotation>
--      <xs:documentation>A unit element allows an attribute to restrict its
--        scope to a specific target unit.  If a position element is specified in
--        a targetRestriction along with a unit, then the unit's chip's position
--        must match that as well.
--      </xs:documentation>
--    </xs:annotation>
--    <xs:simpleType>
--      <xs:restriction base="xs:unsignedByte">
--        <xs:minInclusive value="0"/>
--        <xs:maxInclusive value="254"/>
--      </xs:restriction>
--    </xs:simpleType>
--  </xs:element>
--
--  <xs:element name="position">
--    <xs:annotation>
--      <xs:documentation>A position element allows an attribute to restrict
--        its scope to a specific position.  Only applicable for targets with
--        positions, unless used in conjuction with the unit element.
--      </xs:documentation>
--    </xs:annotation>
--    <xs:simpleType>
--      <xs:restriction base="xs:unsignedShort">
--        <xs:minInclusive value="0"/>
--        <xs:maxInclusive value="65534"/>
--      </xs:restriction>
--    </xs:simpleType>
--  </xs:element>
--
--  <xs:element name="node">
--    <xs:annotation>
--      <xs:documentation>A node element allows an attribute to restrict
--        its scope to a specific node.
--      </xs:documentation>
--    </xs:annotation>
--    <xs:simpleType>
--      <xs:restriction base="xs:unsignedByte">
--        <xs:minInclusive value="0"/>
--        <xs:maxInclusive value="14"/>
--      </xs:restriction>
--    </xs:simpleType>
--  </xs:element>
--
--</xs:schema>
--
-diff --git a/src/usr/targeting/common/xmltohb/bios_metadata_petitboot.xslt b/src/usr/targeting/common/xmltohb/bios_metadata_petitboot.xslt
-deleted file mode 100644
-index ee2a2bc..0000000
---- a/src/usr/targeting/common/xmltohb/bios_metadata_petitboot.xslt
-+++ /dev/null
-@@ -1,93 +0,0 @@
--<?xml version="1.0"?>
--<!-- IBM_PROLOG_BEGIN_TAG                                                   -->
--<!-- This is an automatically generated prolog.                             -->
--<!--                                                                        -->
--<!-- $Source: src/usr/targeting/common/xmltohb/bios_metadata_petitboot.xslt $ -->
--<!--                                                                        -->
--<!-- OpenPOWER HostBoot Project                                             -->
--<!--                                                                        -->
--<!-- Contributors Listed Below - COPYRIGHT 2015                             -->
--<!-- [+] International Business Machines Corp.                              -->
--<!--                                                                        -->
--<!--                                                                        -->
--<!-- Licensed under the Apache License, Version 2.0 (the "License");        -->
--<!-- you may not use this file except in compliance with the License.       -->
--<!-- You may obtain a copy of the License at                                -->
--<!--                                                                        -->
--<!--     http://www.apache.org/licenses/LICENSE-2.0                         -->
--<!--                                                                        -->
--<!-- Unless required by applicable law or agreed to in writing, software    -->
--<!-- distributed under the License is distributed on an "AS IS" BASIS,      -->
--<!-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or        -->
--<!-- implied. See the License for the specific language governing           -->
--<!-- permissions and limitations under the License.                         -->
--<!--                                                                        -->
--<!-- IBM_PROLOG_END_TAG                                                     -->
--
--<xsl:stylesheet version="1.0"
--  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
--
--<xsl:output method="xml" version="1.0"
--  encoding="UTF-8" indent="yes"/>
--
--<xsl:template match="/">
--  <firmware-overrides>
--    <xsl:apply-templates select="firmware-overrides/attribute"/>
--    <xsl:apply-templates select="firmware-overrides/group"/>
--  </firmware-overrides>
--</xsl:template>
--
--<xsl:template match="attribute">
--  <attribute>
--    <xsl:attribute name="id">
--      <xsl:value-of select="id"/>
--    </xsl:attribute>
--    <numeric-id><xsl:value-of select="numeric-id"/></numeric-id>
--    <type>
--        <size><xsl:value-of select="size"/></size>
--        <encoding><xsl:value-of select="encoding"/></encoding>
--    </type>
--    <default><xsl:value-of select="default"/></default>
--    <display-name><xsl:value-of select="display-name"/></display-name>
--    <description><xsl:value-of select="description"/></description>
--    <target>
--      <type><xsl:value-of select="target/type"/></type>
--      <node><xsl:value-of select="target/node"/></node>
--      <position><xsl:value-of select="target/position"/></position>
--      <unit><xsl:value-of select="target/unit"/></unit>
--    </target>
--    <xsl:apply-templates select="numericOverride"/>
--    <xsl:apply-templates select="enumeration"/>
--  </attribute>
--</xsl:template>
--
--<xsl:template match="numericOverride">
--  <range>
--    <start><xsl:value-of select="start"/></start>
--    <end><xsl:value-of select="end"/></end>
--  </range>
--</xsl:template>
--
--<xsl:template match="enumeration">
--  <enumeration>
--    <xsl:apply-templates select="./enumerator"/>
--  </enumeration>
--</xsl:template>
--
--<xsl:template match="enumerator">
--  <enumerator>
--    <display-name><xsl:value-of select="display-name"/></display-name>
--    <description><xsl:value-of select="description"/></description>
--    <value><xsl:value-of select="value"/></value>
--  </enumerator>
--</xsl:template>
--
--<xsl:template match="group">
--  <group>
--    <name><xsl:value-of select="name"/></name>
--    <xsl:apply-templates select="./attribute"/>
--    <xsl:apply-templates select="./group"/>
--  </group>
--</xsl:template>
--
--</xsl:stylesheet>
-diff --git a/src/usr/targeting/common/xmltohb/xmltohb.pl b/src/usr/targeting/common/xmltohb/xmltohb.pl
-index 6e8db84..d02c1a7 100755
---- a/src/usr/targeting/common/xmltohb/xmltohb.pl
-+++ b/src/usr/targeting/common/xmltohb/xmltohb.pl
-@@ -48,7 +48,6 @@ use Text::Wrap;
- use Data::Dumper;
- use POSIX;
- use Env;
--use XML::LibXML;
- 
- ################################################################################
- # Set PREFERRED_PARSER to XML::Parser. Otherwise it uses XML::SAX which contains
-@@ -77,10 +76,6 @@ my $cfgIncludeFspAttributes = 0;
- my $CfgSMAttrFile = "";
- my $cfgAddVersionPage = 0;
- 
--my $cfgBiosXmlFile = undef;
--my $cfgBiosSchemaFile = undef;
--my $cfgBiosOutputFile = undef;
--
- GetOptions("hb-xml-file:s" => \$cfgHbXmlFile,
-            "src-output-dir:s" =>  \$cfgSrcOutputDir,
-            "img-output-dir:s" =>  \$cfgImgOutputDir,
-@@ -92,9 +87,6 @@ GetOptions("hb-xml-file:s" => \$cfgHbXmlFile,
-            "smattr-output-file:s" => \$CfgSMAttrFile,
-            "include-fsp-attributes!" =>  \$cfgIncludeFspAttributes,
-            "version-page!" => \$cfgAddVersionPage,
--           "bios-xml-file:s" => \$cfgBiosXmlFile,
--           "bios-schema-file:s" => \$cfgBiosSchemaFile,
--           "bios-output-file:s" => \$cfgBiosOutputFile,
-            "help" => \$cfgHelp,
-            "man" => \$cfgMan,
-            "verbose" => \$cfgVerbose ) || pod2usage(-verbose => 0);
-@@ -124,9 +116,6 @@ if($cfgVerbose)
-     print STDOUT "Big endian = $cfgBigEndian\n";
-     print STDOUT "include-fsp-attributes = $cfgIncludeFspAttributes\n",
-     print STDOUT "version-page = $cfgAddVersionPage\n",
--    print STDOUT "bios-schema-file = $cfgBiosSchemaFile\n";
--    print STDOUT "bios-xml-file = $cfgBiosXmlFile\n";
--    print STDOUT "bios-output-file = $cfgBiosOutputFile\n";
- }
- 
- ################################################################################
-@@ -151,11 +140,6 @@ my @associationTypes = ( PARENT_BY_CONTAINMENT,
- use constant ATTR_PHYS_PATH => "PHYS_PATH";
- use constant ATTR_AFFINITY_PATH => "AFFINITY_PATH";
- use constant ATTR_UNKNOWN => "UnknownAttributeName";
--use constant ATTR_POSITION => "POSITION";
--use constant ATTR_CHIP_UNIT => "CHIP_UNIT";
--use constant ATTR_CLASS => "CLASS";
--use constant ATTR_TYPE => "TYPE";
--use constant ATTR_MODEL => "MODEL";
- 
- # Data manipulation constants
- use constant BITS_PER_BYTE => 8;
-@@ -475,7 +459,6 @@ sub validateAttributes {
-                              = { required => 0, isscalar => 0};
-     $elements{"hwpfToHbAttrMap"}
-                              = { required => 0, isscalar => 0};
--    $elements{"display-name"} = { required => 0, isscalar => 1};
- 
-     foreach my $attribute (@{$attributes->{attribute}})
-     {
-@@ -5267,10 +5250,6 @@ sub generateTargetingImage {
-     my $pnorRoOffset = $offset;
-     my $attributesWritten = 0;
- 
--    my %biosData = ();
--    my %attributeDefCache =
--        map { $_->{id} => $_} @{$attributes->{attribute}};
--
-     foreach my $targetInstance (@targetsAoH)
-     {
-         my $data;
-@@ -5306,6 +5285,9 @@ sub generateTargetingImage {
-         # themselves FSP specific.  Only need to do this 1x per target instance
-         my $fspTarget = isFspTargetInstance($attributes,$targetInstance);
- 
-+        my %attributeDefCache =
-+            map { $_->{id} => $_} @{$attributes->{attribute}};
-+
-         # Must have the same order as the attribute list from above.
-         for my $attributeId
-             (sort
-@@ -5322,20 +5304,6 @@ sub generateTargetingImage {
-                     $attrhash{$attributeId}->{default};
-             }
- 
--            # Cache these attributes away in the BIOS data structure as
--            # identifying information that will be used to enforce the target
--            # restrictions
--            if(    ($attributeId eq ATTR_PHYS_PATH)
--                || ($attributeId eq ATTR_POSITION )
--                || ($attributeId eq ATTR_CHIP_UNIT)
--                || ($attributeId eq ATTR_CLASS    )
--                || ($attributeId eq ATTR_TYPE     )
--                || ($attributeId eq ATTR_MODEL    ) )
--            {
--                $biosData{$targetInstance->{id}}{_identity_}{$attributeId} =
--                     $attrhash{$attributeId}->{default};
--            }
--
-             my $attrValue =
-             enumNameToValue($attributeIdEnumeration,$attributeId);
-             $attrValue = sprintf ("%0x", $attrValue);
-@@ -5498,11 +5466,6 @@ sub generateTargetingImage {
-                         $attributes,
-                         $attributeDef,$attrhash{$attributeId}->{default});
- 
--                $biosData{$targetInstance->{id}}{$attributeId}{size} =
--                    (length $heapZeroInitData);
--                $biosData{$targetInstance->{id}}{$attributeId}{default} =
--                    $attrhash{$attributeId}->{default};
--
-                 my $hex = unpack ("H*",$heapZeroInitData);
-                 push @attrDataforSM, [$attrValue, $huidValue,
-                     $hex, $section, $targetInstance->{id}, $attributeId];
-@@ -5527,11 +5490,6 @@ sub generateTargetingImage {
-                         $attributes,
-                         $attributeDef,$attrhash{$attributeId}->{default});
- 
--                $biosData{$targetInstance->{id}}{$attributeId}{size} =
--                    (length $heapPnorInitData);
--                $biosData{$targetInstance->{id}}{$attributeId}{default} =
--                    $attrhash{$attributeId}->{default};
--
-                 my $hex = unpack ("H*",$heapPnorInitData);
-                 push @attrDataforSM, [$attrValue, $huidValue,
-                     $hex, $section, $targetInstance->{id}, $attributeId];
-@@ -5701,11 +5659,6 @@ sub generateTargetingImage {
-                         $attributes,
-                         $attributeDef,$attrhash{$attributeId}->{default});
- 
--                $biosData{$targetInstance->{id}}{$attributeId}{size} =
--                    (length $hbHeapZeroInitData);
--                $biosData{$targetInstance->{id}}{$attributeId}{default} =
--                    $attrhash{$attributeId}->{default};
--
-                 # Align the data as necessary
-                 my $pads = ($alignment - ($hbHeapZeroInitOffset
-                             % $alignment)) % $alignment;
-@@ -6028,37 +5981,6 @@ sub generateTargetingImage {
-             - $fspP1DefaultedFromP3Offset));
-     }
- 
--    if(defined $cfgBiosXmlFile)
--    {
--        unless (-e $cfgBiosXmlFile)
--        {
--            fatal("BIOS XML file $cfgBiosXmlFile does not exist.\n");
--        }
--
--        unless (defined $cfgBiosSchemaFile)
--        {
--            fatal("BIOS XML file $cfgBiosXmlFile specified, but a BIOS schema "
--                . "file was not.\n");
--        }
--
--        unless (-e $cfgBiosSchemaFile)
--        {
--            fatal("BIOS schema file $cfgBiosSchemaFile does not exist.\n");
--        }
--
--        unless (defined $cfgBiosOutputFile)
--        {
--            fatal("BIOS output file not specified.\n");
--        }
--
--        my $bios = new
--            Bios($cfgBiosXmlFile,$cfgBiosSchemaFile,$cfgBiosOutputFile);
--        $bios->load();
--        $bios->processBios(
--            \%attributeDefCache,\$attributes,\%biosData,%targetPhysicalPath);
--        $bios->export();
--    }
--
-     return $outFile;
- }
- 
-@@ -6090,935 +6012,6 @@ print SM_TARGET_FILE"
-     close(SM_TARGET_FILE);
- }
- 
--################################################################################
--# BIOS Package
--#    Consumes platform-specific BIOS XML file, validates it, and outputs
--#    extended data on the attributes, which will be transformed (via xslt
--#    stylesheets) and used by 3rd parties (like Petitboot).  The BIOS
--#    package validates the input file against a stylesheet to ensure
--#    proper formatting.
--################################################################################
--
--{
--
--package Bios;
--
--################################################################################
--# Constructor; create a new Bios object
--################################################################################
--
--sub new
--{
--    my ($class,$biosInputXmlFile,$biosSchemaXsdFile,$biosOutputXmlFile) = @_;
--    my $self = {
--        _biosInputXmlFile => $biosInputXmlFile,
--        _libXmlParser => XML::LibXML->new(),
--        _biosXmlDoc => undef,
--        _biosSchemaXsdFile => $biosSchemaXsdFile,
--        _biosOutputXmlFile => $biosOutputXmlFile,
--    };
--
--    bless $self, $class;
--
--    return $self;
--}
--
--################################################################################
--# Load and parse the BIOS XML data, then validate it
--################################################################################
--
--sub load
--{
--    my ($self) = @_;
--    my $biosSchemaXsd = undef;
--
--    eval
--    {
--        $self->{_biosXmlDoc} =
--            $self->{_libXmlParser}->parse_file($self->{_biosInputXmlFile});
--    };
--
--    main::fatal ("Failed to parse BIOS file [$self->{_biosInputXmlFile}].\n"
--        . " Reason: $@") if $@;
--
--    eval
--    {
--        $biosSchemaXsd =
--            XML::LibXML::Schema->new(location => $self->{_biosSchemaXsdFile} );
--    };
--
--    main::fatal ("Failed to load valid schema [$self->{_biosSchemaXsdFile}].\n"
--        . "Reason: $@") if $@;
--
--    eval
--    {
--        $biosSchemaXsd->validate($self->{_biosXmlDoc})
--    };
--
--    main::fatal ("Failed to validate [$self->{_biosInputXmlFile}] "
--        . "using schema [$self->{_biosSchemaXsdFile}].\n"
--        . "Reason: $@") if $@;
--}
--
--################################################################################
--# Export the working version of the BIOS document to a file our STDOUT
--################################################################################
--
--sub export
--{
--    my ($self,$forceStdout) = @_;
--
--    if(defined $forceStdout
--        && ($forceStdout == 1))
--    {
--        print STDOUT "In-memory BIOS XML dump:\n";
--        print STDOUT $self->{_biosXmlDoc}->toString();
--    }
--    else
--    {
--        open(OUTPUT_XML,">$self->{_biosOutputXmlFile}") or
--            main::fatal("Could not open output BIOS XML file "
--                . "[$self->{_biosOutputXmlFile}] for writing.\n"
--                . "Reason: $!");
--
--        print OUTPUT_XML $self->{_biosXmlDoc}->toString() or
--            main::fatal ("Failed write output BIOS XML file "
--                . "[$self->{_biosOutputXmlFile}].\n"
--                . "Reason: $!");
--
--        close OUTPUT_XML or
--            main::fatal ("Failed to close output BIOS XML file "
--                . "[$self->{_biosOutputXmlFile}].\n"
--                . "Reason: $!");
--    }
--}
--
--################################################################################
--# Create child element in BIOS XML tree and return it
--################################################################################
--
--sub createChildElement()
--{
--    my ($self,$parent,$name,$value) = @_;
--
--    my $child = XML::LibXML::Element->new($name);
--
--    # Value is optional parameter; if not specified, only the child container
--    # element is created
--    if(defined $value)
--    {
--        $child->appendTextNode($value);
--    }
--    $parent->addChild($child);
--
--    return $child;
--}
--
--################################################################################
--# Validate any constraint not enforced by the schema and amend the XML tree
--################################################################################
--
--sub processBios
--{
--    my($self,$attrMapRef,$attributesRef,$instanceRef,%targetPhysicalPath) = @_;
--
--    use bigint;
--
--    my %attrTargAttrSetByBios = ();
--
--    # Process all attribute elements regardless of tree location
--    foreach my $attribute ($self->{_biosXmlDoc}->findnodes('//attribute'))
--    {
--        my($id) = $attribute->findnodes('./id');
--        my $attributeId =  $id->to_literal;
--
--        # Attribute must be defined in targeting
--        if(!exists $attrMapRef->{$attributeId})
--        {
--            main::fatal("BIOS definition specified attribute $attributeId, but "
--                . "that attribute is not defined in targeting.\n");
--        }
--
--        # Attribute must have volatile persistency
--        if($attrMapRef->{$attributeId}{persistency} ne "volatile"
--             && $attrMapRef->{$attributeId}{persistency} ne "volatile-zeroed")
--        {
--            main::fatal("BIOS definition specified attribute $attributeId, but "
--                . "that attribute is neither volatile nor volatile-zeroed "
--                . "in targeting.  Actual persistency is "
--                . "$attrMapRef->{$attributeId}{persistency}.\n");
--        }
--
--        # Attribute must be read only
--        my $readable = exists $attrMapRef->{$attributeId}{readable} ? 1 : 0;
--        my $writeable = exists $attrMapRef->{$attributeId}{writeable} ? 1 : 0;
--        if(!$readable || $writeable)
--        {
--            main::fatal("BIOS definition specified attribute $attributeId, but "
--                . "that attribute is not read-only in targeting.  "
--                . "Readable? " . $readable
--                . " writeable? " . $writeable . "\n");
--        }
--
--        # Attribute must not be an FSP-only attribute
--        my $fspOnly = exists $attrMapRef->{$attributeId}{fspOnly} ? 1 : 0;
--        if($fspOnly)
--        {
--            main::fatal("BIOS definition specified attribute $attributeId, but "
--                . "that attribute is FSP only in targeting.\n");
--        }
--
--        # Attribute must be an allowed type -and- supported by the BIOS code
--        # Current support is for signed/unsigned ints (1,2,4,8 bytes in size)
--        # and enumerations
--        my $simpleType = exists $attrMapRef->{$attributeId}{simpleType} ? 1 : 0;
--        my $complexType =
--            exists $attrMapRef->{$attributeId}{complexType} ? 1 : 0;
--        my $nativeType = exists $attrMapRef->{$attributeId}{nativeType} ? 1 : 0;
--        if(!$simpleType)
--        {
--            main::fatal("BIOS definition specified attribute $attributeId, but "
--                . "that attribute is not a simple type in targeting.  "
--                . "Complex type? $complexType, native type? $nativeType.\n");
--        }
--
--        # Defines which attributes can be put in the BIOS and provides
--        # associated BIOS type hint for 3rd party consumer
--        my %typeHash = ();
--
--        $typeHash{"int8_t"} =
--             { generalType => 'signed',
--               min         => -128,
--               max         => 127,
--               ror         => 1,
--             };
--        $typeHash{"int16_t"} =
--             { generalType => 'signed',
--               min         => -32768,
--               max         => 32767,
--               ror         => 1,
--             };
--        $typeHash{"int32_t"} =
--             { generalType => 'signed',
--               min         => -2147483648,
--               max         => 2147483647,
--               ror         => 1,
--             };
--        $typeHash{"int64_t"} =
--             { generalType => 'signed',
--               min         => -9223372036854775808,
--               max         => 9223372036854775807,
--               ror         => 1,
--             };
--        $typeHash{"uint8_t"} =
--             { generalType => 'unsigned',
--               min         => 0,
--               max         => 255,
--               ror         => 1,
--              };
--        $typeHash{"uint16_t"} =
--             { generalType => 'unsigned',
--               min         => 0,
--               max         => 65535,
--               ror         => 1,
--             };
--        $typeHash{"uint32_t"} =
--             { generalType => 'unsigned',
--               min         => 0,
--               max         => 4294967295,
--               ror         => 1,
--             };
--        $typeHash{"uint64_t"} =
--             { generalType => 'unsigned',
--               min         => 0,
--               max         => 18446744073709551615,
--               ror         => 1,
--             };
--        $typeHash{"enumeration"} =
--             { generalType => 'unsigned',
--               min         => 'na',
--               max         => 'na',
--               ror         => 1,
--             };
--
--        my $validType = 0;
--        my $attrType = "unknown";
--        # Convert actual type into a generalized type hint for the BIOS consumer
--        # and append to the XML tree
--        foreach my $type (keys %typeHash)
--        {
--            if(exists $attrMapRef->{$attributeId}{simpleType}{$type})
--            {
--                $self->createChildElement($attribute,"encoding",
--                    $typeHash{$type}{generalType});
--                $attrType = $type;
--                $validType = 1;
--                last;
--            }
--        }
--        if(!$validType)
--        {
--            main::fatal("BIOS definition specified attribute $attributeId, but "
--                . "that attribute's type is not supported in BIOS context. "
--                . "Dump of type:\n"
--                . ::Dumper($attrMapRef->{$attributeId}{simpleType}) . "\n");
--        }
--
--        # Simple type must not be array
--        if(exists $attrMapRef->{$attributeId}{simpleType}{array})
--        {
--            main::fatal("BIOS definition specified attribute $attributeId, but "
--                . "that attribute is an array which is not supported in "
--                . "BIOS context.\n");
--        }
--
--        # If attribute definition doesn't have a short name, it must be
--        # overridden by the BIOS config.  Add final value to the XML tree
--        my($displayNameNodes) = $attribute->findnodes('./display-name');
--        if(!$displayNameNodes)
--        {
--            if(exists $attrMapRef->{$attributeId}{'display-name'})
--            {
--                $self->createChildElement(
--                    $attribute,"display-name",
--                    $attrMapRef->{$attributeId}{'display-name'});
--            }
--            else
--            {
--                main::fatal("BIOS definition specified attribute $attributeId, "
--                    . "but attribute definition does not give a display name, "
--                    . "so BIOS config must (but failed to do so).\n");
--            }
--        }
--
--        # If attribute definition doesn't have a description, it must be
--        # overridden by the BIOS config.  Add final value to the XML tree
--        my($descriptionNodes) = $attribute->findnodes('./description');
--        if(!$descriptionNodes)
--        {
--            if(exists $attrMapRef->{$attributeId}{description})
--            {
--               $self->createChildElement(
--                    $attribute,"description",
--                    $attrMapRef->{$attributeId}{description});
--            }
--            else
--            {
--                main::fatal("BIOS definition specified attribute $attributeId, "
--                    . "but attribute definition does not give a description, "
--                    . "so BIOS config must (but failed to do so).\n");
--            }
--        }
--
--        my $default = undef;
--        my $size = undef;
--        my @targetRestrictions = $attribute->findnodes('./targetRestriction');
--
--        # Assume all targets have this BIOS attribute to begin with, then prove
--        # otherwise during processing
--        my %filteredTargets = %$instanceRef;
--        foreach my $target (keys %filteredTargets)
--        {
--            $filteredTargets{$target}{_allowed_} = 1;
--        }
--
--        # Hold the target override data
--        my %restriction = ();
--        $restriction{node} = 0x0F; # FAPI override value = any position
--        $restriction{position} = 0xFFFF; # FAPI override value = any position
--        $restriction{unit} = 0xFF; # FAPI override value = any unit
--        $restriction{symbolicType} = "*"; # Easy to understand target type
--        $restriction{numericType} = 0x0; # FAPI type indicator; 0 = any
--
--        # Scan target restriction(s).  If no restriction, the BIOS attribute
--        # must have same default for all instances.  If target restriction, all
--        # attributes that are grouped by the restriction must have the same
--        # default value.
--        if(scalar @targetRestrictions > 0)
--        {
--            my $restrictNode = "*";
--            my $restrictPos  = "*"; # NA except for things with positions
--                                    # including units
--            my $restrictUnit = "*"; # NA except for units
--            my $restrictType = "*";
--
--            # By default, a BIOS setting applies to every target the attribute
--            # is assigned to in targeting.  However, a target restriction can
--            # restrict an attribute to one or more subsets of those.  The set of
--            # targets tied to same BIOS attribute+restriction cannot intersect
--            # with any other similar grouping.  Further, all attributes of
--            # same type tied to same BIOS attribute via the restriction must
--            # have same default value.  Only one target restriction allowed by
--            # the schema
--            foreach my $targetRestriction (@targetRestrictions)
--            {
--                # Schema validation doesn't easily force targetRestrictions to
--                # have at least one child, so bail if that's the case
--                my @childElements = $targetRestriction->findnodes('./*');
--                if(scalar @childElements == 0)
--                {
--                    main::fatal("BIOS definition specified attribute "
--                        . "$attributeId, but requested targetRestriction with "
--                        . "no parameters.\n");
--                }
--
--                my @nodeElements = $targetRestriction->findnodes('./node');
--                my @positionElements
--                    = $targetRestriction->findnodes('./position');
--                my @unitElements = $targetRestriction->findnodes('./unit');
--                my @typeElements = $targetRestriction->findnodes('./type');
--
--                if(scalar @nodeElements)
--                {
--                    $restriction{node} = $nodeElements[0]->to_literal;
--                }
--
--                if(scalar @positionElements)
--                {
--                    $restriction{position} = $positionElements[0]->to_literal;
--                }
--
--                if(scalar @unitElements)
--                {
--                    $restriction{unit} = $unitElements[0]->to_literal;
--                }
--
--                # If any type restriction, verify it is a valid type designator
--                # any hold onto the numeric ID which will end up in the XML tree
--                if(scalar @typeElements)
--                {
--                    my $symbolicType = $typeElements[0]->to_literal;
--                    my $typeEnumDef =
--                        ::getEnumerationType($$attributesRef,"TYPE");
--                    my $numericType =
--                        ::enumNameToValue($typeEnumDef,$symbolicType);
--
--                    $restriction{numericType} = $numericType;
--                    $restriction{symbolicType} = $symbolicType;
--                }
--
--                # Compute the affected targets
--                foreach my $target (keys %filteredTargets)
--                {
--                    if(scalar @typeElements > 0)
--                    {
--                        $restrictType = $typeElements[0]->to_literal;
--
--                        # Screen out targets that don't match the given type
--                        if($filteredTargets{$target}{_allowed_} == 1)
--                        {
--                            my $type =
--                                $filteredTargets{$target}{_identity_}{TYPE};
--                            if($restrictType ne $type
--                                && $filteredTargets{$target}{_allowed_} == 1)
--                            {
--                                $filteredTargets{$target}{_allowed_} = 0;
--                                next;
--                            }
--                        }
--                    }
--
--                    if(scalar @nodeElements > 0)
--                    {
--                        $restrictNode = $nodeElements[0]->to_literal;
--
--                        # Screen out targets that don't match the given node.
--                        # A target matches the node restriction if its physical
--                        # path contains the same node ID.
--                        my $isInSameNodeExpr =
--                            quotemeta "physical:sys-0/node-$restrictNode" ;
--                        my $path =
--                            $filteredTargets{$target}{_identity_}{PHYS_PATH};
--
--                        if($path !~ m/^$isInSameNodeExpr/)
--                        {
--                            $filteredTargets{$target}{_allowed_} = 0;
--                            next;
--                        }
--                    }
--
--                    if(scalar @unitElements > 0)
--                    {
--                        $restrictUnit = $unitElements[0]->to_literal;
--
--                        my $checkPosition = 0;
--
--                        # Screen out targets that do not have unit attributes,
--                        # or which have non-matching unit attributes
--                        if(   (!exists
--                               $filteredTargets{$target}{_identity_}{CHIP_UNIT})
--                           || ($filteredTargets{$target}{_identity_}{CHIP_UNIT}
--                               != $restrictUnit)   )
--                        {
--                            $filteredTargets{$target}{_allowed_} = 0;
--                            next;
--                        }
--                        else
--                        {
--                            $checkPosition = 1;
--                        }
--
--                        # If unit matches, need to make sure it also sits on
--                        # chip at requested position, if specified
--                        if($checkPosition && ((scalar @positionElements) > 0))
--                        {
--                            my $candidatePath =
--                               $filteredTargets{$target}{_identity_}{PHYS_PATH};
--
--                            my $parent_phys_path = substr(
--                                $candidatePath, 0,(rindex $candidatePath, "/"));
--                            my $foundPosition = 0;
--
--                            # Walk from unit to whatever parent has the position
--                            # attribute; Remove this target from consideration
--                            # if the position does not match the restriction
--                            while(
--                                defined $targetPhysicalPath{$parent_phys_path})
--                            {
--                                if(defined $filteredTargets{
--                                       $targetPhysicalPath{$parent_phys_path}
--                                   }{_identity_}{POSITION})
--                                {
--                                    if ($filteredTargets{
--                                          $targetPhysicalPath{$parent_phys_path}
--                                        }{_identity_}{POSITION}
--                                        == $positionElements[0]->to_literal)
--                                    {
--                                        $foundPosition = 1;
--                                    }
--
--                                    last;
--                                }
--
--                                $candidatePath = $parent_phys_path;
--                                $parent_phys_path = substr(
--                                    $candidatePath, 0,
--                                    (rindex $candidatePath, "/"));
--                            }
--
--                            if(!$foundPosition)
--                            {
--                                $filteredTargets{$target}{_allowed_} = 0;
--                                next;
--                            }
--                        }
--                    }
--
--                    # If no unit restriction but position restriction, screen
--                    # out targets that don't have position attribute or whose
--                    # position attribute does not match the restriction
--                    if(   (scalar @positionElements > 0)
--                       && (scalar @unitElements == 0)   )
--                    {
--                        $restrictPos = $positionElements[0]->to_literal;
--
--                        if(   (!exists
--                                $filteredTargets{$target}{_identity_}{POSITION})
--                           || (  $filteredTargets{$target}{_identity_}{POSITION}
--                               != $restrictPos))
--                        {
--                            $filteredTargets{$target}{_allowed_} = 0;
--                        }
--                    }
--                 }
--            }
--        }
--
--        foreach my $target (keys %filteredTargets)
--        {
--            # Don't bother with any target that is not in play
--            if($filteredTargets{$target}{_allowed_} != 1)
--            {
--                next;
--            }
--
--            # Candidate is any target having the attribute and a default
--            # value determined
--            if(   exists $instanceRef->{$target}{$attributeId}
--               && exists $instanceRef->{$target}{$attributeId}{default}
--               && exists $instanceRef->{$target}{$attributeId}{size})
--            {
--                # Multiple BIOS directives cannot touch same
--                # target/attribute
--                if(defined $attrTargAttrSetByBios{$target}{$attributeId})
--                {
--                    main::fatal("$target, $attributeId set by multiple BIOS "
--                        . "definitions.\n");
--                }
--                else
--                {
--                    $attrTargAttrSetByBios{$target}{$attributeId} = 1;
--                }
--
--                # If no default set yet
--                if(! (defined $default) )
--                {
--                    $default = $instanceRef->{$target}{$attributeId}{default};
--                    $size = $instanceRef->{$target}{$attributeId}{size};
--                }
--                # Cannot have different defaults in same group
--                elsif(   $instanceRef->{$target}{$attributeId}{default}
--                      != $default )
--                {
--                    main::fatal("BIOS definition specified attribute "
--                        . "$attributeId, but default values are not same "
--                        . "across all qualifying targets.  "
--                        . "$target/ $attributeId = "
--                        . "$instanceRef->{$target}{$attributeId}{default}.\n");
--                }
--            }
--        }
--
--        # If no targets had the attribute
--        if(!defined $default || !defined $size)
--        {
--            main::fatal("BIOS definition specified attribute $attributeId, but "
--                . "after considering target restrictions/etc., no "
--                . "valid targets were found.\n");
--        }
--
--        # Add the restriction info to the XML tree.  This info is useful for 3rd
--        # parties to create Hostboot attribute overrides.
--        my $targetElement = $self->createChildElement($attribute,"target");
--        $self->createChildElement(
--            $targetElement,"type",sprintf("0x%08X",$restriction{numericType}));
--        $self->createChildElement(
--            $targetElement,"node",sprintf("0x%02X",$restriction{node}));
--        $self->createChildElement(
--            $targetElement,"position",sprintf("0x%04X",$restriction{position}));
--        $self->createChildElement(
--            $targetElement,"unit",sprintf("0x%02X",$restriction{unit}));
--
--        my @enumerationOverrideElement
--            = $attribute->findnodes('./enumerationOverride');
--        if($attrType eq "enumeration")
--        {
--            # Get a copy of the enumeration description.  Schema requires
--            # enumerator to have only a name (symbolic handle) + value.
--            # Customization allows overriding description + short name
--            # Customization allows specifying subset of values to actually use
--            # Output includes short name, long name, value
--            my $enumType =
--                $attrMapRef->{$attributeId}{simpleType}{enumeration}{id};
--            my $enumerationType =
--                ::getEnumerationType($$attributesRef,$enumType);
--
--            my %foundAllowed = ();
--            my $enableRestrictions = 0;
--            if(scalar @enumerationOverrideElement)
--            {
--                # Each enumerator name must tie back to a valid enumeration
--                foreach my $overrideNameElement (
--                    $attribute->findnodes(
--                        './enumerationOverride/allowedEnumerators/name'))
--                {
--                    my $overrideName = $overrideNameElement->to_literal;
--                    my $nameFound = 0;
--                    foreach my $enumerator (@{$enumerationType->{enumerator}})
--                    {
--                        if($enumerator->{name} eq $overrideName)
--                        {
--                            # Each allowed value must be different from all the
--                            # rest previously found for this attribute
--                            if(exists $foundAllowed{$overrideName})
--                            {
--                                main::fatal("BIOS definition specified "
--                                    . "attribute $attributeId, and supplied "
--                                    . "override to allowed enumeration values, "
--                                    . "but duplicated a value of "
--                                    . "$overrideName.\n");
--                            }
--                            else
--                            {
--                                $foundAllowed{$overrideName} = 1;
--                                $enumerator->{allowed} = 1;
--                            }
--
--                            $enableRestrictions = 1;
--                            $nameFound = 1;
--
--                            last;
--                        }
--                    }
--
--                    if(!$nameFound)
--                    {
--                        main::fatal("BIOS definition specified attribute "
--                            . "$attributeId, and supplied override to allowed "
--                            . "enumeration values, but requested enumerator "
--                            . "$overrideName is not valid.\n");
--                    }
--                }
--
--                # Apply any overrides to the enumerator text
--                my %textOverrideAllowed = ();
--                foreach my $enumeratorOverrideElement (
--                    $attribute->findnodes(
--                        './enumerationOverride/enumeratorOverride'))
--                {
--                    # Each override must have exactly one name element
--                    my @name = $enumeratorOverrideElement->findnodes('./name');
--
--                    # Each override must have 0 or 1 display-name and
--                    # descriptions elements
--                    my @displayName =
--                        $enumeratorOverrideElement->findnodes('./display-name');
--                    my @description =
--                        $enumeratorOverrideElement->findnodes('./description');
--
--                    # Make sure enumerator name is valid
--                    my $overrideName = $name[0]->to_literal;
--                    my $nameFound = 0;
--                    foreach my $enumerator (@{$enumerationType->{enumerator}})
--                    {
--                        if($enumerator->{name} eq $overrideName)
--                        {
--                            # Must not duplicate already overridden enumerator
--                            if(exists $textOverrideAllowed{$overrideName})
--                            {
--                                main::fatal("BIOS definition specified "
--                                     . "attribute $attributeId, and supplied "
--                                     . "override to allowed enumerator, "
--                                     . "but already overrode this "
--                                     . "enuemrator.\n");
--                            }
--                            # Can only override things that are not restricted
--                            elsif(   !exists $foundAllowed{$overrideName}
--                                  && $enableRestrictions)
--                            {
--                                main::fatal("BIOS definition specified "
--                                     . "attribute $attributeId, and supplied "
--                                     . "override to allowed enumerator, but "
--                                     . "this enumerator $overrideName is "
--                                     . "restricted.\n");
--                            }
--                            else
--                            {
--                                $textOverrideAllowed{$overrideName} = 1;
--                            }
--
--                            if(scalar @displayName)
--                            {
--                                $enumerator->{'display-name'} =
--                                    $displayName[0]->to_literal;
--                            }
--
--                            if(scalar @description)
--                            {
--                                $enumerator->{description} =
--                                    $description[0]->to_literal;
--                            }
--
--                            $nameFound = 1;
--                            last;
--                        }
--                    }
--
--                    if(!$nameFound)
--                    {
--                        main::fatal("BIOS definition specified attribute "
--                            . "$attributeId, and supplied override to allowed "
--                            . "enumeration, but requested invalid enumerator "
--                            . "name to override of $overrideName.\n");
--                    }
--                }
--            }
--
--            my $enumerationElement =
--                $self->createChildElement($attribute,"enumeration");
--
--            foreach my $enumerator (@{$enumerationType->{enumerator}})
--            {
--                if($enableRestrictions && !exists $enumerator->{allowed})
--                {
--                    # If enumerator is not allowed and is same as attribute
--                    # default then can't continue
--                    if($default eq  $enumerator->{name})
--                    {
--                        main::fatal("BIOS definition specified attribute "
--                            . "$attributeId as not allowing "
--                            . "$enumerator->{name}, but that is the attribute "
--                            . "default.\n");
--                    }
--
--                    next;
--                }
--
--                my $enumeratorElement =
--                    $self->createChildElement($enumerationElement,"enumerator");
--
--                if(!exists $enumerator->{'display-name'})
--                {
--                    main::fatal("BIOS definition specified attribute "
--                        . "$attributeId, and supplied override to enumerator "
--                        . "$enumerator->{name}, but there is no "
--                        . "display-name.\n");
--                }
--
--                $self->createChildElement(
--                   $enumeratorElement,"display-name",
--                   $enumerator->{'display-name'});
--
--                if(!exists $enumerator->{description})
--                {
--                    main::fatal("BIOS definition specified attribute "
--                        . "$attributeId, and supplied override to enumerator "
--                        . "$enumerator->{name}, but there is no "
--                        . "description.\n");
--                }
--
--                $self->createChildElement(
--                   $enumeratorElement,"description",$enumerator->{description});
--                $self->createChildElement(
--                   $enumeratorElement,"value",
--                   sprintf("0x%08X",$enumerator->{value}));
--            }
--
--            # Translate attribute default to actual value
--            $default = ::enumNameToValue($enumerationType,$default);
--        }
--        # No enums allowed to be specified
--        elsif(scalar @enumerationOverrideElement)
--        {
--                main::fatal("BIOS definition specified attribute $attributeId, "
--                    . "and supplied enumerated values, but this is not an "
--                    . "enumeration attribute, it is of type $attrType.\n");
--        }
--
--        # Can only specify numeric override for signed/unsigned values of
--        # 1,2,4,8 byte values
--        my @numericOverrideElements= $attribute->findnodes('./numericOverride');
--
--        # Hash of min(key), max(value) pairs
--        my %allowedRange = ();
--        if(scalar @numericOverrideElements)
--        {
--            # If range override not allowed for this attribute, bail
--            if($typeHash{$attrType}{ror} != 1)
--            {
--                main::fatal("BIOS definition specified attribute $attributeId, "
--                    . "and supplied numeric override, but this attribute "
--                    . "type does not support such override.  Type is "
--                    . "$attrType.\n");
--            }
--
--            # A numericOverride has exactly one start + end element
--            my @startElements =
--                @numericOverrideElements[0]->findnodes('./start');
--            my @endElements = @numericOverrideElements[0]->findnodes('./end');
--            my $min = $typeHash{$attrType}{min};
--            my $max = $typeHash{$attrType}{max};
--
--            # Validate range min
--            if(scalar @startElements)
--            {
--                my $rawMin = @startElements[0]->to_literal;
--
--                if($rawMin < $min || $rawMin > $max)
--                {
--                    main::fatal("BIOS definition specified attribute "
--                        . "$attributeId, and supplied valid start or end "
--                        . "range, but min out of range. requested "
--                        . "min = $rawMin, allowed min = "
--                        . "$typeHash{$attrType}{min}, allowed max = "
--                        . "$typeHash{$attrType}{max}.\n");
--                }
--                $min = $rawMin;
--            }
--
--            # Validate range max
--            if(scalar @endElements)
--            {
--                my $rawMax = @endElements[0]->to_literal;
--
--                if($rawMax > $max || $rawMax < $min)
--                {
--                    main::fatal("BIOS definition specified attribute "
--                        . "$attributeId, and supplied valid start or end "
--                        . "range, but max out of range. requested "
--                        . "max = $rawMax, current min = $min, "
--                        . "allowed min = "
--                        . "$typeHash{$attrType}{min}, allowed max = "
--                        . "$typeHash{$attrType}{max}.\n");
--                }
--                $max = $rawMax;
--            }
--
--            # Min must be <= Max
--            if($min > $max)
--            {
--                main::fatal("BIOS definition specified attribute "
--                    . "$attributeId, and supplied valid start or end "
--                    . "range, but min > max. min = $min, "
--                    . "max = $max.\n");
--            }
--
--            # To prevent range overlaps, cannot duplicate the same start of
--            # a range
--            if(defined $allowedRange{$min})
--            {
--                main::fatal("Already range starting at $min.\n");
--            }
--
--            $allowedRange{$min} = $max;
--            my $defaultInRange = 0;
--
--            my $min = undef;
--            my $max = undef;
--
--            # Ensure default value falls within a defined range.  The ranges are
--            # sorted in numerically ascending order according to the start of
--            # each range, so if the start of
--            # range N falls within range N-1, we know there is an illegal range
--            # overlap and fail.
--            foreach my $rangeKey (sort {$a <=> $b} keys %allowedRange)
--            {
--                if(   ($default >= $rangeKey)
--                   && ($default <= $allowedRange{$rangeKey}) )
--                {
--                    $defaultInRange = 1;
--                }
--
--                if(!defined $min)
--                {
--                    $min = $rangeKey;
--                    $max = $allowedRange{$rangeKey};
--                    next;
--                }
--
--                if($rangeKey <= $max)
--                {
--                    main::fatal("Range starting with $rangeKey overlaps "
--                        . "range ending at $max.\n");
--                }
--
--                $min = $rangeKey;
--                $max = $allowedRange{$rangeKey};
--            }
--
--            if(!$defaultInRange)
--            {
--                main::fatal("Default value $default not in any valid range.\n");
--            }
--        }
--
--        # Convert attribute ID to numerical value and append to XML tree
--        my $attributeIdEnumeration
--            = ::getAttributeIdEnumeration($$attributesRef);
--        my $attrValue = ::enumNameToValue($attributeIdEnumeration,$attributeId);
--        $attrValue = sprintf ("0x%0X", $attrValue);
--
--        # Add the remaining metadata to the XML tree
--        $self->createChildElement($attribute,"default",$default);
--        $self->createChildElement($attribute,"numeric-id",$attrValue);
--        $self->createChildElement($attribute,"size",$size);
--    }
--}
--
--1;
--
--}
--
- __END__
- 
- =head1 NAME
-@@ -7117,23 +6110,6 @@ Adds 4096 bytes of version page as first page in the generated binaries.
- Does not add 4096 bytes of version page as first page in the generated
- binaries . This is the default behavior.
- 
--=item B<--bios-xml-file>
--
--Path + file name of XML file describing the platform's BIOS configuration.
--Optional.
--
--=item B<--bios-schema-file>
--
--Path + file name of XSD schema file used to validate the BIOS XML file. Required
--if a BIOS XML file is given.
--
--=item B<--bios-output-file>
--
--Path + filename of output XML file describing the amended BIOS configuration.
--This output is commonly later modified by 3rd parties via xslt transformation to
--tailor the output for a given application.  Required if a BIOS XML file is
--given.
--
- =item B<--verbose>
- 
- Prints out some internal workings
--- 
-1.8.2.2
-
-
-From 2a45170e801056f7f2952610ccd9079ad5324c98 Mon Sep 17 00:00:00 2001
-From: Matt Ploetz <maploetz@us.ibm.com>
-Date: Fri, 20 Feb 2015 11:04:36 -0600
-Subject: [PATCH 06/10] Revert "Targeting: Generate VERSION page for binaries."
-
-This reverts commit 34c58e19162834ff5bb8d4ffb9975b50d5a0770a.
----
- src/build/buildpnor/defaultPnorLayout.xml   |  1 -
- src/usr/targeting/common/xmltohb/xmltohb.pl | 59 +----------------------------
- src/usr/targeting/xmltohb/makefile          |  5 +--
- 3 files changed, 4 insertions(+), 61 deletions(-)
-
-diff --git a/src/build/buildpnor/defaultPnorLayout.xml b/src/build/buildpnor/defaultPnorLayout.xml
-index 18c309d..d5d5d25 100644
---- a/src/build/buildpnor/defaultPnorLayout.xml
-+++ b/src/build/buildpnor/defaultPnorLayout.xml
-@@ -97,7 +97,6 @@ Layout Description
-         <eyeCatch>HBD</eyeCatch>
-         <physicalOffset>0x5D000</physicalOffset>
-         <physicalRegionSize>0x120000</physicalRegionSize>
--        <sha512Version/>
-         <side>sideless</side>
-         <ecc/>
-     </section>
-diff --git a/src/usr/targeting/common/xmltohb/xmltohb.pl b/src/usr/targeting/common/xmltohb/xmltohb.pl
-index d02c1a7..a658c74 100755
---- a/src/usr/targeting/common/xmltohb/xmltohb.pl
-+++ b/src/usr/targeting/common/xmltohb/xmltohb.pl
-@@ -74,7 +74,6 @@ my $cfgShortEnums = 0;
- my $cfgBigEndian = 1;
- my $cfgIncludeFspAttributes = 0;
- my $CfgSMAttrFile = "";
--my $cfgAddVersionPage = 0;
- 
- GetOptions("hb-xml-file:s" => \$cfgHbXmlFile,
-            "src-output-dir:s" =>  \$cfgSrcOutputDir,
-@@ -86,7 +85,6 @@ GetOptions("hb-xml-file:s" => \$cfgHbXmlFile,
-            "big-endian!" =>  \$cfgBigEndian,
-            "smattr-output-file:s" => \$CfgSMAttrFile,
-            "include-fsp-attributes!" =>  \$cfgIncludeFspAttributes,
--           "version-page!" => \$cfgAddVersionPage,
-            "help" => \$cfgHelp,
-            "man" => \$cfgMan,
-            "verbose" => \$cfgVerbose ) || pod2usage(-verbose => 0);
-@@ -115,7 +113,6 @@ if($cfgVerbose)
-     print STDOUT "Short enums = $cfgShortEnums\n";
-     print STDOUT "Big endian = $cfgBigEndian\n";
-     print STDOUT "include-fsp-attributes = $cfgIncludeFspAttributes\n",
--    print STDOUT "version-page = $cfgAddVersionPage\n",
- }
- 
- ################################################################################
-@@ -337,21 +334,9 @@ use constant SECTION => 3;
- use constant TARGET => 4;
- use constant ATTRNAME => 5;
- my @attrDataforSM = ();
--
--#Flag which indicates if the script needs to add the 4096 bytes of version
--#checksum as first page in the binary file generated.
--my $addRO_Section_VerPage = 0;
- if( !($cfgImgOutputDir =~ "none") )
- {
--    #Version page will be added only if the script is called in with the flag
--    #--version-flag
--    if ($cfgAddVersionPage)
--    {
--        $addRO_Section_VerPage = 1;
--    }
--    #Pass the $addRO_Section_VerPage into the sub rotuine
--    my $Data = generateTargetingImage($cfgVmmConstsFile,$attributes,\%Target_t,
--                                      $addRO_Section_VerPage);
-+    my $Data = generateTargetingImage($cfgVmmConstsFile,$attributes,\%Target_t);
- 
-     open(PNOR_TARGETING_FILE,">$cfgImgOutputDir".$cfgImgOutputFile)
-       or fatal ("Targeting image file: \"$cfgImgOutputDir"
-@@ -4973,7 +4958,7 @@ sub serializeAssociations
- ################################################################################
- 
- sub generateTargetingImage {
--    my($vmmConstsFile, $attributes, $Target_t,$addRO_Section_VerPage) = @_;
-+    my($vmmConstsFile, $attributes, $Target_t) = @_;
- 
-     # 128 MB virtual memory offset between sections
-     my $vmmSectionOffset = 128 * 1024 * 1024; # 128MB
-@@ -4998,12 +4983,6 @@ sub generateTargetingImage {
-     my $headerSize = 256;
-     my $offset = $headerSize;
- 
--
--    #If the file to be created is the HB targeting binary , then it will contain
--    #first page (4096 bytes) as the read-only data checksum. Need to adjust the
--    #read-only section offset.
--    my $versionSectionSize = 4096;
--
-     # Reserve space for the pointer to the # of targets, update later;
-     my $numTargetsPointer = 0;
-     my $numTargetsPointerBinData = pack8byte($numTargetsPointer);
-@@ -5768,15 +5747,6 @@ sub generateTargetingImage {
-     my $blockSize = 4*1024;
- 
-     my %sectionHoH = ();
--
--    my $roOffset = 0;
--    if ($addRO_Section_VerPage == 1)
--    {
--        #First section to start after 4096 bytes
--        #as RO version data occupies first page in the binary file
--        $roOffset = $versionSectionSize;
--    }
--
-     $sectionHoH{ pnorRo }{ offset } = 0;
-     $sectionHoH{ pnorRo }{ type   } = 0;
-     $sectionHoH{ pnorRo }{ size   } = sizeBlockAligned($offset,$blockSize,1);
-@@ -5897,24 +5867,6 @@ sub generateTargetingImage {
-     }
- 
-     my $outFile;
--
--    #HB Targeting binary file will contain <Version Page>+<Targeting Header>+
--    #<Section  data>...
--    if ($addRO_Section_VerPage == 1)
--    {
--        #Generate the MD5 checksum value for the read-only data and update the
--        #content of the version section
--        my $versionHeader = "VERSION";
--        $versionHeader .= md5_hex($roAttrBinData);
--
--        $outFile .= $versionHeader;
--        my $versionHeaderPadSize =
--            (sizeBlockAligned ((length $versionHeader),$versionSectionSize,1)
--             - (length $versionHeader));
--        $outFile .= pack ("@".$versionHeaderPadSize);
--    }
--
--    #Append the 256 bytes header data
-     $outFile .= $headerBinData;
-     my $padSize = sizeBlockAligned((length $headerBinData),$headerSize,1)
-         - (length $headerBinData);
-@@ -6103,13 +6055,6 @@ generated code.
- Omits FSP specific attributes and targets from the generated binaries and
- generated code.  This is the default behavior.
- 
--=item B<--version-page>
--Adds 4096 bytes of version page as first page in the generated binaries.
--
--=item B<--no-version-page>
--Does not add 4096 bytes of version page as first page in the generated
--binaries . This is the default behavior.
--
- =item B<--verbose>
- 
- Prints out some internal workings
-diff --git a/src/usr/targeting/xmltohb/makefile b/src/usr/targeting/xmltohb/makefile
-index eb0b05a..6d1fff3 100644
---- a/src/usr/targeting/xmltohb/makefile
-+++ b/src/usr/targeting/xmltohb/makefile
-@@ -5,7 +5,7 @@
- #
- # OpenPOWER HostBoot Project
- #
--# Contributors Listed Below - COPYRIGHT 2011,2015
-+# Contributors Listed Below - COPYRIGHT 2011,2014
- # [+] International Business Machines Corp.
- #
- #
-@@ -154,6 +154,5 @@ ${GENDIR}/%_targeting.bin: ${XMLTOHB_COMPILER_SCRIPT} ${GENDIR}/%.hb.xml \
-         $(addprefix --fapi-attributes-xml-file=,${GENDIR}/${XMLTOHB_FAPI_XML}) \
-          --src-output-dir=none --img-output-dir=$(dir $@) \
-          --img-output-file=$(notdir $@) \
--         --vmm-consts-file=$(VMM_CONSTS_FILE) --noshort-enums \
--         --version-page
-+         --vmm-consts-file=$(VMM_CONSTS_FILE) --noshort-enums
- 
--- 
-1.8.2.2
-
-
-From 0a4989176f0ef4f1374f88ae5dd4157cd63d45ce Mon Sep 17 00:00:00 2001
-From: Matt Ploetz <maploetz@us.ibm.com>
-Date: Fri, 20 Feb 2015 11:04:47 -0600
-Subject: [PATCH 07/10] Revert "adding toc offsets to defaultPnorLayout for
- hwsv team"
-
-This reverts commit 6990adda0f2996cc7baacba9f485c7b5a415904c.
----
- src/build/buildpnor/defaultPnorLayout.xml | 7 -------
- 1 file changed, 7 deletions(-)
-
-diff --git a/src/build/buildpnor/defaultPnorLayout.xml b/src/build/buildpnor/defaultPnorLayout.xml
-index d5d5d25..897d4db 100644
---- a/src/build/buildpnor/defaultPnorLayout.xml
-+++ b/src/build/buildpnor/defaultPnorLayout.xml
-@@ -28,9 +28,6 @@ Layout Description
-     <imageSize>    -> Size of PNOR image in bytes.
-     <blockSize>    -> size of erase blocks in bytes.
-     <tocSize>      -> size of each partition table
--    <!- TODO:RTC:123734 - remove side offsets once hwsv implements new layout ->
--    <sideAOffset>  -> Location of Side A Partition Table
--    <sideBOffset>  -> Location of Side B Partition Table
-     <side>         -> Contains information about the side
-         <id>            -> Id of the side (A or B)
-         <arrangement>   -> Tag that specifies the arrangement of the side
-@@ -67,10 +64,6 @@ Layout Description
-         <imageSize>0x4000000</imageSize>
-         <blockSize>0x1000</blockSize>
-         <tocSize>0x8000</tocSize>
--        <!--TODO: RTC 123734 - remove side offsets once hwsv implements new
--        layout-->
--        <sideAOffset>0x0</sideAOffset>
--        <sideBOffset>0x8000</sideBOffset>
-         <arrangement>A-B-D</arrangement>
-         <side>
-             <id>B</id>
--- 
-1.8.2.2
-
-
-From 2f98670c4b42a64f481a336e4d8d34a9a5ad93a8 Mon Sep 17 00:00:00 2001
-From: Matt Ploetz <maploetz@us.ibm.com>
-Date: Fri, 20 Feb 2015 11:04:55 -0600
-Subject: [PATCH 08/10] Revert "Created 2-sided and golden-side pnor layouts"
-
-This reverts commit e83759d6aa90999933318155772b50a8af679ec6.
----
- src/build/buildpnor/buildpnor.pl          | 254 ++++++++----------------------
- src/build/buildpnor/defaultPnorLayout.xml |  69 ++++----
- src/usr/pnor/common/ffs_hb.H              |   3 +-
- 3 files changed, 96 insertions(+), 230 deletions(-)
-
-diff --git a/src/build/buildpnor/buildpnor.pl b/src/build/buildpnor/buildpnor.pl
-index aad7c34..f6df6c8 100755
---- a/src/build/buildpnor/buildpnor.pl
-+++ b/src/build/buildpnor/buildpnor.pl
-@@ -61,7 +61,6 @@ my $g_trace = 1;
- 
- my $programName = File::Basename::basename $0;
- my %pnorLayout;
--my %PhysicalOffsets;
- my %binFiles;
- my $pnorLayoutFile;
- my $pnorBinName = "";
-@@ -71,6 +70,7 @@ my $emitTestSections = 0;
- my $g_fpartCmd = "";
- my $g_fcpCmd = "";
- my %sidelessSecFilled = ();
-+
- my %SideOptions = (
-         A => "A",
-         B => "B",
-@@ -132,7 +132,7 @@ if (-e $pnorBinName)
- }
- 
- #Load PNOR Layout XML file
--my $rc = loadPnorLayout($pnorLayoutFile, \%pnorLayout, \%PhysicalOffsets);
-+my $rc = loadPnorLayout($pnorLayoutFile, \%pnorLayout);
- if($rc != 0)
- {
-     trace(0, "Error detected from call to loadPnorLayout().  Exiting");
-@@ -163,6 +163,8 @@ if($rc != 0)
- }
- trace(1, "Done checkSpaceConstraints");
- 
-+# @TODO RTC: 120062 - Determine which side is Golden, possibly handle a new
-+#                    xml tag
- # Create all Partition Tables at each TOC offset
- # Each side has 2 TOC's created at different offsets for backup purposes.
- # Loop all side sections
-@@ -172,6 +174,7 @@ foreach my $sideId ( keys %{$pnorLayout{metadata}{sides}} )
-     foreach my $toc ( keys %{$pnorLayout{metadata}{sides}{$sideId}{toc}})
-     {
-         my $tocOffset = $pnorLayout{metadata}{sides}{$sideId}{toc}{$toc};
-+
-         $rc = createPnorPartition($tocVersion, $pnorBinName, \%pnorLayout,
-                                   $sideId, $tocOffset);
-         if($rc != 0)
-@@ -179,31 +182,9 @@ foreach my $sideId ( keys %{$pnorLayout{metadata}{sides}} )
-             trace(0, "Error detected from createPnorPartition() $tocOffset Exiting");
-             exit 1;
-         }
--
--        #Add the golden side tag to the "part" partition of PNOR`
--        my $userflags1 = ($pnorLayout{metadata}{sides}{$sideId}{golden} eq "yes") ?
--                            0x01 : 0x00;
--
--        #add a golden bit to the misc flags in userflag1
--        $userflags1 = $userflags1 << 16;
--        trace(2, "$g_fpartCmd --target $pnorBinName --partition-offset $tocOffset --user 1 --name part --value $userflags1 --force");
--        $rc =    `$g_fpartCmd --target $pnorBinName --partition-offset $tocOffset --user 1 --name part --value $userflags1 --force`;
--        if($rc != 0)
--        {
--            trace(0, "Call to add golden flag to PART failed.  rc=$rc.  Aborting!");
--            exit;
--        }
-     }
- }
- 
--#add backup TOC and other side's toc information to each TOC
--$rc = addTOCInfo(\%pnorLayout, $pnorBinName);
--if($rc)
--{
--    trace(0, "Error detected from call to addTOCInfo().  Exiting");
--    exit 1;
--}
--
- # Fill all sides
- foreach my $sideId ( keys %{$pnorLayout{metadata}{sides}} )
- {
-@@ -227,7 +208,7 @@ exit 0;
- ################################################################################
- sub loadPnorLayout
- {
--    my ($i_pnorFile, $i_pnorLayoutRef, $i_physicalOffsets) = @_;
-+    my ($i_pnorFile, $i_pnorLayoutRef) = @_;
-     my $this_func = (caller(0))[3];
- 
-     unless(-e $i_pnorFile)
-@@ -240,6 +221,49 @@ sub loadPnorLayout
-     my $xs = new XML::Simple(keyattr=>[], forcearray => 1);
-     my $xml = $xs->XMLin($i_pnorFile);
- 
-+    #Save the meatadata - imageSize, blockSize, etc.
-+    # @TODO RTC:120062 enhance metadata section, fix metadataE1 to match xml
-+    # and change TOC names accordingly
-+    foreach my $metadataEl (@{$xml->{metadata}})
-+    {
-+        # Get meta data
-+        my $imageSize = $metadataEl->{imageSize}[0];
-+        my $blockSize = $metadataEl->{blockSize}[0];
-+        $imageSize = getNumber($imageSize);
-+        $blockSize = getNumber($blockSize);
-+        $$i_pnorLayoutRef{metadata}{imageSize} = $imageSize;
-+        $$i_pnorLayoutRef{metadata}{blockSize} = $blockSize;
-+
-+        # Get Side A
-+        my $sideATocOffset = $metadataEl->{sideATocOffset}[0];
-+        my $sideATocBackupOffset = $metadataEl->{sideATocBackupOffset}[0];
-+        $sideATocOffset = getNumber($sideATocOffset);
-+        $sideATocBackupOffset = getNumber($sideATocBackupOffset);
-+        # @TODO RTC: 120062 change pnorLayoutRef hash to match new xml
-+        $$i_pnorLayoutRef{metadata}{sides}{$SideOptions{A}}{toc}{primary} = $sideATocOffset;
-+        $$i_pnorLayoutRef{metadata}{sides}{$SideOptions{A}}{toc}{backup} = $sideATocBackupOffset;
-+
-+        # Get side B info (if it exists)
-+        if (exists $metadataEl->{sideBTocOffset}[0])
-+        {
-+            trace(1, "Adding Side B information ....");
-+            my $sideBTocOffset = $metadataEl->{sideBTocOffset}[0];
-+            my $sideBTocBackupOffset = $metadataEl->{sideBTocBackupOffset}[0];
-+            $sideBTocOffset = getNumber($sideBTocOffset);
-+            $sideBTocBackupOffset = getNumber($sideBTocBackupOffset);
-+            # @TODO RTC: 120062 change pnorLayoutRef hash to match new xml
-+            $$i_pnorLayoutRef{metadata}{sides}{$SideOptions{B}}{toc}{primary} = $sideBTocOffset;
-+            $$i_pnorLayoutRef{metadata}{sides}{$SideOptions{B}}{toc}{backup} = $sideBTocBackupOffset;
-+
-+            trace(3, "$this_func: metadata: imageSize = $imageSize, blockSize=$blockSize, sideATocOffset=$sideATocOffset, sideATocBackupOffset=$sideATocBackupOffset, sideBTocOffset=$sideBTocOffset, sideBTocBackupOffset=$sideBTocBackupOffset");
-+        }
-+        else
-+        {
-+           trace(3, "$this_func: metadata: imageSize = $imageSize, blockSize=$blockSize, sideATocOffset=$sideATocOffset, sideATocBackupOffset=$sideATocBackupOffset");
-+        }
-+
-+    }
-+
-     #Iterate over the <section> elements.
-     foreach my $sectionEl (@{$xml->{section}})
-     {
-@@ -252,6 +276,7 @@ sub loadPnorLayout
-         my $ecc = (exists $sectionEl->{ecc} ? "yes" : "no");
-         my $sha512Version = (exists $sectionEl->{sha512Version} ? "yes" : "no");
-         my $sha512perEC = (exists $sectionEl->{sha512perEC} ? "yes" : "no");
-+        my $sideless = (exists $sectionEl->{sideless} ? "yes" : "no");
-         my $preserved = (exists $sectionEl->{preserved} ? "yes" : "no");
-         my $readOnly = (exists $sectionEl->{readOnly} ? "yes" : "no");
-         if (($emitTestSections == 0) && ($sectionEl->{testonly}[0] eq "yes"))
-@@ -272,93 +297,12 @@ sub loadPnorLayout
-         $$i_pnorLayoutRef{sections}{$physicalOffset}{ecc} = $ecc;
-         $$i_pnorLayoutRef{sections}{$physicalOffset}{sha512Version} = $sha512Version;
-         $$i_pnorLayoutRef{sections}{$physicalOffset}{sha512perEC} = $sha512perEC;
-+        $$i_pnorLayoutRef{sections}{$physicalOffset}{sideless} = $sideless;
-         $$i_pnorLayoutRef{sections}{$physicalOffset}{preserved} = $preserved;
-         $$i_pnorLayoutRef{sections}{$physicalOffset}{readOnly} = $readOnly;
- 
--        #store the physical offsets of each section in a hash, so, it is easy
--        #to search physicalOffsets based on the name of the section (eyecatch)
--        if ($side eq "sideless")
--        {
--            foreach my $metadata (@{$xml->{metadata}})
--            {
--                foreach my $sides (@{$metadata->{side}})
--                {
--                    $$i_physicalOffsets{side}{$sides->{id}[0]}{eyecatch}{$eyeCatch} = $physicalOffset;
--                }
--            }
--        }
--        else
--        {
--            $$i_physicalOffsets{side}{$side}{eyecatch}{$eyeCatch} = $physicalOffset;
--        }
-     }
--    # Save the metadata - imageSize, blockSize, toc Information etc.
--    foreach my $metadataEl (@{$xml->{metadata}})
--    {
--        # Get meta data
--        my $imageSize   = $metadataEl->{imageSize}[0];
--        my $blockSize   = $metadataEl->{blockSize}[0];
--        my $tocSize     = $metadataEl->{tocSize}[0];
--        my $arrangement = $metadataEl->{arrangement}[0];
--        $imageSize      = getNumber($imageSize);
--        $blockSize      = getNumber($blockSize);
--        $tocSize        = getNumber($tocSize);
--        $$i_pnorLayoutRef{metadata}{imageSize}   = $imageSize;
--        $$i_pnorLayoutRef{metadata}{blockSize}   = $blockSize;
--        $$i_pnorLayoutRef{metadata}{tocSize}     = $tocSize;
--        $$i_pnorLayoutRef{metadata}{arrangement} = $arrangement;
--
--        my $numOfSides  = scalar (@{$metadataEl->{side}});
--        my $sideSize = ($imageSize)/($numOfSides);
--
--        trace(1, " $this_func: metadata: imageSize = $imageSize, blockSize=$blockSize, arrangement = $arrangement, numOfSides: $numOfSides, sideSize: $sideSize, tocSize: $tocSize");
--
--        #determine the TOC offsets from the arrangement and side Information
--        #stored in the layout xml
--        #
--        #Arrangement A-B-D means that the layout had Primary TOC (A), then backup TOC (B), then Data (pnor section information).
--        #Similaryly, arrangement A-D-B means that primary toc is followed by the data (section information) and then
--        #the backup TOC.
--        if ($arrangement eq "A-B-D")
--        {
--            my $count = 0;
--            foreach my $side (@{$metadataEl->{side}})
--            {
--                my $golden     = (exists $side->{golden} ? "yes" : "no");
--                my $sideId     = $side->{id}[0];
--                my $primaryTOC = ($sideSize)*($count);
--                my $backupTOC  = ($primaryTOC)+($tocSize);
- 
--                $$i_pnorLayoutRef{metadata}{sides}{$sideId}{toc}{primary} = $primaryTOC;
--                $$i_pnorLayoutRef{metadata}{sides}{$sideId}{toc}{backup}  = $backupTOC;
--                $$i_pnorLayoutRef{metadata}{sides}{$sideId}{golden}       = $golden;
--
--                $count = $count + 1;
--                trace(1, "A-B-D: side:$sideId primaryTOC:$primaryTOC, backupTOC:$backupTOC, golden: $golden");
--            }
--        }
--        elsif ($arrangement eq "A-D-B")
--        {
--            foreach my $side (@{$metadataEl->{side}})
--            {
--                my $golden     = (exists $side->{golden} ? "yes" : "no");
--                my $sideId     = $side->{id}[0];
--                my $hbbAddr    = $$i_physicalOffsets{side}{$sideId}{eyecatch}{"HBB"};
--                my $primaryTOC = align_down($hbbAddr, $sideSize);
--                my $backupTOC  = align_up($hbbAddr, $sideSize) - $tocSize;
--
--                $$i_pnorLayoutRef{metadata}{sides}{$sideId}{toc}{primary} = $primaryTOC;
--                $$i_pnorLayoutRef{metadata}{sides}{$sideId}{toc}{backup}  = $backupTOC;
--                $$i_pnorLayoutRef{metadata}{sides}{$sideId}{golden}       = $golden;
--                trace(1, "A-D-B: side:$sideId HBB:$hbbAddr, primaryTOC:$primaryTOC, backupTOC:$backupTOC, golden: $golden");
--            }
--        }
--        else
--        {
--            trace(0, "Arrangement:$arrangement is not supported");
--            exit(1);
--        }
--    }
-     return 0;
- }
- 
-@@ -387,6 +331,7 @@ sub createPnorImg
-             $rc = 1;
-             last;
-         }
-+
-         #f{fs,part} --create tuleta.pnor --partition-offset 0 --size 8MiB --block 4KiB --force
-         trace(2, "$g_fpartCmd --target $i_pnorBinName --partition-offset $i_offset --create --size $imageSize --block $blockSize --force");
-         $rc = `$g_fpartCmd --target $i_pnorBinName --partition-offset $i_offset --create --size $imageSize --block $blockSize --force`;
-@@ -449,6 +394,7 @@ sub addUserData
-         $miscFlags |= 0x40;
-     }
- 
-+
-     #First User Data Word
-     #[1:chip][1:compressType][2:dataInteg]
-     my $userflags0 = ($chip << 24)
-@@ -503,6 +449,7 @@ sub createPnorPartition
-         {
-             last;
-         }
-+
-         #get Block size
-         my $blockSize = $$i_pnorLayoutRef{metadata}{blockSize};
- 
-@@ -551,7 +498,7 @@ sub createPnorPartition
- 
-                 #Add Partition
-                 #f{fs,part} --add --target tuleta.pnor --partition-offset 0 --offset 0x1000   --size 0x280000 --name HBI --flags 0x0
--                trace(2, "$this_func: $g_fpartCmd --target $i_pnorBinName --partition-offset $offset --add --offset $physicalOffset --size $physicalRegionSize --name $eyeCatch --flags 0x0");
-+                trace(2, "$g_fpartCmd --target $i_pnorBinName --partition-offset $offset --add --offset $physicalOffset --size $physicalRegionSize --name $eyeCatch --flags 0x0");
-                 $rc = `$g_fpartCmd --target $i_pnorBinName --partition-offset $offset --add --offset $physicalOffset --size $physicalRegionSize --name $eyeCatch --flags 0x0`;
-                 if($rc)
-                 {
-@@ -588,67 +535,6 @@ sub createPnorPartition
- }
- 
- ################################################################################
--# addTOCInfo -- adds BACKUP_PART and OTHER_SIDE information to all the TOCs
--################################################################################
--sub addTOCInfo
--{
--    my ($i_pnorLayout, $i_pnorBinName) = @_;
--    my $rc        = 0;
--    my $other_idx = 0;
--    my $sideShift = 0;
--    my @all_tocs;
--    foreach my $sideId (keys %{$$i_pnorLayout{metadata}{sides}})
--    {
--        push @all_tocs, $$i_pnorLayout{metadata}{sides}{$sideId}{toc}{primary};
--        push @all_tocs, $$i_pnorLayout{metadata}{sides}{$sideId}{toc}{backup};
--    }
--    foreach my $sideId ( keys %{$$i_pnorLayout{metadata}{sides}} )
--    {
--        my $physicalRegionSize = $$i_pnorLayout{metadata}{tocSize};
--        my $backup_part = "BACKUP_PART";
--        my $other_side  = "OTHER_SIDE";
--        my $backup_idx  = 0;
--        my $otherSide   = getOtherSide($sideId);
--        my $numOfTOCs   =  scalar keys %{$$i_pnorLayout{metadata}{sides}{$sideId}{toc}};
--
--        #Adding an extra entry in the TOC that points to its backup TOC and other side's TOC (if other side exists).
--        #This is used to search for all the TOCs in PnorRP code. The idea is to create a link between the tocs such that
--        #if we can find one valid TOC, then we can look at its  BACKUP_PART entry or OTHER_SIDE entry in the TOC to
--        #determine the location of backup TOC.Each TOC has only one BACKUP_PART entry and one OTHER_SIDE entry.
--        foreach my $toc (keys %{$$i_pnorLayout{metadata}{sides}{$sideId}{toc}})
--        {
--            #adding backup_part
--            my $toc_offset    = $$i_pnorLayout{metadata}{sides}{$sideId}{toc}{$toc};
--            my $backup_offset = $all_tocs[(($backup_idx + 1)% $numOfTOCs) + $sideShift ];
--            trace(1, "$g_fpartCmd --target $i_pnorBinName --partition-offset $toc_offset --add --offset $backup_offset --size $physicalRegionSize --name $backup_part --flags 0x0");
--            $rc = `$g_fpartCmd --target $i_pnorBinName --partition-offset $toc_offset --add --offset $backup_offset --size $physicalRegionSize --name $backup_part --flags 0x0`;
--            if($rc)
--            {
--                trace(0, "Call to add partition $backup_part failed.  rc=$rc.  Aborting!");
--                exit;
--            }
--
--            #Don't add OTHER_SIDE section if there is only one side in PNOR
--            if ((scalar keys % {$$i_pnorLayout{metadata}{sides}}) > 1)
--            {
--                #adding other_side
--                my $otherSide_offset = $all_tocs[(($other_idx + 2)% scalar @all_tocs)];
--                trace(1, "$g_fpartCmd --target $i_pnorBinName --partition-offset $toc_offset --add --offset $otherSide_offset --size $physicalRegionSize --name $other_side --flags 0x0");
--                $rc = `$g_fpartCmd --target $i_pnorBinName --partition-offset $toc_offset --add --offset $otherSide_offset --size $physicalRegionSize --name $other_side --flags 0x0`;
--                if($rc)
--                {
--                    trace(0, "Call to add partition $other_side failed.  rc=$rc.  Aborting!");
--                    exit;
--                }
--            }
--            $backup_idx++;
--            $other_idx++;
--        }
--        $sideShift = $sideShift + $numOfTOCs;
--    }
--    return $rc;
--}
--################################################################################
- # robustifyImgs - Perform any ECC or ShawHash manipulations
- ################################################################################
- sub robustifyImgs
-@@ -663,24 +549,6 @@ sub robustifyImgs
- }
- 
- ################################################################################
--# align_down: Align the input to the lower end of the PNOR side
--################################################################################
--sub align_down
--{
--    my ($addr,$n) = @_;
--    return (($addr) - ($addr)%($n));
--}
--
--################################################################################
--# align_up: Align the input address to the higher end of the PNOR side
--################################################################################
--sub align_up
--{
--    my ($addr,$n) = @_;
--    return ((($addr) + ($n-1)) & ~($n-1));
--}
--
--################################################################################
- # findLayoutKeyByEyeCatch - Figure out hash key based on eyeCatcher
- ################################################################################
- sub findLayoutKeyByEyeCatch
-@@ -828,7 +696,7 @@ sub fillPnorImage
-                 last;
-             }
-          }
--     }
-+    }
- 
-     return $rc;
- }
-@@ -924,7 +792,15 @@ sub getSideInfo
-     my $side = "";
-     my $eyeCatch = $i_sectionHash{$i_key}{eyeCatch};
- 
--    $side = $i_sectionHash{$i_key}{side};
-+
-+    if($i_sectionHash{$i_key}{sideless} eq "yes")
-+    {
-+        return $SideOptions{sideless};
-+    }
-+    else
-+    {
-+        $side = $i_sectionHash{$i_key}{side};
-+    }
- 
-     # Error paths
-     if ($side eq "")
-diff --git a/src/build/buildpnor/defaultPnorLayout.xml b/src/build/buildpnor/defaultPnorLayout.xml
-index 897d4db..249bdb4 100644
---- a/src/build/buildpnor/defaultPnorLayout.xml
-+++ b/src/build/buildpnor/defaultPnorLayout.xml
-@@ -25,16 +25,12 @@
- <!--
- Layout Description
- <metadata> Element -> Contains high-level information about the PNOR layout.
--    <imageSize>    -> Size of PNOR image in bytes.
--    <blockSize>    -> size of erase blocks in bytes.
--    <tocSize>      -> size of each partition table
--    <side>         -> Contains information about the side
--        <id>            -> Id of the side (A or B)
--        <arrangement>   -> Tag that specifies the arrangement of the side
--                           (A-B-D or A-D-B)
--                           A-B-D: Primary TOC (A),Backup TOC (B), and Section Information (Data - D)
--                           A-D-B: Primary TOC (A), Section Information (Data - D), Backup TOC (B)
--        <golden/> -> Indicates that the side of the PNOR is golden
-+    <imageSize>           -> Size of PNOR image in bytes.
-+    <blockSize>           -> size of erase blocks in bytes.
-+    <sideATocOffset>      -> Location of Side A Partition Table
-+    <sideATocBackupOffset>-> Location of Side A Backup Partition Table
-+    <sideBTocOffset>      -> Location of Side B Partition Table
-+    <sideBTocBackupOffset>-> Location of Side B Backup Partition Table
- </metadata>
- <section> Element -> Contains information about a PNOR Partition
-     <description>   -> Text description of the partition.
-@@ -43,12 +39,11 @@ Layout Description
-     <physicalOffset>-> Offset of the Partition in PNOR
-                        in bytes.
-     <physicalSize>  -> Size of the Partition in bytes.
--    <side>          -> Side that this section is associated with.
--                       could be (A, B, or sideless)
--                       A - Section is associated with side A
--                       B - Section is associated with side B
--                       sideless - Indicates partition will be in both TOCs but
--                                  only one copy of the partition should be created
-+    <side>          -> Side the Partition should be associated with. This
-+                       determines if the partition should be added to the
-+                       partition table at <sideATocOffset> or <sideBTocOffset>
-+    <sideless/>     -> Indicates partition will be in both TOCs but only one
-+                       copy of the partition should be created
-     <testonly/>     -> Indicates partition is used for internal testing only.
-                        Partition should be skipped in production environments.
-     <ecc/>          -> Indicates Partition should be ECC protected
-@@ -63,18 +58,16 @@ Layout Description
-     <metadata>
-         <imageSize>0x4000000</imageSize>
-         <blockSize>0x1000</blockSize>
--        <tocSize>0x8000</tocSize>
--        <arrangement>A-B-D</arrangement>
--        <side>
--            <id>B</id>
--        </side>
-+        <!-- @TODO RTC: 120062 - Enhance meta info -->
-+        <sideATocOffset>0x0</sideATocOffset>
-+        <sideATocBackupOffset>0x8000</sideATocBackupOffset>
-     </metadata>
-     <section>
-         <description>Hostboot Error Logs (144K)</description>
-         <eyeCatch>HBEL</eyeCatch>
-         <physicalOffset>0x10000</physicalOffset>
-         <physicalRegionSize>0x24000</physicalRegionSize>
--        <side>sideless</side>
-+        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -82,7 +75,7 @@ Layout Description
-         <eyeCatch>GUARD</eyeCatch>
-         <physicalOffset>0x58000</physicalOffset>
-         <physicalRegionSize>0x5000</physicalRegionSize>
--        <side>sideless</side>
-+        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -90,7 +83,7 @@ Layout Description
-         <eyeCatch>HBD</eyeCatch>
-         <physicalOffset>0x5D000</physicalOffset>
-         <physicalRegionSize>0x120000</physicalRegionSize>
--        <side>sideless</side>
-+        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -99,7 +92,7 @@ Layout Description
-         <!--NOTE: MUST update standalone.simics if offset changes -->
-          <physicalOffset>0x17D000</physicalOffset>
-         <physicalRegionSize>0x48000</physicalRegionSize>
--        <side>sideless</side>
-+        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -108,7 +101,7 @@ Layout Description
-         <!--NOTE: MUST update standalone.simics if offset changes -->
-         <physicalOffset>0x1C5000</physicalOffset>
-         <physicalRegionSize>0x90000</physicalRegionSize>
--        <side>sideless</side>
-+        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -117,7 +110,7 @@ Layout Description
-         <!--NOTE: MUST update standalone.simics if offset changes -->
-         <physicalOffset>0x255000</physicalOffset>
-         <physicalRegionSize>0x48000</physicalRegionSize>
--        <side>sideless</side>
-+        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -126,7 +119,7 @@ Layout Description
-         <physicalOffset>0x29D000</physicalOffset>
-         <physicalRegionSize>0x5A0000</physicalRegionSize>
-         <sha512Version/>
--        <side>sideless</side>
-+        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -135,7 +128,7 @@ Layout Description
-         <physicalOffset>0x83D000</physicalOffset>
-         <physicalRegionSize>0x90000</physicalRegionSize>
-         <sha512perEC/>
--        <side>sideless</side>
-+        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -144,7 +137,7 @@ Layout Description
-         <physicalOffset>0x8CD000</physicalOffset>
-         <physicalRegionSize>0x48000</physicalRegionSize>
-         <sha512perEC/>
--        <side>sideless</side>
-+        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -153,7 +146,7 @@ Layout Description
-         <physicalOffset>0x915000</physicalOffset>
-         <physicalRegionSize>0x120000</physicalRegionSize>
-         <sha512Version/>
--        <side>sideless</side>
-+        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -162,7 +155,7 @@ Layout Description
-         <physicalOffset>0xA35000</physicalOffset>
-         <physicalRegionSize>0x240000</physicalRegionSize>
-         <sha512Version/>
--        <side>sideless</side>
-+        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -170,7 +163,7 @@ Layout Description
-         <eyeCatch>PAYLOAD</eyeCatch>
-         <physicalOffset>0xC75000</physicalOffset>
-         <physicalRegionSize>0x1680000</physicalRegionSize>
--        <side>sideless</side>
-+        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -179,7 +172,7 @@ Layout Description
-         <physicalOffset>0x3590000</physicalOffset>
-         <physicalRegionSize>0x9000</physicalRegionSize>
-         <testonly/>
--        <side>sideless</side>
-+        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -187,8 +180,8 @@ Layout Description
-         <eyeCatch>TESTRO</eyeCatch>
-         <physicalOffset>0x3599000</physicalOffset>
-         <physicalRegionSize>0x9000</physicalRegionSize>
--        <side>sideless</side>
-         <testonly/>
-+        <sideless/>
-         <preserved/>
-         <readOnly/>
-         <ecc/>
-@@ -196,13 +189,11 @@ Layout Description
-     <section>
-         <description>Hostboot Base (576K)</description>
-         <!--NOTE: MUST update standalone.simics if offset changes -->
--        <!--NOTE: HBB must be at pnorSize-0x99000 for a new proc
--                  part to be bootable -->
-         <eyeCatch>HBB</eyeCatch>
-         <physicalOffset>0x3F67000</physicalOffset>
-         <physicalRegionSize>0x90000</physicalRegionSize>
-         <sha512Version/>
--        <side>sideless</side>
-+        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -210,7 +201,7 @@ Layout Description
-         <eyeCatch>GLOBAL</eyeCatch>
-         <physicalOffset>0x3FF7000</physicalOffset>
-         <physicalRegionSize>0x9000</physicalRegionSize>
--        <side>sideless</side>
-+        <sideless/>
-         <ecc/>
-     </section>
- </pnor>
-diff --git a/src/usr/pnor/common/ffs_hb.H b/src/usr/pnor/common/ffs_hb.H
-index 30a6173..c96911b 100644
---- a/src/usr/pnor/common/ffs_hb.H
-+++ b/src/usr/pnor/common/ffs_hb.H
-@@ -66,8 +66,7 @@ enum
-     /* Miscellaneous Bits : 1 byte */
-     FFS_MISC_PRESERVED     = 0x80,    /**< Preserved across code updates */
-     FFS_MISC_READ_ONLY     = 0x40,    /**< Read only section */
--    FFS_MISC_GOLDEN        = 0x01,    /**< Golden side of PNOR */
--    FFS_MISC_UNUSED        = 0x1E,    /**< Unused MISC Flags */
-+    FFS_MISC_UNUSED        = 0x1F,    /**< Unused MISC Flags */
- };
- 
- /**
--- 
-1.8.2.2
-
-
-From eea17a14de872f99c3d01a022f392b5f846fd746 Mon Sep 17 00:00:00 2001
-From: Matt Ploetz <maploetz@us.ibm.com>
-Date: Fri, 20 Feb 2015 11:05:03 -0600
-Subject: [PATCH 09/10] Revert "Initial Support of SBE_UPDATE_INDEPENDENT Mode"
-
-This reverts commit 002c4beefb54d288eee8faf4d9aa2b08b137aed3.
----
- src/usr/sbe/HBconfig     |  31 ++++++------
- src/usr/sbe/sbe_update.C | 126 +++++++++--------------------------------------
- 2 files changed, 36 insertions(+), 121 deletions(-)
-
-diff --git a/src/usr/sbe/HBconfig b/src/usr/sbe/HBconfig
-index 952baf8..7244b31 100644
---- a/src/usr/sbe/HBconfig
-+++ b/src/usr/sbe/HBconfig
-@@ -1,30 +1,27 @@
- config SBE_UPDATE_SEQUENTIAL
--    default y if !SBE_UPDATE_SIMULTANEOUS && !SBE_UPDATE_INDEPENDENT
--    depends on !SBE_UPDATE_SIMULTANEOUS && !SBE_UPDATE_INDEPENDENT
-+    default y if !SBE_UPDATE_SIMULTANEOUS && !SBE_UPDATE_GOLDEN
-+    depends on !SBE_UPDATE_SIMULTANEOUS && !SBE_UPDATE_GOLDEN
-     help
--        If an update is necessary, only 1 SBE SEEPROM per processor will be
--        updated on each IPL.  If a 2nd SBE SEEPROM needs to be updated, a re-IPL
--        will be requested.  The end result is that both SBE SEEPROMs will
--        contain the same code.
-+        If an update is necessary, only 1 SBE SEEPROM will be updated on each
-+        IPL per processor.  If a 2nd SBE SEEPROM needs to be updated, a re-IPL
-+        will be requested.
- 
- config SBE_UPDATE_SIMULTANEOUS
-     default n
--    depends on !SBE_UPDATE_SEQUENTIAL && !SBE_UPDATE_INDEPENDENT
-+    depends on !SBE_UPDATE_SEQUENTIAL && !SBE_UPDATE_GOLDEN
-     help
--        If an update is necessary, both SBE SEEPROMs on a processor will be
--        updated at the same time before a re-IPL request is issued.  The end
--        result is that both SBE SEEPROMs will contain the same code.
-+        If an update is necessary, both SBE SEEPROMs on a target will be updated
-+        at the same time before a re-IPL request is issued.
- 
--config SBE_UPDATE_INDEPENDENT
--    default y if TWO_SIDE_SUPPORT
-+config SBE_UPDATE_GOLDEN
-+    default n
-     depends on !SBE_UPDATE_SEQUENTIAL && !SBE_UPDATE_SIMULTANEOUS
-     help
--        If an update is necessary, and if the "current" SBE SEEPROM of this
--        IPL is not the 'GOLDEN' SBE SEEPROM, then only the current SBE SEEPROM
--        will be updated.  After the update a re-IPL request will be issued.
--        The other SBE SEEPROM, whether 'GOLDEN' or not, will not be updated.
-+        If an update is necessary, only 1 SBE SEEPROM will be updated and
-+        then a re-IPL request will be issued.  The other SBE SEEPROM will not
-+        be touched and treated as the 'Golden' SEEPROM.
- 
- config NO_SBE_UPDATES
-     default n
-     help
--        Don't update the SBE SEEPROMs at all.
-+        Don't update the SBE SEEPROMs at all
-diff --git a/src/usr/sbe/sbe_update.C b/src/usr/sbe/sbe_update.C
-index a2fad1e..698d41a 100644
---- a/src/usr/sbe/sbe_update.C
-+++ b/src/usr/sbe/sbe_update.C
-@@ -354,10 +354,6 @@ namespace SBE
-                     errlCommit( err, SBE_COMP_ID );
-                 }
- 
--#ifdef CONFIG_BMC_IPMI
--                // @todo RTC 120734 reset system's reboot count via IPMI sensor
--#endif
--
-                 TRACFCOMP( g_trac_sbe,
-                            INFO_MRK"updateProcessorSbeSeeproms(): Calling "
-                            "INITSERVICE::doShutdown() with "
-@@ -685,9 +681,6 @@ namespace SBE
- 
-         do{
- 
--            // @todo RTC 120734 - before customizing, ensure correct HBB address
--            // is set in the necessary attribute
--
-             // cast OUR type of target to a FAPI type of target.
-             const fapi::Target
-               l_fapiTarg(fapi::TARGET_TYPE_PROC_CHIP,
-@@ -1942,6 +1935,7 @@ namespace SBE
-             }
- 
- 
-+
-             /**************************************************************/
-             /*  Compare SEEPROM 1 with PNOR and Customized Image CRC --   */
-             /*  -- dirty or clean?                                        */
-@@ -2145,91 +2139,25 @@ namespace SBE
-         io_sbeState.update_actions   = CLEAR_ACTIONS;
-         io_sbeState.seeprom_side_to_update = EEPROM::LAST_CHIP_TYPE;
- 
-+        // @todo RTC 107721 - Need to handle Habanero 'golden' SEEPROM side
-+
-         do{
- 
-             // To be safe, we're only look at the bits defined in sbe_update.H
-             i_system_situation &= SITUATION_ALL_BITS_MASK;
- 
--#ifdef CONFIG_SBE_UPDATE_INDEPENDENT
--
--            // The 2 SBE SEEPROMs are independent of each other
--            // Determine if PNOR is 1- or 2-sided and if there is a
--            // GOLDEN boot involved
--
--#ifdef CONFIG_TWO_SIDE_SUPPORT
--
--            // @todo RTC 120734 - ask PNOR if we are in "GOLDEN" mode,
--            // which would mean that we are booting off the the GOLDEN
--            // SBE SEEPROM which corresponds to the GOLDEN side of PNOR
--/*
--            if (true)
--            {
--                // If true, nothing to do (covered in istep 6 function)
--                l_actions = CLEAR_ACTIONS;
--
--                TRACFCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: "
--                           "Booting GOLDEN SBE SEEPROM in PNOR 2-sided Mode. "
--                           "No updates for cur side=%d. Continue IPL. "
--                           "(sit=0x%.2X, act=0x%.8X flags=0x%.2X)",
--                           TARGETING::get_huid(io_sbeState.target),
--                           io_sbeState.cur_seeprom_side,
--                           i_system_situation, l_actions,
--                           io_sbeState.mvpdSbKeyword.flags);
--                break;
--            }
--            else // proceed to update this side
--            {
--                TRACUCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: "
--                           "NOT Booting GOLDEN SBE SEEPROM in PNOR 2-sided "
--                           "mode. Checking for update on cur side=%d ",
--                           TARGETING::get_huid(io_sbeState.target),
--                           io_sbeState.cur_seeprom_side)
--            }
--*/
--#else
--
--            // @todo RTC 120734 - check this assumption
--            // Assume that we're only checking/updating the current side
--            TRACUCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: "
--                       "PNOR 1-sided so only check for update on cur side=%d",
--                       TARGETING::get_huid(io_sbeState.target),
--                       io_sbeState.cur_seeprom_side);
--#endif
--
--            // Check for clean vs. dirty only on cur side
--            if ( i_system_situation & SITUATION_CUR_IS_DIRTY )
--            {
--                //  Update cur side and re-ipl
--                l_actions |= IPL_RESTART;
--                l_actions |= DO_UPDATE;
--                l_actions |= UPDATE_SBE;
--
--                // Set Update side to cur
--                io_sbeState.seeprom_side_to_update =
--                                ( io_sbeState.cur_seeprom_side ==
--                                              PNOR::SBE_SEEPROM0 )
--                                  ? EEPROM::SBE_PRIMARY : EEPROM::SBE_BACKUP;
--
--                TRACFCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: "
--                           "cur side (%d) dirty. Update cur. Re-IPL. "
--                           "(sit=0x%.2X, act=0x%.8X flags=0x%.2X)",
--                           TARGETING::get_huid(io_sbeState.target),
--                           io_sbeState.cur_seeprom_side,
--                           i_system_situation, l_actions,
--                           io_sbeState.mvpdSbKeyword.flags);
--            }
--            else
--            {
--                // Cur side clean - No Updates - Continue IPL
--                l_actions = CLEAR_ACTIONS;
-+#ifdef CONFIG_SBE_UPDATE_GOLDEN
-+            // @todo RTC 107721 - Need to handle Habanero 'golden' SEEPROM side
-+            // For now default to no update and continue IPL
-+                    l_actions = CLEAR_ACTIONS;
- 
--                TRACFCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: "
--                           "cur side (%d) clean-no updates. "
--                           "Continue IPL. (sit=0x%.2X, act=0x%.8X)",
--                           TARGETING::get_huid(io_sbeState.target),
--                           io_sbeState.cur_seeprom_side,
--                           i_system_situation, l_actions);
--            }
-+                    TRACFCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: "
-+                               "Habanero 'GOLDEN' Seeprom Support to come. "
-+                               "For now no updates. cur side=%d. "
-+                               "Continue IPL. (sit=0x%.2X, act=0x%.8X)",
-+                               TARGETING::get_huid(io_sbeState.target),
-+                               io_sbeState.cur_seeprom_side,
-+                               i_system_situation, l_actions);
- 
- #elif CONFIG_SBE_UPDATE_SIMULTANEOUS
-             // Updates both SEEPROMs if either side is dirty
-@@ -2324,8 +2252,7 @@ namespace SBE
- 
-                     // Set Update side to alt
-                     io_sbeState.seeprom_side_to_update =
--                                ( io_sbeState.alt_seeprom_side ==
--                                              PNOR::SBE_SEEPROM0 )
-+                                ( io_sbeState.alt_seeprom_side == PNOR::SBE_SEEPROM0 )
-                                   ? EEPROM::SBE_PRIMARY : EEPROM::SBE_BACKUP ;
- 
-                     // Update MVPD PERMANENT flag: make cur=perm
-@@ -2371,8 +2298,7 @@ namespace SBE
- 
-                     // Set Update side to alt
-                     io_sbeState.seeprom_side_to_update =
--                                ( io_sbeState.alt_seeprom_side ==
--                                              PNOR::SBE_SEEPROM0 )
-+                                ( io_sbeState.alt_seeprom_side == PNOR::SBE_SEEPROM0 )
-                                   ? EEPROM::SBE_PRIMARY : EEPROM::SBE_BACKUP ;
- 
- 
-@@ -2432,8 +2358,7 @@ namespace SBE
- 
-                     // Set Update side to alt
-                     io_sbeState.seeprom_side_to_update =
--                                ( io_sbeState.alt_seeprom_side ==
--                                              PNOR::SBE_SEEPROM0 )
-+                                ( io_sbeState.alt_seeprom_side == PNOR::SBE_SEEPROM0 )
-                                   ? EEPROM::SBE_PRIMARY : EEPROM::SBE_BACKUP ;
- 
-                     // Update MVPD RE-IPL SEEPROM flag: re-IPL on ALT:
-@@ -2530,8 +2455,7 @@ namespace SBE
- 
-                         // Set Update side to alt
-                         io_sbeState.seeprom_side_to_update =
--                                ( io_sbeState.alt_seeprom_side ==
--                                              PNOR::SBE_SEEPROM0 )
-+                                ( io_sbeState.alt_seeprom_side == PNOR::SBE_SEEPROM0 )
-                                   ? EEPROM::SBE_PRIMARY : EEPROM::SBE_BACKUP ;
- 
-                         // Update MVPD RE-IPL SEEPROM flag: re-IPL on ALT:
-@@ -2567,8 +2491,7 @@ namespace SBE
- 
-                     // Set Update side to alt
-                     io_sbeState.seeprom_side_to_update =
--                                ( io_sbeState.alt_seeprom_side ==
--                                              PNOR::SBE_SEEPROM0 )
-+                                ( io_sbeState.alt_seeprom_side == PNOR::SBE_SEEPROM0 )
-                                   ? EEPROM::SBE_PRIMARY : EEPROM::SBE_BACKUP ;
- 
-                     TRACFCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: "
-@@ -3278,8 +3201,7 @@ namespace SBE
- 
-                     // Compare against 'current' Master side in case there is
-                     // an issue with the other side
--                    if (io_sbeStates_v[i].cur_seeprom_side ==
--                                          PNOR::SBE_SEEPROM0)
-+                    if (io_sbeStates_v[i].cur_seeprom_side == PNOR::SBE_SEEPROM0)
-                     {
-                         ver_ptr =
-                             &(io_sbeStates_v[i].seeprom_0_ver.image_version);
-@@ -3323,9 +3245,6 @@ namespace SBE
-                 // Special Master Processor checks
-                 if ( i == mP )
-                 {
--// Skip Master Processor check of Both SEEPROMs being identical
--#ifndef CONFIG_SBE_UPDATE_INDEPENDENT
--
-                     // Compare Versions of Both SEEPROMs to PNOR Version
-                     // Create a Predictive Error if there's an issue
-                     if ((0 != memcmp(
-@@ -3420,15 +3339,14 @@ namespace SBE
-                         errlCommit( err, SBE_COMP_ID );
- 
-                     } // end of check
--#endif
-+
-                     // Continue to avoid remaining non-Master Processor checks
-                     continue;
-                 }
-                 else
-                 {
-                     // Not Master, so get 'current' version
--                    if (io_sbeStates_v[i].cur_seeprom_side ==
--                                          PNOR::SBE_SEEPROM0)
-+                    if (io_sbeStates_v[i].cur_seeprom_side == PNOR::SBE_SEEPROM0)
-                     {
-                         ver_ptr =
-                             &(io_sbeStates_v[i].seeprom_0_ver.image_version);
--- 
-1.8.2.2
-
-
-From 7820949b6720adb1b92f87175d373d1b01eea83a Mon Sep 17 00:00:00 2001
-From: Matt Ploetz <maploetz@us.ibm.com>
-Date: Fri, 20 Feb 2015 11:05:11 -0600
-Subject: [PATCH 10/10] Revert "Support for Redundant Copy of HB code in PNOR"
-
-This reverts commit 67c5a1ebe73f81bca1bb6608bbb8f204f0f37fa8.
----
- src/build/buildpnor/buildpnor.pl            | 590 +++++++++++-----------------
- src/build/buildpnor/defaultPnorLayout.xml   |  91 ++---
- src/build/mkrules/hbfw/img/makefile         |   4 +-
- src/include/usr/hwas/hwasPlatDeconfigGard.H |  19 +-
- src/include/usr/pnor/pnor_reasoncodes.H     |   2 -
- src/include/usr/pnor/pnorif.H               |  39 +-
- src/usr/hwas/hwasPlatDeconfigGard.C         |  89 +----
- src/usr/pnor/HBconfig                       |   5 -
- src/usr/pnor/common/ffs_hb.H                |   7 +-
- src/usr/pnor/makefile                       |   1 -
- src/usr/pnor/pnor_common.C                  | 182 ++-------
- src/usr/pnor/pnor_common.H                  |  19 +-
- src/usr/pnor/pnorrp.C                       | 152 +++----
- src/usr/pnor/pnorrp.H                       |  26 +-
- src/usr/pnor/pnorsbe.C                      |  87 ----
- src/usr/pnor/pnorvalid.C                    |   5 +-
- src/usr/pnor/runtime/rt_pnor.C              |  11 +-
- src/usr/pnor/runtime/rt_pnor.H              |   2 +-
- src/usr/pnor/test/pnorrptest.H              | 104 +----
- src/usr/sbe/sbe_update.C                    |  95 +++--
- src/usr/sbe/sbe_update.H                    |  38 +-
- src/usr/sbe/test/sbeupdatetest.H            |  24 +-
- 22 files changed, 535 insertions(+), 1057 deletions(-)
- delete mode 100644 src/usr/pnor/pnorsbe.C
-
-diff --git a/src/build/buildpnor/buildpnor.pl b/src/build/buildpnor/buildpnor.pl
-index f6df6c8..51b6922 100755
---- a/src/build/buildpnor/buildpnor.pl
-+++ b/src/build/buildpnor/buildpnor.pl
-@@ -6,7 +6,7 @@
- #
- # OpenPOWER HostBoot Project
- #
--# Contributors Listed Below - COPYRIGHT 2012,2015
-+# Contributors Listed Below - COPYRIGHT 2012,2014
- # [+] International Business Machines Corp.
- #
- #
-@@ -62,20 +62,16 @@ my $g_trace = 1;
- my $programName = File::Basename::basename $0;
- my %pnorLayout;
- my %binFiles;
-+
-+
- my $pnorLayoutFile;
- my $pnorBinName = "";
- my $tocVersion = 0x1;
- my $g_TOCEyeCatch = "part";
- my $emitTestSections = 0;
-+my $g_ffsCmd = "";
- my $g_fpartCmd = "";
- my $g_fcpCmd = "";
--my %sidelessSecFilled = ();
--
--my %SideOptions = (
--        A => "A",
--        B => "B",
--        sideless => "sideless",
--    );
- 
- if ($#ARGV < 0) {
-     usage();
-@@ -106,6 +102,9 @@ for (my $i=0; $i < $#ARGV + 1; $i++)
-         my $argVal = $ARGV[++$i];
-         saveInputFile("--binFile", $argName, $argVal, \%binFiles);
-     }
-+    elsif($ARGV[$i] =~ /--ffsCmd/) {
-+        $g_ffsCmd = $ARGV[++$i];
-+    }
-     elsif($ARGV[$i] =~ /--fpartCmd/) {
-         $g_fpartCmd = $ARGV[++$i];
-     }
-@@ -122,14 +121,12 @@ for (my $i=0; $i < $#ARGV + 1; $i++)
-     }
- }
- 
--############################## Begin Actions ##################################
--
--#Delete File (pnorBinName) if exists to prevent errors when making layout
--#changes
--if (-e $pnorBinName)
--{
--    unlink $pnorBinName or warn "Could not unlink $pnorBinName: $!";
--}
-+#Extract ffs version number from help text.
-+#Use to trigger using proper input parms..
-+#my $ffsParms = 0;
-+#my $ffsVersion = `$g_ffsCmd 2>&1  | grep "Partition Tool" `;
-+#$ffsVersion =~ s/.*(v[0-9\.]*).*/\1/;
-+#$ffsVersion = $1;
- 
- #Load PNOR Layout XML file
- my $rc = loadPnorLayout($pnorLayoutFile, \%pnorLayout);
-@@ -139,6 +136,9 @@ if($rc != 0)
-     exit 1;
- }
- 
-+#trace(1, Dumper(%pnorLayout->{1576960}));
-+#trace(1, Dumper(%binFiles));
-+
- #Verify all the section files exist
- my $rc = verifyFilesExist(\%pnorLayout, \%binFiles);
- if($rc != 0)
-@@ -161,48 +161,42 @@ if($rc != 0)
-     trace(0, "Error detected from call to checkSpaceConstraints().  Exiting");
-     exit 1;
- }
--trace(1, "Done checkSpaceConstraints");
--
--# @TODO RTC: 120062 - Determine which side is Golden, possibly handle a new
--#                    xml tag
--# Create all Partition Tables at each TOC offset
--# Each side has 2 TOC's created at different offsets for backup purposes.
--# Loop all side sections
--foreach my $sideId ( keys %{$pnorLayout{metadata}{sides}} )
-+
-+#create the PNOR image
-+#two copies of TOC created at different offsets
-+my $sideAOffset =  $pnorLayout{metadata}{sideAOffset};
-+my $sideBOffset =  $pnorLayout{metadata}{sideBOffset};
-+
-+$rc = createPnorImg($tocVersion, $pnorBinName, \%pnorLayout, $sideAOffset, 'A');
-+if($rc != 0)
- {
--    # Loop all tocs (primary and backup)
--    foreach my $toc ( keys %{$pnorLayout{metadata}{sides}{$sideId}{toc}})
--    {
--        my $tocOffset = $pnorLayout{metadata}{sides}{$sideId}{toc}{$toc};
-+    trace(0, "Error detected from createPnorImg() sideAOffset. Exiting");
-+    exit 1;
-+}
- 
--        $rc = createPnorPartition($tocVersion, $pnorBinName, \%pnorLayout,
--                                  $sideId, $tocOffset);
--        if($rc != 0)
--        {
--            trace(0, "Error detected from createPnorPartition() $tocOffset Exiting");
--            exit 1;
--        }
--    }
-+$rc = createPnorImg($tocVersion, $pnorBinName, \%pnorLayout, $sideBOffset, 'B');
-+if($rc != 0)
-+{
-+    trace(0, "Error detected from createPnorImg() sideBOffset. Exiting");
-+    exit 1;
- }
- 
--# Fill all sides
--foreach my $sideId ( keys %{$pnorLayout{metadata}{sides}} )
-+$rc = fillPnorImage($pnorBinName, \%pnorLayout, \%binFiles, $sideAOffset, 'A');
-+if($rc != 0)
- {
--    my $tocOffset = $pnorLayout{metadata}{sides}{$sideId}{toc}{primary};
-+    trace(0, "Error detected from call to fillPnorImage() sideAOffset. Exiting");
-+    exit 1;
-+}
- 
--    $rc = fillPnorImage($pnorBinName, \%pnorLayout, \%binFiles, $sideId,
--                        $tocOffset);
--    if($rc != 0)
--    {
--        trace(0, "Error detected from call to fillPnorImage() sideATocOffset. Exiting");
--        exit 1;
--    }
-+$rc = fillPnorImage($pnorBinName, \%pnorLayout, \%binFiles, $sideBOffset, 'B');
-+if($rc != 0)
-+{
-+    trace(0, "Error detected from call to fillPnorImage() sideBOffset. Exiting");
-+    exit 1;
- }
- 
- exit 0;
- 
--#########################  Begin Utility Subroutines ###########################
--
- ################################################################################
- # loadPnorLayout
- ################################################################################
-@@ -221,52 +215,33 @@ sub loadPnorLayout
-     my $xs = new XML::Simple(keyattr=>[], forcearray => 1);
-     my $xml = $xs->XMLin($i_pnorFile);
- 
-+    #trace(1, "pnorLayoutXML \n ".Dumper($xml));
-+
-     #Save the meatadata - imageSize, blockSize, etc.
--    # @TODO RTC:120062 enhance metadata section, fix metadataE1 to match xml
--    # and change TOC names accordingly
-     foreach my $metadataEl (@{$xml->{metadata}})
-     {
--        # Get meta data
-         my $imageSize = $metadataEl->{imageSize}[0];
-         my $blockSize = $metadataEl->{blockSize}[0];
-+        my $sideAOffset = $metadataEl->{sideAOffset}[0];
-+        my $sideBOffset = $metadataEl->{sideBOffset}[0];
-+
-+        trace(3, "$this_func: metadata: imageSize = $imageSize, blockSize=$blockSize, sideAOffset=$sideAOffset, sideBOffset=$sideBOffset");
-+
-         $imageSize = getNumber($imageSize);
-         $blockSize = getNumber($blockSize);
-+        $sideAOffset = getNumber($sideAOffset);
-+        $sideBOffset = getNumber($sideBOffset);
-+
-         $$i_pnorLayoutRef{metadata}{imageSize} = $imageSize;
-         $$i_pnorLayoutRef{metadata}{blockSize} = $blockSize;
--
--        # Get Side A
--        my $sideATocOffset = $metadataEl->{sideATocOffset}[0];
--        my $sideATocBackupOffset = $metadataEl->{sideATocBackupOffset}[0];
--        $sideATocOffset = getNumber($sideATocOffset);
--        $sideATocBackupOffset = getNumber($sideATocBackupOffset);
--        # @TODO RTC: 120062 change pnorLayoutRef hash to match new xml
--        $$i_pnorLayoutRef{metadata}{sides}{$SideOptions{A}}{toc}{primary} = $sideATocOffset;
--        $$i_pnorLayoutRef{metadata}{sides}{$SideOptions{A}}{toc}{backup} = $sideATocBackupOffset;
--
--        # Get side B info (if it exists)
--        if (exists $metadataEl->{sideBTocOffset}[0])
--        {
--            trace(1, "Adding Side B information ....");
--            my $sideBTocOffset = $metadataEl->{sideBTocOffset}[0];
--            my $sideBTocBackupOffset = $metadataEl->{sideBTocBackupOffset}[0];
--            $sideBTocOffset = getNumber($sideBTocOffset);
--            $sideBTocBackupOffset = getNumber($sideBTocBackupOffset);
--            # @TODO RTC: 120062 change pnorLayoutRef hash to match new xml
--            $$i_pnorLayoutRef{metadata}{sides}{$SideOptions{B}}{toc}{primary} = $sideBTocOffset;
--            $$i_pnorLayoutRef{metadata}{sides}{$SideOptions{B}}{toc}{backup} = $sideBTocBackupOffset;
--
--            trace(3, "$this_func: metadata: imageSize = $imageSize, blockSize=$blockSize, sideATocOffset=$sideATocOffset, sideATocBackupOffset=$sideATocBackupOffset, sideBTocOffset=$sideBTocOffset, sideBTocBackupOffset=$sideBTocBackupOffset");
--        }
--        else
--        {
--           trace(3, "$this_func: metadata: imageSize = $imageSize, blockSize=$blockSize, sideATocOffset=$sideATocOffset, sideATocBackupOffset=$sideATocBackupOffset");
--        }
--
-+        $$i_pnorLayoutRef{metadata}{sideAOffset} = $sideAOffset;
-+        $$i_pnorLayoutRef{metadata}{sideBOffset} = $sideBOffset;
-     }
- 
-     #Iterate over the <section> elements.
-     foreach my $sectionEl (@{$xml->{section}})
-     {
-+        #trace(1, "current Element: \n ".Dumper($sectionEl));
-         my $description = $sectionEl->{description}[0];
-         my $eyeCatch = $sectionEl->{eyeCatch}[0];
-         my $physicalOffset = $sectionEl->{physicalOffset}[0];
-@@ -276,9 +251,7 @@ sub loadPnorLayout
-         my $ecc = (exists $sectionEl->{ecc} ? "yes" : "no");
-         my $sha512Version = (exists $sectionEl->{sha512Version} ? "yes" : "no");
-         my $sha512perEC = (exists $sectionEl->{sha512perEC} ? "yes" : "no");
--        my $sideless = (exists $sectionEl->{sideless} ? "yes" : "no");
--        my $preserved = (exists $sectionEl->{preserved} ? "yes" : "no");
--        my $readOnly = (exists $sectionEl->{readOnly} ? "yes" : "no");
-+
-         if (($emitTestSections == 0) && ($sectionEl->{testonly}[0] eq "yes"))
-         {
-             next;
-@@ -289,6 +262,8 @@ sub loadPnorLayout
-         $physicalOffset = getNumber($physicalOffset);
-         $physicalRegionSize = getNumber($physicalRegionSize);
- 
-+        # trace(4, "$this_func: physicalOffset=$physicalOffset, physicalRegionSize=$physicalRegionSize");
-+
-         $$i_pnorLayoutRef{sections}{$physicalOffset}{description} = $description;
-         $$i_pnorLayoutRef{sections}{$physicalOffset}{eyeCatch} = $eyeCatch;
-         $$i_pnorLayoutRef{sections}{$physicalOffset}{physicalOffset} = $physicalOffset;
-@@ -297,9 +272,6 @@ sub loadPnorLayout
-         $$i_pnorLayoutRef{sections}{$physicalOffset}{ecc} = $ecc;
-         $$i_pnorLayoutRef{sections}{$physicalOffset}{sha512Version} = $sha512Version;
-         $$i_pnorLayoutRef{sections}{$physicalOffset}{sha512perEC} = $sha512perEC;
--        $$i_pnorLayoutRef{sections}{$physicalOffset}{sideless} = $sideless;
--        $$i_pnorLayoutRef{sections}{$physicalOffset}{preserved} = $preserved;
--        $$i_pnorLayoutRef{sections}{$physicalOffset}{readOnly} = $readOnly;
- 
-     }
- 
-@@ -307,16 +279,23 @@ sub loadPnorLayout
- }
- 
- ################################################################################
--# createPnorImg - Create PNOR image based on input data.
-+# createPnorImg - Create PNOR image and partitions based on input data.
- ################################################################################
- sub createPnorImg
- {
--    my ($i_tocVersion, $i_pnorBinName, $i_pnorLayoutRef, $i_offset) = @_;
-+    my ($i_tocVersion, $i_pnorBinName, $i_pnorLayoutRef, $offset, $side) = @_;
-     my $this_func = (caller(0))[3];
-     my $rc = 0;
-+    my $key;
-+    my $other_side = 'B';
-     trace(4, "$this_func: >>Enter");
- 
--    trace(1, "createPnorImg:: $i_offset");
-+    trace(1, "createPnorImg:: $offset");
-+
-+    if($side eq 'B')
-+    {
-+        $other_side = 'A';
-+    }
- 
-     #get Block size
-     my $blockSize = $$i_pnorLayoutRef{metadata}{blockSize};
-@@ -324,212 +303,154 @@ sub createPnorImg
-     #Get size of image in blocks
-     my $imageSize = $$i_pnorLayoutRef{metadata}{imageSize};
-     my $blockCount = $imageSize/$blockSize;
--    do{
--        if ($blockCount != int($blockCount))
--        {
--            trace(0, "$this_func: Image size ($imageSize) is not an even multiple of erase blocks ($blockSize).  This is not supported.  Aborting!");
--            $rc = 1;
--            last;
--        }
--
--        #f{fs,part} --create tuleta.pnor --partition-offset 0 --size 8MiB --block 4KiB --force
--        trace(2, "$g_fpartCmd --target $i_pnorBinName --partition-offset $i_offset --create --size $imageSize --block $blockSize --force");
--        $rc = `$g_fpartCmd --target $i_pnorBinName --partition-offset $i_offset --create --size $imageSize --block $blockSize --force`;
--        if($rc)
--        {
--            trace(0, "$this_func: Call to creating image failed.  rc=$rc.  Aborting!");
--            last;
--        }
--    }while(0);
--
--    return $rc;
--}
--
--################################################################################
--# addUserData - Add partition user data.
--################################################################################
--sub addUserData
--{
--    my $i_pnorBinName = shift;
--    my $i_offset = shift;
--    my $i_key = shift;
--    my %i_sectionHash = @_;
--
--    my $this_func = (caller(0))[3];
--    my $rc = 0;
--    trace(4, "$this_func: >>Enter");
--
--    my $eyeCatch = $i_sectionHash{$i_key}{eyeCatch};
--
--    # User data Flags based on FFS entry user data (ffs_hb_user_t)
--    my $chip = 0;
--    my $compressType = 0;
--    my $dataInteg = 0;
--    my $verCheck = 0;
--    my $miscFlags = 0;
--
--    # DataInteg flag
--    if( ($i_sectionHash{$i_key}{ecc} eq "yes") )
--    {
--        $dataInteg = 0x8000;
--    }
--
--    # VerCheck Flag
--    if( ($i_sectionHash{$i_key}{sha512Version} eq "yes") )
-+    if ($blockCount != int($blockCount))
-     {
--        $verCheck = 0x80;
--    }
--    elsif( ($i_sectionHash{$i_key}{sha512perEC} eq "yes") )
--    {
--        $verCheck = 0x40;
-+        trace(0, "$this_func: Image size ($imageSize) is not an even multiple of erase blocks ($blockSize).  This is not supported.  Aborting!");
-+        $rc = 1;
-+        return $rc;
-     }
- 
--    # Misc Flags
--    if( ($i_sectionHash{$i_key}{preserved} eq "yes") )
--    {
--        $miscFlags |= 0x80;
-+    #f{fs,part} --create tuleta.pnor --partition-offset 0 --size 8MiB --block 4KiB --force
-+    if ($g_ffsCmd eq "") {
-+        my $Out = `$g_fpartCmd --target $i_pnorBinName --partition-offset $offset --create --size $imageSize --block $blockSize --force`;
-+    } else {
-+        my $Out = `$g_ffsCmd --target $i_pnorBinName --partition-offset $offset --create --size $imageSize --block $blockSize --force`;
-     }
--    if( ($i_sectionHash{$i_key}{readOnly} eq "yes") )
-+    $rc = $?;
-+    if($rc)
-     {
--        $miscFlags |= 0x40;
-+        trace(0, "$this_func: Call to creating image failed.  rc=$rc.  Aborting!");
-+        return $rc;
-     }
- 
-+    #key into hash data is the physical offset of section.  Need to sort the keys
-+    #so we put things in the correct order in toc.
-+    #Generally speaking, this loop is populating the FFS Header with records based on the
-+    #section data specified in the XML + actual sizes of the input binary files.
-+    my %sectionHash = %{$$i_pnorLayoutRef{sections}};
- 
--    #First User Data Word
--    #[1:chip][1:compressType][2:dataInteg]
--    my $userflags0 = ($chip << 24)
--      | ($compressType << 16)
--      | $dataInteg;
-+    for $key ( sort {$a<=> $b} keys %sectionHash)
-+    {
-+        my $eyeCatch = "UNDEF";
-+        my $physicalOffset = 0xFFFFFFFF;
-+        my $physicalRegionSize = 0xFFFFFFFF;
- 
--    #Second User Data Word
--    #[1:sha512Version/sha512perEC][1:miscFlags]
--    my $userflags1 = ($verCheck << 24)
--        | ($miscFlags << 16);
-+        # eyecatcher
-+        my $eyeCatch = $sectionHash{$key}{eyeCatch};
-+        my $myside = $sectionHash{$key}{side};
- 
--    do{
--        trace(2, "$g_fpartCmd --target $i_pnorBinName --partition-offset $i_offset --user 0 --name $eyeCatch --value userflags0=$userflags0");
--        $rc = `$g_fpartCmd --target $i_pnorBinName --partition-offset $i_offset --user 0 --name $eyeCatch --value $userflags0`;
--        if($rc)
--        {
--            trace(0, "$this_func: Call to add userdata to $eyeCatch failed.  rc=$rc.  Aborting!");
--            last;
--        }
--        trace(2, "$g_fpartCmd --target $i_pnorBinName --partition-offset $i_offset --user 1 --name $eyeCatch --value userflags1=$userflags1");
--        $rc = `$g_fpartCmd --target $i_pnorBinName --partition-offset $i_offset --user 1 --name $eyeCatch --value $userflags1`;
--        if($rc)
-+        #don't try to add the TOC, but need to update all other paritions
-+        #Add if side matches (or not set) -- so if it isn't equal to other side
-+        if(( $eyeCatch ne $g_TOCEyeCatch ) && ( $myside ne $other_side ))
-         {
--            trace(0, "$this_func: Call to add userdata to $eyeCatch failed.  rc=$rc.  Aborting!");
--            last;
--        }
--    }while(0);
--
--    return $rc;
--}
--
--################################################################################
--# createPnorPartition - Create PNOR partitions based on input data.
--################################################################################
--sub createPnorPartition
--{
--    my ($i_tocVersion, $i_pnorBinName, $i_pnorLayoutRef, $side, $offset) = @_;
--    my $this_func = (caller(0))[3];
--    my $rc = 0;
--    my $key;
--    my $other_side = getOtherSide($side);
- 
--    trace(4, "$this_func: >>Enter");
--
--    trace(1, "createPnorPartition:: $offset");
--
--    do{
--        # Create pnor image at partition offset
--        $rc = createPnorImg($i_tocVersion, $i_pnorBinName, $i_pnorLayoutRef,
--                            $offset);
--        if($rc)
--        {
--            last;
--        }
-+            # base/physical offset
-+            my $physicalOffset = $sectionHash{$key}{physicalOffset};
-+            #make sure offset is on a block boundary
-+            my $val = $physicalOffset/$blockSize;
-+            if ($val != int($val))
-+            {
-+                trace(0, "$this_func: Partition offset ($val) is does not fall on an erase block ($blockSize) boundary.  This is not supported.  Aborting!");
-+                $rc = -1;
-+                last;
-+            }
- 
--        #get Block size
--        my $blockSize = $$i_pnorLayoutRef{metadata}{blockSize};
-+            #physical size
-+            my $physicalRegionSize = $sectionHash{$key}{physicalRegionSize};
-+            $val = $physicalRegionSize/$blockSize;
-+            if($val != int($val))
-+            {
-+                trace(0, "$this_func: Partition size ($val) is not an even multiple of erase blocks ($blockSize).  This is not supported.  Aborting!");
-+                exit 1;
-+            }
- 
--        # key into hash data is the physical offset of section.  Need to sort the
--        # keys so we put things in the correct order in toc. Generally speaking,
--        # this loop is populating the FFS Header with records based on the section
--        # data specified in the XML + actual sizes of the input binary files.
--        my %sectionHash = %{$$i_pnorLayoutRef{sections}};
-+            #Add Partition
-+            #f{fs,part} --add --target tuleta.pnor --partition-offset 0 --offset 0x1000   --size 0x280000 --name HBI --flags 0x0
-+            if ($g_ffsCmd eq "") {
-+                trace(1, "$g_fpartCmd --target $i_pnorBinName --partition-offset $offset --add --offset $physicalOffset --size $physicalRegionSize --name $eyeCatch --flags 0x0");
-+                my $Out = `$g_fpartCmd --target $i_pnorBinName --partition-offset $offset --add --offset $physicalOffset --size $physicalRegionSize --name $eyeCatch --flags 0x0`;
-+            } else {
-+                my $Out = `$g_ffsCmd --target $i_pnorBinName --partition-offset $offset --add --offset $physicalOffset --size $physicalRegionSize --name $eyeCatch --flags 0x0`;
-+            }
-+            $rc = $?;
-+            if($rc)
-+            {
-+                trace(0, "$this_func: Call to add partition $eyeCatch failed.  rc=$rc.  Aborting!");
-+                last;
-+            }
- 
--        for $key ( sort {$a<=> $b} keys %sectionHash)
--        {
--            my $eyeCatch = "UNDEF";
--            my $physicalOffset = 0xFFFFFFFF;
--            my $physicalRegionSize = 0xFFFFFFFF;
-+            # User data Flags
-+            my $chip = 0;
-+            my $compress = 0;
-+            my $ecc = 0;
-+            my $version = 0;
- 
--            # eyecatcher
--            my $eyeCatch = $sectionHash{$key}{eyeCatch};
-+            if( ($sectionHash{$key}{ecc} eq "yes") )
-+            {
-+                $ecc = 0x8000;
-+            }
-+            if( ($sectionHash{$key}{sha512Version} eq "yes") )
-+            {
-+                $version = 0x80;
-+            }
-+            elsif( ($sectionHash{$key}{sha512perEC} eq "yes") )
-+            {
-+                $version = 0x40;
-+            }
- 
--            my $sideInfo = getSideInfo($key, %sectionHash);
-+            #First User Data Word
-+            #[1:chip][1:compression][2:ecc]
-+            my $userflags0 = ($chip << 24)
-+              | ($compress << 16)
-+              | $ecc;
-+
-+            #Second User Data Word
-+            #[1:sha512Version/sha512perEC]
-+            my $userflags1 = ($version << 24);
-+
-+            trace(1,"userflags0 = $userflags0");
-+            trace(1,"userflags1 = $userflags1");
-+            if ($g_ffsCmd eq "") {
-+                trace(1, "$g_fpartCmd --target $i_pnorBinName --partition-offset $offset --user 0 --name $eyeCatch --value $userflags0");
-+                my $Out = `$g_fpartCmd --target $i_pnorBinName --partition-offset $offset --user 0 --name $eyeCatch --value $userflags0`;
-+                trace(1, "$g_fpartCmd --target $i_pnorBinName --partition-offset $offset --user 1 --name $eyeCatch --value $userflags1");
-+                my $Out = `$g_fpartCmd --target $i_pnorBinName --partition-offset $offset --user 1 --name $eyeCatch --value $userflags1`;
-+            }
-+            $rc = $?;
-+            if($rc)
-+            {
-+                trace(0, "$this_func: Call to add userdata to $eyeCatch failed.  rc=$rc.  Aborting!");
-+                last;
-+            }
- 
--            #don't try to add the TOC, but need to update all other paritions
--            #Add if side matches (or not set) -- so if it isn't equal to other side
--            #Also add if sideless
--            if( ($eyeCatch ne $g_TOCEyeCatch ) &&
--                ($sideInfo ne $other_side ))
-+            #Trunc Partition
-+            #f{fs,part} --target tuleta.pnor --partition-offset 0 --name HBI --trunc
-+            if ($g_ffsCmd eq "") {
-+                my $Out = `$g_fpartCmd --target $i_pnorBinName --partition-offset $offset --trunc --name $eyeCatch`;
-+            } else {
-+                my $Out = `$g_ffsCmd --target $i_pnorBinName --partition-offset $offset --trunc --name $eyeCatch`;
-+            }
-+            $rc = $?;
-+            if($rc)
-             {
--                # base/physical offset
--                my $physicalOffset = $sectionHash{$key}{physicalOffset};
--                #make sure offset is on a block boundary
--                my $val = $physicalOffset/$blockSize;
--                if ($val != int($val))
--                {
--                    trace(0, "$this_func: Partition offset ($val) does not fall on an erase block ($blockSize) boundary.  This is not supported.  Aborting!");
--                    $rc = -1;
--                    last;
--                }
--
--                #physical size
--                my $physicalRegionSize = $sectionHash{$key}{physicalRegionSize};
--                $val = $physicalRegionSize/$blockSize;
--                if($val != int($val))
--                {
--                    trace(0, "$this_func: Partition size ($val) is not an even multiple of erase blocks ($blockSize).  This is not supported.  Aborting!");
--                    exit 1;
--                }
--
--                #Add Partition
--                #f{fs,part} --add --target tuleta.pnor --partition-offset 0 --offset 0x1000   --size 0x280000 --name HBI --flags 0x0
--                trace(2, "$g_fpartCmd --target $i_pnorBinName --partition-offset $offset --add --offset $physicalOffset --size $physicalRegionSize --name $eyeCatch --flags 0x0");
--                $rc = `$g_fpartCmd --target $i_pnorBinName --partition-offset $offset --add --offset $physicalOffset --size $physicalRegionSize --name $eyeCatch --flags 0x0`;
--                if($rc)
--                {
--                    trace(0, "$this_func: Call to add partition $eyeCatch failed.  rc=$rc.  Aborting!");
--                    last;
--                }
--
--                # Add User Partition data
--                $rc = addUserData($i_pnorBinName, $offset, $key, %sectionHash);
--                if($rc)
--                {
--                    trace(0, "$this_func: Call to add user data to partition $eyeCatch failed.  rc=$rc.  Aborting!");
--                    last;
--                }
--
--                #Trunc Partition
--                #f{fs,part} --target tuleta.pnor --partition-offset 0 --name HBI --trunc
--                $rc = `$g_fpartCmd --target $i_pnorBinName --partition-offset $offset --trunc --name $eyeCatch`;
--                if($rc)
--                {
--                    trace(0, "$this_func: Call to trunc partition $eyeCatch failed.  rc=$rc.  Aborting!");
--                    last;
--                }
-+                trace(0, "$this_func: Call to trunc partition $eyeCatch failed.  rc=$rc.  Aborting!");
-+                last;
-             }
-         }
--        # Added in case more functionality added before while ends
--        if ($rc)
--        {
--            last;
--        }
--    }while(0);
-+
-+        #Disable usewords for now.  Will get re-enabled and fixed up as
-+        #we add support for underlying functions
-+
-+#        my $Out = `$g_fpartCmd --target $i_pnorBinName --partition-offset $offset
-+#        		--user 0 --name $eyeCatch --value $actualRegionSize`;
-+#        $rc = $?;
-+#        if($rc)
-+#        {
-+#            trace(0, "$this_func: Call to fpart setting user 0 for partition $eyeCatch failed.  rc=$rc.  Aborting!");
-+#            last;
-+#        }
-+
-+    }
- 
-     return $rc;
- }
-@@ -649,13 +570,21 @@ sub checkSpaceConstraints
- ################################################################################
- sub fillPnorImage
- {
--    my ($i_pnorBinName, $i_pnorLayoutRef, $i_binFiles, $side, $offset) = @_;
-+    my ($i_pnorBinName, $i_pnorLayoutRef, $i_binFiles, $offset, $side) = @_;
-     my $this_func = (caller(0))[3];
-     my $rc = 0;
-     my $key;
--    my $other_side = getOtherSide($side);
-+    my $other_side = 'B';
-+
-+
-+    if($side eq 'B')
-+    {
-+        $other_side = 'A';
-+    }
-+
- 
-     trace(1, "fillPnorImage:: $offset");
-+
-     #key is the physical offset into the file, however don't need to sort
-     #since FFS allows populating partitions in any order
-     my %sectionHash = %{$$i_pnorLayoutRef{sections}};
-@@ -676,26 +605,27 @@ sub fillPnorImage
-             next;
-         }
- 
--        my $sideInfo = getSideInfo($key, %sectionHash);
-+        my $myside = $sectionHash{$key}{side};
- 
--        # Add if side matches (or not set) -- so if it isn't equal to other side
--        # Only fill sideless sections once
--        if( ($sideInfo ne $other_side) &&
--            (!exists($sidelessSecFilled{$eyeCatch})))
-+        #Add if side matches (or not set) -- so if it isn't equal to other side
-+        if( $myside ne $other_side )
-         {
--            if($sideInfo eq $SideOptions{sideless})
--            {
--                $sidelessSecFilled{$eyeCatch} = 1;
--            }
--            trace(5, "$this_func: populating section $sideInfo:$eyeCatch, filename=$inputFile");
-+            trace(5, "$this_func: populating section $myside:$eyeCatch, filename=$inputFile");
-+
-             #fcp --target tuleta.pnor --partition-offset 0 --name HBI --write hostboot_extended.bin
--            $rc = `$g_fcpCmd $inputFile $i_pnorBinName:$eyeCatch --offset $offset --write --buffer 0x40000000`;
-+            if ($g_ffsCmd eq "") {
-+                my $Out = `$g_fcpCmd $inputFile $i_pnorBinName:$eyeCatch --offset $offset --write --buffer 0x40000000`;
-+            } else {
-+                my $Out = `$g_ffsCmd --target $i_pnorBinName --partition-offset $offset --name $eyeCatch  --write $inputFile`;
-+            }
-+            $rc = $?;
-             if($rc)
-             {
-                 trace(0, "$this_func: Call to fcp adding data to partition $eyeCatch failed.  rc=$rc.  Aborting!");
-                 last;
-             }
-          }
-+
-     }
- 
-     return $rc;
-@@ -723,6 +653,28 @@ sub saveInputFile
- }
- 
- #################################################
-+# getFFSEntrySize: Returns number of bytes in an ffs_entry based on specified version
-+#################################################
-+sub getFFSEntrySize
-+{
-+    my($i_tocVersion, $i_pnorLayoutRef) = @_;
-+    my $this_func = (caller(0))[3];
-+    my $ffsEntrySize = 0;
-+
-+    if($i_tocVersion == 0x1)
-+    {
-+        #16 char name + 12 fixed words + 16 user data words
-+        $ffsEntrySize = 16+(12*4)+(16*4);
-+    }
-+    else
-+    {
-+        trace(0, "$this_func:  Layout Version Unsupported!  i_tocVersion=$i_tocVersion");
-+        exit 1;
-+    }
-+    return $ffsEntrySize;
-+}
-+
-+#################################################
- # Insert specifed number of pad bytes into file
- #
- #################################################
-@@ -780,70 +732,6 @@ sub trace
-     }
- }
- 
--################################################################################
--# getSideInfo - return side info of certain sections and determine if value is
--#               a supported value
--################################################################################
--sub getSideInfo
--{
--    my $i_key = shift;
--    my %i_sectionHash = @_;
--
--    my $side = "";
--    my $eyeCatch = $i_sectionHash{$i_key}{eyeCatch};
--
--
--    if($i_sectionHash{$i_key}{sideless} eq "yes")
--    {
--        return $SideOptions{sideless};
--    }
--    else
--    {
--        $side = $i_sectionHash{$i_key}{side};
--    }
--
--    # Error paths
--    if ($side eq "")
--    {
--        trace(0, "Error detected from call to getSideInfo() - $eyeCatch has no side info specified Exiting");
--        exit 1;
--    }
--    elsif (!exists($SideOptions{$side}))
--    {
--        trace(0, "Error detected from call to getSideInfo() - $eyeCatch has sideInfo = $side which is not supported Exiting");
--        exit 1;
--    }
--
--    return $side;
--}
--
--################################################################################
--# getOtherSide - return other side of the given side
--#                does not default to main side in case more sides are added
--################################################################################
--sub getOtherSide
--{
--    my $i_side = shift;
--    my $other_side = "";
--
--    if($i_side eq $SideOptions{A})
--    {
--        $other_side = $SideOptions{B};
--    }
--    elsif($i_side eq $SideOptions{B})
--    {
--        $other_side = $SideOptions{A};
--    }
--
--    # Error paths
--    if ($other_side eq "")
--    {
--        trace(0, "Error detected from call to getOtherSide() - Could not get other side of side = $i_side Exiting");
--        exit 1;
--    }
--
--    return $other_side;
--}
- 
- 
- ################################################################################
-diff --git a/src/build/buildpnor/defaultPnorLayout.xml b/src/build/buildpnor/defaultPnorLayout.xml
-index 249bdb4..e34f0fe 100644
---- a/src/build/buildpnor/defaultPnorLayout.xml
-+++ b/src/build/buildpnor/defaultPnorLayout.xml
-@@ -5,9 +5,7 @@
- <!--                                                                        -->
- <!-- OpenPOWER HostBoot Project                                             -->
- <!--                                                                        -->
--<!-- Contributors Listed Below - COPYRIGHT 2012,2015                        -->
--<!-- [+] International Business Machines Corp.                              -->
--<!--                                                                        -->
-+<!-- COPYRIGHT International Business Machines Corp. 2012,2014              -->
- <!--                                                                        -->
- <!-- Licensed under the Apache License, Version 2.0 (the "License");        -->
- <!-- you may not use this file except in compliance with the License.       -->
-@@ -24,50 +22,48 @@
- <!-- IBM_PROLOG_END_TAG                                                     -->
- <!--
- Layout Description
--<metadata> Element -> Contains high-level information about the PNOR layout.
--    <imageSize>           -> Size of PNOR image in bytes.
--    <blockSize>           -> size of erase blocks in bytes.
--    <sideATocOffset>      -> Location of Side A Partition Table
--    <sideATocBackupOffset>-> Location of Side A Backup Partition Table
--    <sideBTocOffset>      -> Location of Side B Partition Table
--    <sideBTocBackupOffset>-> Location of Side B Backup Partition Table
--</metadata>
--<section> Element -> Contains information about a PNOR Partition
--    <description>   -> Text description of the partition.
--                       Does not have to be machine readable.
--    <eyeCatch>      -> Name of the Partition
--    <physicalOffset>-> Offset of the Partition in PNOR
--                       in bytes.
--    <physicalSize>  -> Size of the Partition in bytes.
--    <side>          -> Side the Partition should be associated with. This
--                       determines if the partition should be added to the
--                       partition table at <sideATocOffset> or <sideBTocOffset>
--    <sideless/>     -> Indicates partition will be in both TOCs but only one
--                       copy of the partition should be created
--    <testonly/>     -> Indicates partition is used for internal testing only.
--                       Partition should be skipped in production environments.
--    <ecc/>          -> Indicates Partition should be ECC protected
--    <sha512Version/>-> Indicates Partition uses SHA512 for version information.
--    <sha512perEC/>  -> Indicates SHA512 is used to indicate version for each
--                       EC-specific image within the Partition.
--    <preserved/>    -> Indicates Partition is preserved across code updates.
--</section>
-+<metadata> Element -> Contains high-level information about
-+   the PNOR layout.
-+    <imageSize> -> Size of PNOR image in bytes.
-+    <blockSize> -> size of erase blocks in bytes.
-+    <sideAOffset> -> Location of Side A Partition Table
-+    <sideBOffset> -> Location of Side B Partition Table
-+<section> -> Contains information about a PNOR Partition
-+    <description> -> Text description of the partition.
-+                     Does not have to be machine readable.
-+    <eyeCatch> -> Name of the Partition
-+    <physicalOffset> -> Offset of the Partition in PNOR
-+                        in bytes.
-+    <physicalSize> -> Size of the Partition in bytes.
-+    <side> -> Side the partition should be associated with.
-+              This determines if the partition should be
-+              added to the partition table at <sideAOffset>
-+              or <sideBOffset>
-+    <testonly/> Indicates partition is used for internal
-+                testing only.  Partition should be skipped
-+                 in production environments.
-+    <ecc/>  Indicates Partition should be ECC protected
-+    <sha512Version/> Indicates Partition uses SHA512 for
-+                     version information.
-+    <sha512perEC/> Indicates SHA512 is used to indicate
-+                   version for each EC-specific image
-+                   within the Partition.
-+    <preserved/>   Indicates Partition is preserved
-+                   across code updates.
- -->
- 
- <pnor>
-     <metadata>
-         <imageSize>0x4000000</imageSize>
-         <blockSize>0x1000</blockSize>
--        <!-- @TODO RTC: 120062 - Enhance meta info -->
--        <sideATocOffset>0x0</sideATocOffset>
--        <sideATocBackupOffset>0x8000</sideATocBackupOffset>
-+        <sideAOffset>0x0</sideAOffset>
-+        <sideBOffset>0x8000</sideBOffset>
-     </metadata>
-     <section>
-         <description>Hostboot Error Logs (144K)</description>
-         <eyeCatch>HBEL</eyeCatch>
-         <physicalOffset>0x10000</physicalOffset>
-         <physicalRegionSize>0x24000</physicalRegionSize>
--        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -75,7 +71,6 @@ Layout Description
-         <eyeCatch>GUARD</eyeCatch>
-         <physicalOffset>0x58000</physicalOffset>
-         <physicalRegionSize>0x5000</physicalRegionSize>
--        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -83,7 +78,6 @@ Layout Description
-         <eyeCatch>HBD</eyeCatch>
-         <physicalOffset>0x5D000</physicalOffset>
-         <physicalRegionSize>0x120000</physicalRegionSize>
--        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -92,7 +86,6 @@ Layout Description
-         <!--NOTE: MUST update standalone.simics if offset changes -->
-          <physicalOffset>0x17D000</physicalOffset>
-         <physicalRegionSize>0x48000</physicalRegionSize>
--        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -101,7 +94,6 @@ Layout Description
-         <!--NOTE: MUST update standalone.simics if offset changes -->
-         <physicalOffset>0x1C5000</physicalOffset>
-         <physicalRegionSize>0x90000</physicalRegionSize>
--        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -110,7 +102,6 @@ Layout Description
-         <!--NOTE: MUST update standalone.simics if offset changes -->
-         <physicalOffset>0x255000</physicalOffset>
-         <physicalRegionSize>0x48000</physicalRegionSize>
--        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -119,7 +110,6 @@ Layout Description
-         <physicalOffset>0x29D000</physicalOffset>
-         <physicalRegionSize>0x5A0000</physicalRegionSize>
-         <sha512Version/>
--        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -128,7 +118,6 @@ Layout Description
-         <physicalOffset>0x83D000</physicalOffset>
-         <physicalRegionSize>0x90000</physicalRegionSize>
-         <sha512perEC/>
--        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -137,7 +126,6 @@ Layout Description
-         <physicalOffset>0x8CD000</physicalOffset>
-         <physicalRegionSize>0x48000</physicalRegionSize>
-         <sha512perEC/>
--        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -146,7 +134,6 @@ Layout Description
-         <physicalOffset>0x915000</physicalOffset>
-         <physicalRegionSize>0x120000</physicalRegionSize>
-         <sha512Version/>
--        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -155,7 +142,6 @@ Layout Description
-         <physicalOffset>0xA35000</physicalOffset>
-         <physicalRegionSize>0x240000</physicalRegionSize>
-         <sha512Version/>
--        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -163,7 +149,6 @@ Layout Description
-         <eyeCatch>PAYLOAD</eyeCatch>
-         <physicalOffset>0xC75000</physicalOffset>
-         <physicalRegionSize>0x1680000</physicalRegionSize>
--        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -172,18 +157,6 @@ Layout Description
-         <physicalOffset>0x3590000</physicalOffset>
-         <physicalRegionSize>0x9000</physicalRegionSize>
-         <testonly/>
--        <sideless/>
--        <ecc/>
--    </section>
--    <section>
--        <description>Special PNOR Test Space (36K)</description>
--        <eyeCatch>TESTRO</eyeCatch>
--        <physicalOffset>0x3599000</physicalOffset>
--        <physicalRegionSize>0x9000</physicalRegionSize>
--        <testonly/>
--        <sideless/>
--        <preserved/>
--        <readOnly/>
-         <ecc/>
-     </section>
-     <section>
-@@ -193,7 +166,6 @@ Layout Description
-         <physicalOffset>0x3F67000</physicalOffset>
-         <physicalRegionSize>0x90000</physicalRegionSize>
-         <sha512Version/>
--        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -201,7 +173,6 @@ Layout Description
-         <eyeCatch>GLOBAL</eyeCatch>
-         <physicalOffset>0x3FF7000</physicalOffset>
-         <physicalRegionSize>0x9000</physicalRegionSize>
--        <sideless/>
-         <ecc/>
-     </section>
- </pnor>
-diff --git a/src/build/mkrules/hbfw/img/makefile b/src/build/mkrules/hbfw/img/makefile
-index 925061e..c0b0900 100755
---- a/src/build/mkrules/hbfw/img/makefile
-+++ b/src/build/mkrules/hbfw/img/makefile
-@@ -5,7 +5,7 @@
- #
- # OpenPOWER HostBoot Project
- #
--# Contributors Listed Below - COPYRIGHT 2012,2015
-+# Contributors Listed Below - COPYRIGHT 2012,2014
- # [+] International Business Machines Corp.
- #
- #
-@@ -226,7 +226,7 @@ PNOR_BUILD_SCRIPT = ${buildpnor.pl:P}
- #so need to use tryinclude for now.
- .tryinclude <${.PATH:Ffips_pnor.mk}>
- 
--HOSTBOOT_DEFAULT_SECTIONS = HBB=${BASE_W_HEADER_ECC_IMAGE},HBI=${EXT_ECC_HEADER_IMAGE},HBRT=${HBRT_ECC_HEADER_IMAGE},TEST=${TESTDATA_ECC},TESTRO=${TESTDATA_ECC},HBEL=${HBEL_ECC_IMAGE},GUARD=${GUARD_ECC_IMAGE},GLOBAL=${GLOBAL_ECC_IMAGE},PAYLOAD=${PAYLOAD_ECC_IMAGE},CVPD=${CVPD_ECC_IMAGE},MVPD=${MVPD_ECC_IMAGE},DJVPD=${DJVPD_ECC_IMAGE}
-+HOSTBOOT_DEFAULT_SECTIONS = HBB=${BASE_W_HEADER_ECC_IMAGE},HBI=${EXT_ECC_HEADER_IMAGE},HBRT=${HBRT_ECC_HEADER_IMAGE},TEST=${TESTDATA_ECC},HBEL=${HBEL_ECC_IMAGE},GUARD=${GUARD_ECC_IMAGE},GLOBAL=${GLOBAL_ECC_IMAGE},PAYLOAD=${PAYLOAD_ECC_IMAGE},CVPD=${CVPD_ECC_IMAGE},MVPD=${MVPD_ECC_IMAGE},DJVPD=${DJVPD_ECC_IMAGE}
- 
- 
- HBFW_OBJPATH = ${.PATH:M*obj*}
-diff --git a/src/include/usr/hwas/hwasPlatDeconfigGard.H b/src/include/usr/hwas/hwasPlatDeconfigGard.H
-index c439a42..4b89353 100644
---- a/src/include/usr/hwas/hwasPlatDeconfigGard.H
-+++ b/src/include/usr/hwas/hwasPlatDeconfigGard.H
-@@ -5,9 +5,7 @@
- /*                                                                        */
- /* OpenPOWER HostBoot Project                                             */
- /*                                                                        */
--/* Contributors Listed Below - COPYRIGHT 2012,2015                        */
--/* [+] International Business Machines Corp.                              */
--/*                                                                        */
-+/* COPYRIGHT International Business Machines Corp. 2012,2014              */
- /*                                                                        */
- /* Licensed under the Apache License, Version 2.0 (the "License");        */
- /* you may not use this file except in compliance with the License.       */
-@@ -32,8 +30,6 @@
- #ifndef HWASPLATDECONFIGGARD_H_
- #define HWASPLATDECONFIGGARD_H_
- 
--#include <pnor/pnorif.H>
--
- /**
-  *  @brief Adapt common singleton declaration to specific platform
-  *
-@@ -68,19 +64,6 @@ struct HBDeconfigGard
-     void *iv_pGardRecords;          // Pointer to the GARD Records in PNOR
- };
- 
--/**
-- *  @brief Gets iv_gardSectionInfo and sets it if first time called.
-- *         Sets o_sectionInfo based on iv_gardSectionInfo for the caller
-- *
-- *  @param[out] Guard PNOR section info
-- *
-- *  @return errlHndl_t Error log handle, depending on config options will
-- *          ignore error because no Guard section exists in PNOR
-- *          (e.g. CONFIG_GOLDEN_PNOR_SIDE_SUPPORT)
-- *
-- */
--errlHndl_t getGardSectionInfo(PNOR::SectionInfo_t& o_sectionInfo);
--
- } // namespace HWAS
- 
- #endif // HWASPLATDECONFIGGARD_H_
-diff --git a/src/include/usr/pnor/pnor_reasoncodes.H b/src/include/usr/pnor/pnor_reasoncodes.H
-index 4857c1b..a9854a4 100644
---- a/src/include/usr/pnor/pnor_reasoncodes.H
-+++ b/src/include/usr/pnor/pnor_reasoncodes.H
-@@ -136,8 +136,6 @@ namespace PNOR
-         RC_PNOR_READ_NOT_SUPPORTED   = PNOR_COMP_ID | 0x1F,
-         RC_PNOR_WRITE_NOT_SUPPORTED  = PNOR_COMP_ID | 0x20,
-         RC_NON_ECC_PROTECTED_SECTION = PNOR_COMP_ID | 0x21,
--        RC_WRITABLE_PERM_FAIL        = PNOR_COMP_ID | 0x22,
--        RC_WRITE_TRACKED_PERM_FAIL   = PNOR_COMP_ID | 0x23,
-     };
- 
-     enum UserDetailsTypes
-diff --git a/src/include/usr/pnor/pnorif.H b/src/include/usr/pnor/pnorif.H
-index 2689077..a9856f8 100644
---- a/src/include/usr/pnor/pnorif.H
-+++ b/src/include/usr/pnor/pnorif.H
-@@ -29,7 +29,6 @@
- #include <stdint.h>
- #include <builtins.h>
- #include <errl/errlentry.H>
--#include <utility>
- 
- namespace PNOR
- {
-@@ -62,7 +61,6 @@ enum SectionId
-     ATTR_PERM,      /**< Permanent Attribute Override */
-     CAPP,           /**< CAPP lid */
-     TEST,           /**< Scratch space for PNOR test cases */
--    TESTRO,         /**< Scratch space for PNOR ReadOnly test cases */
- 
-     NUM_SECTIONS,   /**< Number of defined sections */
- 
-@@ -84,8 +82,7 @@ struct SectionInfo_t
-     uint64_t size;      /**< Size of partition in bytes */
-     bool eccProtected;  /**< Section is ECC protected */
-     bool sha512Version; /**< Version Checking */
--    bool sha512perEC; /**< Version Checking perEC */
--    bool readOnly; /**< Section is read only */
-+    bool sha512perEC;   /**< Version Checking perEC */
- };
- 
- /**
-@@ -124,7 +121,6 @@ errlHndl_t fixECC (SectionId i_section);
-  *         true = PNOR DD is using L3 Cache for fake PNOR
-  *         false = PNOR DD not using L3 Cache for fake PNOR
-  */
-- bool usingL3Cache();
- 
- /**
-  * @brief  Clears the specified PNOR section with all FF's (w/ good ECC)
-@@ -135,6 +131,8 @@ errlHndl_t fixECC (SectionId i_section);
-  */
- errlHndl_t clearSection(PNOR::SectionId i_section);
- 
-+bool usingL3Cache();
-+
- /**
-  * @brief Validate the Alternative Master Processor's LPC
-  *        Connection to PNOR
-@@ -143,14 +141,6 @@ errlHndl_t clearSection(PNOR::SectionId i_section);
-  */
- errlHndl_t validateAltMaster( void );
- 
--//@ TODO RTC: 120061 add golden info
--//@ TODO RTC: 109703 make golden changes for informing OPAL
--struct TocInfo_t
--{
--    std::pair<uint64_t, uint64_t> activeTocOffsets;
--    std::pair<uint64_t, uint64_t> altTocOffsets;
--};
--
- /** @brief PNOR::TEST section offsets for test cases to prevent
-  *         concurrency problems
-  */
-@@ -160,29 +150,6 @@ enum TestSectionOffset{
-     pnorTestSec_rt_readwrite_offset = 0x6000,
- };
- 
--////////////////////////////////////////////////////////////////////////////////
--// SBE functionality that lives in PNOR
--
--// Used to keep track of perm/temp, and cur/alt
--enum sbeSeepromSide_t
--{
--    SBE_SEEPROM0         = 0x00,   // corresponds to EEPROM::SBE_PRIMARY
--    SBE_SEEPROM1         = 0x01,   // corresponts to EEPROM::SBE_BACKUP
--    SBE_SEEPROM_INVALID  = 0xFF,
--};
--
--/**
-- * @brief Determines which Seeprom was used to boot the SBE
-- *
-- * @param[in] i_target      Target processor to customize
-- *
-- * @param[out] o_bootSide   The Seeprom the SBE booted from
-- *
-- * @return errlHndl_t       Error log handle on failure.
-- */
--errlHndl_t getSbeBootSeeprom(TARGETING::Target* i_target,
--                             sbeSeepromSide_t& o_bootSide);
--
- }
- 
- #endif
-diff --git a/src/usr/hwas/hwasPlatDeconfigGard.C b/src/usr/hwas/hwasPlatDeconfigGard.C
-index 2911cf3..912f7d4 100644
---- a/src/usr/hwas/hwasPlatDeconfigGard.C
-+++ b/src/usr/hwas/hwasPlatDeconfigGard.C
-@@ -5,7 +5,7 @@
- /*                                                                        */
- /* OpenPOWER HostBoot Project                                             */
- /*                                                                        */
--/* Contributors Listed Below - COPYRIGHT 2013,2015                        */
-+/* Contributors Listed Below - COPYRIGHT 2013,2014                        */
- /* [+] Google Inc.                                                        */
- /* [+] International Business Machines Corp.                              */
- /*                                                                        */
-@@ -52,15 +52,6 @@ using namespace HWAS::COMMON;
- using namespace TARGETING;
- 
- const uint32_t EMPTY_GARD_RECORDID = 0xFFFFFFFF;
--/**
-- * @brief Guard PNOR section info, obtained once for efficiency
-- */
--static PNOR::SectionInfo_t g_GardSectionInfo;
--
--/**
-- * @brief Flag indicating if getGardSectionInfo() was called previously
-- */
--static bool getGardSectionInfoCalled;
- 
- void _flush(void *i_addr);
- errlHndl_t _GardRecordIdSetup(void *&io_platDeconfigGard);
-@@ -99,7 +90,7 @@ errlHndl_t DeconfigGard::platClearGardRecords(
- 
-     HWAS_MUTEX_LOCK(iv_mutex);
-     l_pErr = _GardRecordIdSetup(iv_platDeconfigGard);
--    if (!l_pErr && iv_platDeconfigGard)
-+    if (!l_pErr)
-     {
-         uint32_t l_gardRecordsCleared = 0;
-         HBDeconfigGard *l_hbDeconfigGard =
-@@ -136,6 +127,10 @@ errlHndl_t DeconfigGard::platClearGardRecords(
- 
-         HWAS_INF("GARD Records Cleared: %d", l_gardRecordsCleared);
-     }
-+    else
-+    {
-+        HWAS_ERR("Error from _GardRecordIdSetup");
-+    }
- 
-     HWAS_MUTEX_UNLOCK(iv_mutex);
- #endif // CONFIG_NO_GARD_SUPPORT
-@@ -158,7 +153,7 @@ errlHndl_t DeconfigGard::platGetGardRecords(
- 
-     HWAS_MUTEX_LOCK(iv_mutex);
-     l_pErr = _GardRecordIdSetup(iv_platDeconfigGard);
--    if (!l_pErr && iv_platDeconfigGard)
-+    if (!l_pErr)
-     {
-         HBDeconfigGard *l_hbDeconfigGard =
-                 (HBDeconfigGard *)iv_platDeconfigGard;
-@@ -188,6 +183,10 @@ errlHndl_t DeconfigGard::platGetGardRecords(
-             }
-         } // for
-     }
-+    else
-+    {
-+        HWAS_ERR("Error from _GardRecordIdSetup");
-+    }
- 
-     HWAS_MUTEX_UNLOCK(iv_mutex);
-     HWAS_INF("Get returning %d GARD Records", o_records.size());
-@@ -270,8 +269,9 @@ errlHndl_t DeconfigGard::platCreateGardRecord(
-         }
- 
-         l_pErr = _GardRecordIdSetup(iv_platDeconfigGard);
--        if (l_pErr && iv_platDeconfigGard)
-+        if (l_pErr)
-         {
-+            HWAS_ERR("Error from _GardRecordIdSetup");
-             break;
-         }
- 
-@@ -394,27 +394,20 @@ errlHndl_t _GardRecordIdSetup( void *&io_platDeconfigGard)
-             break;
-         }
- 
--        // Get the PNOR Guard information
-+        // allocate our memory and set things up
-+        io_platDeconfigGard = malloc(sizeof(HBDeconfigGard));
-+        HBDeconfigGard *l_hbDeconfigGard =
-+                (HBDeconfigGard *)io_platDeconfigGard;
-+
-+        // get the PNOR address.
-         PNOR::SectionInfo_t l_section;
--        l_pErr = getGardSectionInfo(l_section);
-+        l_pErr = PNOR::getSectionInfo(PNOR::GUARD_DATA, l_section);
-         if (l_pErr)
-         {
--            HWAS_ERR("_GardRecordIdSetup: getGardSectionInfo failed!!!");
-+            HWAS_ERR("PNOR::getSectionInfo failed!!!");
-             // no support for GARD in this configuration.
-             break;
-         }
--        // Check if guard section exists, as certain configs ignore the above
--        // error (e.g. golden side has no GARD section)
--        if (l_section.size == 0)
--        {
--            HWAS_ERR("_GardRecordIdSetup: No guard section skipping function");
--            break;
--        }
--
--        // allocate our memory and set things up
--        io_platDeconfigGard = malloc(sizeof(HBDeconfigGard));
--        HBDeconfigGard *l_hbDeconfigGard =
--                (HBDeconfigGard *)io_platDeconfigGard;
- 
-         l_hbDeconfigGard->iv_pGardRecords =
-             reinterpret_cast<DeconfigGard::GardRecord *> (l_section.vaddr);
-@@ -473,44 +466,4 @@ void _flush(void *i_addr)
-     }
- }
- 
--errlHndl_t getGardSectionInfo(PNOR::SectionInfo_t& o_sectionInfo)
--{
--    errlHndl_t l_errl = NULL;
--    do
--    {
--        // getSectionInfo has already been called for GUARD_DATA
--        if(getGardSectionInfoCalled)
--        {
--            o_sectionInfo = g_GardSectionInfo;
--            break;
--        }
--
--        // Get Guard Section Info and set gardSectionInfo
--        l_errl = PNOR::getSectionInfo(PNOR::GUARD_DATA, g_GardSectionInfo);
--        if (l_errl)
--        {
--            g_GardSectionInfo.size = 0;
--// @TODO RTC: 120061 - replace config flag with a pnor interface call to say if
--//                     there is a guard section on the current (active) side
--//                     of pnor
--#ifdef CONFIG_TWO_SIDE_SUPPORT
--            HWAS_INF("getGardSectionInfo: No guard section disabling guard support");
--            l_errl = NULL;
--#else
--            HWAS_ERR("getGardSectionInfo:getSectionInfo failed");
--#endif
--        }
--        else
--        {
--            HWAS_INF("getGardSectionInfo: Section %s found, size %d",
--                      g_GardSectionInfo.name, g_GardSectionInfo.size);
--        }
--
--        o_sectionInfo = g_GardSectionInfo;
--        getGardSectionInfoCalled = true;
--    } while(0);
--
--    return l_errl;
--}
--
- } // namespace HWAS
-diff --git a/src/usr/pnor/HBconfig b/src/usr/pnor/HBconfig
-index 21082f4..298144c 100644
---- a/src/usr/pnor/HBconfig
-+++ b/src/usr/pnor/HBconfig
-@@ -37,8 +37,3 @@ config PNOR_IS_32MB
-     default n
-     help
-         Size of the attached flash chip is 32MB, if not set then 64MB is default
--
--config TWO_SIDE_SUPPORT
--    default n
--    help
--        This is used to turn on/off two sided pnor support
-diff --git a/src/usr/pnor/common/ffs_hb.H b/src/usr/pnor/common/ffs_hb.H
-index c96911b..b638021 100644
---- a/src/usr/pnor/common/ffs_hb.H
-+++ b/src/usr/pnor/common/ffs_hb.H
-@@ -5,9 +5,7 @@
- /*                                                                        */
- /* OpenPOWER HostBoot Project                                             */
- /*                                                                        */
--/* Contributors Listed Below - COPYRIGHT 2012,2015                        */
--/* [+] International Business Machines Corp.                              */
--/*                                                                        */
-+/* COPYRIGHT International Business Machines Corp. 2012,2014              */
- /*                                                                        */
- /* Licensed under the Apache License, Version 2.0 (the "License");        */
- /* you may not use this file except in compliance with the License.       */
-@@ -27,7 +25,7 @@
- 
- /*
-  * FSP Destination: src/hbfw/fsp/pnor/common/ffs_hb.H
-- *
-+ * 
-  * NOTE: Do NOT modify this file in CMVC directly!  It comes from the Hostboot
-  *      repository and will be overwritten.
- */
-@@ -65,7 +63,6 @@ enum
- 
-     /* Miscellaneous Bits : 1 byte */
-     FFS_MISC_PRESERVED     = 0x80,    /**< Preserved across code updates */
--    FFS_MISC_READ_ONLY     = 0x40,    /**< Read only section */
-     FFS_MISC_UNUSED        = 0x1F,    /**< Unused MISC Flags */
- };
- 
-diff --git a/src/usr/pnor/makefile b/src/usr/pnor/makefile
-index 2f0a4e1..31087a4 100644
---- a/src/usr/pnor/makefile
-+++ b/src/usr/pnor/makefile
-@@ -32,7 +32,6 @@ OBJS += pnor_common.o
- OBJS += pnorvalid.o
- OBJS += ecc.o
- OBJS += sfcdd.o
--OBJS += pnorsbe.o
- 
- #SFC Implementations
- OBJS += $(if $(CONFIG_SFC_IS_IBM_DPSS),sfc_ibm.o)
-diff --git a/src/usr/pnor/pnor_common.C b/src/usr/pnor/pnor_common.C
-index 00931ec..e8972e2 100644
---- a/src/usr/pnor/pnor_common.C
-+++ b/src/usr/pnor/pnor_common.C
-@@ -24,15 +24,14 @@
- /* IBM_PROLOG_END_TAG                                                     */
- 
- #include "pnor_common.H"
-+#include <pnor/pnorif.H>
- #include <pnor/pnor_reasoncodes.H>
- 
- #include "ffs.h"           //Common header file with BuildingBlock.
- #include "common/ffs_hb.H" //Hostboot def of user data in ffs_entry struct
--#include <sys/mm.h>
- 
- #include <initservice/initserviceif.H>
- #include <util/align.H>
--#include <errl/errlmanager.H>
- 
- // Trace definition
- trace_desc_t* g_trac_pnor = NULL;
-@@ -46,29 +45,28 @@ TRAC_INIT(&g_trac_pnor, PNOR_COMP_NAME, 4*KILOBYTE, TRACE::BUFFER_SLOW); //4K
-  * Eyecatcher strings for PNOR TOC entries
-  */
- const char* cv_EYECATCHER[] = {
--    "part",      /**< PNOR::TOC            : Table of Contents */
--    "HBI",       /**< PNOR::HB_EXT_CODE    : Hostboot Extended Image */
--    "GLOBAL",    /**< PNOR::GLOBAL_DATA    : Global Data */
--    "HBB",       /**< PNOR::HB_BASE_CODE   : Hostboot Base Image */
--    "SBEC",      /**< PNOR::CENTAUR_SBE    : Centaur Self-Boot Engine image */
--    "SBE",       /**< PNOR::SBE_IPL        : Self-Boot Enginer IPL image */
--    "WINK",      /**< PNOR::WINK           : Sleep Winkle Reference image */
--    "PAYLOAD",   /**< PNOR::PAYLOAD        : HAL/OPAL */
--    "HBRT",      /**< PNOR::HB_RUNTIME     : Hostboot Runtime (for Sapphire) */
--    "HBD",       /**< PNOR::HB_DATA        : Hostboot Data */
--    "GUARD",     /**< PNOR::GUARD_DATA     : Hostboot Data */
--    "HBEL",      /**< PNOR::HB_ERRLOGS     : Hostboot Error log Repository */
--    "DJVPD",     /**< PNOR::DIMM_JEDEC_VPD : Dimm JEDEC VPD */
--    "MVPD",      /**< PNOR::MODULE_VPD     : Module VPD */
--    "CVPD",      /**< PNOR::CENTAUR_VPD    : Centaur VPD */
--    "NVRAM",     /**< PNOR::NVRAM          : OPAL Storage */
--    "OCC",       /**< PNOR::OCC            : OCC LID */
--    "FIRDATA",   /**< PNOR::FIRDATA        : FIRDATA */
-+    "part",     /**< PNOR::TOC            : Table of Contents */
-+    "HBI",      /**< PNOR::HB_EXT_CODE    : Hostboot Extended Image */
-+    "GLOBAL",   /**< PNOR::GLOBAL_DATA    : Global Data */
-+    "HBB",      /**< PNOR::HB_BASE_CODE   : Hostboot Base Image */
-+    "SBEC",     /**< PNOR::CENTAUR_SBE    : Centaur Self-Boot Engine image */
-+    "SBE",      /**< PNOR::SBE_IPL        : Self-Boot Enginer IPL image */
-+    "WINK",     /**< PNOR::WINK           : Sleep Winkle Reference image */
-+    "PAYLOAD",  /**< PNOR::PAYLOAD        : HAL/OPAL */
-+    "HBRT",     /**< PNOR::HB_RUNTIME     : Hostboot Runtime (for Sapphire) */
-+    "HBD",      /**< PNOR::HB_DATA        : Hostboot Data */
-+    "GUARD",    /**< PNOR::GUARD_DATA     : Hostboot Data */
-+    "HBEL",     /**< PNOR::HB_ERRLOGS     : Hostboot Error log Repository */
-+    "DJVPD",    /**< PNOR::DIMM_JEDEC_VPD : Dimm JEDEC VPD */
-+    "MVPD",     /**< PNOR::MODULE_VPD     : Module VPD */
-+    "CVPD",     /**< PNOR::CENTAUR_VPD    : Centaur VPD */
-+    "NVRAM",    /**< PNOR::NVRAM          : OPAL Storage */
-+    "OCC",      /**< PNOR::OCC            : OCC LID */
-+    "FIRDATA",  /**< PNOR::FIRDATA        : FIRDATA */
-     "ATTR_TMP",  /**< PNOR::ATTR_TMP       : Temporary Attribute Overrides */
-     "ATTR_PERM", /**< PNOR::ATTR_PERM      : Permanent Attribute Overrides */
--    "CAPP",      /**< PNOR::CAPP            : CAPP LID */
--    "TEST",      /**< PNOR::TEST           : Test space for PNOR*/
--    "TESTRO",    /**< PNOR::TESTRO         : ReadOnly Test space for PNOR */
-+    "CAPP",     /**< PNOR::CAPP           : CAPP LID */
-+    "TEST",     /**< PNOR::TEST           : Test space for PNOR*/
-     //Not currently used
- //    "XXX",    /**< NUM_SECTIONS       : Used as invalid entry */
- };
-@@ -91,7 +89,7 @@ uint32_t PNOR::pnor_ffs_checksum(void* data, size_t size)
- }
- 
- errlHndl_t PNOR::parseTOC(uint8_t* i_toc0Buffer, uint8_t* i_toc1Buffer,
--           TOCS & o_TOC_used, SectionData_t * o_TOC, uint64_t i_baseVAddr)
-+           uint32_t & o_TOC_used, SectionData_t * o_TOC, uint64_t i_baseVAddr)
- {
-     TRACUCOMP(g_trac_pnor,"PNOR::parseTOC>");
-     errlHndl_t l_errhdl = NULL;
-@@ -99,10 +97,9 @@ errlHndl_t PNOR::parseTOC(uint8_t* i_toc0Buffer, uint8_t* i_toc1Buffer,
-     bool TOC_0_failed = false;
- 
-     do{
--        o_TOC_used = TOC_0;
-+        o_TOC_used = 0;
- 
--        for (TOCS cur_TOC = TOC_0; cur_TOC < NUM_TOCS;
--            cur_TOC = (TOCS)(cur_TOC+1))
-+        for (uint32_t cur_TOC = 0; cur_TOC < NUM_TOCS; ++cur_TOC)
-         {
-             TRACFCOMP(g_trac_pnor, "PNOR::parseTOC verifying TOC: %d",cur_TOC);
-             uint64_t nextVAddr = i_baseVAddr;
-@@ -137,10 +134,10 @@ errlHndl_t PNOR::parseTOC(uint8_t* i_toc0Buffer, uint8_t* i_toc1Buffer,
-                 {
-                     TRACFCOMP(g_trac_pnor, "PNOR::parseTOC TOC 0 failed header checksum");
-                     TOC_0_failed = true;
--                    o_TOC_used = TOC_1;
-+                    o_TOC_used = 1;
-                     continue;
-                 }
--                else if (cur_TOC == TOC_1 && TOC_0_failed)
-+                else if (cur_TOC == 1 && TOC_0_failed)
-                 {
-                     // Both TOC's failed
-                     TRACFCOMP(g_trac_pnor, "PNOR::parseTOC both TOCs are corrupted");
-@@ -167,7 +164,7 @@ errlHndl_t PNOR::parseTOC(uint8_t* i_toc0Buffer, uint8_t* i_toc1Buffer,
-             }
- 
-             // Only check header if on first TOC or the first TOC failed
--            if (cur_TOC == TOC_0 || TOC_0_failed)
-+            if (cur_TOC == 0 || TOC_0_failed)
-             {
-                 TRACFCOMP(g_trac_pnor, "PNOR::parseTOC: FFS Block size=0x%.8X,"
-                  " Partition Table Size = 0x%.8x, entry_count=%d",
-@@ -273,15 +270,15 @@ errlHndl_t PNOR::parseTOC(uint8_t* i_toc0Buffer, uint8_t* i_toc1Buffer,
-                     // in SP-less config
-                     TRACFCOMP(g_trac_pnor, "PNOR::parseTOC pnor_ffs_checksum"
-                             " entry checksums do not match");
--                    if (cur_TOC == TOC_0)
-+                    if (cur_TOC == 0)
-                     {
-                         TRACFCOMP(g_trac_pnor,"PNOR::parseTOC TOC 0 entry"
-                                 " checksum failed");
-                         TOC_0_failed = true;
--                        o_TOC_used = TOC_1;
-+                        o_TOC_used = 1;
-                         break;
-                     }
--                    else if (cur_TOC == TOC_1 && TOC_0_failed)
-+                    else if (cur_TOC == 1 && TOC_0_failed)
-                     {
-                         // Both TOC's failed
-                         TRACFCOMP(g_trac_pnor, "PNOR::parseTOC both TOC's are"
-@@ -309,7 +306,7 @@ errlHndl_t PNOR::parseTOC(uint8_t* i_toc0Buffer, uint8_t* i_toc1Buffer,
-                 }
- 
-                 // Only set data if on first TOC or the first TOC failed
--                if (cur_TOC == TOC_0 || TOC_0_failed)
-+                if (cur_TOC == 0 || TOC_0_failed)
-                 {
-                     //Figure out section enum
-                     for(uint32_t eyeIndex=PNOR::TOC;eyeIndex<PNOR::NUM_SECTIONS;
-@@ -396,120 +393,25 @@ errlHndl_t PNOR::parseTOC(uint8_t* i_toc0Buffer, uint8_t* i_toc1Buffer,
-                                               0, 0, true);
-                         break;
-                     }
--
--# ifndef __HOSTBOOT_RUNTIME
--                    // Handle section permissions
--                    if (o_TOC[secId].misc & FFS_MISC_READ_ONLY)
--                    {
--                        // Need to set permissions to allow writing to virtual
--                        // addresses, but prevents the kernel from ejecting
--                        // dirty pages (no WRITE_TRACKED).
--                        int rc = mm_set_permission(
--                                                (void*)o_TOC[secId].virtAddr,
--                                                o_TOC[secId].size,
--                                                WRITABLE);
--                        if (rc)
--                        {
--                            TRACFCOMP(g_trac_pnor, "E>PnorRP::readTOC: Failed to set block permissions to WRITABLE for section %s.",
--                                      cv_EYECATCHER[secId]);
--                            /*@
--                            * @errortype
--                            * @moduleid PNOR::MOD_PNORRP_READTOC
--                            * @reasoncode PNOR::RC_WRITABLE_PERM_FAIL
--                            * @userdata1 PNOR section id
--                            * @userdata2 PNOR section vaddr
--                            * @devdesc Could not set permissions of the
--                            * given PNOR section to WRITABLE
--                            * @custdesc A problem occurred while reading PNOR partition table
--                            */
--                            l_errhdl = new ERRORLOG::ErrlEntry(
--                                            ERRORLOG::ERRL_SEV_UNRECOVERABLE,
--                                            PNOR::MOD_PNORRP_READTOC,
--                                            PNOR::RC_WRITABLE_PERM_FAIL,
--                                            secId,
--                                            o_TOC[secId].virtAddr,
--                                            true /*Add HB SW Callout*/);
--                            l_errhdl->collectTrace(PNOR_COMP_NAME);
--                        }
--                    }
--                    else
--                    {
--                        // Need to set permissions to R/W
--                        int rc = mm_set_permission(
--                                            (void*)o_TOC[secId].virtAddr,
--                                            o_TOC[secId].size,
--                                            WRITABLE | WRITE_TRACKED);
--                        if (rc)
--                        {
--                            TRACFCOMP(g_trac_pnor, "E>PnorRP::readTOC: Failed to set block permissions to WRITABLE/WRITE_TRACKED for section %s.",
--                                      cv_EYECATCHER[secId]);
--                            /*@
--                            * @errortype
--                            * @moduleid PNOR::MOD_PNORRP_READTOC
--                            * @reasoncode PNOR::RC_WRITE_TRACKED_PERM_FAIL
--                            * @userdata1 PNOR section id
--                            * @userdata2 PNOR section vaddr
--                            * @devdesc Could not set permissions of the
--                            * given PNOR section to
--                            * WRITABLE/WRITE_TRACKED
--                            * @custdesc A problem occurred while reading
--                            * PNOR partition table
--                            */
--                            l_errhdl = new ERRORLOG::ErrlEntry(
--                                            ERRORLOG::ERRL_SEV_UNRECOVERABLE,
--                                            PNOR::MOD_PNORRP_READTOC,
--                                            PNOR::RC_WRITE_TRACKED_PERM_FAIL,
--                                            secId,
--                                            o_TOC[secId].virtAddr,
--                                            true /*Add HB SW Callout*/);
--                            l_errhdl->collectTrace(PNOR_COMP_NAME);
--                        }
--                    }
--#endif
--                    if( l_errhdl )
--                    {
--                        // If both toc0 and toc1 fail break and return the error
--                        if ( (cur_TOC == TOC_1) && (TOC_0_failed) )
--                        {
--                            TRACFCOMP(g_trac_pnor, "PNOR::parseTOC readFromDevice Failed on both TOCs");
--                            break;
--                        }
--
--                        // Toc 1 has not been read yet or Toc 0 was read
--                        // successfully
--                        // Commit error and break to continue checking the next
--                        // TOC
--                        else
--                        {
--                            TRACFCOMP(g_trac_pnor, "PNOR::parseTOC readFromDevice Failed on TOC %d, commit error",
--                                      cur_TOC);
--                            errlCommit(l_errhdl,PNOR_COMP_ID);
--                            l_errhdl = NULL;
--                            break;
--                        }
--                    }
-                 }
--            } // For TOC Entries
-+            }
-             if (l_errhdl)
-             {
-+                TRACFCOMP(g_trac_pnor, ERR_MRK"PNOR::parseTOC: error parsing");
-                 break;
-             }
--        } // For TOC's
--        if (l_errhdl)
--        {
--            break;
-+
-+            for(PNOR::SectionId tmpId = PNOR::FIRST_SECTION;
-+                tmpId < PNOR::NUM_SECTIONS;
-+                tmpId = (PNOR::SectionId) (tmpId + 1) )
-+            {
-+                TRACFCOMP(g_trac_pnor, "%s:    size=0x%.8X  flash=0x%.8X  "
-+                       "virt=0x%.16X", cv_EYECATCHER[tmpId], o_TOC[tmpId].size,
-+                       o_TOC[tmpId].flashAddr, o_TOC[tmpId].virtAddr );
-+            }
-         }
-     } while(0);
- 
--    for(PNOR::SectionId tmpId = PNOR::FIRST_SECTION;
--        tmpId < PNOR::NUM_SECTIONS;
--        tmpId = (PNOR::SectionId) (tmpId + 1) )
--    {
--        TRACFCOMP(g_trac_pnor, "%s:    size=0x%.8X  flash=0x%.8X  "
--               "virt=0x%.16X", cv_EYECATCHER[tmpId], o_TOC[tmpId].size,
--               o_TOC[tmpId].flashAddr, o_TOC[tmpId].virtAddr );
--    }
--
-     TRACUCOMP(g_trac_pnor, "< PNOR::parseTOC" );
-     return l_errhdl;
- }
-diff --git a/src/usr/pnor/pnor_common.H b/src/usr/pnor/pnor_common.H
-index 5eb8934..3944e27 100644
---- a/src/usr/pnor/pnor_common.H
-+++ b/src/usr/pnor/pnor_common.H
-@@ -41,22 +41,11 @@ namespace PNOR {
-         uint8_t misc; /**< Misc Flags */
-     } PACKED;
- 
--    // Simple enum of TOC's per PNOR side
--    enum TOCS
--    {
--        TOC_0 = 0,
--        TOC_1 = 1,
--        NUM_TOCS,
--    };
--
-     enum
-     {
--        // @TODO RTC: 120061 - Determine TOC locations
--        // TOC offsets based on pnor layout
--        SIDE_A_TOC_0_OFFSET = 0,
--        SIDE_A_TOC_1_OFFSET = 0x8000,
--        SIDE_B_TOC_0_OFFSET = 0x2000000,
--        SIDE_B_TOC_1_OFFSET = 0x2008000,
-+        NUM_TOCS = 2,
-+        TOC_0_OFFSET = 0,
-+        TOC_1_OFFSET = 0x8000,
- 
-         /** Real number of bytes required to read 1 logical page */
-         PAGESIZE_PLUS_ECC = ((PAGESIZE * 9)/8),  // 8B data + 1B of ECC
-@@ -90,7 +79,7 @@ namespace PNOR {
-      * @return Error
-      */
-     errlHndl_t parseTOC(uint8_t* i_toc0Buffer, uint8_t* i_toc1Buffer,
--           TOCS & o_TOC_used, SectionData_t * o_TOC, uint64_t i_baseVAddr);
-+           uint32_t & o_TOC_used, SectionData_t * o_TOC, uint64_t i_baseVAddr);
- }
- 
- #endif
-diff --git a/src/usr/pnor/pnorrp.C b/src/usr/pnor/pnorrp.C
-index aeaeb22..299a063 100644
---- a/src/usr/pnor/pnorrp.C
-+++ b/src/usr/pnor/pnorrp.C
-@@ -44,7 +44,6 @@
- #include <endian.h>
- #include <util/align.H>
- #include <config.h>
--#include "pnor_common.H"
- 
- 
- extern trace_desc_t* g_trac_pnor;
-@@ -193,9 +192,7 @@ void* wait_for_message( void* unused )
-  * @brief  Constructor
-  */
- PnorRP::PnorRP()
--: iv_activeTocOffsets(SIDE_A_TOC_0_OFFSET,SIDE_A_TOC_1_OFFSET)
--,iv_altTocOffsets(SIDE_B_TOC_0_OFFSET,SIDE_B_TOC_1_OFFSET)
--,iv_TOC_used(TOC_0)
-+: iv_TOC_used(0)
- ,iv_msgQ(NULL)
- ,iv_startupRC(0)
- {
-@@ -234,28 +231,12 @@ void PnorRP::initDaemon()
- 
-     do
-     {
--        // @TODO RTC: 120062 - Determine which side is Golden
--        // Default TOC offsets set to side A. If two side support is enabled,
--        // check which SEEPROM hostboot booted from
--#ifdef CONFIG_TWO_SIDE_SUPPORT
--        TARGETING::Target* pnor_target = TARGETING::
--                                         MASTER_PROCESSOR_CHIP_TARGET_SENTINEL;
--        // Get correct TOC
--        PNOR::sbeSeepromSide_t l_bootSide;
--        PNOR::getSbeBootSeeprom(pnor_target, l_bootSide);
--        if (l_bootSide == PNOR::SBE_SEEPROM1)
--        {
--            TRACFCOMP( g_trac_pnor, "PnorRP::initDaemon> Booting from Side B");
--            iv_activeTocOffsets.first = SIDE_B_TOC_0_OFFSET;
--            iv_activeTocOffsets.second = SIDE_B_TOC_1_OFFSET;
--            iv_altTocOffsets.first = SIDE_A_TOC_0_OFFSET;
--            iv_altTocOffsets.second = SIDE_A_TOC_0_OFFSET;
--        }
--        else
-+        // read the TOC in the PNOR to compute the sections
-+        l_errhdl = readTOC();
-+        if( l_errhdl )
-         {
--            TRACFCOMP( g_trac_pnor, "PnorRP::initDaemon> Booting from Side A");
-+            break;
-         }
--#endif
- 
-         // create a message queue
-         iv_msgQ = msg_q_create();
-@@ -272,7 +253,7 @@ void PnorRP::initDaemon()
-              * @userdata1    Requested Address
-              * @userdata2    rc from mm_alloc_block
-              * @devdesc      PnorRP::initDaemon> Error from mm_alloc_block
--             * @custdesc     A problem occurred while accessing the boot flash.
-+             * @custdesc    A problem occurred while accessing the boot flash.
-              */
-             l_errhdl = new ERRORLOG::ErrlEntry(
-                            ERRORLOG::ERRL_SEV_UNRECOVERABLE,
-@@ -289,14 +270,9 @@ void PnorRP::initDaemon()
-         INITSERVICE::registerBlock(reinterpret_cast<void*>(BASE_VADDR),
-                                    TOTAL_SIZE,PNOR_PRIORITY);
- 
--        // Read the TOC in the PNOR to compute the sections and set their
--        // correct permissions
--        l_errhdl = readTOC();
--        if( l_errhdl )
--        {
--            TRACFCOMP(g_trac_pnor, ERR_MRK"PnorRP::initDaemon: Failed to readTOC");
--            break;
--        }
-+        // Need to set permissions to R/W
-+        rc = mm_set_permission((void*) BASE_VADDR,TOTAL_SIZE,
-+                               WRITABLE | WRITE_TRACKED);
- 
-         // start task to wait on the queue
-         task_create( wait_for_message, NULL );
-@@ -343,7 +319,7 @@ errlHndl_t PnorRP::getSectionInfo( PNOR::SectionId i_section,
-              * @userdata1    Requested Section
-              * @userdata2    Startup RC
-              * @devdesc      PnorRP::getSectionInfo> RP not properly initialized
--             * @custdesc     A problem occurred while accessing the boot flash.
-+             * @custdesc    A problem occurred while accessing the boot flash.
-              */
-             l_errhdl = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE,
-                                                PNOR::MOD_PNORRP_GETSECTIONINFO,
-@@ -370,7 +346,7 @@ errlHndl_t PnorRP::getSectionInfo( PNOR::SectionId i_section,
-              * @userdata1    Requested Section
-              * @userdata2    TOC used
-              * @devdesc      PnorRP::getSectionInfo> Invalid Address for read/write
--             * @custdesc     A problem occurred while accessing the boot flash.
-+             * @custdesc    A problem occurred while accessing the boot flash.
-             */
-             l_errhdl = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE,
-                                                PNOR::MOD_PNORRP_GETSECTIONINFO,
-@@ -402,13 +378,12 @@ errlHndl_t PnorRP::getSectionInfo( PNOR::SectionId i_section,
-                                  != 0) ? true : false;
-         o_info.sha512perEC = ((iv_TOC[id].version & FFS_VERS_SHA512_PER_EC)
-                                != 0) ? true : false;
--        o_info.readOnly = ((iv_TOC[id].misc & FFS_MISC_READ_ONLY)
--                               != 0) ? true : false;
-     }
- 
-     return l_errhdl;
- }
- 
-+
- /**
-  * @brief Read the TOC and store section information
-  */
-@@ -420,7 +395,7 @@ errlHndl_t PnorRP::readTOC()
-     uint8_t* toc1Buffer = new uint8_t[PAGESIZE];
-     uint64_t fatal_error = 0;
-     do {
--        l_errhdl = readFromDevice( iv_activeTocOffsets.first, 0, false,
-+        l_errhdl = readFromDevice( TOC_0_OFFSET, 0, false,
-                                 toc0Buffer, fatal_error );
-         if (l_errhdl)
-         {
-@@ -428,7 +403,7 @@ errlHndl_t PnorRP::readTOC()
-             break;
-         }
- 
--        l_errhdl = readFromDevice( iv_activeTocOffsets.second, 0, false,
-+        l_errhdl = readFromDevice( TOC_1_OFFSET, 0, false,
-                                    toc1Buffer, fatal_error );
-         if (l_errhdl)
-         {
-@@ -437,7 +412,7 @@ errlHndl_t PnorRP::readTOC()
-         }
- 
-         l_errhdl = PNOR::parseTOC(toc0Buffer, toc1Buffer, iv_TOC_used, iv_TOC,
--                                  BASE_VADDR);
-+                   BASE_VADDR);
-         if (l_errhdl)
-         {
-             TRACFCOMP(g_trac_pnor, "readTOC: parseTOC failed");
-@@ -762,63 +737,59 @@ errlHndl_t PnorRP::computeDeviceAddr( void* i_vaddr,
-     o_chip = 99;
-     uint64_t l_vaddr = (uint64_t)i_vaddr;
- 
--    do
-+    // make sure this is one of our addresses
-+    if( !((l_vaddr >= BASE_VADDR)
-+          && (l_vaddr < LAST_VADDR)) )
-     {
--        // make sure this is one of our addresses
--        if( !((l_vaddr >= BASE_VADDR)
--              && (l_vaddr < LAST_VADDR)) )
--        {
--            TRACFCOMP( g_trac_pnor, "PnorRP::computeDeviceAddr> Virtual Address outside known PNOR range : i_vaddr=%p", i_vaddr );
--            /*@
--             * @errortype
--             * @moduleid     PNOR::MOD_PNORRP_WAITFORMESSAGE
--             * @reasoncode   PNOR::RC_INVALID_ADDRESS
--             * @userdata1    Virtual Address
--             * @userdata2    Base PNOR Address
--             * @devdesc      PnorRP::computeDeviceAddr> Virtual Address outside
--             *               known PNOR range
--             * @custdesc    A problem occurred while accessing the boot flash.
--             */
--            l_errhdl = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE,
--                                            PNOR::MOD_PNORRP_COMPUTEDEVICEADDR,
--                                            PNOR::RC_INVALID_ADDRESS,
--                                            l_vaddr,
--                                            BASE_VADDR,
--                                            true /*Add HB SW Callout*/);
--            l_errhdl->collectTrace(PNOR_COMP_NAME);
--            break;
--        }
-+        TRACFCOMP( g_trac_pnor, "PnorRP::computeDeviceAddr> Virtual Address outside known PNOR range : i_vaddr=%p", i_vaddr );
-+        /*@
-+         * @errortype
-+         * @moduleid     PNOR::MOD_PNORRP_WAITFORMESSAGE
-+         * @reasoncode   PNOR::RC_INVALID_ADDRESS
-+         * @userdata1    Virtual Address
-+         * @userdata2    Base PNOR Address
-+         * @devdesc      PnorRP::computeDeviceAddr> Virtual Address outside
-+         *               known PNOR range
-+         * @custdesc    A problem occurred while accessing the boot flash.
-+         */
-+        l_errhdl = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE,
-+                                        PNOR::MOD_PNORRP_COMPUTEDEVICEADDR,
-+                                        PNOR::RC_INVALID_ADDRESS,
-+                                        l_vaddr,
-+                                        BASE_VADDR,
-+                                        true /*Add HB SW Callout*/);
-+        l_errhdl->collectTrace(PNOR_COMP_NAME);
-+        return l_errhdl;
-+    }
- 
--        // find the matching section
--        PNOR::SectionId id = PNOR::INVALID_SECTION;
--        l_errhdl = computeSection( l_vaddr, id );
--        if( l_errhdl )
--        {
--            TRACFCOMP( g_trac_pnor, "PnorRP::computeDeviceAddr> Virtual address does not match any pnor sections : i_vaddr=%p", i_vaddr );
--            break;
--        }
-+    // find the matching section
-+    PNOR::SectionId id = PNOR::INVALID_SECTION;
-+    l_errhdl = computeSection( l_vaddr, id );
-+    if( l_errhdl )
-+    {
-+        return l_errhdl;
-+    }
- 
--        // pull out the information we need to return from our global copy
--        o_chip = iv_TOC[id].chip;
--        o_ecc = (bool)(iv_TOC[id].integrity & FFS_INTEG_ECC_PROTECT);
--        o_offset = l_vaddr - iv_TOC[id].virtAddr; //offset into section
-+    // pull out the information we need to return from our global copy
-+    o_chip = iv_TOC[id].chip;
-+    o_ecc = (bool)(iv_TOC[id].integrity & FFS_INTEG_ECC_PROTECT);
-+    o_offset = l_vaddr - iv_TOC[id].virtAddr; //offset into section
- 
--        // for ECC we need to figure out where the ECC-enhanced offset is
--        //  before tacking on the offset to the section
--        if( o_ecc )
--        {
--            o_offset = (o_offset * 9) / 8;
--        }
--        // add on the offset of the section itself
--        o_offset += iv_TOC[id].flashAddr;
--    } while(0);
-+    // for ECC we need to figure out where the ECC-enhanced offset is
-+    //  before tacking on the offset to the section
-+    if( o_ecc )
-+    {
-+        o_offset = (o_offset * 9) / 8;
-+    }
-+    // add on the offset of the section itself
-+    o_offset += iv_TOC[id].flashAddr;
- 
-     TRACUCOMP( g_trac_pnor, "< PnorRP::computeDeviceAddr: i_vaddr=%X, o_offset=0x%X, o_chip=%d", l_vaddr, o_offset, o_chip );
-     return l_errhdl;
- }
- 
- /**
-- * @brief Static instance function
-+ * @brief Static instance function for testcase only
-  */
- PnorRP& PnorRP::getInstance()
- {
-@@ -1016,10 +987,3 @@ errlHndl_t PnorRP::fixECC (PNOR::SectionId i_section)
-     TRACFCOMP(g_trac_pnor, EXIT_MRK"PnorRP::fixECC");
-     return l_err;
- }
--
--uint64_t PnorRP::getTocOffset(TOCS i_toc) const
--{
--    // Can use a ternary operator because there are only 2 TOCs per side
--    return (i_toc == TOC_0) ? iv_activeTocOffsets.first :
--                              iv_activeTocOffsets.second;
--}
-diff --git a/src/usr/pnor/pnorrp.H b/src/usr/pnor/pnorrp.H
-index 509cf14..3703afe 100644
---- a/src/usr/pnor/pnorrp.H
-+++ b/src/usr/pnor/pnorrp.H
-@@ -76,18 +76,9 @@ class PnorRP
-      */
-     errlHndl_t fixECC(PNOR::SectionId i_section);
- 
--    /**
--     * @brief  Get TOC offset of specified TOC on active side
--     *
--     * @param[in] i_toc     TOC offset desired on active side
--     *
--     * @return uint64_t     TOC offset
--     */
--    uint64_t getTocOffset(PNOR::TOCS i_toc) const;
--
-   protected:
-     /**
--     * @brief  Constructor, default TOC offsets to side A
-+     * @brief  Constructor
-      */
-     PnorRP();
- 
-@@ -98,23 +89,16 @@ class PnorRP
- 
- 
-   private:
--
--    // TOC 0 and 1 offsets of both PNOR sides. The active PNOR side determined
--    // by the Seeprom the SBE booted from
--    std::pair<uint64_t, uint64_t> iv_activeTocOffsets;
--    std::pair<uint64_t, uint64_t> iv_altTocOffsets;
--
-     enum
-     {
-         BASE_VADDR = VMM_VADDR_PNOR_RP, /**< 2GB = 0x80000000*/
-         TOTAL_SIZE = 64*MEGABYTE, /**< Allocate 64 MB (0x4000000)*/
-         LAST_VADDR = BASE_VADDR + TOTAL_SIZE,  /**< End of our VA range */
-     };
--
-     /**
-      * Which TOC (0 or 1) is used after verifying both.
-      */
--    PNOR::TOCS iv_TOC_used;
-+    uint32_t iv_TOC_used;
- 
-     /**
-      * Flash statistics
-@@ -154,8 +138,7 @@ class PnorRP
- 
-     /**
-      * @brief Verify both TOC's and store section information from one of the
--     *        verified TOC's. Additionally set each section permissions
--     *        (e.g. readOnly)
-+     *        verified TOC's
-      *
-      * @return Error from device
-      */
-@@ -241,6 +224,7 @@ class PnorRP
-         return false;
-     };
- 
-+
-     // allow local helper function to call private methods
-     friend void* wait_for_message( void* unused );
- 
-@@ -253,7 +237,7 @@ class PnorRP
-     friend errlHndl_t PNOR::validateAltMaster( void );
- 
-     /**
--     * @brief Static instance function
-+     * @brief Static instance function for testcase only
-      */
-     static PnorRP& getInstance();
- };
-diff --git a/src/usr/pnor/pnorsbe.C b/src/usr/pnor/pnorsbe.C
-deleted file mode 100644
-index 0b61173..0000000
---- a/src/usr/pnor/pnorsbe.C
-+++ /dev/null
-@@ -1,87 +0,0 @@
--/* IBM_PROLOG_BEGIN_TAG                                                   */
--/* This is an automatically generated prolog.                             */
--/*                                                                        */
--/* $Source: src/usr/pnor/pnorsbe.C $                                      */
--/*                                                                        */
--/* OpenPOWER HostBoot Project                                             */
--/*                                                                        */
--/* Contributors Listed Below - COPYRIGHT 2014,2015                        */
--/* [+] International Business Machines Corp.                              */
--/*                                                                        */
--/*                                                                        */
--/* Licensed under the Apache License, Version 2.0 (the "License");        */
--/* you may not use this file except in compliance with the License.       */
--/* You may obtain a copy of the License at                                */
--/*                                                                        */
--/*     http://www.apache.org/licenses/LICENSE-2.0                         */
--/*                                                                        */
--/* Unless required by applicable law or agreed to in writing, software    */
--/* distributed under the License is distributed on an "AS IS" BASIS,      */
--/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or        */
--/* implied. See the License for the specific language governing           */
--/* permissions and limitations under the License.                         */
--/*                                                                        */
--/* IBM_PROLOG_END_TAG                                                     */
--/**
-- *  @file pnorsbe.C
-- *
-- *  @brief Implements PNOR::getSbeBootSeeprom(), which Determines which
-- *         Seeprom was used to boot the SB
-- */
--
--#include <pnor/pnorif.H>
--#include <trace/interface.H>
--#include <errl/errlmanager.H>
--#include <errl/errlentry.H>
--#include <devicefw/userif.H>
--
--extern trace_desc_t* g_trac_pnor;
--
--namespace PNOR
--{
--
--//Used to read SBE Boot Side from processor
--const uint64_t SBE_VITAL_REG_0x0005001C = 0x005001C;
--const uint64_t SBE_BOOT_SELECT_MASK = 0x0080000000000000;
--
--errlHndl_t getSbeBootSeeprom(TARGETING::Target* i_target,
--                             sbeSeepromSide_t& o_bootSide)
--{
--    TRACFCOMP( g_trac_pnor, ENTER_MRK"PNOR::getSbeBootSeeprom()" );
--
--    errlHndl_t err = NULL;
--    uint64_t scomData = 0x0;
--
--    o_bootSide = SBE_SEEPROM0;
--
--    do{
--
--        size_t op_size = sizeof(scomData);
--        err = deviceRead( i_target,
--                          &scomData,
--                          op_size,
--                          DEVICE_SCOM_ADDRESS(SBE_VITAL_REG_0x0005001C) );
--        if( err )
--        {
--            TRACFCOMP( g_trac_pnor, ERR_MRK"PNOR::getSbeBootSeeprom() -Error "
--                       "reading SBE VITAL REG (0x%.8X) from Target :"
--                       "HUID=0x%.8X",
--                       SBE_VITAL_REG_0x0005001C,
--                       TARGETING::get_huid(i_target));
--            break;
--        }
--        if(scomData & SBE_BOOT_SELECT_MASK)
--        {
--            o_bootSide = SBE_SEEPROM1;
--        }
--
--    }while(0);
--
--    TRACFCOMP( g_trac_pnor,
--               EXIT_MRK"PNOR::getSbeBootSeeprom(): o_bootSide=0x%X (reg=0x%X)",
--               o_bootSide, scomData );
--
--    return err;
--}
--
--} // end namespace
-\ No newline at end of file
-diff --git a/src/usr/pnor/pnorvalid.C b/src/usr/pnor/pnorvalid.C
-index 46204ca..1bc09a2 100644
---- a/src/usr/pnor/pnorvalid.C
-+++ b/src/usr/pnor/pnorvalid.C
-@@ -102,7 +102,7 @@ errlHndl_t validateAltMaster( void )
-     // When reading PNOR TOC assume a single page and no ECC
-     uint8_t* tocBuffer = new uint8_t[PAGESIZE];
-     size_t read_size = PAGESIZE;
--    const uint64_t toc0_offset = PnorRP::getInstance().getTocOffset(TOC_0);
-+    const uint64_t toc0_offset = PNOR::TOC_0_OFFSET;
- 
-     do{
- 
-@@ -176,7 +176,8 @@ errlHndl_t validateAltMaster( void )
-             pnordd = new PnorDD(procList[i]);
- 
-             // Read Flash
--            l_err = pnordd->readFlash(tocBuffer, read_size, toc0_offset);
-+            l_err = pnordd->readFlash(tocBuffer, read_size,
-+                                      PNOR::TOC_0_OFFSET);
-             if ( l_err )
-             {
-                 // Commit Error Log, but continue the test
-diff --git a/src/usr/pnor/runtime/rt_pnor.C b/src/usr/pnor/runtime/rt_pnor.C
-index c61aa1d..c43160f 100644
---- a/src/usr/pnor/runtime/rt_pnor.C
-+++ b/src/usr/pnor/runtime/rt_pnor.C
-@@ -297,7 +297,7 @@ errlHndl_t RtPnor::flush( PNOR::SectionId i_section)
- }
- /*******Protected Methods**************/
- RtPnor::RtPnor()
--:iv_TOC_used(PNOR::TOC_0)
-+:iv_TOC_used(0)
- {
-     errlHndl_t l_err = readTOC();
-     if (l_err)
-@@ -588,10 +588,7 @@ errlHndl_t RtPnor::readTOC ()
-             break;
-         }
- 
--        // @TODO RTC:120733
--        // RT code needs a way to get the active side tocs vs just defaulting
--        // to SIDE_A
--        l_err = readFromDevice (l_procId, PNOR::TOC, PNOR::SIDE_A_TOC_0_OFFSET,
-+        l_err = readFromDevice (l_procId, PNOR::TOC, PNOR::TOC_0_OFFSET,
-                 PAGESIZE,false,toc0Buffer);
-         if (l_err)
-         {
-@@ -599,7 +596,7 @@ errlHndl_t RtPnor::readTOC ()
-                       " for TOC0");
-             break;
-         }
--        l_err = readFromDevice (l_procId, PNOR::TOC, PNOR::SIDE_A_TOC_1_OFFSET,
-+        l_err = readFromDevice (l_procId, PNOR::TOC, PNOR::TOC_1_OFFSET,
-                 PAGESIZE, false,toc1Buffer);
-         if (l_err)
-         {
-@@ -608,7 +605,7 @@ errlHndl_t RtPnor::readTOC ()
-             break;
-         }
- 
--        l_err = PNOR::parseTOC(toc0Buffer, toc1Buffer, iv_TOC_used, iv_TOC, 0);
-+        l_err = PNOR::parseTOC(toc0Buffer, toc1Buffer, iv_TOC_used, iv_TOC,0);
-         if (l_err)
-         {
-             TRACFCOMP(g_trac_pnor, "RtPnor::readTOC: parseTOC failed");
-diff --git a/src/usr/pnor/runtime/rt_pnor.H b/src/usr/pnor/runtime/rt_pnor.H
-index f3a03a5..43041fc 100644
---- a/src/usr/pnor/runtime/rt_pnor.H
-+++ b/src/usr/pnor/runtime/rt_pnor.H
-@@ -81,7 +81,7 @@ class RtPnor
-         /**
-         * Which TOC (0 or 1) is used after verifying both.
-         */
--        PNOR::TOCS iv_TOC_used;
-+        uint32_t iv_TOC_used;
- 
-         /**
-          * Cached copy of section data
-diff --git a/src/usr/pnor/test/pnorrptest.H b/src/usr/pnor/test/pnorrptest.H
-index 427227b..04ca729 100644
---- a/src/usr/pnor/test/pnorrptest.H
-+++ b/src/usr/pnor/test/pnorrptest.H
-@@ -517,30 +517,22 @@ class PnorRpTest : public CxxTest::TestSuite
-         uint8_t* corruptBuffer = new uint8_t[PAGESIZE];
- 
-         // Corrupt both ffs header and first entry for each TOC
--        for (PNOR::TOCS cur_TOC = PNOR::TOC_0; cur_TOC < PNOR::NUM_TOCS;
--             cur_TOC = (PNOR::TOCS)(cur_TOC+1))
-+        for (uint32_t cur_TOC = 0; cur_TOC < PNOR::NUM_TOCS; ++cur_TOC)
-         {
--            PNOR::TOCS TOC_used = cur_TOC;
-+            uint32_t TOC_used = cur_TOC;
- 
-             if (cur_TOC == 0)
-             {
--              offset =  PnorRP::getInstance().getTocOffset(PNOR::TOC_0);
-+              offset =  PNOR::TOC_0_OFFSET;
-             }
-             else
-             {
--              offset =  PnorRP::getInstance().getTocOffset(PNOR::TOC_1);
-+              offset =  PNOR::TOC_1_OFFSET;
-             }
- 
-             // Read cur_TOC header data
--            PnorRP::getInstance().readFromDevice( offset, 0, false,
--                                                  tocHeader, fatal_error );
--            if (fatal_error)
--            {
--                TRACFCOMP(g_trac_pnor, "PnorRpTest::test_TOC> ERROR : Could not read TOC header data at offset 0x%X RC=%X",
--                          offset, fatal_error);
--                TS_FAIL("PnorRpTest::test_TOC> ERROR : Could not read TOC header data at offset 0x%X RC=%X",
--                          offset, fatal_error);
--            }
-+            PnorRP::getInstance().readFromDevice( offset, 0, false, tocHeader,
-+                                                  fatal_error );
- 
-             // Corrupt cur_TOC header data
-             memcpy(corruptBuffer, tocHeader, PAGESIZE);
-@@ -567,13 +559,6 @@ class PnorRpTest : public CxxTest::TestSuite
-             PnorRP::getInstance().readFromDevice( offset + FFS_HDR_SIZE, 0,
-                                                   false, tocEntry,
-                                                   fatal_error );
--            if (fatal_error)
--            {
--                TRACFCOMP(g_trac_pnor, "PnorRpTest::test_TOC> ERROR : Could not read first TOC entry data at offset 0x%X RC=%X",
--                          offset, fatal_error);
--                TS_FAIL("PnorRpTest::test_TOC> ERROR : Could not read first TOC entry data at offset 0x%X RC=%X",
--                          offset, fatal_error);
--            }
- 
-             // Corrupt cur_TOC header data
-             memcpy(corruptBuffer, tocEntry, PAGESIZE);
-@@ -606,83 +591,6 @@ class PnorRpTest : public CxxTest::TestSuite
-         TRACFCOMP(g_trac_pnor, "PnorRpTest::test_TOC End");
-     }
- 
--    /**
--     * @brief PNOR RP test - ReadOnlyTag
--     *        Tests if readOnly tag on a section is being processed correctly
--     *
--     */
--    void test_ReadOnlyTag(void)
--    {
--        TRACFCOMP(g_trac_pnor, "PnorRpTest::test_ReadOnlyTag Start" );
--        PNOR::SectionInfo_t l_info;
--        errlHndl_t l_errhdl = NULL;
--        uint64_t chip_select = 0xF;
--        bool needs_ecc = false;
--
--        l_errhdl = PNOR::getSectionInfo(PNOR::TESTRO, l_info);
--        if( l_errhdl )
--        {
--            TRACFCOMP(g_trac_pnor, "PnorRpTest::test_ReadOnlyTag> ERROR : getSectionInfo returned error for %d : RC=%X",
--                      PNOR::TESTRO, l_errhdl->reasonCode());
--            ERRORLOG::errlCommit(l_errhdl, PNOR_COMP_ID);
--            TS_FAIL( "PnorRpTest::test_ReadOnlyTag> ERROR : could not read pnor section %d", PNOR::TESTRO);
--        }
--
--        // Write some data
--        const uint64_t l_writeData = 0x1122334455667788;
--        uint64_t* l_dataptr = reinterpret_cast<uint64_t*> (l_info.vaddr);
--        l_dataptr[0] = l_writeData;
--
--        // Flush the page to make sure it gets out to the device
--        // Due to ReadOnly permissions set on TESTRO should be a no-op
--        int rc = mm_remove_pages( RELEASE, l_dataptr, PAGESIZE );
--        if( rc )
--        {
--            TRACFCOMP( g_trac_pnor, "PnorRpTest::test_ReadOnlyTag> ERROR : error on RELEASE : rc=%X", rc );
--            TS_FAIL( "PnorRpTest::test_ReadOnlyTag> ERROR : error on RELEASE" );
--        }
--
--        // Get physical address of pnor section
--        uint64_t l_address = 0;
--        l_errhdl = PnorRP::getInstance().computeDeviceAddr((void*)l_info.vaddr,
--                                                        l_address,
--                                                        chip_select,
--                                                        needs_ecc);
--        if(l_errhdl)
--        {
--            TRACFCOMP(g_trac_pnor, "PnorRpTest::test_ReadOnlyTag> ERROR : computeDeviceAddr vaddr = 0x%X",l_info.vaddr);
--            errlCommit(l_errhdl,PNOR_COMP_ID);
--            TS_FAIL( "PnorRpTest::test_ReadOnlyTag> ERROR : computeDeviceAddr vaddr = 0x%X",l_info.vaddr);
--        }
--
--        // Read pnor section and check if write did not occur
--        uint64_t l_readData = 0;
--        size_t l_size = sizeof(uint64_t);
--        l_errhdl = deviceRead(TARGETING::MASTER_PROCESSOR_CHIP_TARGET_SENTINEL,
--                              &l_readData,
--                              l_size,
--                              DEVICE_PNOR_ADDRESS(0, l_address));
--        TRACFCOMP(g_trac_pnor, "PnorRpTest::test_ReadOnlyTag> Read Data = 0x%X",l_readData);
--        if(l_errhdl)
--        {
--            TS_FAIL("PnorRpTest::test_ReadOnlyTag: deviceRead() failed! Error committed.");
--            ERRORLOG::errlCommit(l_errhdl, PNOR_COMP_ID);
--        }
--        if(l_readData == l_writeData)
--        {
--            TS_FAIL("PnorRpTest::test_ReadOnlyTag: Data was written to readOnly section = %s",
--                     l_info.name);
--        }
--        if(l_size != sizeof(uint64_t))
--        {
--            TS_FAIL("PnorRpTest::test_ReadOnlyTag: deviceRead() Read length not expected value. Addr: 0x%llx, Exp: %d, Act: %d",
--                    l_address, sizeof(uint64_t), l_size);
--        }
--
--        TRACFCOMP(g_trac_pnor, "PnorRpTest::test_ReadOnlyTag End");
--    }
--
--
-     //@todo - import config data from build and compare to section info
- 
-     /**
-diff --git a/src/usr/sbe/sbe_update.C b/src/usr/sbe/sbe_update.C
-index 698d41a..9dd9e0a 100644
---- a/src/usr/sbe/sbe_update.C
-+++ b/src/usr/sbe/sbe_update.C
-@@ -1214,6 +1214,49 @@ namespace SBE
-     }
- 
- /////////////////////////////////////////////////////////////////////
-+    errlHndl_t getSbeBootSeeprom(TARGETING::Target* i_target,
-+                                 sbeSeepromSide_t& o_bootSide)
-+    {
-+        TRACUCOMP( g_trac_sbe,
-+                   ENTER_MRK"getSbeBootSeeprom()" );
-+
-+        errlHndl_t err = NULL;
-+        uint64_t scomData = 0x0;
-+
-+        o_bootSide = SBE_SEEPROM0;
-+
-+        do{
-+
-+            size_t op_size = sizeof(scomData);
-+            err = deviceRead( i_target,
-+                              &scomData,
-+                              op_size,
-+                              DEVICE_SCOM_ADDRESS(SBE_VITAL_REG_0x0005001C) );
-+            if( err )
-+            {
-+                TRACFCOMP( g_trac_sbe, ERR_MRK"getSbeBootSeeprom() -Error "
-+                           "reading SBE VITAL REG (0x%.8X) from Target :"
-+                           "HUID=0x%.8X",
-+                           SBE_VITAL_REG_0x0005001C,
-+                           TARGETING::get_huid(i_target));
-+                break;
-+            }
-+            if(scomData & SBE_BOOT_SELECT_MASK)
-+            {
-+                o_bootSide = SBE_SEEPROM1;
-+            }
-+
-+        }while(0);
-+
-+        TRACUCOMP( g_trac_sbe,
-+                   EXIT_MRK"getSbeBootSeeprom(): o_bootSide=0x%X (reg=0x%X)",
-+                   o_bootSide, scomData );
-+
-+        return err;
-+    }
-+
-+
-+/////////////////////////////////////////////////////////////////////
-     errlHndl_t getSbeInfoState(sbeTargetState_t& io_sbeState)
-     {
- 
-@@ -1308,11 +1351,11 @@ namespace SBE
-             if(SEEPROM_0_PERMANENT_VALUE ==
-                (io_sbeState.mvpdSbKeyword.flags & PERMANENT_FLAG_MASK))
-             {
--                io_sbeState.permanent_seeprom_side = PNOR::SBE_SEEPROM0;
-+                io_sbeState.permanent_seeprom_side = SBE_SEEPROM0;
-             }
-             else // Side 1 must be permanent
-             {
--                io_sbeState.permanent_seeprom_side = PNOR::SBE_SEEPROM1;
-+                io_sbeState.permanent_seeprom_side = SBE_SEEPROM1;
-             }
- 
- 
-@@ -1361,21 +1404,21 @@ namespace SBE
-             /*  Determine which SEEPROM System Booted On   */
-             /***********************************************/
-             //Get Current (boot) Side
--            PNOR::sbeSeepromSide_t tmp_cur_side = PNOR::SBE_SEEPROM_INVALID;
--            err = PNOR::getSbeBootSeeprom(io_sbeState.target, tmp_cur_side);
-+            sbeSeepromSide_t tmp_cur_side = SBE_SEEPROM_INVALID;
-+            err = getSbeBootSeeprom(io_sbeState.target, tmp_cur_side);
-             if(err)
-             {
-                 TRACFCOMP( g_trac_sbe, ERR_MRK"getSbeInfoState() - Error returned from getSbeBootSeeprom()");
-                 break;
-             }
-             io_sbeState.cur_seeprom_side = tmp_cur_side;
--            if (io_sbeState.cur_seeprom_side == PNOR::SBE_SEEPROM0)
-+            if (io_sbeState.cur_seeprom_side == SBE_SEEPROM0)
-             {
--                io_sbeState.alt_seeprom_side = PNOR::SBE_SEEPROM1;
-+                io_sbeState.alt_seeprom_side = SBE_SEEPROM1;
-             }
--            else if ( io_sbeState.cur_seeprom_side == PNOR::SBE_SEEPROM1)
-+            else if ( io_sbeState.cur_seeprom_side == SBE_SEEPROM1)
-             {
--                io_sbeState.alt_seeprom_side = PNOR::SBE_SEEPROM0;
-+                io_sbeState.alt_seeprom_side = SBE_SEEPROM0;
-             }
-             else
-             {
-@@ -2012,7 +2055,7 @@ namespace SBE
-             /*  Determine what side to update                             */
-             /**************************************************************/
-             // Set cur and alt isDirty values
--            if( io_sbeState.cur_seeprom_side == PNOR::SBE_SEEPROM0 )
-+            if( io_sbeState.cur_seeprom_side == SBE_SEEPROM0 )
-             {
-                 current_side_isDirty = seeprom_0_isDirty;
-                 alt_side_isDirty     = seeprom_1_isDirty;
-@@ -2179,14 +2222,14 @@ namespace SBE
-                     io_sbeState.seeprom_side_to_update = EEPROM::SBE_PRIMARY;
- 
-                     // Update MVPD PERMANENT flag: make cur=perm
--                    ( io_sbeState.cur_seeprom_side == PNOR::SBE_SEEPROM0 ) ?
-+                    ( io_sbeState.cur_seeprom_side == SBE_SEEPROM0 ) ?
-                          // clear bit 0
-                          io_sbeState.mvpdSbKeyword.flags &= ~PERMANENT_FLAG_MASK
-                          : //set bit 0
-                          io_sbeState.mvpdSbKeyword.flags |= PERMANENT_FLAG_MASK;
- 
-                     // Update MVPD RE-IPL SEEPROM flag: re-IPL on ALT:
--                    ( io_sbeState.alt_seeprom_side == PNOR::SBE_SEEPROM0 ) ?
-+                    ( io_sbeState.alt_seeprom_side == SBE_SEEPROM0 ) ?
-                          // clear bit 1
-                          io_sbeState.mvpdSbKeyword.flags &= ~REIPL_SEEPROM_MASK
-                          : //set bit 1
-@@ -2252,18 +2295,18 @@ namespace SBE
- 
-                     // Set Update side to alt
-                     io_sbeState.seeprom_side_to_update =
--                                ( io_sbeState.alt_seeprom_side == PNOR::SBE_SEEPROM0 )
-+                                ( io_sbeState.alt_seeprom_side == SBE_SEEPROM0 )
-                                   ? EEPROM::SBE_PRIMARY : EEPROM::SBE_BACKUP ;
- 
-                     // Update MVPD PERMANENT flag: make cur=perm
--                    ( io_sbeState.cur_seeprom_side == PNOR::SBE_SEEPROM0 ) ?
-+                    ( io_sbeState.cur_seeprom_side == SBE_SEEPROM0 ) ?
-                          // clear bit 0
-                          io_sbeState.mvpdSbKeyword.flags &= ~PERMANENT_FLAG_MASK
-                          : //set bit 0
-                          io_sbeState.mvpdSbKeyword.flags |= PERMANENT_FLAG_MASK;
- 
-                     // Update MVPD RE-IPL SEEPROM flag: re-IPL on ALT:
--                    ( io_sbeState.alt_seeprom_side == PNOR::SBE_SEEPROM0 ) ?
-+                    ( io_sbeState.alt_seeprom_side == SBE_SEEPROM0 ) ?
-                          // clear bit 1
-                          io_sbeState.mvpdSbKeyword.flags &= ~REIPL_SEEPROM_MASK
-                          : //set bit 1
-@@ -2298,13 +2341,13 @@ namespace SBE
- 
-                     // Set Update side to alt
-                     io_sbeState.seeprom_side_to_update =
--                                ( io_sbeState.alt_seeprom_side == PNOR::SBE_SEEPROM0 )
-+                                ( io_sbeState.alt_seeprom_side == SBE_SEEPROM0 )
-                                   ? EEPROM::SBE_PRIMARY : EEPROM::SBE_BACKUP ;
- 
- 
-                     // MVPD flag Update
-                     // Update MVPD flag make cur=perm
--                    ( io_sbeState.cur_seeprom_side == PNOR::SBE_SEEPROM0 ) ?
-+                    ( io_sbeState.cur_seeprom_side == SBE_SEEPROM0 ) ?
-                          // clear bit 0
-                          io_sbeState.mvpdSbKeyword.flags &= ~PERMANENT_FLAG_MASK
-                          : // set bit 0
-@@ -2358,11 +2401,11 @@ namespace SBE
- 
-                     // Set Update side to alt
-                     io_sbeState.seeprom_side_to_update =
--                                ( io_sbeState.alt_seeprom_side == PNOR::SBE_SEEPROM0 )
-+                                ( io_sbeState.alt_seeprom_side == SBE_SEEPROM0 )
-                                   ? EEPROM::SBE_PRIMARY : EEPROM::SBE_BACKUP ;
- 
-                     // Update MVPD RE-IPL SEEPROM flag: re-IPL on ALT:
--                    ( io_sbeState.alt_seeprom_side == PNOR::SBE_SEEPROM0 ) ?
-+                    ( io_sbeState.alt_seeprom_side == SBE_SEEPROM0 ) ?
-                          // clear bit 1
-                          io_sbeState.mvpdSbKeyword.flags &= ~REIPL_SEEPROM_MASK
-                          : // set bit 1
-@@ -2373,7 +2416,7 @@ namespace SBE
-                     if ( g_istep_mode )
-                     {
-                         // Update MVPD PERMANENT flag: make alt=perm
--                        (io_sbeState.alt_seeprom_side == PNOR::SBE_SEEPROM0 ) ?
-+                        (io_sbeState.alt_seeprom_side == SBE_SEEPROM0 ) ?
-                          // clear bit 0
-                          io_sbeState.mvpdSbKeyword.flags &= ~PERMANENT_FLAG_MASK
-                          : //set bit 0
-@@ -2455,11 +2498,11 @@ namespace SBE
- 
-                         // Set Update side to alt
-                         io_sbeState.seeprom_side_to_update =
--                                ( io_sbeState.alt_seeprom_side == PNOR::SBE_SEEPROM0 )
-+                                ( io_sbeState.alt_seeprom_side == SBE_SEEPROM0 )
-                                   ? EEPROM::SBE_PRIMARY : EEPROM::SBE_BACKUP ;
- 
-                         // Update MVPD RE-IPL SEEPROM flag: re-IPL on ALT:
--                        ( io_sbeState.alt_seeprom_side == PNOR::SBE_SEEPROM0 ) ?
-+                        ( io_sbeState.alt_seeprom_side == SBE_SEEPROM0 ) ?
-                           // clear bit 1
-                           io_sbeState.mvpdSbKeyword.flags &= ~REIPL_SEEPROM_MASK
-                           : // set bit 1
-@@ -2491,7 +2534,7 @@ namespace SBE
- 
-                     // Set Update side to alt
-                     io_sbeState.seeprom_side_to_update =
--                                ( io_sbeState.alt_seeprom_side == PNOR::SBE_SEEPROM0 )
-+                                ( io_sbeState.alt_seeprom_side == SBE_SEEPROM0 )
-                                   ? EEPROM::SBE_PRIMARY : EEPROM::SBE_BACKUP ;
- 
-                     TRACFCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: "
-@@ -3201,12 +3244,12 @@ namespace SBE
- 
-                     // Compare against 'current' Master side in case there is
-                     // an issue with the other side
--                    if (io_sbeStates_v[i].cur_seeprom_side == PNOR::SBE_SEEPROM0)
-+                    if (io_sbeStates_v[i].cur_seeprom_side == SBE_SEEPROM0)
-                     {
-                         ver_ptr =
-                             &(io_sbeStates_v[i].seeprom_0_ver.image_version);
-                     }
--                    else // PNOR::SBE_SEEPROM1
-+                    else // SBE_SEEPROM1
-                     {
-                         ver_ptr =
-                             &(io_sbeStates_v[i].seeprom_1_ver.image_version);
-@@ -3346,12 +3389,12 @@ namespace SBE
-                 else
-                 {
-                     // Not Master, so get 'current' version
--                    if (io_sbeStates_v[i].cur_seeprom_side == PNOR::SBE_SEEPROM0)
-+                    if (io_sbeStates_v[i].cur_seeprom_side == SBE_SEEPROM0)
-                     {
-                         ver_ptr =
-                             &(io_sbeStates_v[i].seeprom_0_ver.image_version);
-                     }
--                    else // PNOR::SBE_SEEPROM1
-+                    else // SBE_SEEPROM1
-                     {
-                         ver_ptr =
-                             &(io_sbeStates_v[i].seeprom_1_ver.image_version);
-diff --git a/src/usr/sbe/sbe_update.H b/src/usr/sbe/sbe_update.H
-index e49c582..aa880b2 100644
---- a/src/usr/sbe/sbe_update.H
-+++ b/src/usr/sbe/sbe_update.H
-@@ -5,9 +5,7 @@
- /*                                                                        */
- /* OpenPOWER HostBoot Project                                             */
- /*                                                                        */
--/* Contributors Listed Below - COPYRIGHT 2013,2015                        */
--/* [+] International Business Machines Corp.                              */
--/*                                                                        */
-+/* COPYRIGHT International Business Machines Corp. 2013,2014              */
- /*                                                                        */
- /* Licensed under the Apache License, Version 2.0 (the "License");        */
- /* you may not use this file except in compliance with the License.       */
-@@ -55,6 +53,10 @@ namespace SBE
-     const uint64_t SBE_IMAGE_SEEPROM_ADDRESS    = 0x400; // 1KB
-     const uint64_t SBE_VERSION_SEEPROM_ADDRESS  = 0x300; // 1KB - 256B
- 
-+    //Used to read SBE Boot Side from processor
-+    const uint64_t SBE_VITAL_REG_0x0005001C = 0x005001C;
-+    const uint64_t SBE_BOOT_SELECT_MASK = 0x0080000000000000;
-+
-     // PNOR SBE and SBEC Partition constants
-     const uint32_t MAX_SBE_ENTRIES = 9;
-     const uint32_t SBETOC_EYECATCH = 0x53424500;  //'SBE\0'
-@@ -104,6 +106,14 @@ namespace SBE
-         MVPDOP_WRITE,     // Write version data to MVPD
-     };
- 
-+    // Used to keep track of perm/temp, and cur/alt
-+    enum sbeSeepromSide_t
-+    {
-+        SBE_SEEPROM0         = 0x00,   // corresponds to EEPROM::SBE_PRIMARY
-+        SBE_SEEPROM1         = 0x01,   // corresponts to EEPROM::SBE_BACKUP
-+        SBE_SEEPROM_INVALID  = 0xFF,
-+    };
-+
-     // Actions can be combined
-     enum sbeUpdateActions_t
-     {
-@@ -117,6 +127,7 @@ namespace SBE
-         UNSUPPORTED_SITUATION  = 0x80000000,
-     };
- 
-+
-     /******************************************/
-     /*  Structs                               */
-     /******************************************/
-@@ -196,9 +207,9 @@ namespace SBE
-         bool                     seeprom_0_ver_ECC_fail;
-         bool                     seeprom_1_ver_ECC_fail;
- 
--        PNOR::sbeSeepromSide_t         cur_seeprom_side; // aka 'booted' side
--        PNOR::sbeSeepromSide_t         alt_seeprom_side;
--        PNOR::sbeSeepromSide_t         permanent_seeprom_side;
-+        sbeSeepromSide_t         cur_seeprom_side; // aka 'booted' side
-+        sbeSeepromSide_t         alt_seeprom_side;
-+        sbeSeepromSide_t         permanent_seeprom_side;
- 
-         // Customized Image Information for this Target
-         size_t                   customizedImage_size;
-@@ -318,6 +329,21 @@ namespace SBE
-                                    void* io_imgPtr,
-                                    size_t& o_actImgSize);
- 
-+
-+    /**
-+     * @brief Determines which Seeprom was used to boot the SBE
-+     *
-+     * @param[in] i_target      Target processor to customize
-+     *
-+     * @param[out] o_bootSide   The Seeprom the SBE booted from
-+     *
-+     * @return errlHndl_t    Error log handle on failure.
-+     */
-+
-+    errlHndl_t getSbeBootSeeprom(TARGETING::Target* i_target,
-+                                 sbeSeepromSide_t& o_bootSide);
-+
-+
-     /**
-      * @brief Collects Version information from a specific SEEPROM
-      *
-diff --git a/src/usr/sbe/test/sbeupdatetest.H b/src/usr/sbe/test/sbeupdatetest.H
-index 5e25706..d235141 100644
---- a/src/usr/sbe/test/sbeupdatetest.H
-+++ b/src/usr/sbe/test/sbeupdatetest.H
-@@ -580,7 +580,7 @@ class SBEUpdateTest: public CxxTest::TestSuite
-         {
-             // Inputs
-             uint8_t                      i_situation;
--            PNOR::sbeSeepromSide_t       i_cur;     // current_seeprom_side
-+            sbeSeepromSide_t             i_cur;     // current_seeprom_side
-             uint8_t                      i_flags;   // mvpdSbKeyword.flags
- 
-             // Expected Output
-@@ -596,7 +596,7 @@ class SBEUpdateTest: public CxxTest::TestSuite
-             // - update alt=1
-             // - make cur=perm
-             // - re-IPL
--            { 0xE0, PNOR::SBE_SEEPROM0, 0x80,
-+            { 0xE0, SBE_SEEPROM0, 0x80,
-               static_cast<sbeUpdateActions_t>
-                      (DO_UPDATE|IPL_RESTART|UPDATE_MVPD|UPDATE_SBE),
-               EEPROM::SBE_BACKUP, 0x40 },
-@@ -606,7 +606,7 @@ class SBEUpdateTest: public CxxTest::TestSuite
-             // - update alt=0
-             // - make cur=perm
-             // - re-IPL
--            { 0xC0, PNOR::SBE_SEEPROM1, 0x00,
-+            { 0xC0, SBE_SEEPROM1, 0x00,
-               static_cast<sbeUpdateActions_t>
-                      (DO_UPDATE|IPL_RESTART|UPDATE_MVPD|UPDATE_SBE),
-               EEPROM::SBE_PRIMARY, 0x80 },
-@@ -616,7 +616,7 @@ class SBEUpdateTest: public CxxTest::TestSuite
-             // - update alt=0
-             // - make cur=perm
-             // - Continue IPL
--            { 0xA0, PNOR::SBE_SEEPROM1, 0x00,
-+            { 0xA0, SBE_SEEPROM1, 0x00,
-               static_cast<sbeUpdateActions_t>
-                      (DO_UPDATE|UPDATE_MVPD|UPDATE_SBE),
-               EEPROM::SBE_PRIMARY, 0x80 },
-@@ -625,7 +625,7 @@ class SBEUpdateTest: public CxxTest::TestSuite
-             // Arbitrarily set cur side to 1 (therefore perm set to 0)
-             // - No updates
-             // - Continue IPL
--            { 0x80, PNOR::SBE_SEEPROM1, 0x00,
-+            { 0x80, SBE_SEEPROM1, 0x00,
-               static_cast<sbeUpdateActions_t>(CLEAR_ACTIONS),
-               EEPROM::LAST_CHIP_TYPE, 0x00 },
- 
-@@ -633,7 +633,7 @@ class SBEUpdateTest: public CxxTest::TestSuite
-             // Arbitrarily set cur side to 0 (therefore perm set to 0)
-             // - update alt=1
-             // - re-IPL
--            { 0x60, PNOR::SBE_SEEPROM0, 0x00,
-+            { 0x60, SBE_SEEPROM0, 0x00,
-               static_cast<sbeUpdateActions_t>
-                      (DO_UPDATE|IPL_RESTART|UPDATE_MVPD|UPDATE_SBE),
-               EEPROM::SBE_BACKUP, 0x40 },
-@@ -644,14 +644,14 @@ class SBEUpdateTest: public CxxTest::TestSuite
-             // Arbitrarily set cur side to 1 (therefore perm set to 1)
-             // - update alt=0
-             // - re-IPL
--            { 0x40, PNOR::SBE_SEEPROM1, 0x80,
-+            { 0x40, SBE_SEEPROM1, 0x80,
-               static_cast<sbeUpdateActions_t>
-                      (DO_UPDATE|IPL_RESTART|UPDATE_MVPD|UPDATE_SBE),
-               EEPROM::SBE_PRIMARY, 0x80 },
- 
-             // Repeat previous case to make sure global variables are used
-             // correctly to save MBOX value
--            { 0x40, PNOR::SBE_SEEPROM1, 0x80,
-+            { 0x40, SBE_SEEPROM1, 0x80,
-               static_cast<sbeUpdateActions_t>
-                      (DO_UPDATE|IPL_RESTART|UPDATE_MVPD|UPDATE_SBE),
-               EEPROM::SBE_PRIMARY, 0x80 },
-@@ -660,7 +660,7 @@ class SBEUpdateTest: public CxxTest::TestSuite
-             // Arbitrarily set cur side to 0 (therefore perm set to 0)
-             // - update alt=1
-             // - Continue IPL
--            { 0x20, PNOR::SBE_SEEPROM0, 0x00,
-+            { 0x20, SBE_SEEPROM0, 0x00,
-               static_cast<sbeUpdateActions_t>(DO_UPDATE|UPDATE_SBE),
-               EEPROM::SBE_BACKUP, 0x00 },
- 
-@@ -670,7 +670,7 @@ class SBEUpdateTest: public CxxTest::TestSuite
-             // - Continue IPL
-             // NOTE: this will test that right-most-bit is ignored:
-             //  so techincally case 0x01, which should be = case 0x00
--            { 0x01, PNOR::SBE_SEEPROM0, 0x00,
-+            { 0x01, SBE_SEEPROM0, 0x00,
-               static_cast<sbeUpdateActions_t>(CLEAR_ACTIONS),
-               EEPROM::LAST_CHIP_TYPE, 0x00 },
- #endif // SBE_UPDATE_SEQUENTIAL
-@@ -708,8 +708,8 @@ class SBEUpdateTest: public CxxTest::TestSuite
-                 sbeState.cur_seeprom_side = testData[i].i_cur;
- 
-                 sbeState.alt_seeprom_side =
--                             ( ( testData[i].i_cur == PNOR::SBE_SEEPROM0 )
--                               ? PNOR::SBE_SEEPROM1 : PNOR::SBE_SEEPROM0 );
-+                             ( ( testData[i].i_cur == SBE_SEEPROM0 )
-+                               ? SBE_SEEPROM1 : SBE_SEEPROM0 );
- 
-                 sbeState.mvpdSbKeyword.flags = testData[i].i_flags;
- 
--- 
-1.8.2.2
-
diff --git a/openpower/package/hostboot/hostboot.mk b/openpower/package/hostboot/hostboot.mk
index e404f8a..7e1af21 100644
--- a/openpower/package/hostboot/hostboot.mk
+++ b/openpower/package/hostboot/hostboot.mk
@@ -4,7 +4,7 @@
 #
 ################################################################################
 
-HOSTBOOT_VERSION ?= 07bb80e9281ed8aafbd283d5ab2c0f777e347b73
+HOSTBOOT_VERSION ?= 7894fc7b2f7e848267b4f3666f5d8410ea9b894a
 HOSTBOOT_SITE ?= $(call github,open-power,hostboot,$(HOSTBOOT_VERSION))
 
 HOSTBOOT_LICENSE = Apache-2.0
diff --git a/openpower/package/openpower-pnor/openpower-pnor.mk b/openpower/package/openpower-pnor/openpower-pnor.mk
index 63dc69a..15e4417 100644
--- a/openpower/package/openpower-pnor/openpower-pnor.mk
+++ b/openpower/package/openpower-pnor/openpower-pnor.mk
@@ -8,7 +8,7 @@
 # make doesn't care for quotes in the dependencies.
 XML_PACKAGE=$(subst $\",,$(BR2_OPENPOWER_XML_PACKAGE))
 
-OPENPOWER_PNOR_VERSION ?= f2dd4340228d1287a2622faffdfecebce9a321dd
+OPENPOWER_PNOR_VERSION ?= 94389f62eabecf00ef129b4184bf4ba2bc9cd193
 OPENPOWER_PNOR_SITE ?= $(call github,open-power,pnor,$(OPENPOWER_PNOR_VERSION))
 
 OPENPOWER_PNOR_LICENSE = Apache-2.0
