Merge pull request #56 from ploetzma/hostbootUpdates

Update hostboot commit
diff --git a/openpower/package/hostboot/hostboot-0003-Revert-redundent-copy-of-hb-code-in-pnor.patch b/openpower/package/hostboot/hostboot-0003-Revert-redundent-copy-of-hb-code-in-pnor.patch
deleted file mode 100644
index 0fb587f..0000000
--- a/openpower/package/hostboot/hostboot-0003-Revert-redundent-copy-of-hb-code-in-pnor.patch
+++ /dev/null
@@ -1,3424 +0,0 @@
-From 5adea56942b770c02118e322e417f015415421f9 Mon Sep 17 00:00:00 2001
-From: Matt Ploetz <maploetz@us.ibm.com>
-Date: Mon, 16 Feb 2015 14:50:05 -0600
-Subject: [PATCH 1/3] 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 d277e6fce112af0088d2179a07482b71cc3f083e Mon Sep 17 00:00:00 2001
-From: Matt Ploetz <maploetz@us.ibm.com>
-Date: Mon, 16 Feb 2015 14:50:17 -0600
-Subject: [PATCH 2/3] 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 fc5492346de6fdc8e2f58e8ec58881de6aae5510 Mon Sep 17 00:00:00 2001
-From: Matt Ploetz <maploetz@us.ibm.com>
-Date: Mon, 16 Feb 2015 14:58:48 -0600
-Subject: [PATCH 3/3] Revert "Support for Redundant Copy of HB code in PNOR"
-
-This reverts commit 67c5a1ebe73f81bca1bb6608bbb8f204f0f37fa8.
-
-Conflicts:
-	src/usr/sbe/sbe_update.C
-
-Change-Id: I84530811fb6204a29e879bce8065a17964df1a72
----
- src/build/buildpnor/buildpnor.pl            | 588 +++++++++++-----------------
- src/build/buildpnor/defaultPnorLayout.xml   |  87 ++--
- src/build/mkrules/hbfw/img/makefile         |   2 +-
- src/include/usr/hwas/hwasPlatDeconfigGard.H |  15 -
- src/include/usr/pnor/pnor_reasoncodes.H     |   2 -
- src/include/usr/pnor/pnorif.H               |  39 +-
- src/usr/hwas/hwasPlatDeconfigGard.C         |  87 +---
- src/usr/pnor/HBconfig                       |   5 -
- src/usr/pnor/common/ffs_hb.H                |   3 +-
- 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                    |  97 +++--
- src/usr/sbe/sbe_update.H                    |  34 +-
- src/usr/sbe/test/sbeupdatetest.H            |  24 +-
- 22 files changed, 529 insertions(+), 1043 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..7c5bd92 100755
---- a/src/build/buildpnor/buildpnor.pl
-+++ b/src/build/buildpnor/buildpnor.pl
-@@ -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..e20439e 100644
---- a/src/build/buildpnor/defaultPnorLayout.xml
-+++ b/src/build/buildpnor/defaultPnorLayout.xml
-@@ -24,50 +24,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 +73,6 @@ Layout Description
-         <eyeCatch>GUARD</eyeCatch>
-         <physicalOffset>0x58000</physicalOffset>
-         <physicalRegionSize>0x5000</physicalRegionSize>
--        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -83,7 +80,6 @@ Layout Description
-         <eyeCatch>HBD</eyeCatch>
-         <physicalOffset>0x5D000</physicalOffset>
-         <physicalRegionSize>0x120000</physicalRegionSize>
--        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -92,7 +88,6 @@ Layout Description
-         <!--NOTE: MUST update standalone.simics if offset changes -->
-          <physicalOffset>0x17D000</physicalOffset>
-         <physicalRegionSize>0x48000</physicalRegionSize>
--        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -101,7 +96,6 @@ Layout Description
-         <!--NOTE: MUST update standalone.simics if offset changes -->
-         <physicalOffset>0x1C5000</physicalOffset>
-         <physicalRegionSize>0x90000</physicalRegionSize>
--        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -110,7 +104,6 @@ Layout Description
-         <!--NOTE: MUST update standalone.simics if offset changes -->
-         <physicalOffset>0x255000</physicalOffset>
-         <physicalRegionSize>0x48000</physicalRegionSize>
--        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -119,7 +112,6 @@ Layout Description
-         <physicalOffset>0x29D000</physicalOffset>
-         <physicalRegionSize>0x5A0000</physicalRegionSize>
-         <sha512Version/>
--        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -128,7 +120,6 @@ Layout Description
-         <physicalOffset>0x83D000</physicalOffset>
-         <physicalRegionSize>0x90000</physicalRegionSize>
-         <sha512perEC/>
--        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -137,7 +128,6 @@ Layout Description
-         <physicalOffset>0x8CD000</physicalOffset>
-         <physicalRegionSize>0x48000</physicalRegionSize>
-         <sha512perEC/>
--        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -146,7 +136,6 @@ Layout Description
-         <physicalOffset>0x915000</physicalOffset>
-         <physicalRegionSize>0x120000</physicalRegionSize>
-         <sha512Version/>
--        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -155,7 +144,6 @@ Layout Description
-         <physicalOffset>0xA35000</physicalOffset>
-         <physicalRegionSize>0x240000</physicalRegionSize>
-         <sha512Version/>
--        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -163,7 +151,6 @@ Layout Description
-         <eyeCatch>PAYLOAD</eyeCatch>
-         <physicalOffset>0xC75000</physicalOffset>
-         <physicalRegionSize>0x1680000</physicalRegionSize>
--        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -172,18 +159,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 +168,6 @@ Layout Description
-         <physicalOffset>0x3F67000</physicalOffset>
-         <physicalRegionSize>0x90000</physicalRegionSize>
-         <sha512Version/>
--        <sideless/>
-         <ecc/>
-     </section>
-     <section>
-@@ -201,7 +175,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..8b229ad 100755
---- a/src/build/mkrules/hbfw/img/makefile
-+++ b/src/build/mkrules/hbfw/img/makefile
-@@ -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..985d261 100644
---- a/src/include/usr/hwas/hwasPlatDeconfigGard.H
-+++ b/src/include/usr/hwas/hwasPlatDeconfigGard.H
-@@ -32,8 +32,6 @@
- #ifndef HWASPLATDECONFIGGARD_H_
- #define HWASPLATDECONFIGGARD_H_
- 
--#include <pnor/pnorif.H>
--
- /**
-  *  @brief Adapt common singleton declaration to specific platform
-  *
-@@ -68,19 +66,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..f163c0c 100644
---- a/src/usr/hwas/hwasPlatDeconfigGard.C
-+++ b/src/usr/hwas/hwasPlatDeconfigGard.C
-@@ -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..3defcd4 100644
---- a/src/usr/pnor/common/ffs_hb.H
-+++ b/src/usr/pnor/common/ffs_hb.H
-@@ -27,7 +27,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 +65,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 a2fad1e..f9865ca 100644
---- a/src/usr/sbe/sbe_update.C
-+++ b/src/usr/sbe/sbe_update.C
-@@ -1221,6 +1221,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)
-     {
- 
-@@ -1315,11 +1358,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;
-             }
- 
- 
-@@ -1368,21 +1411,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
-             {
-@@ -2018,7 +2061,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;
-@@ -2207,7 +2250,7 @@ namespace SBE
-                 // Set Update side to cur
-                 io_sbeState.seeprom_side_to_update =
-                                 ( io_sbeState.cur_seeprom_side ==
--                                              PNOR::SBE_SEEPROM0 )
-+                                              SBE_SEEPROM0 )
-                                   ? EEPROM::SBE_PRIMARY : EEPROM::SBE_BACKUP;
- 
-                 TRACFCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: "
-@@ -2251,14 +2294,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
-@@ -2325,18 +2368,18 @@ namespace SBE
-                     // Set Update side to alt
-                     io_sbeState.seeprom_side_to_update =
-                                 ( io_sbeState.alt_seeprom_side ==
--                                              PNOR::SBE_SEEPROM0 )
-+                                              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
-@@ -2372,13 +2415,13 @@ namespace SBE
-                     // Set Update side to alt
-                     io_sbeState.seeprom_side_to_update =
-                                 ( io_sbeState.alt_seeprom_side ==
--                                              PNOR::SBE_SEEPROM0 )
-+                                              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
-@@ -2433,11 +2476,11 @@ namespace SBE
-                     // Set Update side to alt
-                     io_sbeState.seeprom_side_to_update =
-                                 ( io_sbeState.alt_seeprom_side ==
--                                              PNOR::SBE_SEEPROM0 )
-+                                              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
-@@ -2448,7 +2491,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
-@@ -2531,11 +2574,11 @@ namespace SBE
-                         // Set Update side to alt
-                         io_sbeState.seeprom_side_to_update =
-                                 ( io_sbeState.alt_seeprom_side ==
--                                              PNOR::SBE_SEEPROM0 )
-+                                              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
-@@ -2568,7 +2611,7 @@ namespace SBE
-                     // Set Update side to alt
-                     io_sbeState.seeprom_side_to_update =
-                                 ( io_sbeState.alt_seeprom_side ==
--                                              PNOR::SBE_SEEPROM0 )
-+                                              SBE_SEEPROM0 )
-                                   ? EEPROM::SBE_PRIMARY : EEPROM::SBE_BACKUP ;
- 
-                     TRACFCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: "
-@@ -3279,12 +3322,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)
-+                                          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);
-@@ -3428,12 +3471,12 @@ namespace SBE
-                 {
-                     // Not Master, so get 'current' version
-                     if (io_sbeStates_v[i].cur_seeprom_side ==
--                                          PNOR::SBE_SEEPROM0)
-+                                          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..09aa476 100644
---- a/src/usr/sbe/sbe_update.H
-+++ b/src/usr/sbe/sbe_update.H
-@@ -55,6 +55,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 +108,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 +129,7 @@ namespace SBE
-         UNSUPPORTED_SITUATION  = 0x80000000,
-     };
- 
-+
-     /******************************************/
-     /*  Structs                               */
-     /******************************************/
-@@ -196,9 +209,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 +331,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-0004-Serverwiz2-scripts.patch b/openpower/package/hostboot/hostboot-0004-Serverwiz2-scripts.patch
deleted file mode 100644
index 9d7a6c0..0000000
--- a/openpower/package/hostboot/hostboot-0004-Serverwiz2-scripts.patch
+++ /dev/null
@@ -1,456 +0,0 @@
-From 8f139eab659dc681e24a8c414dac00607a090fa0 Mon Sep 17 00:00:00 2001
-From: Matt Ploetz <maploetz@us.ibm.com>
-Date: Mon, 16 Feb 2015 13:15:43 -0600
-Subject: [PATCH] New Serverwiz2 patches
-
-Change-Id: I4ba05d89e9ca0ef3298c0f9d503f349782632d89
----
- src/build/mkrules/dist.targets.mk      |   3 +-
- src/usr/targeting/common/Targets.pm    |  24 ++---
- src/usr/targeting/common/processMrw.pl | 171 ++++++++++++++-------------------
- 3 files changed, 88 insertions(+), 110 deletions(-)
- mode change 100644 => 100755 src/usr/targeting/common/Targets.pm
- mode change 100644 => 100755 src/usr/targeting/common/processMrw.pl
-
-diff --git a/src/build/mkrules/dist.targets.mk b/src/build/mkrules/dist.targets.mk
-index ca28150..4b541ce 100644
---- a/src/build/mkrules/dist.targets.mk
-+++ b/src/build/mkrules/dist.targets.mk
-@@ -74,7 +74,8 @@ COPY_FILES = \
-     src/usr/hwpf/hwp/initfiles/sample.initfile:tools \
-     src/build/buildpnor/buildSbePart.pl:openpower \
-     src/build/buildpnor/buildpnor.pl:openpower \
--    src/usr/targeting/common/genHwsvMrwXml.pl:openpower \
-+    src/usr/targeting/common/processMrw.pl:openpower \
-+    src/usr/targeting/common/Targets.pm:openpower \
-     src/usr/targeting/common/xmltohb/mergexml.sh:openpower \
-     src/usr/targeting/common/xmltohb/attribute_types.xml:openpower \
-     src/usr/targeting/common/xmltohb/attribute_types_hb.xml:openpower \
-diff --git a/src/usr/targeting/common/Targets.pm b/src/usr/targeting/common/Targets.pm
-old mode 100644
-new mode 100755
-index d4c2bfa..53568cf
---- a/src/usr/targeting/common/Targets.pm
-+++ b/src/usr/targeting/common/Targets.pm
-@@ -194,6 +194,7 @@ sub printAttribute
-     $filter{MBA_NUM}                        = 1;
-     $filter{IPMI_INSTANCE}                  = 1;
-     $filter{INSTANCE_ID}                    = 1;
-+    $filter{ADC_CHANNEL_SENSOR_NUMBERS}     = 1;
- 
-     if ($filter{$attribute} == 1)
-     {
-@@ -286,7 +287,7 @@ sub buildHierarchy
-     $self->{data}->{INSTANCE_PATH} = $old_path . "/" . $target;
- 
-     ## copy attributes
--
-+    
-     foreach my $attribute (keys %{ $target_xml->{attribute} })
-     {
-         my $value = $target_xml->{attribute}->{$attribute}->{default};
-@@ -317,7 +318,7 @@ sub buildHierarchy
-             $self->setAttribute($key, $attribute, $value);
-         }
-     }
--    ## global attributes overwrite local
-+    ## global attributes overwrite local   
-     foreach my $prop (keys %{$self->{xml}->{globalSetting}->{$key}->{property}})
-     {
-         my $val=$self->{xml}->{globalSetting}->{$key}->{property}->
-@@ -400,7 +401,7 @@ sub buildAffinity
-         {
-             $proc = -1;
-             $node = -1;
--
-+            
-             $self->{targeting}{SYS}[0]{KEY} = $target;
-             $self->setAttribute($target, "AFFINITY_PATH", "affinity:sys-0");
-             $self->setAttribute($target, "PHYS_PATH",     "physical:sys-0");
-@@ -443,7 +444,7 @@ sub buildAffinity
-             $self->{NUM_PROCS_PER_NODE} = $proc + 1;
-             $self->{targeting}->{SYS}[0]{NODES}[$node]{PROCS}[$proc]{KEY} =
-               $target;
--
-+            
-             $self->setHuid($target, 0, $node);
-             my $socket = $self->getTargetParent(
-                          $self->getTargetParent($target));
-@@ -475,7 +476,7 @@ sub buildAffinity
-                 ## don't want non-hostboot targets
-                 if ($unit_type_id > 0)
-                 {
--
-+                    
-                     push(@{$self->{targeting}
-                             ->{SYS}[0]{NODES}[$node]{PROCS}[$proc]{$unit_type}},
-                             { 'KEY' => $unit });
-@@ -490,7 +491,7 @@ sub buildAffinity
-                     $self->setHuid($unit, 0, $node);
-                     if ($unit_type eq "OCC")
-                     {
--                        $self->setAttribute($unit, "ENTITY_INSTANCE",$proc);
-+                        $self->setAttribute($unit, "ENTITY_INSTANCE",$proc);                        
-                     }
-                     ## export core
-                     if ($unit_type eq "EX")
-@@ -610,9 +611,9 @@ sub processMcs
-         $self->{targeting}
-           ->{SYS}[0]{NODES}[$node]{PROCS}[$proc]{MCSS}[$mcs] {MEMBUFS}[0]{KEY} =
-           $membuf;
--
-+          
-         $self->setAttribute($membuf, "ENTITY_INSTANCE",
--               $self->{membuf_inst_num});
-+               $self->{membuf_inst_num});   
-         $self->{membuf_inst_num}++;
-         ## get the mbas
-         foreach my $child (@{ $self->{data}->{TARGETS}{$membuf}{CHILDREN} })
-@@ -629,7 +630,7 @@ sub processMcs
-                     $node_phys . "/membuf-$membufnum/l4-0");
-                 $self->setHuid($child, 0, $node);
-             }
--
-+            
-             if ($self->getType($child) eq "MBA")
-             {
-                 my $mba = $self->getAttribute($child,"MBA_NUM");
-@@ -671,10 +672,9 @@ sub processMcs
-                         $self->setHuid($dimm, 0, $node);
-                         $self->{targeting}
-                           ->{SYS}[0]{NODES}[$node]{PROCS}[$proc] {MCSS}[$mcs]
--                          {MEMBUFS}[0]{MBAS}[$mba]{DIMMS}[$affinitypos]{KEY}
--                                = $dimm;
-+                          {MEMBUFS}[0]{MBAS}[$mba] {DIMMS}[$affinitypos]{KEY} = $dimm;
-                         $self->setAttribute($dimm, "ENTITY_INSTANCE",
--                             $self->{dimm_tpos});
-+                             $self->{dimm_tpos});  
-                         $self->{dimm_tpos}++;
-                         $affinitypos++;
-                     }
-diff --git a/src/usr/targeting/common/processMrw.pl b/src/usr/targeting/common/processMrw.pl
-old mode 100644
-new mode 100755
-index 18107df..1fb292f
---- a/src/usr/targeting/common/processMrw.pl
-+++ b/src/usr/targeting/common/processMrw.pl
-@@ -84,7 +84,7 @@ foreach my $target (sort keys %{ $targetObj->getAllTargets() })
-     if ($type eq "SYS")
-     {
-         processSystem($targetObj, $target);
--    }
-+    } 
-     elsif ($type eq "PROC")
-     {
-         processProcessor($targetObj, $target);
-@@ -141,7 +141,7 @@ if ($report)
- {
-     my $report_file = $xmldir . "/" . $targetObj->getSystemName() . ".rpt";
-     open(SUM,">$report_file") || die "Unable to create: $report_file\n";
--    my $ref = $targetObj->{targeting}->{SYS}[0]{NODES}[0]{PROCS};
-+    my $ref = $targetObj->{targeting}->{SYS}[0]{NODES}[0]{PROCS};       
-     foreach my $proc (@{$ref})
-     {
-         foreach my $mcs (@{$proc->{MCSS}})
-@@ -149,7 +149,7 @@ if ($report)
-             my $mcs_target = $mcs->{KEY};
-             my $membuf=$mcs->{MEMBUFS}[0];
-             my $membuf_target = $membuf->{KEY};
--
-+          
-             my $sch = $targetObj->getAttribute($mcs_target,
-                       "SCHEMATIC_INTERFACE");
-             my $aff = $targetObj->getAttribute($mcs_target,"AFFINITY_PATH");
-@@ -158,7 +158,7 @@ if ($report)
-             if ($membuf_target ne "") {
-                 foreach my $mba (@{$membuf->{MBAS}}) {
-                     my $mba_target = $mba->{KEY};
--
-+               
-                     $huid = $targetObj->getAttribute($mba_target,"HUID");
-                     $aff = $targetObj->getAttribute($mcs_target,
-                                    "AFFINITY_PATH");
-@@ -177,7 +177,7 @@ if ($report)
-                         my $sens = $targetObj->getAttribute($dimm_target,
-                                   "IPMI_SENSORS");
-                         my @s = split(/\,/,$sens);
--
-+                        
-                         print SUM "\t\t$huid | $dimm_target".
-                                   " | $aff | $p | $d | $i2c | ".
-                                   "$s[0],$s[1] | $s[2],$s[3]\n";
-@@ -194,82 +194,6 @@ if ($report)
- ## Processing subroutines
- 
- #--------------------------------------------------
--## SDRs
--##
--
--sub processSdr
--{
--    my $targetObj = shift;
--    my $target = shift;
--    my $sdrObj = shift;
--
--    my @ipmi_sensors;
--    my %id_lu;
--
--    if ($targetObj->isBadAttribute($target,"ENTITY_ID_LOOKUP")==1)
--    {
--        return;
--    }
--    my $entity_id_lookup = $targetObj->getAttribute($target,"ENTITY_ID_LOOKUP");
--    if ($entity_id_lookup ne "") {
--        my $pos=0;
--        if ($targetObj->isBadAttribute($target,"IPMI_INSTANCE")==1)
--        {
--            $pos = $targetObj->getAttribute($target,"ENTITY_INSTANCE");
--        }
--        else
--        {
--            $pos = $targetObj->getAttribute($target,"IPMI_INSTANCE");
--        }
--        print  "$entity_id_lookup,$pos\n";
--        my @ids = split(/,/,$entity_id_lookup);
--        foreach my $i (@ids)
--        {
--            my $i_int = oct($i);
--            if ($i_int>0)
--            {
--                $id_lu{$i_int}=1;
--            }
--        }
--        foreach my $s (@{$sdrObj->{data}})
--        {
--            my $sdr_entity_id = oct($s->{entity_id});
--            if ($s->{name}=~/Core/) {
--                $sdr_entity_id=208;
--            }
--            if ($id_lu{$sdr_entity_id}>0)
--            {
--                my $sensor_id=$s->{sensor_id};
--                my $instance_id=oct($s->{entity_instance});
--                my $sensor_type=oct($s->{sensor_type});
--                if ($instance_id==$pos)
--                {
--                    print "IMPORTING: $target; pos=$pos; entity_id=".
--                           "$sdr_entity_id; ".
--                           "sensor_id=$sensor_id; sensor_type=$sensor_type\n";
--                    my $eid=sprintf("0x%02x%02x",$sensor_type,$sdr_entity_id);
--                    my $sid=sprintf("0x%02x",$s->{sensor_id});
--                    push(@ipmi_sensors,$eid.",".$sid);
--                    $id_lu{$sdr_entity_id}++;
--                }
--            }
--        }
--        foreach my $k (keys(%id_lu)) {
--            if ($id_lu{$k}==1)
--            {
--                print "WARNING: $target; pos=$pos; entity_id=$k; ".
--                      "not imported\n";
--                #$targetObj->myExit(3);
--            }
--        }
--        for (my $i=@ipmi_sensors;$i<16;$i++)
--        {
--            push(@ipmi_sensors,"0xFFFF,0xFF");
--        }
--        my $ipmi = join(',',@ipmi_sensors);
--        $targetObj->setAttribute($target,"IPMI_SENSORS",$ipmi);
--    }
--}
- 
- #--------------------------------------------------
- ## System
-@@ -347,7 +271,7 @@ sub processProcessor
-        $targetObj->getTargetParent($targetObj->getTargetParent($target));
-     $targetObj->copyAttribute($socket_target,$target,"LOCATION_CODE");
-     $targetObj->copyAttribute($socket_target,$target,"FRU_ID");
--
-+    
- 
-     foreach my $attr (sort (keys
-            %{ $targetObj->getTarget($socket_target)->{TARGET}->{attribute} }))
-@@ -529,7 +453,7 @@ sub setupBars
-                 my $b=sprintf("0x%016X",
-          $i_base+$i_node_offset*$node+$i_proc_offset*$proc+$i_offset*$i);
-                 my $sep=",";
--                if ($i==$num-1)
-+                if ($i==$num-1) 
-                 {
-                     $sep="";
-                 }
-@@ -560,7 +484,7 @@ sub processMcs
-     my $i_offset = Math::BigInt->new($offset);
- 
-     my $mcs = $targetObj->getAttribute($target, "MCS_NUM");
--    my $mcsStr=sprintf("0x%016X",
-+    my $mcsStr=sprintf("0x%016X",   
-          $i_base+$i_node_offset*$node+$i_proc_offset*$proc+$i_offset*$mcs);
-     $targetObj->setAttribute($target, "IBSCOM_MCS_BASE_ADDR", $mcsStr);
- }
-@@ -577,7 +501,7 @@ sub processXbus
-     my $target    = shift;
- 
-     # $targetObj->setAttribute($target, "PEER_TARGET","");
--
-+  
- }
- 
- #--------------------------------------------------
-@@ -595,7 +519,7 @@ sub processAbus
-    $targetObj->setAttribute($target, "EI_BUS_TX_LANE_INVERT","0");
-    $targetObj->setAttribute($target, "EI_BUS_TX_MSBSWAP","0");
-    # $targetObj->setAttribute($target, "PEER_TARGET","");
--
-+            
-     my $abus_child_conn = $targetObj->getFirstConnectionDestination($target);
-     if ($abus_child_conn ne "")
-     {
-@@ -785,14 +709,12 @@ sub processPcie
-                 {
-                     for (my $lane=0;$lane<16;$lane++)
-                     {
--                        $equalization[$phb_num][$lane]=$eqs[$e+1].",".
--                              $eqs[$e+2];
--                    }
-+                        $equalization[$phb_num][$lane]=$eqs[$e+1].",".$eqs[$e+2];
-+                    }                    
-                 }
-                 else
-                 {
--                    $equalization[$phb_num][$eqs[$e]] = $eqs[$e+1].",".
--                              $eqs[$e+2];
-+                    $equalization[$phb_num][$eqs[$e]] = $eqs[$e+1].",".$eqs[$e+2];
-                 }
-             }
-             substr($phb_config, $phb_num, 1, "1");
-@@ -886,7 +808,7 @@ sub processMembufVpdAssociation
- {
-     my $targetObj = shift;
-     my $target    = shift;
--
-+    
-     my $vpds=$targetObj->findConnections($target,"I2C","VPD");
-     if ($vpds ne "" ) {
-         my $vpd = $vpds->{CONN}->[0];
-@@ -899,7 +821,7 @@ sub processMembufVpdAssociation
-                 setEepromAttributes($targetObj,
-                        "EEPROM_VPD_PRIMARY_INFO",$membuf_target,$vpd);
-                 setEepromAttributes($targetObj,
--                       "EEPROM_VPD_FRU_INFO",$membuf_target,$vpd,"0++");
-+                       "EEPROM_VPD_FRU_INFO",$membuf_target,$vpd,"0++");       
-                 my $index = $targetObj->getBusAttribute($membuf_assoc->{SOURCE},
-                                 $membuf_assoc->{BUS_NUM}, "ISDIMM_MBVPD_INDEX");
-                 $targetObj->setAttribute(
-@@ -920,8 +842,8 @@ sub processMembuf
- {
-     my $targetObj = shift;
-     my $target    = shift;
--    if ($targetObj->isBadAttribute($target, "PHYS_PATH", ""))
--    {
-+    if ($targetObj->isBadAttribute($target, "PHYS_PATH", "")) 
-+    { 
-         ##dmi is probably not connected.  will get caught in error checking
-         return;
-     }
-@@ -949,7 +871,33 @@ sub processMembuf
-             }
-         }
-     }
-+    ## find port mapping
-+    my %dimm_portmap;
-+    foreach my $child (@{$targetObj->getTargetChildren($target)})
-+    {
-+         if ($targetObj->getType($child) eq "MBA")
-+         {
-+             my $mba_num = $targetObj->getAttribute($child,"MBA_NUM");
-+             my $dimms=$targetObj->findConnections($child,"DDR3","");
-+             if ($dimms ne "")
-+             {
-+                 foreach my $dimm (@{$dimms->{CONN}})
-+                 {
-+                       my $port_num = $targetObj->getAttribute(
-+                                     $dimm->{SOURCE},"MBA_PORT");
-+                       my $dimm_num = $targetObj->getAttribute(
-+                                     $dimm->{SOURCE},"MBA_DIMM");
-+                       
-+                       my $map = oct("0b".$mba_num.$port_num.$dimm_num);
-+                       $dimm_portmap{$dimm->{DEST_PARENT}} = $map;
-+                 }
-+             }
-+         }
-+    }
-+    
-+    
-     ## Process MEMBUF to DIMM I2C connections
-+    my @addr_map=('0','0','0','0','0','0','0','0');
-     my $dimms=$targetObj->findConnections($target,"I2C","SPD");
-     if ($dimms ne "") {
-         foreach my $dimm (@{$dimms->{CONN}}) {
-@@ -960,8 +908,19 @@ sub processMembuf
-             setEepromAttributes($targetObj,
-                        "EEPROM_VPD_FRU_INFO",$dimm_target,
-                        $dimm,"0++");
-+
-+            my $field=getI2cMapField($targetObj,$dimm_target,$dimm);
-+            my $map = $dimm_portmap{$dimm_target};
-+            if ($map eq "") { 
-+                print "ERROR: $dimm_target doesn't map to a dimm/port\n";
-+                $targetObj->myExit(3);
-+            }
-+            $addr_map[$map] = $field;
-         }
-     }
-+    $targetObj->setAttribute($targetObj->{targeting}->{SYS}[0]->{KEY},
-+            "MRW_MEM_SENSOR_CACHE_ADDR_MAP","0x".join("",@addr_map));
-+
-     ## Update bus speeds
-     processI2cSpeeds($targetObj,$target);
- 
-@@ -973,7 +932,7 @@ sub processMembuf
-         foreach my $ddr (@{$ddrs->{CONN}}) {
-             my $mba=$ddr->{SOURCE};
-             my $dimm=$ddr->{DEST_PARENT};
--            my ($dimmnum,$port)=split(//,sprintf("%02b\n",$portmap{$mba}));
-+            my ($dimmnum,$port)=split(//,sprintf("%02b\n",$portmap{$mba}));        
-             $targetObj->setAttribute($dimm, "MBA_DIMM",$dimmnum);
-             $targetObj->setAttribute($dimm, "MBA_PORT",$port);
-             $portmap{$mba}++;
-@@ -984,6 +943,24 @@ sub processMembuf
-     }
- }
- 
-+sub getI2cMapField
-+{
-+    my $targetObj = shift;
-+    my $target = shift;
-+    my $conn_target = shift;
-+
-+
-+    my $port = $targetObj->getAttribute($conn_target->{SOURCE}, "I2C_PORT");
-+    my $engine = $targetObj->getAttribute($conn_target->{SOURCE}, "I2C_ENGINE");
-+    my $addr = $targetObj->getBusAttribute($conn_target->{SOURCE},
-+            $conn_target->{BUS_NUM}, "I2C_ADDRESS");
-+    
-+    my $bits=sprintf("%08b",hex($addr));
-+    my $field=sprintf("%d%3s",oct($port),substr($bits,4,3));
-+    my $hexfield = sprintf("%X",oct("0b$field"));
-+    return $hexfield;
-+}
-+
- 
- sub setEepromAttributes
- {
-@@ -1036,7 +1013,7 @@ sub setGpioAttributes
-     my $engine = $targetObj->getAttribute($conn_target->{SOURCE}, "I2C_ENGINE");
-     my $addr = $targetObj->getBusAttribute($conn_target->{SOURCE},
-             $conn_target->{BUS_NUM}, "I2C_ADDRESS");
--    my $path = $targetObj->getAttribute($conn_target->{SOURCE_PARENT},
-+    my $path = $targetObj->getAttribute($conn_target->{SOURCE_PARENT}, 
-                "PHYS_PATH");
- 
- 
--- 
-1.8.2.2
-
diff --git a/openpower/package/hostboot/hostboot-0006-revert-OCC-v3.patch b/openpower/package/hostboot/hostboot-0006-revert-OCC-v3.patch
new file mode 100644
index 0000000..5999ffc
--- /dev/null
+++ b/openpower/package/hostboot/hostboot-0006-revert-OCC-v3.patch
@@ -0,0 +1,205 @@
+From 4619901bd09eccbe26d430195c4e8019f6993b0b Mon Sep 17 00:00:00 2001
+From: Matt Ploetz <maploetz@us.ibm.com>
+Date: Mon, 23 Feb 2015 17:09:14 -0600
+Subject: [PATCH] Revert "Set FIR master in HOMER config data"
+
+This reverts commit 84023756531d9c48d2e4939326f4048f2dadbe28.
+---
+ src/include/usr/hwpf/hwp/occ/occ_common.H | 27 ++----------------
+ src/usr/diag/HBconfig                     |  6 ----
+ src/usr/hwpf/hwp/occ/occ.C                |  2 +-
+ src/usr/hwpf/hwp/occ/occ_common.C         | 46 +++++++++++++++++++------------
+ src/usr/hwpf/hwp/occ/runtime/rt_occ.C     |  2 +-
+ 5 files changed, 33 insertions(+), 50 deletions(-)
+
+diff --git a/src/include/usr/hwpf/hwp/occ/occ_common.H b/src/include/usr/hwpf/hwp/occ/occ_common.H
+index 8245539..1886e51 100644
+--- a/src/include/usr/hwpf/hwp/occ/occ_common.H
++++ b/src/include/usr/hwpf/hwp/occ/occ_common.H
+@@ -36,38 +36,19 @@ namespace HBOCC
+     struct occHostConfigDataArea_t
+     {
+         uint32_t version;
+-
+-        //For computation of timebase frequency
+         uint32_t nestFrequency;
+-
+-        // For determining the interrupt type to Host
+-        //  0x00000000 = Use FSI2HOST Mailbox
+-        //  0x00000001 = Use OCC interrupt line through PSIHB complex
+         uint32_t interruptType;
+-
+-        // For informing OCC if it is the FIR master:
+-        //  0x00000000 = Default
+-        //  0x00000001 = FIR Master
+-        uint32_t firMaster;
+-
+-        // FIR collection configuration data needed by FIR Master
+-        //  OCC in the event of a checkstop
+-        uint8_t firdataConfig[3072];
+     };
+ 
+     enum
+     {
+-        OccHostDataVersion = 3,
++        OccHostDataVersion = 2,
+         OCC_LIDID = 0x81e00430,
+         OCC_IBSCOM_RANGE_IN_MB = MEGABYTE,
+ 
+         // Interrupt Types
+         USE_FSI2HOST_MAILBOX = 0x00000000,
+-        USE_PSIHB_COMPLEX    = 0x00000001,
+-
+-        // FIR Master
+-        NOT_FIR_MASTER = 0x00000000,
+-        IS_FIR_MASTER  = 0x00000001
++        USE_PSIHB_COMPLEX    = 0x00000001
+     };
+ 
+     enum occAction_t
+@@ -78,15 +59,13 @@ namespace HBOCC
+     /**
+      * @brief Sets up OCC Host data
+      *
+-     * @param[in] i_proc:         target processor to load
+      * @param[in] i_occHostDataVirtAddr Virtual
+      *                       address of current
+      *                       proc's Host data area.
+      *
+      * @return errlHndl_t  Error log Host data setup failed
+      */
+-    errlHndl_t loadHostDataToHomer(TARGETING::Target* i_proc,
+-                                   void* i_occHostDataVirtAddr);
++    errlHndl_t loadHostDataToHomer(void* i_occHostDataVirtAddr);
+ 
+     /**
+      * @brief Execute procedures and steps required to load
+diff --git a/src/usr/diag/HBconfig b/src/usr/diag/HBconfig
+index 973cecd..a516133 100644
+--- a/src/usr/diag/HBconfig
++++ b/src/usr/diag/HBconfig
+@@ -2,9 +2,3 @@ config HBRT_PRD
+     default n
+     help
+         Enable HBRT PRD.
+-
+-config ENABLE_CHECKSTOP_ANALYSIS
+-    default n
+-    help
+-        Enable collection of FIR data by OCC for checkstops and
+-        post-checkstop analysis by PRD on system reboot
+diff --git a/src/usr/hwpf/hwp/occ/occ.C b/src/usr/hwpf/hwp/occ/occ.C
+index ac2f4b1..f56c909 100644
+--- a/src/usr/hwpf/hwp/occ/occ.C
++++ b/src/usr/hwpf/hwp/occ/occ.C
+@@ -133,7 +133,7 @@ namespace HBOCC
+                                            (i_homerVirtAddrBase) +
+                                 tmpOffset + HOMER_OFFSET_TO_OCC_HOST_DATA;
+             void* occHostVirt = reinterpret_cast<void*>(i_homerHostVirtAddr);
+-            l_errl = HBOCC::loadHostDataToHomer(i_target,occHostVirt);
++            l_errl = HBOCC::loadHostDataToHomer(occHostVirt);
+             if( l_errl != NULL )
+             {
+                 TRACFCOMP( g_fapiImpTd, ERR_MRK"loading Host Data Area failed!" );
+diff --git a/src/usr/hwpf/hwp/occ/occ_common.C b/src/usr/hwpf/hwp/occ/occ_common.C
+index e444b26..97d36f4 100644
+--- a/src/usr/hwpf/hwp/occ/occ_common.C
++++ b/src/usr/hwpf/hwp/occ/occ_common.C
+@@ -119,9 +119,14 @@ namespace HBOCC
+ 
+     /**
+      * @brief Sets up OCC Host data
++     *
++     * @param[in] i_occHostDataVirtAddr Virtual
++     *                       address of current
++     *                       proc's Host data area.
++     *
++     * @return errlHndl_t  Error log Host data setup failed
+      */
+-    errlHndl_t loadHostDataToHomer( TARGETING::Target* i_proc,
+-                                    void* i_occHostDataVirtAddr)
++    errlHndl_t loadHostDataToHomer(void* i_occHostDataVirtAddr)
+     {
+         TRACUCOMP( g_fapiTd,
+                    ENTER_MRK"loadHostDataToHomer(%p)",
+@@ -156,22 +161,6 @@ namespace HBOCC
+             config_data->interruptType = USE_PSIHB_COMPLEX;
+         }
+ 
+-#ifdef CONFIG_ENABLE_CHECKSTOP_ANALYSIS
+-        // Figure out the FIR master
+-        TARGETING::Target* masterproc = NULL;
+-        tS.masterProcChipTargetHandle( masterproc );
+-        if( masterproc == i_proc )
+-        {
+-            config_data->firMaster = IS_FIR_MASTER;
+-        }
+-        else
+-        {
+-            config_data->firMaster = NOT_FIR_MASTER;
+-        }
+-#else
+-        config_data->firMaster = 0;
+-#endif
+-
+         TRACUCOMP( g_fapiTd,
+                    EXIT_MRK"loadHostDataToHomer");
+ 
+@@ -181,6 +170,16 @@ namespace HBOCC
+     /**
+      * @brief Execute procedures and steps necessary
+      *        to load OCC data in specified processor
++     *
++     * @param[in] i_target   Target proc to load
++     * @param[in] i_homerVirtAddrBase Virtual
++     *                       address of current
++     *                       proc's HOMER
++     * @param[in] i_homerPhysAddrBase Physical
++     *                       address of current
++     *                       proc's HOMER
++     *
++     * @return errlHndl_t  Error log image load failed
+      */
+      errlHndl_t loadOCC(TARGETING::Target* i_target,
+                     uint64_t i_homerPhysAddr,
+@@ -300,6 +299,12 @@ namespace HBOCC
+      * @brief Start OCC for specified DCM pair of processors.
+      *        If 2nd input is NULL, OCC will be setup on just
+      *        one target.
++     *
++     * @param[in] i_target0:    target of first processor in DCM pair
++     * @param[in] i_target1:    target of second processor in DCM pair
++     * @param[out] o_failedTarget failed target in case of an error
++     *
++     * @return errlHndl_t  Error log of startOCC failed
+      */
+     errlHndl_t startOCC (Target* i_target0,
+                          Target* i_target1,
+@@ -418,6 +423,11 @@ namespace HBOCC
+      * @brief Stop OCC for specified DCM pair of processors.
+      *        If 2nd input is NULL, OCC will be setup on just
+      *        one target.
++     *
++     * @param[in] i_target0:    target of first processor in DCM pair
++     * @param[in] i_target1:    target of second processor in DCM pair
++     *
++     * @return errlHndl_t  Error log of stopOCC failed
+      */
+     errlHndl_t stopOCC(TARGETING::Target * i_target0,
+                        TARGETING::Target * i_target1)
+diff --git a/src/usr/hwpf/hwp/occ/runtime/rt_occ.C b/src/usr/hwpf/hwp/occ/runtime/rt_occ.C
+index 1bc02a8..8583801 100644
+--- a/src/usr/hwpf/hwp/occ/runtime/rt_occ.C
++++ b/src/usr/hwpf/hwp/occ/runtime/rt_occ.C
+@@ -179,7 +179,7 @@ namespace RT_OCC
+ 
+             void* occHostVirt = reinterpret_cast <void *> (i_homer_addr_va +
+                                 HOMER_OFFSET_TO_OCC_HOST_DATA);
+-            err = HBOCC::loadHostDataToHomer(proc_target,occHostVirt);
++            err = HBOCC::loadHostDataToHomer(occHostVirt);
+             if( err != NULL )
+             {
+                 TRACFCOMP( g_fapiImpTd, ERR_MRK"loading Host Data Area failed!" );
+-- 
+1.8.2.2
+
diff --git a/openpower/package/hostboot/hostboot-0007-Revert-PNOR-goldenside.patch b/openpower/package/hostboot/hostboot-0007-Revert-PNOR-goldenside.patch
new file mode 100644
index 0000000..038fd09
--- /dev/null
+++ b/openpower/package/hostboot/hostboot-0007-Revert-PNOR-goldenside.patch
@@ -0,0 +1,6095 @@
+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 2055371..e404f8a 100644
--- a/openpower/package/hostboot/hostboot.mk
+++ b/openpower/package/hostboot/hostboot.mk
@@ -4,7 +4,7 @@
 #
 ################################################################################
 
-HOSTBOOT_VERSION ?= 7a51e37d5d7672fbef3a8f3c4a11a652ded9241a
+HOSTBOOT_VERSION ?= 07bb80e9281ed8aafbd283d5ab2c0f777e347b73
 HOSTBOOT_SITE ?= $(call github,open-power,hostboot,$(HOSTBOOT_VERSION))
 
 HOSTBOOT_LICENSE = Apache-2.0
diff --git a/openpower/package/occ/occ.mk b/openpower/package/occ/occ.mk
index 728a941..cbabb94 100644
--- a/openpower/package/occ/occ.mk
+++ b/openpower/package/occ/occ.mk
@@ -4,7 +4,7 @@
 #
 ################################################################################
 
-OCC_VERSION ?= 0a19fa3049ce60d8d9f5905cd05c1018cbdfb253
+OCC_VERSION ?= 2adf5f493db7436dd0df0fcb846c16b93dd1f374
 OCC_SITE ?= $(call github,open-power,occ,$(OCC_VERSION))
 OCC_LICENSE = Apache-2.0
 OCC_DEPENDENCIES = host-binutils host-p8-pore-binutils