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-0003-Revert-redundent-copy-of-hb-code-in-pnor.patch b/openpower/package/hostboot/hostboot-0007-Revert-PNOR-goldenside.patch
similarity index 66%
rename from openpower/package/hostboot/hostboot-0003-Revert-redundent-copy-of-hb-code-in-pnor.patch
rename to openpower/package/hostboot/hostboot-0007-Revert-PNOR-goldenside.patch
index 054840e..038fd09 100644
--- a/openpower/package/hostboot/hostboot-0003-Revert-redundent-copy-of-hb-code-in-pnor.patch
+++ b/openpower/package/hostboot/hostboot-0007-Revert-PNOR-goldenside.patch
@@ -1,7 +1,470 @@
-From 1e017616432b8eb72f9b48080aab0b88d7f2241e Mon Sep 17 00:00:00 2001
+From f4ca5fb46a11c947cc1a334a6e846a9f8a8852cd Mon Sep 17 00:00:00 2001
 From: Matt Ploetz <maploetz@us.ibm.com>
-Date: Tue, 17 Feb 2015 14:02:13 -0600
-Subject: [PATCH 1/6] Revert "Skipping over readTOC if hostInterface for
+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.
@@ -104,10 +567,1588 @@
 1.8.2.2
 
 
-From 2eaec22c342cf6dc93c6ae4e90bf4c0dfb5607c8 Mon Sep 17 00:00:00 2001
+From 6ee93d64558e1d536cc10cd47fef5ce33416a288 Mon Sep 17 00:00:00 2001
 From: Matt Ploetz <maploetz@us.ibm.com>
-Date: Tue, 17 Feb 2015 14:02:24 -0600
-Subject: [PATCH 2/6] Revert "Targeting: Generate VERSION page for binaries."
+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.
 ---
@@ -281,11 +2322,11 @@
 1.8.2.2
 
 
-From 01728c387eebddd30e1ddd1b28c31c159cd5039e Mon Sep 17 00:00:00 2001
+From 0a4989176f0ef4f1374f88ae5dd4157cd63d45ce Mon Sep 17 00:00:00 2001
 From: Matt Ploetz <maploetz@us.ibm.com>
-Date: Tue, 17 Feb 2015 14:02:36 -0600
-Subject: [PATCH 3/6] Revert "adding toc offsets to defaultPnorLayout for hwsv
- team"
+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.
 ---
@@ -321,10 +2362,10 @@
 1.8.2.2
 
 
-From db81af80e8d4efccfe9de9fe9e01972ff4689ef5 Mon Sep 17 00:00:00 2001
+From 2f98670c4b42a64f481a336e4d8d34a9a5ad93a8 Mon Sep 17 00:00:00 2001
 From: Matt Ploetz <maploetz@us.ibm.com>
-Date: Tue, 17 Feb 2015 14:03:03 -0600
-Subject: [PATCH 4/6] Revert "Created 2-sided and golden-side pnor layouts"
+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.
 ---
@@ -953,10 +2994,10 @@
 1.8.2.2
 
 
-From 65fbfe1c2b67b9e8519220823b82a0ff244ba123 Mon Sep 17 00:00:00 2001
+From eea17a14de872f99c3d01a022f392b5f846fd746 Mon Sep 17 00:00:00 2001
 From: Matt Ploetz <maploetz@us.ibm.com>
-Date: Tue, 17 Feb 2015 14:10:03 -0600
-Subject: [PATCH 5/6] Revert "Initial Support of SBE_UPDATE_INDEPENDENT Mode"
+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.
 ---
@@ -1243,10 +3284,10 @@
 1.8.2.2
 
 
-From c7c2a249b32d8b3776febb6fd81b5fa6874717df Mon Sep 17 00:00:00 2001
+From 7820949b6720adb1b92f87175d373d1b01eea83a Mon Sep 17 00:00:00 2001
 From: Matt Ploetz <maploetz@us.ibm.com>
-Date: Tue, 17 Feb 2015 14:10:12 -0600
-Subject: [PATCH 6/6] Revert "Support for Redundant Copy of HB code in PNOR"
+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.
 ---
diff --git a/openpower/package/hostboot/hostboot.mk b/openpower/package/hostboot/hostboot.mk
index 5bc680b..e404f8a 100644
--- a/openpower/package/hostboot/hostboot.mk
+++ b/openpower/package/hostboot/hostboot.mk
@@ -4,7 +4,7 @@
 #
 ################################################################################
 
-HOSTBOOT_VERSION ?= 7c5d303237f2bec25b7072ec3119d6d4fef875fc
+HOSTBOOT_VERSION ?= 07bb80e9281ed8aafbd283d5ab2c0f777e347b73
 HOSTBOOT_SITE ?= $(call github,open-power,hostboot,$(HOSTBOOT_VERSION))
 
 HOSTBOOT_LICENSE = Apache-2.0
