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