diff --git a/README b/README
index e53754c..829ecec 100644
--- a/README
+++ b/README
@@ -20,9 +20,10 @@
 
 1. Install Fedora 20 64-bit.
 2. Install the packages necessary for the build:
-> sudo yum install vim gcc-c++ flex bison git ctags cscope expat-devel patch glibc-devel.i686 libgcc.i686 zlib-devel zlib-static libstdc++.i686
+> sudo yum update vim-minimal
+> sudo yum install vim gcc-c++ flex bison git ctags cscope expat-devel patch glibc-devel.i686 libgcc.i686 zlib-devel zlib-static libstdc++.i686 libxml2-devel.i686
 3. Install PERL modules necessary for the build:
->  sudo yum install "perl(XML::Simple)" "perl(YAML)" "perl(XML::SAX)" "perl(Fatal)" "perl(Thread::Queue)" "perl(Env)"
+>  sudo yum install "perl(XML::Simple)" "perl(YAML)" "perl(XML::SAX)" "perl(Fatal)" "perl(Thread::Queue)" "perl(Env)" "perl(XML::LibXML)" "perl(Digest::SHA1)"
 
 Troubleshooting
 ===============
diff --git a/buildroot b/buildroot
index 51a8cdf..dd9d28b 160000
--- a/buildroot
+++ b/buildroot
@@ -1 +1 @@
-Subproject commit 51a8cdff226c98c07a8c4346f86bf1ff60651aae
+Subproject commit dd9d28b337210589b77a7a4a7115c53254f704f9
diff --git a/openpower/Config.in b/openpower/Config.in
index 19007fe..19a2859 100644
--- a/openpower/Config.in
+++ b/openpower/Config.in
@@ -8,4 +8,8 @@
 endif
 endmenu
 
+menu "Custom Packages"
+source "$BR2_EXTERNAL/custom/Config.in"
+endmenu
+
 endmenu
diff --git a/openpower/configs/firestone_defconfig b/openpower/configs/firestone_defconfig
new file mode 100644
index 0000000..e823036
--- /dev/null
+++ b/openpower/configs/firestone_defconfig
@@ -0,0 +1,57 @@
+BR2_powerpc64=y
+BR2_powerpc_power8=y
+BR2_OPENPOWER_PLATFORM=y
+
+BR2_OPENPOWER_CONFIG_NAME="firestone"
+BR2_OPENPOWER_XML_PACKAGE="firestone-xml"
+BR2_HOSTBOOT_CONFIG_FILE="firestone.config"
+
+BR2_HOSTBOOT_BINARY_SBE_FILENAME="venice_sbe.img.ecc"
+BR2_HOSTBOOT_BINARY_SBEC_FILENAME="centaur_sbec_pad.img.ecc"
+
+BR2_OCC_BIN_FILENAME="occ.bin"
+
+BR2_FIRESTONE_SYSTEM_XML_FILENAME="FIRESTONE_hb.system.xml"
+BR2_FIRESTONE_MRW_XML_FILENAME="FIRESTONE_hb.mrw.xml"
+BR2_FIRESTONE_BIOS_XML_FILENAME="FIRESTONE_bios.xml"
+
+BR2_OPENPOWER_TARGETING_BIN_FILENAME="FIRESTONE_HB.targeting.bin"
+BR2_OPENPOWER_TARGETING_ECC_FILENAME="FIRESTONE_HB.targeting.bin.ecc"
+BR2_CAPP_UCODE_BIN_FILENAME="cappucode.bin"
+
+BR2_OPENPOWER_PNOR_XML_LAYOUT_FILENAME="defaultPnorLayoutWithGoldenSide.xml"
+BR2_OPENPOWER_PNOR_FILENAME="firestone.pnor"
+
+# skiboot requirements
+BR2_TARGET_SKIBOOT=y
+BR2_TARGET_SKIBOOT_EMBED_PAYLOAD=n
+
+# petitboot requirements
+BR2_ENABLE_LOCALE_PURGE=y
+BR2_ENABLE_LOCALE_WHITELIST="C en_US"
+BR2_GENERATE_LOCALE="en_US.UTF-8"
+BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV=y
+BR2_TARGET_GENERIC_GETTY_PORT="hvc0"
+BR2_ROOTFS_OVERLAY="overlay"
+BR2_LINUX_KERNEL=y
+BR2_LINUX_KERNEL_CUSTOM_GIT=y
+BR2_LINUX_KERNEL_CUSTOM_REPO_URL="git://github.com/open-power/linux.git"
+BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="dc97a6e626eaf22c9bd4baec3954fa5501ce1c63"
+BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
+BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="$(BR2_EXTERNAL)/configs/linux/skiroot_defconfig"
+BR2_LINUX_KERNEL_ZIMAGE_EPAPR=y
+BR2_PACKAGE_BUSYBOX_SHOW_OTHERS=y
+BR2_PACKAGE_LINUX_FIRMWARE=y
+BR2_PACKAGE_LINUX_FIRMWARE_BNX2X=y
+BR2_PACKAGE_LINUX_FIRMWARE_CXGB4=y
+BR2_PACKAGE_I2C_TOOLS=y
+BR2_PACKAGE_NCURSES_WCHAR=y
+BR2_PACKAGE_DROPBEAR=y
+# BR2_PACKAGE_DROPBEAR_SERVER is not set
+BR2_PACKAGE_ETHTOOL=y
+BR2_PACKAGE_NETCAT=y
+BR2_PACKAGE_RSYNC=y
+BR2_PACKAGE_PETITBOOT=y
+BR2_PACKAGE_IPMITOOL=y
+BR2_TARGET_ROOTFS_CPIO_XZ=y
+BR2_TARGET_ROOTFS_INITRAMFS=y
diff --git a/openpower/configs/habanero_defconfig b/openpower/configs/habanero_defconfig
index 4ad8ee0..4340171 100644
--- a/openpower/configs/habanero_defconfig
+++ b/openpower/configs/habanero_defconfig
@@ -17,13 +17,14 @@
 
 BR2_OPENPOWER_TARGETING_BIN_FILENAME="HABANERO_HB.targeting.bin"
 BR2_OPENPOWER_TARGETING_ECC_FILENAME="HABANERO_HB.targeting.bin.ecc"
+BR2_CAPP_UCODE_BIN_FILENAME="cappucode.bin"
 
 BR2_OPENPOWER_PNOR_XML_LAYOUT_FILENAME="defaultPnorLayoutWithGoldenSide.xml"
 BR2_OPENPOWER_PNOR_FILENAME="habanero.pnor"
 
 # skiboot requirements
 BR2_TARGET_SKIBOOT=y
-BR2_TARGET_SKIBOOT_EMBED_PAYLOAD=y
+BR2_TARGET_SKIBOOT_EMBED_PAYLOAD=n
 
 # petitboot requirements
 BR2_ENABLE_LOCALE_PURGE=y
@@ -36,8 +37,8 @@
 BR2_LINUX_KERNEL_CUSTOM_GIT=y
 BR2_LINUX_KERNEL_CUSTOM_REPO_URL="git://github.com/open-power/linux.git"
 BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="dc97a6e626eaf22c9bd4baec3954fa5501ce1c63"
-BR2_LINUX_KERNEL_USE_DEFCONFIG=y
-BR2_LINUX_KERNEL_DEFCONFIG="skiroot"
+BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
+BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="$(BR2_EXTERNAL)/configs/linux/skiroot_defconfig"
 BR2_LINUX_KERNEL_ZIMAGE_EPAPR=y
 BR2_PACKAGE_BUSYBOX_SHOW_OTHERS=y
 BR2_PACKAGE_LINUX_FIRMWARE=y
diff --git a/openpower/configs/hostboot/firestone.config b/openpower/configs/hostboot/firestone.config
new file mode 100755
index 0000000..6684dd6
--- /dev/null
+++ b/openpower/configs/hostboot/firestone.config
@@ -0,0 +1,37 @@
+# The Serial Flash Controller is the AST2400 BMC.
+set   SFC_IS_AST2400
+set   BMC_DOES_SFC_INIT
+unset SFC_IS_IBM_DPSS
+set   ALLOW_MICRON_PNOR
+set   ALLOW_MACRONIX_PNOR
+
+# VPD options.
+set MVPD_READ_FROM_HW
+unset MVPD_READ_FROM_PNOR
+set DJVPD_READ_FROM_HW
+unset DJVPD_READ_FROM_PNOR
+set CVPD_READ_FROM_HW
+#set CVPD_WRITE_TO_HW
+unset CVPD_READ_FROM_PNOR
+set SKIP_RESTRICT_EX_UNITS
+
+# gpio config
+set GPIODD
+set PALMETTO_VDDR
+
+# disable sbe updates
+set NO_SBE_UPDATES
+
+unset PCIE_HOTPLUG_CONTROLLER
+
+# turn on console output
+set CONSOLE
+set CONSOLE_AST2400
+
+# Enable Kingston dimm voltage workaround
+set KINGSTON_1_35_VOLT
+
+set NO_DMI_EREPAIR
+set DISABLE_HOSTBOOT_RUNTIME
+unset HTMGT
+unset START_OCC_DURING_BOOT
diff --git a/openpower/configs/hostboot/habanero.config b/openpower/configs/hostboot/habanero.config
index 3a593a8..2130784 100755
--- a/openpower/configs/hostboot/habanero.config
+++ b/openpower/configs/hostboot/habanero.config
@@ -42,6 +42,9 @@
 set NO_DMI_EREPAIR
 unset DISABLE_HOSTBOOT_RUNTIME
 
+# Compile in hostboot runtime PRD
+set HBRT_PRD
+
 # OCC Enablment flags
 unset SET_NOMINAL_PSTATE
 set HTMGT
diff --git a/openpower/configs/hostboot/palmetto.config b/openpower/configs/hostboot/palmetto.config
index 8e11a5e..0d48abe 100755
--- a/openpower/configs/hostboot/palmetto.config
+++ b/openpower/configs/hostboot/palmetto.config
@@ -41,6 +41,9 @@
 set NO_DMI_EREPAIR
 unset DISABLE_HOSTBOOT_RUNTIME
 
+# Compile in hostboot runtime PRD
+set HBRT_PRD
+
 # OCC Enablment flags
 unset SET_NOMINAL_PSTATE
 set HTMGT
diff --git a/openpower/configs/linux/skiroot_defconfig b/openpower/configs/linux/skiroot_defconfig
new file mode 100644
index 0000000..e54be62
--- /dev/null
+++ b/openpower/configs/linux/skiroot_defconfig
@@ -0,0 +1,222 @@
+CONFIG_PPC64=y
+CONFIG_ALTIVEC=y
+CONFIG_VSX=y
+CONFIG_SMP=y
+CONFIG_NR_CPUS=2048
+# CONFIG_SWAP is not set
+CONFIG_SYSVIPC=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_AUDIT=y
+CONFIG_AUDITSYSCALL=y
+CONFIG_IRQ_DOMAIN_DEBUG=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_TASKSTATS=y
+CONFIG_TASK_DELAY_ACCT=y
+CONFIG_TASK_XACCT=y
+CONFIG_TASK_IO_ACCOUNTING=y
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=20
+# CONFIG_NAMESPACES is not set
+CONFIG_RELAY=y
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_KALLSYMS_ALL=y
+CONFIG_PERF_EVENTS=y
+# CONFIG_COMPAT_BRK is not set
+CONFIG_JUMP_LABEL=y
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_PPC_PMAC is not set
+CONFIG_HZ_100=y
+CONFIG_KEXEC=y
+CONFIG_IRQ_ALL_CPUS=y
+# CONFIG_COMPACTION is not set
+# CONFIG_MIGRATION is not set
+# CONFIG_BOUNCE is not set
+# CONFIG_CROSS_MEMORY_ATTACH is not set
+CONFIG_PPC_64K_PAGES=y
+CONFIG_SCHED_SMT=y
+# CONFIG_SUSPEND is not set
+# CONFIG_SECCOMP is not set
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+CONFIG_NET=y
+CONFIG_NET_IPIP=y
+CONFIG_SYN_COOKIES=y
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_IPV6 is not set
+# CONFIG_WIRELESS is not set
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+# CONFIG_FW_LOADER_USER_HELPER is not set
+CONFIG_PROC_DEVICETREE=y
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=65536
+CONFIG_ATA_OVER_ETH=y
+CONFIG_VIRTIO_BLK=y
+CONFIG_EEPROM_AT24=y
+CONFIG_BLK_DEV_SD=y
+CONFIG_CHR_DEV_ST=y
+CONFIG_BLK_DEV_SR=y
+CONFIG_BLK_DEV_SR_VENDOR=y
+CONFIG_CHR_DEV_SG=y
+CONFIG_SCSI_MULTI_LUN=y
+CONFIG_SCSI_CONSTANTS=y
+CONFIG_SCSI_SCAN_ASYNC=y
+CONFIG_SCSI_CXGB3_ISCSI=y
+CONFIG_SCSI_CXGB4_ISCSI=y
+CONFIG_SCSI_BNX2_ISCSI=y
+CONFIG_BE2ISCSI=y
+CONFIG_SCSI_MPT2SAS=y
+CONFIG_SCSI_IBMVSCSI=y
+CONFIG_SCSI_SYM53C8XX_2=y
+CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0
+CONFIG_SCSI_IPR=y
+# CONFIG_SCSI_IPR_TRACE is not set
+# CONFIG_SCSI_IPR_DUMP is not set
+CONFIG_SCSI_QLA_FC=y
+CONFIG_SCSI_QLA_ISCSI=y
+CONFIG_SCSI_LPFC=y
+CONFIG_SCSI_VIRTIO=y
+CONFIG_SCSI_DH=y
+CONFIG_SCSI_DH_ALUA=y
+CONFIG_ATA=y
+CONFIG_SATA_AHCI=y
+# CONFIG_ATA_SFF is not set
+CONFIG_MD=y
+CONFIG_BLK_DEV_MD=y
+CONFIG_MD_LINEAR=y
+CONFIG_MD_RAID0=y
+CONFIG_MD_RAID1=y
+CONFIG_MD_RAID10=y
+CONFIG_MD_RAID456=y
+CONFIG_MD_MULTIPATH=y
+CONFIG_MD_FAULTY=y
+CONFIG_BLK_DEV_DM=y
+CONFIG_DM_CRYPT=y
+CONFIG_DM_SNAPSHOT=y
+CONFIG_DM_MIRROR=y
+CONFIG_DM_ZERO=y
+CONFIG_DM_MULTIPATH=y
+CONFIG_NETCONSOLE=y
+CONFIG_TUN=y
+CONFIG_VIRTIO_NET=y
+CONFIG_VORTEX=y
+CONFIG_ACENIC=y
+CONFIG_ACENIC_OMIT_TIGON_I=y
+CONFIG_PCNET32=y
+CONFIG_TIGON3=y
+CONFIG_BNX2X=y
+CONFIG_CHELSIO_T1=y
+CONFIG_BE2NET=y
+CONFIG_S2IO=y
+CONFIG_IBMVETH=y
+CONFIG_E100=y
+CONFIG_E1000=y
+CONFIG_E1000E=y
+CONFIG_IXGB=y
+CONFIG_IXGBE=y
+CONFIG_MLX4_EN=y
+CONFIG_MYRI10GE=y
+CONFIG_QLGE=y
+CONFIG_NETXEN_NIC=y
+CONFIG_SFC=y
+# CONFIG_WLAN is not set
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_EVDEV=y
+CONFIG_INPUT_MISC=y
+# CONFIG_SERIO_SERPORT is not set
+CONFIG_VT_HW_CONSOLE_BINDING=y
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_HVC_CONSOLE=y
+CONFIG_IPMI_HANDLER=y
+CONFIG_IPMI_DEVICE_INTERFACE=y
+CONFIG_IPMI_POWERNV=y
+CONFIG_HW_RANDOM=y
+CONFIG_GEN_RTC=y
+CONFIG_RAW_DRIVER=y
+CONFIG_MAX_RAW_DEVS=1024
+# CONFIG_I2C_COMPAT is not set
+CONFIG_I2C_CHARDEV=y
+# CONFIG_I2C_HELPER_AUTO is not set
+CONFIG_DRM=y
+CONFIG_DRM_RADEON=y
+CONFIG_DRM_AST=y
+CONFIG_FIRMWARE_EDID=y
+CONFIG_FB_MODE_HELPERS=y
+CONFIG_FB_OF=y
+CONFIG_FB_MATROX=y
+CONFIG_FB_MATROX_MILLENIUM=y
+CONFIG_FB_MATROX_MYSTIQUE=y
+CONFIG_FB_MATROX_G=y
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+# CONFIG_LCD_CLASS_DEVICE is not set
+# CONFIG_BACKLIGHT_GENERIC is not set
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_LOGO=y
+CONFIG_USB_HIDDEV=y
+CONFIG_USB=y
+CONFIG_USB_MON=y
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_EHCI_HCD=y
+# CONFIG_USB_EHCI_HCD_PPC_OF is not set
+CONFIG_USB_OHCI_HCD=y
+CONFIG_USB_STORAGE=y
+CONFIG_VIRT_DRIVERS=y
+CONFIG_VIRTIO_PCI=y
+# CONFIG_IOMMU_SUPPORT is not set
+CONFIG_EXT2_FS=y
+CONFIG_EXT2_FS_XATTR=y
+CONFIG_EXT2_FS_POSIX_ACL=y
+CONFIG_EXT2_FS_SECURITY=y
+CONFIG_EXT2_FS_XIP=y
+CONFIG_EXT3_FS=y
+CONFIG_EXT3_FS_POSIX_ACL=y
+CONFIG_EXT3_FS_SECURITY=y
+CONFIG_EXT4_FS=y
+CONFIG_EXT4_FS_POSIX_ACL=y
+CONFIG_EXT4_FS_SECURITY=y
+CONFIG_XFS_FS=y
+CONFIG_XFS_POSIX_ACL=y
+CONFIG_BTRFS_FS=y
+CONFIG_BTRFS_FS_POSIX_ACL=y
+CONFIG_AUTOFS4_FS=y
+CONFIG_ISO9660_FS=y
+CONFIG_UDF_FS=y
+CONFIG_MSDOS_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3_ACL=y
+CONFIG_NFS_V4=y
+CONFIG_CIFS=y
+# CONFIG_CIFS_DEBUG is not set
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_ASCII=y
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_UTF8=y
+# CONFIG_XZ_DEC_POWERPC is not set
+CONFIG_PRINTK_TIME=y
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_DEBUG_FS=y
+CONFIG_DEBUG_KERNEL=y
+CONFIG_LOCKUP_DETECTOR=y
+CONFIG_SCHEDSTATS=y
+# CONFIG_FTRACE is not set
+CONFIG_DEBUG_STACKOVERFLOW=y
+CONFIG_XMON=y
+CONFIG_XMON_DEFAULT=y
+# CONFIG_CRYPTO_ANSI_CPRNG is not set
+# CONFIG_CRYPTO_HW is not set
diff --git a/openpower/configs/openpower_mambo_defconfig b/openpower/configs/openpower_mambo_defconfig
index e4edd85..6c61fa5 100644
--- a/openpower/configs/openpower_mambo_defconfig
+++ b/openpower/configs/openpower_mambo_defconfig
@@ -29,8 +29,8 @@
 BR2_LINUX_KERNEL_CUSTOM_GIT=y
 BR2_LINUX_KERNEL_CUSTOM_REPO_URL="git://github.com/open-power/linux.git"
 BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="dc97a6e626eaf22c9bd4baec3954fa5501ce1c63"
-BR2_LINUX_KERNEL_USE_DEFCONFIG=y
-BR2_LINUX_KERNEL_DEFCONFIG="skiroot"
+BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
+BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="$(BR2_EXTERNAL)/configs/linux/skiroot_defconfig"
 BR2_LINUX_KERNEL_ZIMAGE_EPAPR=y
 BR2_PACKAGE_BUSYBOX_SHOW_OTHERS=y
 BR2_PACKAGE_LINUX_FIRMWARE=y
diff --git a/openpower/configs/palmetto_defconfig b/openpower/configs/palmetto_defconfig
index 9bde27f..1dd053a 100644
--- a/openpower/configs/palmetto_defconfig
+++ b/openpower/configs/palmetto_defconfig
@@ -17,13 +17,14 @@
 
 BR2_OPENPOWER_TARGETING_BIN_FILENAME="PALMETTO_HB.targeting.bin"
 BR2_OPENPOWER_TARGETING_ECC_FILENAME="PALMETTO_HB.targeting.bin.ecc"
+BR2_CAPP_UCODE_BIN_FILENAME="cappucode.bin"
 
 BR2_OPENPOWER_PNOR_XML_LAYOUT_FILENAME="defaultPnorLayoutSingleSide.xml"
 BR2_OPENPOWER_PNOR_FILENAME="palmetto.pnor"
 
 # skiboot requirements
 BR2_TARGET_SKIBOOT=y
-BR2_TARGET_SKIBOOT_EMBED_PAYLOAD=y
+BR2_TARGET_SKIBOOT_EMBED_PAYLOAD=n
 
 # petitboot requirements
 BR2_ENABLE_LOCALE_PURGE=y
@@ -36,7 +37,8 @@
 BR2_LINUX_KERNEL_CUSTOM_GIT=y
 BR2_LINUX_KERNEL_CUSTOM_REPO_URL="git://github.com/open-power/linux.git"
 BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="dc97a6e626eaf22c9bd4baec3954fa5501ce1c63"
-BR2_LINUX_KERNEL_DEFCONFIG="skiroot"
+BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
+BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="$(BR2_EXTERNAL)/configs/linux/skiroot_defconfig"
 BR2_LINUX_KERNEL_ZIMAGE_EPAPR=y
 BR2_PACKAGE_BUSYBOX_SHOW_OTHERS=y
 BR2_PACKAGE_LINUX_FIRMWARE=y
diff --git a/openpower/custom/Config.in b/openpower/custom/Config.in
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/openpower/custom/Config.in
diff --git a/openpower/custom/README b/openpower/custom/README
new file mode 100644
index 0000000..088575f
--- /dev/null
+++ b/openpower/custom/README
@@ -0,0 +1,16 @@
+This directory is for placing custom packages that can be kept separate from
+an upstream op-build.  The purpose of this is to make pulling in upstream
+op-build updates much easier, since your customizations will not touch any 
+files also modified by op-build changes.
+
+openpower/custom/configs        # For machine configs (*_defconfig files)
+                /package        # For additional packages.
+                /patches        # For patching existing packages.
+
+It is recommended that the layout of the custom/configs and custom/package
+directories follow the layout of the openpower/ peers.
+
+The openpower/custom/patches directory should have subdirectories for each
+package desired to be patched and patch files contained inside.  For example
+to add a patch to skiboot you would create:
+    openpower/custom/patches/skiboot/skiboot-0001-example.patch
diff --git a/openpower/custom/configs/.dont_delete_this b/openpower/custom/configs/.dont_delete_this
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/openpower/custom/configs/.dont_delete_this
diff --git a/openpower/custom/package/.dont_delete_this b/openpower/custom/package/.dont_delete_this
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/openpower/custom/package/.dont_delete_this
diff --git a/openpower/custom/patches/.dont_delete_this b/openpower/custom/patches/.dont_delete_this
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/openpower/custom/patches/.dont_delete_this
diff --git a/openpower/external.mk b/openpower/external.mk
index 40f7eae..be628ba 100644
--- a/openpower/external.mk
+++ b/openpower/external.mk
@@ -1 +1,5 @@
 include $(sort $(wildcard $(BR2_EXTERNAL)/package/*/*.mk))
+
+# Utilize user-defined custom directory.
+include $(sort $(wildcard $(BR2_EXTERNAL)/custom/*.mk))
+BR2_GLOBAL_PATCH_DIR += " $(BR2_EXTERNAL)/custom/patches "
diff --git a/openpower/package/Config.in b/openpower/package/Config.in
index 3271f80..c0a0dc1 100644
--- a/openpower/package/Config.in
+++ b/openpower/package/Config.in
@@ -3,6 +3,8 @@
 source "$BR2_EXTERNAL/package/hostboot-binaries/Config.in"
 source "$BR2_EXTERNAL/package/palmetto-xml/Config.in"
 source "$BR2_EXTERNAL/package/habanero-xml/Config.in"
+source "$BR2_EXTERNAL/package/firestone-xml/Config.in"
 source "$BR2_EXTERNAL/package/openpower-pnor/Config.in"
 source "$BR2_EXTERNAL/package/p8-pore-binutils/Config.in"
 source "$BR2_EXTERNAL/package/occ/Config.in"
+source "$BR2_EXTERNAL/package/capp-ucode/Config.in"
diff --git a/openpower/package/capp-ucode/Config.in b/openpower/package/capp-ucode/Config.in
new file mode 100644
index 0000000..1bdbc23
--- /dev/null
+++ b/openpower/package/capp-ucode/Config.in
@@ -0,0 +1,10 @@
+config BR2_PACKAGE_CAPP_UCODE
+        bool "capp_capp"
+        default y if (BR2_OPENPOWER_PLATFORM && BR2_powerpc_power8)
+        help
+            Microcode for CAPP hardware
+
+config BR2_CAPP_UCODE_BIN_FILENAME
+        string "Name of CAPP UCODE image file"
+        help
+            String used to define name of the CAPP UCODE binary image file
diff --git a/openpower/package/capp-ucode/capp-ucode.mk b/openpower/package/capp-ucode/capp-ucode.mk
new file mode 100644
index 0000000..88a9020
--- /dev/null
+++ b/openpower/package/capp-ucode/capp-ucode.mk
@@ -0,0 +1,20 @@
+################################################################################
+#
+# capp-ucode.mk
+#
+################################################################################
+CAPP_UCODE_VERSION ?= d4b26834dd674b83971d00a8c0952fa5830c8f6a
+CAPP_UCODE_SITE ?= $(call github,open-power,capp-ucode,$(CAPP_UCODE_VERSION))
+PETITBOOT_LICENSE = Apache-2.0
+
+CAPP_UCODE_INSTALL_IMAGES = YES
+
+define CAPP_UCODE_BUILD_CMDS
+	cd $(@D) && ./build.sh
+endef
+
+define CAPP_UCODE_INSTALL_IMAGES_CMDS
+       $(INSTALL) $(@D)/cappucode.bin $(BINARIES_DIR)
+endef
+
+$(eval $(generic-package))
diff --git a/openpower/package/firestone-xml/Config.in b/openpower/package/firestone-xml/Config.in
new file mode 100755
index 0000000..f0c0948
--- /dev/null
+++ b/openpower/package/firestone-xml/Config.in
@@ -0,0 +1,23 @@
+config BR2_PACKAGE_FIRESTONE_XML
+        bool "firestone_xml"
+        default y if (BR2_OPENPOWER_CONFIG_NAME = "firestone")
+        help
+            Utilites for building xml and the targeting binary image
+
+config BR2_FIRESTONE_SYSTEM_XML_FILENAME
+        string "Firestone targeting system xml filename"
+        default ""
+        help
+            Defines the name of the system XML filename to be used when creating targeting binary image
+
+config BR2_FIRESTONE_MRW_XML_FILENAME
+        string "Firestone targeting mrw xml filename"
+        default ""
+        help
+            Defines the name of the mrw XML filename to be used when creating targeting binary image
+
+config BR2_FIRESTONE_BIOS_XML_FILENAME
+        string "Firestone BIOS metadata XML filename"
+        default ""
+        help
+            Defines the name of the BIOS XML filename to parse when generating BIOS metadata
diff --git a/openpower/package/firestone-xml/firestone.mk b/openpower/package/firestone-xml/firestone.mk
new file mode 100644
index 0000000..aa77e03
--- /dev/null
+++ b/openpower/package/firestone-xml/firestone.mk
@@ -0,0 +1,76 @@
+################################################################################
+#
+# firestone_xml
+#
+################################################################################
+
+FIRESTONE_XML_VERSION ?= 8023db709f2ed5ee4c481fcb7eff68a30248e0ae
+FIRESTONE_XML_SITE ?= $(call github,open-power,firestone-xml,$(FIRESTONE_XML_VERSION))
+
+FIRESTONE_XML_LICENSE = Apache-2.0
+FIRESTONE_XML_DEPENDENCIES = hostboot-install-images openpower-mrw-install-images common-p8-xml-install-images
+
+FIRESTONE_XML_INSTALL_IMAGES = YES
+FIRESTONE_XML_INSTALL_TARGET = YES
+
+MRW_SCRATCH=$(STAGING_DIR)/openpower_mrw_scratch
+MRW_HB_TOOLS=$(STAGING_DIR)/hostboot_build_images
+
+# Defines for BIOS metadata creation
+BIOS_SCHEMA_FILE = $(MRW_HB_TOOLS)/bios.xsd
+FIRESTONE_BIOS_XML_CONFIG_FILE = $(MRW_SCRATCH)/$(BR2_FIRESTONE_BIOS_XML_FILENAME)
+BIOS_XML_METADATA_FILE = \
+    $(MRW_HB_TOOLS)/$(BR2_OPENPOWER_CONFIG_NAME)_bios_metadata.xml
+PETITBOOT_XSLT_FILE = $(MRW_HB_TOOLS)/bios_metadata_petitboot.xslt
+PETITBOOT_BIOS_XML_METADATA_FILE = \
+    $(MRW_HB_TOOLS)/$(BR2_OPENPOWER_CONFIG_NAME)_bios_metadata_petitboot.xml
+PETITBOOT_BIOS_XML_METADATA_INITRAMFS_FILE = \
+    $(TARGET_DIR)/usr/share/bios_metadata.xml
+
+define FIRESTONE_XML_BUILD_CMDS
+        # copy the firestone xml where the common lives
+        bash -c 'mkdir -p $(MRW_SCRATCH) && cp -r $(@D)/* $(MRW_SCRATCH)'
+
+        # generate the system mrw xml
+        # Not processing until actaul xml is here
+        perl -I $(MRW_HB_TOOLS) \
+        $(MRW_HB_TOOLS)/processMrw.pl -x $(MRW_SCRATCH)/firestone.xml
+        
+        # merge in any system specific attributes, hostboot attributes
+        $(MRW_HB_TOOLS)/mergexml.sh $(MRW_SCRATCH)/$(BR2_FIRESTONE_SYSTEM_XML_FILENAME) \
+            $(MRW_HB_TOOLS)/attribute_types.xml \
+            $(MRW_HB_TOOLS)/attribute_types_hb.xml \
+            $(MRW_HB_TOOLS)/target_types_merged.xml \
+            $(MRW_HB_TOOLS)/target_types_hb.xml \
+            $(MRW_SCRATCH)/$(BR2_FIRESTONE_MRW_XML_FILENAME) > $(MRW_HB_TOOLS)/temporary_hb.hb.xml;
+
+        # creating the targeting binary
+        $(MRW_HB_TOOLS)/xmltohb.pl  \
+            --hb-xml-file=$(MRW_HB_TOOLS)/temporary_hb.hb.xml \
+            --fapi-attributes-xml-file=$(MRW_HB_TOOLS)/fapiattrs.xml \
+            --src-output-dir=none \
+            --img-output-dir=$(MRW_HB_TOOLS)/ \
+            --vmm-consts-file=$(MRW_HB_TOOLS)/vmmconst.h --noshort-enums \
+            --bios-xml-file=$(FIRESTONE_BIOS_XML_CONFIG_FILE) \
+            --bios-schema-file=$(BIOS_SCHEMA_FILE) \
+            --bios-output-file=$(BIOS_XML_METADATA_FILE)
+
+        # Transform BIOS XML into Petitboot specific BIOS XML via the schema
+        xsltproc -o \
+            $(PETITBOOT_BIOS_XML_METADATA_FILE) \
+            $(PETITBOOT_XSLT_FILE) \
+            $(BIOS_XML_METADATA_FILE)
+endef
+
+define FIRESTONE_XML_INSTALL_IMAGES_CMDS
+        mv $(MRW_HB_TOOLS)/targeting.bin $(MRW_HB_TOOLS)/$(BR2_OPENPOWER_TARGETING_BIN_FILENAME)
+endef
+
+define FIRESTONE_XML_INSTALL_TARGET_CMDS
+        # Install Petitboot specific BIOS XML into initramfs's usr/share/ dir
+        $(INSTALL) -D -m 0644 \
+            $(PETITBOOT_BIOS_XML_METADATA_FILE) \
+            $(PETITBOOT_BIOS_XML_METADATA_INITRAMFS_FILE)
+endef
+
+$(eval $(generic-package))
diff --git a/openpower/package/habanero-xml/habanero-xml.mk b/openpower/package/habanero-xml/habanero-xml.mk
index b2e759b..e1abd28 100644
--- a/openpower/package/habanero-xml/habanero-xml.mk
+++ b/openpower/package/habanero-xml/habanero-xml.mk
@@ -4,7 +4,7 @@
 #
 ################################################################################
 
-HABANERO_XML_VERSION ?= f98000504ec8fafb4f8547c0427f0a8056e7b8b7
+HABANERO_XML_VERSION ?= 4c1e936c0329384020b126efe69d2148cfe48960
 HABANERO_XML_SITE ?= $(call github,open-power,habanero-xml,$(HABANERO_XML_VERSION))
 
 HABANERO_XML_LICENSE = Apache-2.0
diff --git a/openpower/package/hostboot-binaries/hostboot_binaries.mk b/openpower/package/hostboot-binaries/hostboot_binaries.mk
index 31006ca..03523c3 100644
--- a/openpower/package/hostboot-binaries/hostboot_binaries.mk
+++ b/openpower/package/hostboot-binaries/hostboot_binaries.mk
@@ -4,7 +4,7 @@
 #
 ################################################################################
 
-HOSTBOOT_BINARIES_VERSION ?= e3c9356a11663f7497dbf80ee712587a7271e493
+HOSTBOOT_BINARIES_VERSION ?= d41753f2b5e2510d6bc6ce58adf8e55207b8d317
 HOSTBOOT_BINARIES_SITE ?= $(call github,open-power,hostboot-binaries,$(HOSTBOOT_BINARIES_VERSION))
 HOSTBOOT_BINARIES_LICENSE = Apache-2.0
 
diff --git a/openpower/package/hostboot/hostboot-0004-Downgrade-OCC-Config-Data-Version-if-no-FIR-Master.patch b/openpower/package/hostboot/hostboot-0004-Downgrade-OCC-Config-Data-Version-if-no-FIR-Master.patch
deleted file mode 100644
index 4cda4f5..0000000
--- a/openpower/package/hostboot/hostboot-0004-Downgrade-OCC-Config-Data-Version-if-no-FIR-Master.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From 93266f96f39f038fc8ad396a5df316c07980f4bf Mon Sep 17 00:00:00 2001
-From: Dan Crowell <dcrowell@us.ibm.com>
-Date: Sat, 28 Feb 2015 11:54:47 -0600
-Subject: [PATCH 3/4] Downgrade OCC Config Data Version if no FIR Master
-
-Change-Id: Idc48298a9c3068da2216172da474ebff93eb3839
-(cherry picked from commit f84f34cc5628d9e7d7d55d0e95462b3fe22d80d5)
----
- src/include/usr/hwpf/hwp/occ/occ_common.H |    2 ++
- src/usr/hwpf/hwp/occ/occ_common.C         |    3 +++
- 2 files changed, 5 insertions(+), 0 deletions(-)
-
-diff --git a/src/include/usr/hwpf/hwp/occ/occ_common.H b/src/include/usr/hwpf/hwp/occ/occ_common.H
-index ca7ab39..7ddb302 100644
---- a/src/include/usr/hwpf/hwp/occ/occ_common.H
-+++ b/src/include/usr/hwpf/hwp/occ/occ_common.H
-@@ -58,6 +58,8 @@ namespace HBOCC
-     enum
-     {
-         OccHostDataVersion = 3,
-+        PRE_FIR_MASTER_VERSION = 2,
-+
-         OCC_LIDID = 0x81e00430,
-         OCC_IBSCOM_RANGE_IN_MB = MEGABYTE,
- 
-diff --git a/src/usr/hwpf/hwp/occ/occ_common.C b/src/usr/hwpf/hwp/occ/occ_common.C
-index 98e6382..0373727 100644
---- a/src/usr/hwpf/hwp/occ/occ_common.C
-+++ b/src/usr/hwpf/hwp/occ/occ_common.C
-@@ -170,6 +170,9 @@ namespace HBOCC
-         }
- #else
-         config_data->firMaster = 0;
-+        //force to an older version so we can support
-+        // older levels of OCC
-+        config_data->version = PRE_FIR_MASTER_VERSION;
- #endif
- 
-         TRACUCOMP( g_fapiTd,
--- 
-1.7.4.1
-
diff --git a/openpower/package/hostboot/hostboot-0006-Revert-SW294127-INITPROC-FSP-Hostboot-fast-exit-powe.patch b/openpower/package/hostboot/hostboot-0004-Revert-SW294127-INITPROC-FSP-Hostboot-fast-exit-powe.patch
similarity index 100%
rename from openpower/package/hostboot/hostboot-0006-Revert-SW294127-INITPROC-FSP-Hostboot-fast-exit-powe.patch
rename to openpower/package/hostboot/hostboot-0004-Revert-SW294127-INITPROC-FSP-Hostboot-fast-exit-powe.patch
diff --git a/openpower/package/hostboot/hostboot-0008-Disable-SPD-writes-workaround-for-DRAM-repairs-error.patch b/openpower/package/hostboot/hostboot-0005-Disable-SPD-writes-workaround-for-DRAM-repairs-error.patch
similarity index 86%
rename from openpower/package/hostboot/hostboot-0008-Disable-SPD-writes-workaround-for-DRAM-repairs-error.patch
rename to openpower/package/hostboot/hostboot-0005-Disable-SPD-writes-workaround-for-DRAM-repairs-error.patch
index 05ea39a..43b5c43 100644
--- a/openpower/package/hostboot/hostboot-0008-Disable-SPD-writes-workaround-for-DRAM-repairs-error.patch
+++ b/openpower/package/hostboot/hostboot-0005-Disable-SPD-writes-workaround-for-DRAM-repairs-error.patch
@@ -1,7 +1,7 @@
-From de6b906bd93e0928cd5464418091268aa7a5ac78 Mon Sep 17 00:00:00 2001
+From e02245750b63a6b892ee48f1422309c8dd4f0c4f Mon Sep 17 00:00:00 2001
 From: Corey Swenson <cswenson@us.ibm.com>
 Date: Fri, 27 Feb 2015 09:45:47 -0600
-Subject: [PATCH 1/3] Disable SPD writes - workaround for DRAM repairs error
+Subject: [PATCH 2/4] Disable SPD writes - workaround for DRAM repairs error
 
 Change-Id: Ic5fac400abff8fef004268dfbdf33fa6ecdded1c
 (cherry picked from commit 1bc5bb42be8e81b525993e9b5dcf08fe684bade4)
diff --git a/openpower/package/hostboot/hostboot-0005-Watchdog-timer-increase-to-7-minutes.patch b/openpower/package/hostboot/hostboot-0005-Watchdog-timer-increase-to-7-minutes.patch
deleted file mode 100644
index 321a067..0000000
--- a/openpower/package/hostboot/hostboot-0005-Watchdog-timer-increase-to-7-minutes.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 55b61605f1a58885e77d6737bfe36f957417a991 Mon Sep 17 00:00:00 2001
-From: Andrew Geissler <andrewg@us.ibm.com>
-Date: Wed, 25 Feb 2015 13:09:48 -0600
-Subject: [PATCH 1/2] Increase watchdog timout to 7.5 minutes
-
-Change-Id: I46070784c303e8135075bc5d36e17a2593ee494c
-RTC: 124676
----
- src/include/usr/ipmi/ipmiwatchdog.H |    7 +++++--
- 1 files changed, 5 insertions(+), 2 deletions(-)
-
-diff --git a/src/include/usr/ipmi/ipmiwatchdog.H b/src/include/usr/ipmi/ipmiwatchdog.H
-index f23b771..2296cc4 100644
---- a/src/include/usr/ipmi/ipmiwatchdog.H
-+++ b/src/include/usr/ipmi/ipmiwatchdog.H
-@@ -43,12 +43,15 @@ namespace IPMIWATCHDOG
- // Globals/Constants
- /******************************************************************************/
- /**
-- * @brief the default watchdog countdown setting it to 120 seconds.
-+ * @brief the default watchdog countdown setting it to 450 seconds.a
-+ *
-+ * Total time on 16x16GB on Habanero was 170s so double and add
-+ * some padding for max config 32 way Habanero.
-  *
-  * @TODO RTC:124499 revisit after performace improvments
-  *
-  */
--const uint16_t  DEFAULT_WATCHDOG_COUNTDOWN = 120;
-+const uint16_t  DEFAULT_WATCHDOG_COUNTDOWN = 450;
- 
- /**
-  * @brief the default watchdog countdown for transition between hostboot
--- 
-1.7.4.1
-
diff --git a/openpower/package/hostboot/hostboot-0006-sbe-pnor.patch b/openpower/package/hostboot/hostboot-0006-sbe-pnor.patch
new file mode 100644
index 0000000..cbf25e1
--- /dev/null
+++ b/openpower/package/hostboot/hostboot-0006-sbe-pnor.patch
@@ -0,0 +1,28 @@
+From 961d01024912ce7b0547095d38921bdd61ae8cd8 Mon Sep 17 00:00:00 2001
+From: Brian Horton <brianh@linux.ibm.com>
+Date: Wed, 11 Mar 2015 10:14:31 -0500
+Subject: [PATCH] fix SBE/PNOR merge issues
+
+Change-Id: I74752dbfa50fc78be66a9f185a7c6bc4d31732cd
+---
+ src/usr/sbe/sbe_update.C |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/usr/sbe/sbe_update.C b/src/usr/sbe/sbe_update.C
+index a559229..5ac4909 100644
+--- a/src/usr/sbe/sbe_update.C
++++ b/src/usr/sbe/sbe_update.C
+@@ -1791,8 +1791,8 @@ namespace SBE
+                                         reinterpret_cast<void*>(SBE_IMG_VADDR),
+                                         ((io_sbeState.seeprom_side_to_update ==
+                                          EEPROM::SBE_PRIMARY ) ?
+-                                            PNOR::SBE_SEEPROM0 :
+-                                            PNOR::SBE_SEEPROM1  ),
++                                            SBE_SEEPROM0 :
++                                            SBE_SEEPROM1  ),
+                                         PNOR::WORKING,
+                                         imageWasUpdated );
+ 
+-- 
+1.7.4.1
+
diff --git a/openpower/package/hostboot/hostboot-0007-Assert-called-when-trying-to-deconfigure-a-DIMM.patch b/openpower/package/hostboot/hostboot-0007-Assert-called-when-trying-to-deconfigure-a-DIMM.patch
deleted file mode 100644
index f3d6ff6..0000000
--- a/openpower/package/hostboot/hostboot-0007-Assert-called-when-trying-to-deconfigure-a-DIMM.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From 5a3e8e0e91dfee9f7f6b1e31f07789e2c2788e21 Mon Sep 17 00:00:00 2001
-From: Richard J. Knight <rjknight@us.ibm.com>
-Date: Fri, 27 Feb 2015 19:45:56 -0600
-Subject: [PATCH 2/3] Assert called when trying to deconfigure a DIMM
-
-    -Remove assert call from default path. Assert
-     should not be called for targets without status
-     sensors. Path should be a no-op.
-
-Change-Id: Id1aa002ea3d79cf24b5c123cbd92647257d12093
-RTC:124846
-(cherry picked from commit eadb8a16b0f04ce10169091263297f3dc4372c9c)
----
- src/usr/ipmi/ipmisensor.C |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
-diff --git a/src/usr/ipmi/ipmisensor.C b/src/usr/ipmi/ipmisensor.C
-index e5b4e64..a62e084 100644
---- a/src/usr/ipmi/ipmisensor.C
-+++ b/src/usr/ipmi/ipmisensor.C
-@@ -640,7 +640,7 @@ namespace SENSOR
-                 break;
- 
-             default:
--                assert(0, "No status sensor associated with target type 0x%x",
-+                TRACFCOMP(g_trac_ipmi,"INF>>No status sensor associated with target type 0x%x",
-                          i_target->getAttr<TARGETING::ATTR_TYPE>());
-                 break;
-         }
--- 
-1.7.4.1
-
diff --git a/openpower/package/hostboot/hostboot-0007-mss-thermal-init-SW297647_and_undo.patch b/openpower/package/hostboot/hostboot-0007-mss-thermal-init-SW297647_and_undo.patch
new file mode 100644
index 0000000..f6eafe5
--- /dev/null
+++ b/openpower/package/hostboot/hostboot-0007-mss-thermal-init-SW297647_and_undo.patch
@@ -0,0 +1,95 @@
+From 430bf7d7b8194bf7789db053999464390e143fdc Mon Sep 17 00:00:00 2001
+From: Brian Horton <brianh@linux.ibm.com>
+Date: Wed, 11 Mar 2015 16:13:11 -0500
+Subject: [PATCH] mss thermal patch from Mike Pradik
+
+AND undeo 1.18 attribute change
+
+Change-Id: I0c3e9d126077fb18bb771909631e0491da4b5f99
+---
+ .../mss_thermal_init/mss_thermal_init.C            |   26 ++++++++++++++++----
+ 1 files changed, 21 insertions(+), 5 deletions(-)
+
+diff --git a/src/usr/hwpf/hwp/dram_initialization/mss_thermal_init/mss_thermal_init.C b/src/usr/hwpf/hwp/dram_initialization/mss_thermal_init/mss_thermal_init.C
+index e09f47f..dc21852 100644
+--- a/src/usr/hwpf/hwp/dram_initialization/mss_thermal_init/mss_thermal_init.C
++++ b/src/usr/hwpf/hwp/dram_initialization/mss_thermal_init/mss_thermal_init.C
+@@ -22,7 +22,7 @@
+ /* permissions and limitations under the License.                         */
+ /*                                                                        */
+ /* IBM_PROLOG_END_TAG                                                     */
+-// $Id: mss_thermal_init.C,v 1.19 2015/02/12 23:23:56 pardeik Exp $
++// $Id: mss_thermal_init.C,v 1.18c CHANGED IN OPENPOWER PATCH brianh   Exp $
+ // $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/centaur/working/procedures/ipl/fapi/mss_thermal_init.C,v $
+ //------------------------------------------------------------------------------
+ // *! (C) Copyright International Business Machines Corp. 2011
+@@ -49,6 +49,8 @@
+ //------------------------------------------------------------------------------
+ // Version:|  Author: |  Date:  | Comment:
+ //---------|----------|---------|-----------------------------------------------
++//   1.18v | brianhk  |11-MAR-15| undo 1.18 change
++//   1.18u | pardeik  |03-MAR-15| user version to be like v1.20
+ //   1.18  | pardeik  |12-FEB-15| change ATTR_MRW_MEM_SENSOR_CACHE_ADDR_MAP to
+ //                              | a centaur target (was system)
+ //   1.17  | pardeik  |19-NOV-14| Use MRW attribute for SC address map for ISDIMMs
+@@ -160,6 +162,7 @@ fapi::ReturnCode mss_thermal_init(const fapi::Target & i_target)
+       const uint8_t I2C_BUS_ENCODE_PRIMARY = 0;
+       const uint8_t I2C_BUS_ENCODE_SECONDARY = 8;
+       const uint8_t MAX_NUM_DIMM_SENSORS = 8;
++      const uint8_t MAX_I2C_BUSSES = 2;
+ 
+       // Variable declaration
+       uint8_t l_dimm_ranks_array[l_NUM_MBAS][l_NUM_PORTS][l_NUM_DIMMS];	// Number of ranks for each configured DIMM in each MBA
+@@ -249,6 +252,19 @@ fapi::ReturnCode mss_thermal_init(const fapi::Target & i_target)
+           l_custom_dimm[i] = fapi::ENUM_ATTR_EFF_CUSTOM_DIMM_NO;
+       }
+ 
++      // zero out the l_dimm_ranks_array so it is initialized for later use if there is a deconfigured MBA
++      for (uint8_t i = 0; i < l_NUM_MBAS; i++)
++      {
++	  for (uint8_t j = 0; j < l_NUM_PORTS; j++)
++	  {
++	      for (uint8_t k = 0; k < l_NUM_DIMMS; k++)
++	      {
++		  l_dimm_ranks_array[i][j][k]=0;
++	      }
++	  }
++
++      }
++
+       for (uint8_t mba_index = 0; mba_index < l_target_mba_array.size(); mba_index++){
+          l_rc = FAPI_ATTR_GET(ATTR_CHIP_UNIT_POS, &l_target_mba_array[mba_index], l_mba_pos);
+ 	 if (l_rc) return l_rc;
+@@ -279,7 +295,7 @@ fapi::ReturnCode mss_thermal_init(const fapi::Target & i_target)
+       else
+       {
+ 	  // sensor cache address map for non custom dimm temperature sensors (which i2c bus and i2c address they are)
+-	  l_rc = FAPI_ATTR_GET(ATTR_MRW_MEM_SENSOR_CACHE_ADDR_MAP, &i_target, l_dimm_sensor_cache_addr_map);
++	  l_rc = FAPI_ATTR_GET(ATTR_MRW_MEM_SENSOR_CACHE_ADDR_MAP, NULL, l_dimm_sensor_cache_addr_map);
+ 	  if (l_rc) return l_rc;
+       }
+ 
+@@ -399,9 +415,9 @@ fapi::ReturnCode mss_thermal_init(const fapi::Target & i_target)
+ 
+ 	  l_cdimm_number_dimm_temp_sensors = 0;
+ 	  // cycle through both primary and secondary i2c busses, determine i2c address and enable bits
+-	  for (uint8_t k = 0; k < 2; k++)
++	  for (uint8_t k = 0; k < MAX_I2C_BUSSES; k++)
+ 	  {
+-	      for (uint8_t i = 0; i < 8; i++)
++	      for (uint8_t i = 0; i < MAX_NUM_DIMM_SENSORS; i++)
+ 	      {
+ 		  if (k == 0)
+ 		  {
+@@ -492,7 +508,7 @@ fapi::ReturnCode mss_thermal_init(const fapi::Target & i_target)
+          // Iterate through the num_ranks array to determine what DIMMs are plugged
+ 	 // Enable sensor monitoring for each plugged DIMM
+          uint32_t l_iterator = 0;
+-         for (uint32_t i = 0; i < 2; i++){
++         for (uint32_t i = 0; i < l_NUM_MBAS; i++){
+ 	    if (l_dimm_ranks_array[i][0][0] != 0){
+ 	       l_ecmd_rc |= l_data_scac_enable.setBit(l_iterator);
+ 	    }
+-- 
+1.7.4.1
+
diff --git a/openpower/package/hostboot/hostboot-0009-GOLDEN-SBE-Update-Support-Reconcile-SBE-images-and-P.patch b/openpower/package/hostboot/hostboot-0009-GOLDEN-SBE-Update-Support-Reconcile-SBE-images-and-P.patch
deleted file mode 100644
index 94e4c49..0000000
--- a/openpower/package/hostboot/hostboot-0009-GOLDEN-SBE-Update-Support-Reconcile-SBE-images-and-P.patch
+++ /dev/null
@@ -1,2028 +0,0 @@
-From 842770c162544b35609528b205d7c015454593fa Mon Sep 17 00:00:00 2001
-From: Mike Baiocchi <baiocchi@us.ibm.com>
-Date: Tue, 17 Feb 2015 13:07:13 -0600
-Subject: [PATCH 4/7] GOLDEN SBE Update Support - Reconcile SBE images and PNOR sides
-
-This code adds a new function at istep 6 to reconcile the two
-SBE Seeproms with the PNOR side and mode (ie, 2-sided, golden, etc).
-It also updates what happens in istep 9 in SBE_UPDATE_INDEPENDENT
-mode.
-
-Change-Id: If71ca52338a179b8cf38cfa336d9790737844715
-RTC: 120734
-(cherry picked from commit fe9afa4e7a3b0eb0e9ae16abb943039aacf34e09)
----
- src/include/usr/sbe/sbeif.H            |   13 +-
- src/include/usr/sbe/sbereasoncodes.H   |   10 +-
- src/usr/hwpf/hwp/slave_sbe/slave_sbe.C |   12 +
- src/usr/sbe/HBconfig                   |    6 +-
- src/usr/sbe/makefile                   |    5 +-
- src/usr/sbe/sbe_resolve_sides.C        | 1363 ++++++++++++++++++++++++++++++++
- src/usr/sbe/sbe_resolve_sides.H        |  259 ++++++
- src/usr/sbe/sbe_update.C               |  124 +++-
- 8 files changed, 1753 insertions(+), 39 deletions(-)
- create mode 100644 src/usr/sbe/sbe_resolve_sides.C
- create mode 100644 src/usr/sbe/sbe_resolve_sides.H
-
-diff --git a/src/include/usr/sbe/sbeif.H b/src/include/usr/sbe/sbeif.H
-index 8706e91..9cf20c6 100644
---- a/src/include/usr/sbe/sbeif.H
-+++ b/src/include/usr/sbe/sbeif.H
-@@ -5,7 +5,9 @@
- /*                                                                        */
- /* OpenPOWER HostBoot Project                                             */
- /*                                                                        */
--/* COPYRIGHT International Business Machines Corp. 2013,2014              */
-+/* Contributors Listed Below - COPYRIGHT 2013,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.       */
-@@ -66,6 +68,15 @@ namespace SBE
-      */
-     errlHndl_t updateProcessorSbeSeeproms();
- 
-+    /**
-+     * @brief Iterates through all the functional processors and resolves
-+     *        the Hostboot Base Addresses (HBB) in each SBE Image and performs
-+     *        any necessary operations related to GOLDEN side support.
-+     *
-+     * @return errlHndl_t    Error log handle on failure.
-+     */
-+    errlHndl_t resolveProcessorSbeSeeproms();
-+
- 
- } //end namespace SBE
- 
-diff --git a/src/include/usr/sbe/sbereasoncodes.H b/src/include/usr/sbe/sbereasoncodes.H
-index a09bb68..effb69e 100644
---- a/src/include/usr/sbe/sbereasoncodes.H
-+++ b/src/include/usr/sbe/sbereasoncodes.H
-@@ -5,7 +5,9 @@
- /*                                                                        */
- /* OpenPOWER HostBoot Project                                             */
- /*                                                                        */
--/* COPYRIGHT International Business Machines Corp. 2013,2014              */
-+/* Contributors Listed Below - COPYRIGHT 2013,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.       */
-@@ -54,6 +56,10 @@ enum sbeModuleId
-     SBE_CUSTOMIZE_IMG                   = 0x0B,
-     SBE_PERFORM_UPDATE_ACTIONS          = 0x0C,
-     SBE_MASTER_VERSION_COMPARE          = 0x0D,
-+    SBE_RESOLVE_HBB_ADDR                = 0x0E,
-+    SBE_READ_SBE_IMAGE                  = 0x0F,
-+    SBE_WRITE_SBE_IMAGE                 = 0x10,
-+    SBE_GET_SBE_IMAGE_SIZE              = 0x11,
- };
- 
- /**
-@@ -91,6 +97,8 @@ enum sbeReasonCode
-     SBE_MISCOMPARE_WITH_MASTER_VERSION  = SBE_COMP_ID | 0x13,
-     SBE_ERROR_ON_UPDATE                 = SBE_COMP_ID | 0x14,
-     SBE_MASTER_VERSION_DOWNLEVEL        = SBE_COMP_ID | 0x15,
-+    SBE_IMAGE_GET_SET_SCALAR_FAIL       = SBE_COMP_ID | 0x16,
-+
- };
- 
- };  // end SBE
-diff --git a/src/usr/hwpf/hwp/slave_sbe/slave_sbe.C b/src/usr/hwpf/hwp/slave_sbe/slave_sbe.C
-index 49225a4..fe568e2 100644
---- a/src/usr/hwpf/hwp/slave_sbe/slave_sbe.C
-+++ b/src/usr/hwpf/hwp/slave_sbe/slave_sbe.C
-@@ -175,6 +175,18 @@ void* call_host_slave_sbe_config(void *io_pArgs)
- 
-         }
-     }
-+
-+    // Resolve the side characteristics of the Processor SBE Seeproms
-+    errlHndl_t err = SBE::resolveProcessorSbeSeeproms();
-+    if ( err )
-+    {
-+        // Create IStep error log and cross reference error that occurred
-+        l_stepError.addErrorDetails( err );
-+
-+        // Commit Error
-+        errlCommit( err, HWPF_COMP_ID );
-+    }
-+
-     TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
-                "call_host_slave_sbe_config exit" );
- 
-diff --git a/src/usr/sbe/HBconfig b/src/usr/sbe/HBconfig
-index 0fa2441..fd2a8d0 100644
---- a/src/usr/sbe/HBconfig
-+++ b/src/usr/sbe/HBconfig
-@@ -20,9 +20,9 @@ config SBE_UPDATE_INDEPENDENT
-     depends on !SBE_UPDATE_SEQUENTIAL && !SBE_UPDATE_SIMULTANEOUS
-     help
-         If an update is necessary, and if the "current" SBE SEEPROM of this
--        IPL is not the 'GOLDEN' SBE SEEPROM, then only the current SBE SEEPROM
--        will be updated.  After the update a re-IPL request will be issued.
--        The other SBE SEEPROM, whether 'GOLDEN' or not, will not be updated.
-+        IPL is not pointing at PNOR's 'GOLDEN' side, then only the current SBE
-+        SEEPROM will be updated.  After the update a re-IPL request will be
-+        issued. The other SBE SEEPROM will not be updated.
- 
- config NO_SBE_UPDATES
-     default n
-diff --git a/src/usr/sbe/makefile b/src/usr/sbe/makefile
-index 06159ff..c45206e 100644
---- a/src/usr/sbe/makefile
-+++ b/src/usr/sbe/makefile
-@@ -5,7 +5,9 @@
- #
- # OpenPOWER HostBoot Project
- #
--# COPYRIGHT International Business Machines Corp. 2013,2014
-+# Contributors Listed Below - COPYRIGHT 2013,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.
-@@ -36,6 +38,7 @@ EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/include
- EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build
- 
- OBJS += sbe_update.o
-+OBJS += sbe_resolve_sides.o
- 
- SUBDIRS += test.d
- 
-diff --git a/src/usr/sbe/sbe_resolve_sides.C b/src/usr/sbe/sbe_resolve_sides.C
-new file mode 100644
-index 0000000..df9958d
---- /dev/null
-+++ b/src/usr/sbe/sbe_resolve_sides.C
-@@ -0,0 +1,1363 @@
-+/* IBM_PROLOG_BEGIN_TAG                                                   */
-+/* This is an automatically generated prolog.                             */
-+/*                                                                        */
-+/* $Source: src/usr/sbe/sbe_resolve_sides.C $                             */
-+/*                                                                        */
-+/* 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                                                     */
-+
-+#include <trace/interface.H>
-+#include <errl/errlentry.H>
-+#include <errl/errlmanager.H>
-+#include <errl/errludtarget.H>
-+#include <errl/errlreasoncodes.H>
-+#include <errl/hberrltypes.H>
-+#include <targeting/common/predicates/predicatectm.H>
-+#include <targeting/common/utilFilter.H>
-+#include <targeting/common/targetservice.H>
-+#include <util/misc.H>
-+#include <pnor/pnorif.H>
-+#include <pnor/ecc.H>
-+#include <devicefw/driverif.H>
-+#include <sys/mm.h>
-+#include <sys/misc.h>
-+#include <hwas/common/deconfigGard.H>
-+#include <initservice/initserviceif.H>
-+#include <config.h>
-+#include <ipmi/ipmiwatchdog.H>
-+#include <ipmi/ipmisensor.H>
-+#include <sbe/sbeif.H>
-+#include <sbe/sbereasoncodes.H>
-+#include "sbe_resolve_sides.H"
-+#include "sbe_update.H"
-+
-+//  fapi support
-+#include    <fapi.H>
-+#include    <fapiHwpExecutor.H>
-+#include    <hwpf/plat/fapiPlatHwpInvoker.H>
-+#include    <hwpf/plat/fapiPlatTrace.H>
-+
-+//Procedures
-+#include <p8_xip_customize.H>
-+#include <sbe_xip_image.h>
-+#include <p8_image_help_base.H>
-+
-+// ----------------------------------------------
-+// Trace definitions
-+// ----------------------------------------------
-+extern trace_desc_t* g_trac_sbe;
-+
-+// ------------------------
-+// Macros for unit testing
-+//#define TRACUCOMP(args...)  TRACFCOMP(args)
-+#define TRACUCOMP(args...)
-+
-+
-+using namespace ERRORLOG;
-+using namespace TARGETING;
-+
-+namespace SBE
-+{
-+    enum {
-+        SBE_IMG_VADDR = VMM_VADDR_SBE_UPDATE,
-+        RING_BUF1_VADDR = FIXED_SEEPROM_WORK_SPACE + SBE_IMG_VADDR,
-+        RING_BUF2_VADDR = RING_BUF1_VADDR + FIXED_RING_BUF_SIZE,
-+        //NOTE: recycling the same memory space for different
-+        //steps in the process.
-+        SBE_ECC_IMG_VADDR = RING_BUF1_VADDR,
-+        SBE_ECC_IMG_MAX_SIZE = VMM_VADDR_SBE_UPDATE_END - SBE_ECC_IMG_VADDR,
-+    };
-+
-+/////////////////////////////////////////////////////////////////////
-+errlHndl_t resolveProcessorSbeSeeproms()
-+{
-+    errlHndl_t err = NULL;
-+    errlHndl_t err_cleanup = NULL;
-+    sbeResolveState_t sideState;
-+    bool l_cleanupVmmSpace = false;
-+    bool l_restartNeeded   = false;
-+
-+    TRACUCOMP( g_trac_sbe,
-+               ENTER_MRK"resolveProcessorSbeSeeproms()" );
-+
-+    do{
-+
-+#ifdef CONFIG_NO_SBE_UPDATES
-+        TRACFCOMP( g_trac_sbe, INFO_MRK"resolveProcessorSbeSeeproms() -  "
-+                   "SBE updates not configured");
-+        break;
-+#endif
-+
-+#ifdef CONFIG_SBE_UPDATE_SIMULTANEOUS
-+        TRACFCOMP( g_trac_sbe, INFO_MRK"resolveProcessorSbeSeeproms() - "
-+                   "Do Nothing in SBE_UPDATE_SIMULTANEOUS mode");
-+        break;
-+#endif
-+
-+#ifdef CONFIG_SBE_UPDATE_SEQUENTIAL
-+        // Check if FSP-services are enabled and if we're running in simics
-+        if ( !INITSERVICE::spBaseServicesEnabled() &&
-+             !Util::isSimicsRunning() )
-+        {
-+            assert (false, "resolveProcessorSbeSeeproms() - "
-+                    "SBE_UPDATE_SEQUENTIAL mode, but FSP-services are not "
-+                    "enabled - Invalid Configuration");
-+        }
-+        else
-+        {
-+            TRACUCOMP( g_trac_sbe, INFO_MRK"resolveProcessorSbeSeeproms() - "
-+                       "Do Nothing in SBE_UPDATE_INDEPENDENT mode with FSP-"
-+                       "services enabled or running in simics");
-+             break;
-+        }
-+#endif
-+
-+        // Get Target Service, and the system target.
-+        TargetService& tS = targetService();
-+        TARGETING::Target* sys = NULL;
-+        (void) tS.getTopLevelTarget( sys );
-+        assert(sys, "resolveProcessorSbeSeeproms() system target is NULL");
-+
-+
-+        //Make sure procedure constants keep within expected range.
-+        assert((FIXED_SEEPROM_WORK_SPACE <= VMM_SBE_UPDATE_SIZE/2),
-+               "resolveProcessorSbeSeeproms() FIXED_SEEPROM_WORK_SPACE "
-+               "too large");
-+        assert((FIXED_RING_BUF_SIZE <= VMM_SBE_UPDATE_SIZE/4),
-+               "resolveProcessorSbeSeeproms() FIXED_RING_BUF_SIZE too "
-+               "large");
-+
-+        // Create VMM space for p8_xip_customize() procedure
-+        err = createSbeImageVmmSpace();
-+        if (err)
-+        {
-+            TRACFCOMP( g_trac_sbe,
-+                       INFO_MRK"resolveProcessorSbeSeeproms: "
-+                       "createSbeImageVmmSpace() Failed. ",
-+                       "rc=0x%.4X", err->reasonCode() );
-+
-+            break;
-+        }
-+        else
-+        {
-+            // Make sure cleanup gets called
-+            l_cleanupVmmSpace = true;
-+        }
-+
-+        /*****************************************************************/
-+        /*  Iterate over all the functional processors and do for each:  */
-+        /*****************************************************************/
-+        TARGETING::TargetHandleList procList;
-+        TARGETING::getAllChips(procList,
-+                               TARGETING::TYPE_PROC,
-+                               true); // true: return functional targets
-+
-+        if( ( 0 == procList.size() ) ||
-+            ( NULL == procList[0] ) )
-+        {
-+            TRACFCOMP( g_trac_sbe, ERR_MRK"resolveProcessorSbeSeeproms() - "
-+                       "No functional processors Found!" );
-+            break;
-+        }
-+
-+        for(uint32_t i=0; i<procList.size(); i++)
-+        {
-+            /***********************************************/
-+            /*  Get Side This Processor did/will boot from */
-+            /***********************************************/
-+            memset(&sideState, 0, sizeof(sideState));
-+            sideState.tgt = procList[i];
-+
-+            err = getSideState(sideState);
-+            if ( err )
-+            {
-+                TRACFCOMP( g_trac_sbe, ERR_MRK
-+                           "resolveProcessorSbeSeeproms: Error returned "
-+                           "from getSideState() "
-+                           "rc=0x%.4X, Target UID=0x%X",
-+                           err->reasonCode(),
-+                           TARGETING::get_huid(sideState.tgt));
-+                // Don't break - handle error at the end of the loop
-+            }
-+
-+
-+            /**********************************************/
-+            /*  Determine the necessary actions           */
-+            /**********************************************/
-+            // Skip if we got an error previously
-+            if ( err == NULL )
-+            {
-+                err = getSideActions(sideState);
-+                if (err)
-+                {
-+                    TRACFCOMP( g_trac_sbe,
-+                               INFO_MRK"resolveProcessorSbeSeeproms: "
-+                               "getSideActions() Failed "
-+                               "rc=0x%.4X, Target UID=0x%X",
-+                               err->reasonCode(),
-+                               TARGETING::get_huid(sideState.tgt));
-+
-+                    // Don't break - handle error at the end of the loop,
-+                }
-+            }
-+
-+            /**********************************************/
-+            /*  Perform the necessary actions             */
-+            /**********************************************/
-+            // Skip if we got an error previously
-+            if ( err == NULL )
-+            {
-+                err = performSideActions(sideState);
-+                if (err)
-+                {
-+                    TRACFCOMP( g_trac_sbe,
-+                               INFO_MRK"resolveProcessorSbeSeeproms: "
-+                               "performSideActions() Failed "
-+                               "rc=0x%.4X, Target UID=0x%X",
-+                               err->reasonCode(),
-+                               TARGETING::get_huid(sideState.tgt));
-+
-+                    // Don't break - handle error at the end of the loop,
-+                }
-+                else
-+                {
-+                    // Target updated without failure, so set IPL_RESTART
-+                    // flag, if necessary
-+                    if (sideState.actions & REIPL)
-+                    {
-+                       l_restartNeeded   = true;
-+                    }
-+                }
-+            }
-+
-+            /**********************************************/
-+            /*  Handle Errors                             */
-+            /**********************************************/
-+
-+            if ( err )
-+            {
-+                // Something failed for this target.
-+
-+                // Commit the error here and move on to the next target,
-+                // or if no targets left, will just continue the IPL
-+                TRACFCOMP( g_trac_sbe,
-+                           INFO_MRK"resolveProcessorSbeSeeproms: "
-+                           "Committing Error Log rc=0x%.4X eid=0x%.8X "
-+                           "plid=0x%.8X for Target UID=0x%X, but "
-+                           "continuing procedure",
-+                           err->reasonCode(),
-+                           err->eid(),
-+                           err->plid(),
-+                           TARGETING::get_huid(sideState.tgt));
-+                errlCommit( err, SBE_COMP_ID );
-+            }
-+
-+
-+        } //end of Target for loop collecting each target's SBE State
-+
-+
-+        /**************************************************************/
-+        /*  Perform System Operation                                  */
-+        /**************************************************************/
-+        // Restart IPL if SBE Update requires it
-+        if ( l_restartNeeded == true )
-+        {
-+            TRACFCOMP( g_trac_sbe,
-+                       INFO_MRK"resolveProcessorSbeSeeprom: Restart "
-+                       "Needed (%d).",
-+                       l_restartNeeded);
-+
-+#ifdef CONFIG_BMC_IPMI
-+                sbePreShutdownIpmiCalls();
-+#endif
-+
-+            TRACFCOMP( g_trac_sbe,
-+                       INFO_MRK"resolveProcessorSbeSeeproms: Calling "
-+                       "INITSERVICE::doShutdown() with "
-+                       "SBE_UPDATE_REQUEST_REIPL = 0x%X",
-+                       SBE_UPDATE_REQUEST_REIPL );
-+            INITSERVICE::doShutdown(SBE_UPDATE_REQUEST_REIPL);
-+        }
-+
-+    }while(0);
-+
-+
-+    // Cleanup VMM Workspace
-+    if ( l_cleanupVmmSpace == true )
-+    {
-+        err_cleanup = cleanupSbeImageVmmSpace();
-+        if ( err_cleanup != NULL )
-+        {
-+
-+            if ( err != NULL )
-+            {
-+                // 2 error logs, so commit the cleanup log here
-+                TRACFCOMP( g_trac_sbe,
-+                           ERR_MRK"resolveProcessorSbeSeeproms: Previous "
-+                           "error (rc=0x%X) before cleanupSbeImageVmmSpace"
-+                           "() failed.  Committing cleanup error (rc=0x%X) "
-+                           "and returning original error",
-+                           err->reasonCode(), err_cleanup->reasonCode()  );
-+
-+                 errlCommit( err_cleanup, SBE_COMP_ID );
-+            }
-+            else
-+            {
-+                // no previous error, so returning cleanup error
-+                TRACFCOMP( g_trac_sbe,
-+                           ERR_MRK"resolveProcessorSbeSeeproms: "
-+                           "cleanupSbeImageVmmSpace() failed.",
-+                           "rc=0x%.4X", err_cleanup->reasonCode() );
-+                err = err_cleanup;
-+            }
-+        }
-+    }
-+
-+
-+    TRACUCOMP( g_trac_sbe,
-+               EXIT_MRK"resolveProcessorSbeSeeproms()" );
-+
-+    return err;
-+}
-+
-+/////////////////////////////////////////////////////////////////////
-+errlHndl_t getSideState(sbeResolveState_t& io_sideState)
-+{
-+    errlHndl_t err = NULL;
-+    TRACUCOMP( g_trac_sbe,
-+               ENTER_MRK"getSideState()" );
-+
-+    do{
-+
-+        /***********************************************/
-+        /*  Get Side This Processor did/will boot from */
-+        /***********************************************/
-+        PNOR::sbeSeepromSide_t tmp_cur_side = PNOR::SBE_SEEPROM_INVALID;
-+        err = PNOR::getSbeBootSeeprom(io_sideState.tgt, tmp_cur_side);
-+        if ( err )
-+        {
-+            TRACFCOMP( g_trac_sbe, ERR_MRK
-+                       "resolveProcessorSbeSeeproms() - Error returned "
-+                       "from PNOR::getSbeBootSeeprom() "
-+                       "rc=0x%.4X, Target UID=0x%X",
-+                       err->reasonCode(),
-+                       TARGETING::get_huid(io_sideState.tgt));
-+            break;
-+        }
-+
-+        io_sideState.cur_side = tmp_cur_side;
-+
-+        io_sideState.alt_side = (tmp_cur_side == PNOR::SBE_SEEPROM0)
-+                                 ? PNOR::SBE_SEEPROM1 : PNOR::SBE_SEEPROM0;
-+
-+        /**********************************************/
-+        /*  Get PNOR Side Information                 */
-+        /**********************************************/
-+        PNOR::SideId tmp_side = PNOR::WORKING;
-+        PNOR::SideInfo_t tmp_side_info;
-+        err = PNOR::getSideInfo (tmp_side, tmp_side_info);
-+        if ( err )
-+        {
-+            TRACFCOMP( g_trac_sbe, ERR_MRK
-+                       "resolveProcessorSbeSeeproms() - Error returned "
-+                       "from PNOR::getSideInfo() "
-+                       "rc=0x%.4X, Target UID=0x%X",
-+                       err->reasonCode(),
-+                       TARGETING::get_huid(io_sideState.tgt));
-+            break;
-+        }
-+
-+        io_sideState.pnor_sideId       = tmp_side_info.id;
-+        io_sideState.pnor_side         = tmp_side_info.side;
-+        io_sideState.pnor_isGolden     = tmp_side_info.isGolden;
-+        io_sideState.pnor_hasOtherSide = tmp_side_info.hasOtherSide;
-+
-+    }while(0);
-+
-+
-+    TRACUCOMP( g_trac_sbe,
-+               EXIT_MRK"getSideState(): cur/alt=%d/%d. Side-%c(%d): "
-+               "isGolden=%d, hasOtherSide=%d",
-+               io_sideState.cur_side, io_sideState.alt_side,
-+               io_sideState.pnor_side, io_sideState.pnor_sideId,
-+               io_sideState.pnor_isGolden, io_sideState.pnor_hasOtherSide );
-+
-+    return err;
-+}
-+
-+
-+/////////////////////////////////////////////////////////////////////
-+errlHndl_t getSideActions(sbeResolveState_t& io_sideState)
-+{
-+    errlHndl_t err = NULL;
-+    uint32_t l_actions = NO_ACTIONS;
-+    TRACUCOMP( g_trac_sbe,
-+               ENTER_MRK"getSideActions()" );
-+
-+    do{
-+
-+        // Check if PNOR is running from its GOLDEN side
-+        if ( io_sideState.pnor_isGolden == true )
-+        {
-+
-+            // If Booting From Seeprom that is pointing to PNOR's GOLDEN Side
-+            // and is possibly the READ_ONLY_SEEPROM - No Re-IPL
-+            if ( io_sideState.cur_side == READ_ONLY_SEEPROM )
-+            {
-+                l_actions |= COPY_READ_ONLY_TO_WORKING;
-+                io_sideState.update_side = io_sideState.alt_side;
-+#ifdef CONFIG_PNOR_TWO_SIDE_SUPPORT
-+                // Need info from PNOR's non-working side for update side
-+                l_actions |= USE_PNOR_ALT_SIDE;
-+                TRACUCOMP( g_trac_sbe, "getSideActions(): Asking for "
-+                           "USE_PNOR_ALT_SIDE: actions=0x%X", l_actions);
-+#endif
-+            }
-+            else
-+            {
-+                // non-READ_ONLY_SEEPROM is pointing to PNOR's GOLDEN side
-+                // This requires an update and re-IPL (Possibly Genesis Mode)
-+                l_actions |= COPY_READ_ONLY_TO_WORKING;
-+                l_actions |= REIPL;
-+                io_sideState.update_side = io_sideState.cur_side;
-+
-+#ifdef CONFIG_PNOR_TWO_SIDE_SUPPORT
-+                // Need info from PNOR's non-working side for update side
-+                l_actions |= USE_PNOR_ALT_SIDE;
-+                TRACUCOMP( g_trac_sbe, "getSideActions(): Asking for "
-+                           "USE_PNOR_ALT_SIDE: actions=0x%X", l_actions);
-+#endif
-+
-+            }
-+        }
-+
-+        // Even though READ_ONLY_SEEPROM is not pointing to PNOR's GOLDEN side,
-+        // treat like it is if there is only 1 side (ie, Palmetto configuration)
-+        else if (  ( io_sideState.pnor_hasOtherSide == false ) &&
-+                   ( io_sideState.cur_side == READ_ONLY_SEEPROM ) )
-+        {
-+            l_actions |= COPY_READ_ONLY_TO_WORKING;
-+            io_sideState.update_side = io_sideState.alt_side;
-+        }
-+
-+        else // current Seeprom not pointing to PNOR's GOLDEN side
-+        {
-+            l_actions |= CHECK_WORKING_HBB;
-+            io_sideState.update_side = io_sideState.cur_side;
-+            // REIPL action will be determined later
-+        }
-+
-+        io_sideState.actions = l_actions;
-+
-+        TRACUCOMP( g_trac_sbe, "getSideActions() Tgt=0x%X: "
-+                   "pnor_isGolden/hasOtherSide=%d/%d, actions=0x%.8X, "
-+                   "Update Side=0x%X, cur=%d",
-+                   TARGETING::get_huid(io_sideState.tgt),
-+                   io_sideState.pnor_isGolden, io_sideState.pnor_hasOtherSide,
-+                   io_sideState.actions,
-+                   io_sideState.update_side,
-+                   io_sideState.cur_side);
-+
-+    }while(0);
-+
-+    TRACUCOMP( g_trac_sbe,
-+               EXIT_MRK"getSideActions()" );
-+
-+    return err;
-+}
-+
-+
-+
-+/////////////////////////////////////////////////////////////////////
-+errlHndl_t performSideActions(sbeResolveState_t& io_sideState)
-+{
-+    errlHndl_t err = NULL;
-+    TRACUCOMP( g_trac_sbe,
-+               ENTER_MRK"performSideActions()" );
-+
-+    bool updateForHBB = false;
-+    size_t image_size = 0;
-+    sbeSeepromVersionInfo_t image_version;
-+
-+    do{
-+        if ( io_sideState.actions & COPY_READ_ONLY_TO_WORKING )
-+        {
-+            // Copy READ_ONLY SBE Seeprom Image to Memory
-+            err = readSbeImage(io_sideState.tgt,
-+                               reinterpret_cast<void*>(SBE_IMG_VADDR),
-+                               READ_ONLY_SEEPROM,
-+                               image_size,
-+                               image_version);
-+            if ( err )
-+            {
-+                TRACFCOMP( g_trac_sbe, ERR_MRK
-+                           "performSideActions: Error returned from "
-+                           "getSetSbeImage() rc=0x%.4X, Target UID=0x%X, "
-+                           "actions = 0x%X, image_size=0x%X",
-+                           err->reasonCode(),
-+                           TARGETING::get_huid(io_sideState.tgt),
-+                           io_sideState.actions, image_size);
-+                break;
-+            }
-+        }
-+
-+        if ( io_sideState.actions & CHECK_WORKING_HBB )
-+        {
-+
-+            // Copy current SBE Seeprom Image to Memory
-+            // NOTE: Seprate section from above because of possible future
-+            // improvement to use MBPD SB Keyword bit to keep track of HBB
-+
-+            err = readSbeImage(io_sideState.tgt,
-+                                 reinterpret_cast<void*>(SBE_IMG_VADDR),
-+                                 io_sideState.update_side,
-+                                 image_size,
-+                                 image_version);
-+            if ( err )
-+            {
-+                TRACFCOMP( g_trac_sbe, ERR_MRK
-+                           "performSideActions: Error returned from "
-+                           "getSetSbeImage() rc=0x%.4X, Target UID=0x%X, "
-+                           "actions = 0x%X, image_size=0x%X",
-+                           err->reasonCode(),
-+                           TARGETING::get_huid(io_sideState.tgt),
-+                           io_sideState.actions, image_size);
-+                break;
-+            }
-+
-+        }
-+
-+
-+        if ( ( io_sideState.actions & COPY_READ_ONLY_TO_WORKING ) ||
-+             ( io_sideState.actions & CHECK_WORKING_HBB ) )
-+        {
-+            // verify HBB
-+            PNOR::SideId pnor_side = PNOR::WORKING;
-+
-+#ifdef CONFIG_PNOR_TWO_SIDE_SUPPORT
-+            // In certain situations need info from Alternate PNOR
-+            if ( io_sideState.actions & USE_PNOR_ALT_SIDE)
-+            {
-+                pnor_side = PNOR::ALTERNATE;
-+            }
-+#endif
-+
-+
-+
-+            err = resolveImageHBBaddr(io_sideState.tgt,
-+                                      reinterpret_cast<void*>(SBE_IMG_VADDR),
-+                                      io_sideState.update_side,
-+                                      pnor_side,
-+                                      updateForHBB);
-+            if ( err )
-+            {
-+                TRACFCOMP( g_trac_sbe, ERR_MRK
-+                           "performSideActions: Error returned from "
-+                           "resolveImageHBBaddr() rc=0x%.4X, Target UID=0x%X, "
-+                           "actions = 0x%X",
-+                           err->reasonCode(),
-+                           TARGETING::get_huid(io_sideState.tgt),
-+                           io_sideState.actions);
-+                break;
-+            }
-+
-+            // Since HBB was updated, we need to re-IPL if not booting on
-+            // READ_ONLY seeprom
-+            if ( ( updateForHBB == true ) &&
-+                 ( io_sideState.cur_side != READ_ONLY_SEEPROM ) )
-+            {
-+                io_sideState.actions |= REIPL;
-+                TRACUCOMP( g_trac_sbe, ERR_MRK
-+                           "performSideActions: resolveImageHBBaddr returned "
-+                           "updateForHBB=%d, and not on READ_ONLY_SEEPROM so "
-+                           "REIPL (actions=0x%X)",
-+                           updateForHBB, io_sideState.actions);
-+            }
-+        }
-+
-+        if ( ( io_sideState.actions & COPY_READ_ONLY_TO_WORKING ) ||
-+             ( updateForHBB == true ) )
-+        {
-+            //  Write Seeprom Image from memory to Seeprom
-+            err = writeSbeImage(io_sideState.tgt,
-+                                reinterpret_cast<void*>(SBE_IMG_VADDR),
-+                                io_sideState.update_side,
-+                                image_size,
-+                                image_version);
-+            if ( err )
-+            {
-+                TRACFCOMP( g_trac_sbe, ERR_MRK
-+                           "performSideActions: Error returned from "
-+                           "getSetSbeImage() rc=0x%.4X, Target UID=0x%X, "
-+                           "actions = 0x%X",
-+                           err->reasonCode(),
-+                           TARGETING::get_huid(io_sideState.tgt),
-+                           io_sideState.actions);
-+                break;
-+            }
-+        }
-+
-+    }while(0);
-+
-+    TRACUCOMP( g_trac_sbe,
-+               EXIT_MRK"performSideActions()" );
-+
-+    return err;
-+}
-+
-+
-+/////////////////////////////////////////////////////////////////////
-+errlHndl_t readSbeImage(TARGETING::Target* i_target,
-+                        void* o_imgPtr,
-+                        PNOR::sbeSeepromSide_t i_side,
-+                        size_t& o_image_size,
-+                        sbeSeepromVersionInfo_t& o_image_version)
-+{
-+    TRACUCOMP( g_trac_sbe,
-+               ENTER_MRK"readSbeImage(): tgt=0x%X, i_side=%d "
-+               "o_imgPtr=%p, o_image_size=0x%X",
-+               TARGETING::get_huid(i_target), i_side, o_imgPtr, o_image_size);
-+
-+    errlHndl_t err = NULL;
-+    int64_t rc = 0;
-+    PNOR::ECC::eccStatus eccStatus = PNOR::ECC::CLEAN;
-+    EEPROM::eeprom_chip_types_t l_seeprom = sbe_side_sync[i_side];
-+    size_t image_size_ECC = 0;
-+
-+    // Need to ensure that io_imgPtr is at SBE_IMG_VADDR = VMM_VADDR_SBE_UPDATE
-+    // since we need to use the VMM_VADDR_SBE_UPDATE space
-+    assert ( o_imgPtr == reinterpret_cast<void*>(SBE_IMG_VADDR),
-+             "getSetSbeImage() - o_imgPtr is not at SBE_IMG_VADDR");
-+
-+    do{
-+
-+        // Clear out back half of page block to use as temp space
-+        // for ECC injected SBE Image.
-+        rc = mm_remove_pages(RELEASE,
-+                             reinterpret_cast<void*>
-+                             (SBE_ECC_IMG_VADDR),
-+                             SBE_ECC_IMG_MAX_SIZE);
-+        if( rc )
-+        {
-+            TRACFCOMP( g_trac_sbe, ERR_MRK"getSetSbeImage() - Error "
-+                           "from mm_remove_pages : rc=%d,  HUID=0x%.8X.",
-+                           rc, TARGETING::get_huid(i_target) );
-+            /*@
-+             * @errortype
-+             * @moduleid     SBE_READ_SBE_IMAGE
-+             * @reasoncode   SBE_REMOVE_PAGES_FOR_EC
-+             * @userdata1    Requested Address
-+             * @userdata2    rc from mm_remove_pages
-+             * @devdesc      updateProcessorSbeSeeproms> mm_remove_pages
-+             *               RELEASE failed
-+             * @custdesc     A problem occurred while updating processor
-+             *               boot code.
-+             */
-+            err = new ErrlEntry(ERRL_SEV_UNRECOVERABLE,
-+                                SBE_READ_SBE_IMAGE,
-+                                SBE_REMOVE_PAGES_FOR_EC,
-+                                TO_UINT64(SBE_ECC_IMG_VADDR),
-+                                TO_UINT64(rc),
-+                                true /*Add HB SW Callout*/ );
-+
-+            //Target isn't directly related to fail, but could be useful
-+            // to see how far we got before failing.
-+            ErrlUserDetailsTarget(i_target).addToLog(err);
-+            err->collectTrace(SBE_COMP_NAME);
-+            break;
-+        }
-+
-+        /*****************************************/
-+        /*  Get Image Size                       */
-+        /*****************************************/
-+        err = getSbeImageSize(i_target,
-+                              o_imgPtr,
-+                              i_side,
-+                              o_image_size);
-+        if(err)
-+        {
-+            TRACFCOMP( g_trac_sbe, ERR_MRK"readSbeImage: - Error from "
-+                       "getSbeImageSize(): rc=0x%.4X, side=%d, HUID=0x%.8X.",
-+                       err->reasonCode(),
-+                       i_side, TARGETING::get_huid(i_target));
-+            break;
-+        }
-+
-+
-+        /*****************************************/
-+        /*  Do Actual Read                       */
-+        /*****************************************/
-+        image_size_ECC = ALIGN_8((o_image_size*9)/8);
-+
-+        assert(image_size_ECC <= SBE_ECC_IMG_MAX_SIZE,
-+               "getSetSbeImage() SBE Image with ECC too large");
-+
-+        // Read image to memory space
-+        err = DeviceFW::deviceOp(
-+                          DeviceFW::READ,
-+                          i_target,
-+                          reinterpret_cast<void*>
-+                            (SBE_ECC_IMG_VADDR),
-+                          image_size_ECC,
-+                          DEVICE_EEPROM_ADDRESS(
-+                                        l_seeprom,
-+                                        SBE_IMAGE_SEEPROM_ADDRESS));
-+
-+        if(err)
-+        {
-+            TRACFCOMP( g_trac_sbe, ERR_MRK"readSbeImage: - Error "
-+                       "from EEPROM op: rc=0x%.4X, seeprom=%d (side=%d). "
-+                       "HUID=0x%.8X. SBE_VADDR=0x%.16X, ECC_VADDR=0x%.16X, "
-+                       "size=0x%.8X, eccSize=0x%.8X, EEPROM offset=0x%X",
-+                       err->reasonCode(), l_seeprom, i_side,
-+                       TARGETING::get_huid(i_target),
-+                       SBE_IMG_VADDR, SBE_ECC_IMG_VADDR, o_image_size,
-+                       image_size_ECC, SBE_IMAGE_SEEPROM_ADDRESS);
-+            break;
-+        }
-+
-+        /*****************************************/
-+        /*  Remove ECC From Image                */
-+        /*****************************************/
-+
-+        // Clear destination
-+        memset( o_imgPtr, 0, MAX_SEEPROM_IMAGE_SIZE );
-+
-+        // Remove ECC
-+        eccStatus = PNOR::ECC::removeECC(reinterpret_cast<uint8_t*>
-+                                             (SBE_ECC_IMG_VADDR),
-+                                         reinterpret_cast<uint8_t*>
-+                                             (o_imgPtr),
-+                                         image_size_ECC);
-+
-+        // Fail if uncorrectable ECC
-+        if ( eccStatus == PNOR::ECC::UNCORRECTABLE )
-+        {
-+            // There is an ECC issue with this SEEPROM
-+
-+            TRACFCOMP( g_trac_sbe,ERR_MRK"readSbeImage: ECC Error "
-+                       "On SBE Image Read eccStatus=%d sI=%d, sI_ECC="
-+                       "%d, HUID=0x%.8X, Seeprom %d (side=%d)",
-+                       eccStatus, o_image_size, image_size_ECC,
-+                       TARGETING::get_huid(i_target),
-+                       l_seeprom, i_side );
-+
-+            /*@
-+             * @errortype
-+             * @moduleid     SBE_READ_SBE_IMAGE
-+             * @reasoncode   SBE_ECC_FAIL
-+             * @userdata1[0:15]     ECC Status
-+             * @userdata1[16:31]    SEEPROM Side
-+             * @userdata1[32:63]    Target HUID
-+             * @userdata2[0:31]     Size - No Ecc
-+             * @userdata2[32:63]    Size - ECC
-+             * @devdesc      ECC Fail Reading SBE Image
-+             */
-+            err = new ErrlEntry(ERRL_SEV_PREDICTIVE,
-+                                SBE_READ_SBE_IMAGE,
-+                                SBE_ECC_FAIL,
-+                                TWO_UINT32_TO_UINT64(
-+                                     ( (eccStatus << 16 ) |
-+                                       l_seeprom ),
-+                                     TARGETING::get_huid(i_target)),
-+                                TWO_UINT32_TO_UINT64(o_image_size,
-+                                                     image_size_ECC));
-+
-+            err->collectTrace(SBE_COMP_NAME);
-+
-+            err->addPartCallout(
-+                                 i_target,
-+                                 HWAS::SBE_SEEPROM_PART_TYPE,
-+                                 HWAS::SRCI_PRIORITY_HIGH,
-+                                 HWAS::NO_DECONFIG,
-+                                 HWAS::GARD_NULL );
-+
-+            ErrlUserDetailsTarget(i_target).addToLog(err);
-+
-+            break;
-+
-+        } // ECC check
-+
-+
-+        // Read out SBE Version Info
-+        bool seeprom_ver_ECC_fail = false;
-+        err = getSeepromSideVersion(i_target,
-+                                    l_seeprom,
-+                                    o_image_version,
-+                                    seeprom_ver_ECC_fail);
-+
-+
-+        if(err)
-+        {
-+            TRACFCOMP( g_trac_sbe, ERR_MRK"readSbeImage: - Error "
-+                       "from getSeepromSideVersion: rc=0x%.4X, seeprom=%d "
-+                       "(side=%d). HUID=0x%.8X",
-+                       err->reasonCode(), l_seeprom, i_side,
-+                       TARGETING::get_huid(i_target));
-+            break;
-+        }
-+
-+        else if (seeprom_ver_ECC_fail == true)
-+        {
-+            // For now, any issues will be addressed in SBE Update
-+            // later in the IPL
-+            TRACFCOMP( g_trac_sbe, ERR_MRK"readSbeImage: ECC fail=%d "
-+                       "Reading Seeprom Version seeprom=%d "
-+                       "(side=%d). HUID=0x%.8X",
-+                       seeprom_ver_ECC_fail, l_seeprom, i_side,
-+                       TARGETING::get_huid(i_target));
-+        }
-+
-+        TRACDBIN(g_trac_sbe, "readSbeImage: SBE Info Version",
-+                 reinterpret_cast<uint8_t*>(&o_image_version),
-+                 sizeof(o_image_version));
-+
-+    }while(0);
-+
-+
-+    TRACUCOMP( g_trac_sbe,
-+               EXIT_MRK"readSbeImage() - eccStatus=%d, "
-+               "size=0x%X, size_ECC=0x%X",
-+               eccStatus, o_image_size, image_size_ECC);
-+
-+
-+    return err;
-+}
-+
-+
-+/////////////////////////////////////////////////////////////////////
-+errlHndl_t writeSbeImage(TARGETING::Target* i_target,
-+                          void* i_imgPtr,
-+                          PNOR::sbeSeepromSide_t i_side,
-+                          size_t i_image_size,
-+                          sbeSeepromVersionInfo_t& io_version)
-+
-+{
-+    TRACFCOMP( g_trac_sbe,
-+               ENTER_MRK"writeSbeImage(): tgt=0x%X, i_side=%d "
-+               "i_imgPtr=%p, i_image_size=0x%X",
-+               TARGETING::get_huid(i_target), i_side, i_imgPtr, i_image_size);
-+
-+    errlHndl_t err = NULL;
-+    int64_t rc = 0;
-+    EEPROM::eeprom_chip_types_t l_seeprom = sbe_side_sync[i_side];
-+    size_t image_size_ECC = 0;
-+
-+    // For Version Information
-+    size_t sbeInfoSize = sizeof(sbeSeepromVersionInfo_t);
-+    size_t sbeInfoSize_ECC = (sbeInfoSize*9)/8;
-+
-+    uint8_t * sbeInfo_data_ECC = static_cast<uint8_t*>
-+                                            (malloc(sbeInfoSize_ECC));
-+
-+
-+    // Need to ensure that io_imgPtr is at SBE_IMG_VADDR = VMM_VADDR_SBE_UPDATE
-+    // since we need to use the VMM_VADDR_SBE_UPDATE space
-+    assert ( i_imgPtr == reinterpret_cast<void*>(SBE_IMG_VADDR),
-+             "writeSbeImage() - io_imgPtr is not at SBE_IMG_VADDR");
-+
-+    do{
-+
-+        // Clear out back half of page block to use as temp space
-+        // for ECC injected SBE Image.
-+        rc = mm_remove_pages(RELEASE,
-+                             reinterpret_cast<void*>
-+                             (SBE_ECC_IMG_VADDR),
-+                             SBE_ECC_IMG_MAX_SIZE);
-+        if( rc )
-+        {
-+            TRACFCOMP( g_trac_sbe, ERR_MRK"writeSbeImage() - Error "
-+                       "from mm_remove_pages : rc=%d,  HUID=0x%.8X.",
-+                       rc, TARGETING::get_huid(i_target) );
-+            /*@
-+             * @errortype
-+             * @moduleid     SBE_WRITE_SBE_IMAGE
-+             * @reasoncode   SBE_REMOVE_PAGES_FOR_EC
-+             * @userdata1    Requested Address
-+             * @userdata2    rc from mm_remove_pages
-+             * @devdesc      updateProcessorSbeSeeproms> mm_remove_pages
-+             *               RELEASE failed
-+             * @custdesc     A problem occurred while updating processor
-+             *               boot code.
-+             */
-+
-+            err = new ErrlEntry(ERRL_SEV_UNRECOVERABLE,
-+                                SBE_WRITE_SBE_IMAGE,
-+                                SBE_REMOVE_PAGES_FOR_EC,
-+                                TO_UINT64(SBE_ECC_IMG_VADDR),
-+                                TO_UINT64(rc),
-+                                true /*Add HB SW Callout*/ );
-+
-+            //Target isn't directly related to fail, but could be useful
-+            //to see how far we got before failing.
-+            ErrlUserDetailsTarget(i_target).addToLog(err);
-+            err->collectTrace(SBE_COMP_NAME);
-+            break;
-+        }
-+
-+        // Inject ECC
-+        PNOR::ECC::injectECC(reinterpret_cast<uint8_t*>(i_imgPtr),
-+                             ALIGN_8(i_image_size),
-+                             reinterpret_cast<uint8_t*>
-+                                 (SBE_ECC_IMG_VADDR));
-+
-+        /*****************************************/
-+        /*  Do Actual Write of Image             */
-+        /*****************************************/
-+        image_size_ECC = ALIGN_8((i_image_size*9)/8);
-+
-+        assert(image_size_ECC <= SBE_ECC_IMG_MAX_SIZE,
-+               "writeSbeImage() SBE Image with ECC too large");
-+
-+        err = deviceWrite(i_target,
-+                          reinterpret_cast<void*>
-+                            (SBE_ECC_IMG_VADDR),
-+                          image_size_ECC,
-+                          DEVICE_EEPROM_ADDRESS(
-+                                        l_seeprom,
-+                                        SBE_IMAGE_SEEPROM_ADDRESS));
-+
-+        if(err)
-+        {
-+            TRACFCOMP( g_trac_sbe, ERR_MRK"writeSbeImage: - Error "
-+                       "from EEPROM op: rc=0x%.4X, seeprom=%d (side=%d). "
-+                       "HUID=0x%.8X. SBE_VADDR=0x%.16X, ECC_VADDR=0x%.16X, "
-+                       "size=0x%.8X, eccSize=0x%.8X, EEPROM offset=0x%X",
-+                       err->reasonCode(), l_seeprom, i_side,
-+                       TARGETING::get_huid(i_target),
-+                       SBE_IMG_VADDR, SBE_ECC_IMG_VADDR, i_image_size,
-+                       image_size_ECC, SBE_IMAGE_SEEPROM_ADDRESS);
-+            break;
-+        }
-+
-+        /********************************************/
-+        /*  Do Actual Write of Version Information  */
-+        /********************************************/
-+
-+        // Update the image crc in the version information
-+        uint32_t image_crc = Util::crc32_calc(i_imgPtr, i_image_size);
-+
-+        memcpy( &(io_version.data_crc),
-+                &image_crc,
-+                sizeof(image_crc));
-+
-+       TRACDBIN( g_trac_sbe, "writeSbeImage: Version no ECC",
-+                 reinterpret_cast<uint8_t*>(&io_version), sizeof(io_version));
-+
-+        // Inject ECC
-+        memset( sbeInfo_data_ECC, 0, sbeInfoSize_ECC);
-+        PNOR::ECC::injectECC(reinterpret_cast<uint8_t*>(&io_version),
-+                             sbeInfoSize, sbeInfo_data_ECC);
-+
-+        TRACDBIN( g_trac_sbe, "writeSbeImage: Version with ECC",
-+                  sbeInfo_data_ECC, sbeInfoSize_ECC);
-+
-+        err = deviceWrite( i_target,
-+                           sbeInfo_data_ECC,
-+                           sbeInfoSize_ECC,
-+                           DEVICE_EEPROM_ADDRESS(
-+                                             l_seeprom,
-+                                             SBE_VERSION_SEEPROM_ADDRESS));
-+
-+        if(err)
-+        {
-+            TRACFCOMP( g_trac_sbe, ERR_MRK"writeSbeImage: - Error "
-+                       "Writing SBE Version Info: rc=0x%.4X, "
-+                       "HUID=0x%.8X, seeprom=%d, side=%d",
-+                       err->reasonCode(),
-+                       TARGETING::get_huid(i_target), l_seeprom, i_side);
-+            break;
-+        }
-+
-+    }while(0);
-+
-+    // Free allocated memory
-+    free(sbeInfo_data_ECC);
-+
-+    TRACUCOMP( g_trac_sbe,
-+               EXIT_MRK"writeSetSbeImage()" );
-+
-+    return err;
-+}
-+
-+
-+
-+
-+/////////////////////////////////////////////////////////////////////
-+errlHndl_t getSbeImageSize(TARGETING::Target* i_target,
-+                               void* i_imgPtr,
-+                               PNOR::sbeSeepromSide_t i_side,
-+                               size_t& o_image_size)
-+{
-+    TRACUCOMP( g_trac_sbe,
-+               ENTER_MRK"geSbeImageSize(): tgt=0x%X, i_side=%d "
-+               "i_imgPtr=%p, o_image_size=0x%X",
-+               TARGETING::get_huid(i_target), i_side, i_imgPtr, o_image_size);
-+
-+    errlHndl_t err = NULL;
-+    PNOR::ECC::eccStatus eccStatus = PNOR::ECC::CLEAN;
-+    EEPROM::eeprom_chip_types_t l_seeprom = sbe_side_sync[i_side];
-+    size_t image_size_ECC = 0;
-+
-+    // Need to ensure that i_imgPtr is at SBE_IMG_VADDR = VMM_VADDR_SBE_UPDATE
-+    // since we need to use the VMM_VADDR_SBE_UPDATE space
-+
-+    assert ( i_imgPtr == reinterpret_cast<void*>(SBE_IMG_VADDR),
-+             "getSbeImageSize() - i_imgPtr is not at SBE_IMG_VADDR");
-+
-+    do{
-+        // Need to read the SbeXipHeader of the image to determine size
-+        // of the image to read out.
-+        // Using io_imgPtr space. First read our header+ECC from SBE
-+        // Seeprom and then use space after that to put header without ECC
-+
-+
-+        size_t hdr_size = ALIGN_8(sizeof(SbeXipHeader));
-+        size_t hdr_size_ECC = (hdr_size * 9)/8;
-+
-+        uint8_t* hdr_ptr = reinterpret_cast<uint8_t*>(i_imgPtr) + hdr_size_ECC;
-+
-+        memset( i_imgPtr, 0, hdr_size_ECC + hdr_size );
-+
-+        TRACUCOMP( g_trac_sbe, INFO_MRK"getSetSbeImage() Reading "
-+                   "SbeXipHeader for Target 0x%X, Seeprom %d "
-+                   "(side=%d), size_ECC=0x%X (size=0x%X)",
-+                   TARGETING::get_huid(i_target),
-+                   l_seeprom, i_side, hdr_size_ECC, hdr_size );
-+
-+        err = DeviceFW::deviceOp( DeviceFW::READ,
-+                                  i_target,
-+                                  i_imgPtr,
-+                                  hdr_size_ECC,
-+                                  DEVICE_EEPROM_ADDRESS(
-+                                                l_seeprom,
-+                                                SBE_IMAGE_SEEPROM_ADDRESS));
-+
-+        if(err)
-+        {
-+            TRACFCOMP( g_trac_sbe, ERR_MRK"getSbeImageSize: - Error "
-+                       "Reading SbeXipHeader: rc=0x%.4X, seeprom=%d (side=%d). "
-+                       "HUID=0x%.8X. size=0x%.8X, EEPROM offset=0x%X",
-+                       err->reasonCode(), l_seeprom, i_side,
-+                       TARGETING::get_huid(i_target), sizeof(SbeXipHeader),
-+                       SBE_IMAGE_SEEPROM_ADDRESS);
-+            break;
-+        }
-+
-+
-+        TRACDBIN( g_trac_sbe,
-+                 "Data with ECC read from Seeprom",
-+                 i_imgPtr,
-+                 hdr_size_ECC );
-+
-+        // Remove ECC
-+        eccStatus = PNOR::ECC::removeECC(
-+                                     reinterpret_cast<uint8_t*>(i_imgPtr),
-+                                     hdr_ptr,
-+                                     hdr_size);
-+
-+        // Fail if uncorrectable ECC
-+        if ( eccStatus == PNOR::ECC::UNCORRECTABLE )
-+        {
-+            TRACFCOMP( g_trac_sbe,ERR_MRK"getSbeImageSize: ECC Error "
-+                       "On SBE Image Read eccStatus=%d sI=%d, sI_ECC="
-+                       "%d, HUID=0x%.8X, Seeprom %d (side=%d)",
-+                       eccStatus, o_image_size, image_size_ECC,
-+                       TARGETING::get_huid(i_target),
-+                       l_seeprom, i_side );
-+            /*@
-+             * @errortype
-+             * @moduleid     SBE_GET_SBE_IMAGE_SIZE
-+             * @reasoncode   SBE_ECC_FAIL
-+             * @userdata1[0:15]     ECC Status
-+             * @userdata1[16:31]    SEEPROM Side
-+             * @userdata1[32:63]    Target HUID
-+             * @userdata2[0:31]     Size - No Ecc
-+             * @userdata2[32:63]    Size - ECC
-+             * @devdesc      ECC Fail Reading SBE Image
-+             */
-+            err = new ErrlEntry(ERRL_SEV_PREDICTIVE,
-+                                SBE_GET_SBE_IMAGE_SIZE,
-+                                SBE_ECC_FAIL,
-+                                TWO_UINT32_TO_UINT64(
-+                                              ( (eccStatus << 16 ) |
-+                                                 l_seeprom ),
-+                                              TARGETING::get_huid(i_target)),
-+                                TWO_UINT32_TO_UINT64(o_image_size,
-+                                                     image_size_ECC));
-+            err->collectTrace(SBE_COMP_NAME);
-+            err->addPartCallout(
-+                                i_target,
-+                                HWAS::SBE_SEEPROM_PART_TYPE,
-+                                HWAS::SRCI_PRIORITY_HIGH,
-+                                HWAS::NO_DECONFIG,
-+                                HWAS::GARD_NULL );
-+
-+            ErrlUserDetailsTarget(i_target).addToLog(err);
-+
-+            break;
-+        }
-+
-+        TRACDBIN( g_trac_sbe,
-+                  "Data without ECC read from Seeprom",
-+                  hdr_ptr,
-+                  hdr_size );
-+
-+        o_image_size = (((SbeXipHeader*)hdr_ptr)->iv_imageSize);
-+
-+    }while(0);
-+
-+    TRACFCOMP( g_trac_sbe,
-+               EXIT_MRK"getSbeImageSize(): o_image_size=0x%X", o_image_size );
-+
-+    return err;
-+}
-+
-+
-+
-+/////////////////////////////////////////////////////////////////////
-+errlHndl_t resolveImageHBBaddr(TARGETING::Target* i_target,
-+                               void* io_imgPtr,
-+                               PNOR::sbeSeepromSide_t i_side,
-+                               PNOR::SideId  i_pnorSideId,
-+                               bool& o_imageWasUpdated )
-+{
-+    errlHndl_t err = NULL;
-+    uint64_t data = 0;
-+    int rc = 0;
-+    bool rc_fail_on_get = false; // 1=get failed, 0=set failed
-+
-+    o_imageWasUpdated = false;
-+
-+    TRACUCOMP( g_trac_sbe,
-+               ENTER_MRK"resolveImageHBBaddr() - tgt=0x%X, i_side=%d, "
-+               "i_pnorSideId=%d",
-+               TARGETING::get_huid(i_target), i_side, i_pnorSideId);
-+
-+    do{
-+
-+        // Get info from PNOR
-+        PNOR::SideInfo_t pnor_side_info;
-+        err = PNOR::getSideInfo (i_pnorSideId, pnor_side_info);
-+        if ( err )
-+        {
-+            TRACFCOMP( g_trac_sbe, ERR_MRK
-+                       "resolveImageHBBaddr() - Error returned "
-+                       "from PNOR::getSideInfo() rc=0x%.4X, Target UID=0x%X "
-+                       "i_pnorSideId",
-+                       err->reasonCode(),
-+                       TARGETING::get_huid(i_target), i_pnorSideId);
-+            break;
-+        }
-+
-+
-+        // Only Need to Check/Update if PNOR has Other Side
-+        // and Seeprom isn't pointing at PNOR's GOLDEN side
-+        if ( (  pnor_side_info.hasOtherSide == true ) &&
-+             (  pnor_side_info.isGolden == false ) )
-+        {
-+
-+            // Read the MMIO offset associated with the HBB address
-+            // from the image
-+            rc = sbe_xip_get_scalar( io_imgPtr,
-+                                     "standalone_mbox2_value",
-+                                     &data);
-+            if ( rc != 0 )
-+            {
-+                rc_fail_on_get = true; // get failed
-+
-+                TRACFCOMP( g_trac_sbe, ERR_MRK"resolveImageHBBaddr() - "
-+                           "sbe_xip_get_scalar() failed rc = 0x%X (%d)",
-+                           rc, rc_fail_on_get);
-+                break;
-+            }
-+
-+            if ( pnor_side_info.hbbMmioOffset == data )
-+            {
-+                TRACUCOMP( g_trac_sbe, "resolveImageHBBaddr: Image has MMIO "
-+                           "offset = 0x%X that matches PNOR MMIO="
-+                           "0x%X for HBB Address=0x%X",
-+                           data, pnor_side_info.hbbMmioOffset,
-+                           pnor_side_info.hbbAddress);
-+            }
-+            else
-+            {
-+                TRACFCOMP( g_trac_sbe, "resolveImageHBBaddr: Image has MMIO "
-+                           "offset = 0x%X does NOT match PNOR MMIO="
-+                           "0x%X for HBB Address=0x%X. Updating Image",
-+                           data, pnor_side_info.hbbMmioOffset,
-+                           pnor_side_info.hbbAddress);
-+
-+                TRACDBIN (g_trac_sbe, "resolveImageHBBaddr: data", &data, 8 );
-+
-+                TRACDBIN (g_trac_sbe, "resolveImageHBBaddr: hbbMmioOffset",
-+                          &pnor_side_info.hbbMmioOffset, 8 );
-+                TRACDBIN (g_trac_sbe, "resolveImageHBBaddr: hbbAddress",
-+                          &pnor_side_info.hbbAddress, 8);
-+
-+                rc = sbe_xip_set_scalar( io_imgPtr, "standalone_mbox2_value",
-+                                         pnor_side_info.hbbMmioOffset);
-+
-+                if ( rc != 0 )
-+                {
-+                    rc_fail_on_get = false; // set failed
-+
-+                    TRACFCOMP( g_trac_sbe, ERR_MRK"resolveImageHBBaddr() - "
-+                               "sbe_xip_set_scalar() failed rc = 0x%X (%d)",
-+                               rc, rc_fail_on_get);
-+                    break;
-+                }
-+                o_imageWasUpdated = true;
-+            }
-+
-+        }
-+        else
-+        {
-+              // pnor_side_info.hasOtherSide is false
-+              TRACUCOMP( g_trac_sbe, "resolveImageHBBaddr: PNOR only has "
-+                         "1 side - No Update Required");
-+        }
-+
-+    }while(0);
-+
-+
-+    if ( ( err == NULL ) && ( rc != 0) )
-+    {
-+        // We failed on get/set cmd above (already traced)
-+
-+        /*@
-+         * @errortype
-+         * @moduleid     SBE_RESOLVE_HBB_ADDR
-+         * @reasoncode   SBE_IMAGE_GET_SET_SCALAR_FAIL
-+         * @userdata1    Return Code of failed operation
-+         * @userdata2    True/False if Get (true) or Set (false) Op failed
-+         * @devdesc      sbe_xip_get/set_scalar() failed when accessing the
-+                         HBB Address MMIO offset in 'standalone_mbox2_value'
-+         * @custdesc     A problem occurred while updating processor
-+         *               boot code.
-+         */
-+        err = new ErrlEntry(ERRL_SEV_UNRECOVERABLE,
-+                            SBE_RESOLVE_HBB_ADDR,
-+                            SBE_IMAGE_GET_SET_SCALAR_FAIL,
-+                            TO_UINT64(rc),
-+                            TO_UINT64(rc_fail_on_get),
-+                            true /*Add HB SW Callout*/ );
-+
-+        err->collectTrace(SBE_COMP_NAME);
-+    }
-+
-+
-+    TRACUCOMP( g_trac_sbe,
-+               EXIT_MRK"resolveImageHBBaddr() - o_imageWasUpdated = %d",
-+               o_imageWasUpdated);
-+
-+    return err;
-+}
-+
-+#ifdef CONFIG_BMC_IPMI
-+/////////////////////////////////////////////////////////////////////
-+void sbePreShutdownIpmiCalls( void )
-+{
-+    errlHndl_t err = NULL;
-+
-+    TRACFCOMP( g_trac_sbe, ENTER_MRK"sbePreShutdownIpmiCalls");
-+
-+    do{
-+        uint16_t count = 0;
-+        SENSOR::RebootCountSensor l_sensor;
-+
-+        // Read reboot count sensor
-+        err = l_sensor.getRebootCount(count);
-+        if ( err )
-+        {
-+            TRACFCOMP( g_trac_sbe,
-+                       ERR_MRK"sbePreShutdownIpmiCalls: "
-+                       "FAIL Reading Reboot Sensor Count. "
-+                       "Committing Error Log rc=0x%.4X eid=0x%.8X "
-+                       "plid=0x%.8X, but continuing shutdown",
-+                       err->reasonCode(),
-+                       err->eid(),
-+                       err->plid());
-+            err->collectTrace(SBE_COMP_NAME);
-+            errlCommit( err, SBE_COMP_ID );
-+
-+            // No Break - Still Do Watchdog Timer Call
-+        }
-+        else
-+        {
-+            // Increment Reboot Count Sensor
-+            count++;
-+            TRACFCOMP( g_trac_sbe,
-+                       INFO_MRK"sbePreShutdownIpmiCalls: "
-+                       "Writing Reboot Sensor Count=%d", count);
-+
-+            err = l_sensor.setRebootCount( count );
-+            if ( err )
-+            {
-+                TRACFCOMP( g_trac_sbe,
-+                           ERR_MRK"sbePreShutdownIpmiCalls: "
-+                           "FAIL Writing Reboot Sensor Count to %d. "
-+                           "Committing Error Log rc=0x%.4X eid=0x%.8X "
-+                           "plid=0x%.8X, but continuing shutdown",
-+                           count,
-+                           err->reasonCode(),
-+                           err->eid(),
-+                           err->plid());
-+                err->collectTrace(SBE_COMP_NAME);
-+                errlCommit( err, SBE_COMP_ID );
-+
-+                // No Break - Still Do Watchdog Timer Call
-+            }
-+        }
-+
-+        // @todo RTC 124679 - Remove Once BMC Monitors Shutdown Attention
-+        // Set Watchdog Timer To 10 seconds
-+        const uint16_t SET_WD_TIMER_10_SECS = 10;
-+        TRACFCOMP( g_trac_sbe,"sbePreShutdownIpmiCalls: "
-+                   "Set Watch Dog Timer To %d Seconds",
-+                   SET_WD_TIMER_10_SECS);
-+
-+        err = IPMIWATCHDOG::setWatchDogTimer(SET_WD_TIMER_10_SECS);
-+        if(err)
-+        {
-+               TRACFCOMP( g_trac_sbe,
-+                          ERR_MRK"sbePreShutdownIpmiCalls: "
-+                          "FAIL Setting Watch Dog Timer to %d seconds. "
-+                          "Committing Error Log rc=0x%.4X eid=0x%.8X "
-+                          "plid=0x%.8X, but continuing shutdown",
-+                          SET_WD_TIMER_10_SECS,
-+                          err->reasonCode(),
-+                          err->eid(),
-+                          err->plid());
-+
-+                err->collectTrace(SBE_COMP_NAME);
-+                errlCommit(err, SBE_COMP_ID );
-+         }
-+
-+    }while(0);
-+
-+    TRACFCOMP( g_trac_sbe, EXIT_MRK"sbePreShutdownIpmiCalls");
-+
-+    return;
-+}
-+#endif // CONFIG_BMC_IPMI
-+
-+
-+} //end SBE Namespace
-diff --git a/src/usr/sbe/sbe_resolve_sides.H b/src/usr/sbe/sbe_resolve_sides.H
-new file mode 100644
-index 0000000..42f727a
---- /dev/null
-+++ b/src/usr/sbe/sbe_resolve_sides.H
-@@ -0,0 +1,259 @@
-+/* IBM_PROLOG_BEGIN_TAG                                                   */
-+/* This is an automatically generated prolog.                             */
-+/*                                                                        */
-+/* $Source: src/usr/sbe/sbe_resolve_sides.H $                             */
-+/*                                                                        */
-+/* 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                                                     */
-+#ifndef __SBE_SBE_RESOLVE_SIDES_H
-+#define __SBE_SBE_RESOLVE_SIDES_H
-+
-+
-+#include <stdint.h>
-+#include <builtins.h>
-+#include <errl/errlentry.H>
-+#include <pnor/pnorif.H>
-+#include <util/align.H>
-+#include <vmmconst.h>
-+#include <targeting/common/targetservice.H>
-+#include <i2c/eepromif.H>
-+#include "sbe_update.H"
-+
-+namespace SBE
-+{
-+    /******************************************/
-+    /*  Constants                             */
-+    /******************************************/
-+
-+    // This seeprom is a candidate to be READ_ONLY (ie, not updated)
-+    const PNOR::sbeSeepromSide_t READ_ONLY_SEEPROM = PNOR::SBE_SEEPROM1;
-+
-+    // Used to keep SBE Seeproms in sync with EEPROM::eeprom_chip_types_t
-+    const EEPROM::eeprom_chip_types_t sbe_side_sync[2] =
-+                                      { EEPROM::SBE_PRIMARY,
-+                                        EEPROM::SBE_BACKUP };
-+
-+    /******************************************/
-+    /*  Enums                                 */
-+    /******************************************/
-+
-+    // Actions can be combined
-+    enum
-+    {
-+        NO_ACTIONS             = 0x00000000,
-+        REIPL                  = 0x00000001,
-+
-+        // Use PNOR::ALTERNATE SideId for HBB Address info
-+        USE_PNOR_ALT_SIDE      = 0x00000002,
-+
-+        // NOTE: These next 2 values are mutually exclusive
-+        CHECK_WORKING_HBB         = 0x00000010,
-+        COPY_READ_ONLY_TO_WORKING = 0x00000020,
-+    };
-+
-+    /******************************************/
-+    /*  Structs                               */
-+    /******************************************/
-+    struct sbeResolveState_t
-+    {
-+
-+        // Target Information
-+        TARGETING::Target*       tgt;
-+
-+        PNOR::sbeSeepromSide_t   cur_side;    // aka 'booted' side
-+        PNOR::sbeSeepromSide_t   alt_side;    // non-booted/non-cur side
-+        PNOR::sbeSeepromSide_t   update_side; // side to be updated
-+
-+        // Info from PNOR
-+        PNOR::SideId pnor_sideId;
-+        char pnor_side;          /**< name of the side either A or B */
-+        bool pnor_isGolden;      /**< True if side is golden */
-+        bool pnor_hasOtherSide;  /**< True if a valid alternate side exists*/
-+
-+        uint32_t actions;
-+
-+        // Constructor to default certain values
-+        sbeResolveState_t() :
-+          tgt(NULL), cur_side(PNOR::SBE_SEEPROM_INVALID),
-+          alt_side(PNOR::SBE_SEEPROM_INVALID),
-+          update_side(PNOR::SBE_SEEPROM_INVALID),
-+          pnor_sideId(PNOR::WORKING),
-+          pnor_side(NULL),
-+          pnor_isGolden(false), pnor_hasOtherSide(false),
-+          actions(NO_ACTIONS)
-+        {}
-+
-+    };
-+
-+
-+    /******************************************/
-+    /*  Functions -- High Level Functions     */
-+    /******************************************/
-+
-+    /**
-+     * @brief Collects SBE Side Information for a specifc target
-+     *
-+     * @param[io/out] io_sideState   Struct containing SBE State of the target
-+     *
-+     * @return errlHndl_t    Error log handle on failure.
-+     */
-+    errlHndl_t getSideState(sbeResolveState_t& io_sideState);
-+
-+    /**
-+     * @brief Analyze and Determine Update Actions for a specific target
-+     *
-+     * @param[io/out] io_sideState   Struct containing SBE State of the target
-+     *
-+     * @return errlHndl_t    Error log handle on failure.
-+     */
-+    errlHndl_t getSideActions(sbeResolveState_t& io_sideState);
-+
-+    /**
-+     * @brief Performs the Update Actions for a specific target
-+     *
-+     * @param[io/out] io_sideState   Struct containing SBE State of the target
-+     *
-+     * @return errlHndl_t    Error log handle on failure.
-+     */
-+    errlHndl_t performSideActions(sbeResolveState_t& io_sideState);
-+
-+
-+
-+    /******************************************/
-+    /*  Functions -- System Access            */
-+    /******************************************/
-+
-+
-+    /**
-+     * @brief Read SBE Image from SBE Seeprom
-+     *
-+     * @param[in] i_target   Target processor
-+     *
-+     * @param[out] o_imgPtr    Pointer to SBE image in memory
-+     *                         Memory for this pointer is expected to be
-+     *                         pre-alloacted
-+     *                         NOTE:  ECC is handled internally in this
-+     *                         function. io_imgPtr points to non-ECC image
-+     *
-+     * @param[in] i_side          Seeprom Side to access
-+     *
-+     * @param[in] o_image_size    The size of the image (non-ECC)
-+     *
-+     * @param[in] o_version       SBE Version struct from seeprom (non-ECC)
-+     *
-+     * @return errlHndl_t    Error log handle on failure.
-+     */
-+    errlHndl_t readSbeImage(TARGETING::Target* i_target,
-+                              void* o_imgPtr,
-+                              PNOR::sbeSeepromSide_t i_side,
-+                              size_t& o_image_size,
-+                              sbeSeepromVersionInfo_t& o_version);
-+
-+    /**
-+     * @brief Write SBE Image from SBE Seeprom
-+     *
-+     * @param[in] i_target   Target processor
-+     *
-+     * @param[in] i_imgPtr    Pointer to SBE image in memory
-+     *                        Memory for this pointer is expected to be
-+     *                        pre-alloacted
-+     *                        NOTE:  ECC is handled internally in this function
-+     *                        i_imgPtr points to non-ECC image
-+     *
-+     * @param[in] i_side        Seeprom Side to access
-+     *
-+     * @param[in] i_image_size  Size of image to write (non-ECC)
-+     *
-+     * @param[in] io_version    SBE Version struct to write (non-ECC)
-+     *                          NOTE: data_crc updated in this function
-+     *
-+     * @return errlHndl_t    Error log handle on failure.
-+     */
-+    errlHndl_t writeSbeImage(TARGETING::Target* i_target,
-+                             void* i_imgPtr,
-+                             PNOR::sbeSeepromSide_t i_side,
-+                             size_t i_image_size,
-+                             sbeSeepromVersionInfo_t& io_version);
-+
-+
-+    /**
-+     * @brief Read SBE Image Header from SBE Seeprom and gets the
-+     *        Image size from the heaser
-+     *
-+     * @param[in] i_target   Target processor
-+     *
-+     * @param[out] i_imgPtr    Pointer to pre-allocated memory to be used
-+     *                         for different operations
-+     *
-+     * @param[in] i_side          Seeprom Side to access
-+     *
-+     * @param[in] o_image_size    The size of the image (non-ECC)
-+     *
-+     * @return errlHndl_t    Error log handle on failure.
-+     */
-+    errlHndl_t getSbeImageSize(TARGETING::Target* i_target,
-+                               void* i_imgPtr,
-+                               PNOR::sbeSeepromSide_t i_side,
-+                               size_t& o_image_size);
-+
-+
-+
-+
-+    /******************************************/
-+    /*  Functions -- Helper Functions         */
-+    /******************************************/
-+
-+    /**
-+     * @brief Check and Update (if necessary) the HBB Address MMIO offset
-+     *        in a customized SBE Image for the current Processor
-+     *
-+     * @param[in] i_target      Target processor to customize
-+     *
-+     * @param[in/out] io_imgPtr    Pointer to SBE image in memory
-+     *                          Memory for this pointer is expected to be
-+     *                          pre-alloacted
-+     *
-+     * @param[in] i_side          Seeprom Side to access
-+     *
-+     * @param[in] i_pnorSideId    PNOR side to get information for
-+     *
-+     * @param[out] o_imageWasUpdated  Set to true if Image was updated;
-+     *                                otherwise false
-+     *
-+     * @return errlHndl_t    Error log handle on failure.
-+     */
-+    errlHndl_t resolveImageHBBaddr(TARGETING::Target* i_target,
-+                                   void* io_imgPtr,
-+                                   PNOR::sbeSeepromSide_t i_side,
-+                                   PNOR::SideId i_pnorSideId,
-+                                   bool& o_imageWasUpdated);
-+
-+#ifdef CONFIG_BMC_IPMI
-+    /**
-+     * @brief Performs any necessary IPMI calls before shutting down the system
-+     *
-+     * @return void       Any generated Error Logs will be commited before the
-+     *                    function returns
-+     */
-+    void sbePreShutdownIpmiCalls( void );
-+#endif
-+
-+} //end namespace SBE
-+#endif
-diff --git a/src/usr/sbe/sbe_update.C b/src/usr/sbe/sbe_update.C
-index 97a0484..562798b 100644
---- a/src/usr/sbe/sbe_update.C
-+++ b/src/usr/sbe/sbe_update.C
-@@ -50,6 +50,7 @@
- #include <sbe/sbeif.H>
- #include <sbe/sbereasoncodes.H>
- #include "sbe_update.H"
-+#include "sbe_resolve_sides.H"
- 
- //  fapi support
- #include    <fapi.H>
-@@ -112,6 +113,25 @@ namespace SBE
- 
-         do{
- 
-+#ifdef CONFIG_NO_SBE_UPDATES
-+            TRACFCOMP( g_trac_sbe, INFO_MRK"updateProcessorSbeSeeproms() - "
-+                       "SBE updates not configured");
-+            break;
-+#endif
-+
-+#ifdef CONFIG_SBE_UPDATE_SEQUENTIAL
-+            // Check if FSP-services are enabled and if we're running in simics
-+            if ( !INITSERVICE::spBaseServicesEnabled() &&
-+                 !Util::isSimicsRunning() )
-+            {
-+                assert (false, "resolveProcessorSbeSeeproms() - "
-+                        "SBE_UPDATE_SEQUENTIAL mode, but FSP-services are not "
-+                        "enabled - Invalid Configuration");
-+            }
-+            // else - continue on
-+#endif
-+
-+
-             // Get Target Service, and the system target.
-             TargetService& tS = targetService();
-             TARGETING::Target* sys = NULL;
-@@ -204,11 +224,6 @@ namespace SBE
-                  err = NULL;
-             }
- 
--#ifdef CONFIG_NO_SBE_UPDATES
--            TRACFCOMP( g_trac_sbe, INFO_MRK"updateProcessorSbeSeeproms() - "
--                       "SBE updates not configured");
--            break;
--#endif
- 
-             for(uint32_t i=0; i<procList.size(); i++)
-             {
-@@ -277,7 +292,6 @@ namespace SBE
-                 /**********************************************/
-                 if ((err == NULL) && (sbeState.update_actions & DO_UPDATE))
-                 {
--
-                     err = performUpdateActions(sbeState);
-                     if (err)
-                     {
-@@ -328,7 +342,6 @@ namespace SBE
- 
-             } //end of Target for loop collecting each target's SBE State
- 
--
-             /**************************************************************/
-             /*  Perform System Operation                                  */
-             /**************************************************************/
-@@ -355,7 +368,7 @@ namespace SBE
-                 }
- 
- #ifdef CONFIG_BMC_IPMI
--                // @todo RTC 120734 reset system's reboot count via IPMI sensor
-+                sbePreShutdownIpmiCalls();
- #endif
- 
-                 TRACFCOMP( g_trac_sbe,
-@@ -685,14 +698,15 @@ namespace SBE
- 
-         do{
- 
--            // @todo RTC 120734 - before customizing, ensure correct HBB address
--            // is set in the necessary attribute
--
-             // cast OUR type of target to a FAPI type of target.
-             const fapi::Target
-               l_fapiTarg(fapi::TARGET_TYPE_PROC_CHIP,
-                          (const_cast<TARGETING::Target*>(i_target)));
- 
-+            // NOTE: The p8_xip_customize_procedure uses SBE_IMAGE_OFFSET
-+            // attribute for HBB address value.  Purpsely leaving this
-+            // attribute as-is for now and will do the check for HBB address
-+            // later.
- 
-             // The p8_xip_customize() procedure tries to include as much core
-             // information as possible, but is limited by SBE Image size
-@@ -871,7 +885,6 @@ namespace SBE
-                                           HWAS::SRCI_PRIORITY_HIGH );
-             }
- 
--
-         }while(0);
- 
-         TRACUCOMP( g_trac_sbe,
-@@ -1715,6 +1728,26 @@ namespace SBE
-             // The Customized Image For This Target Still Resides In
-             // The SBE Update VMM Space: SBE_IMG_VADDR = VMM_VADDR_SBE_UPDATE
- 
-+#ifdef CONFIG_SBE_UPDATE_INDEPENDENT
-+            // Ensure HBB address value in the customized image is correct
-+            // for this side
-+            bool imageWasUpdated=false;
-+            err = resolveImageHBBaddr ( io_sbeState.target,
-+                                        reinterpret_cast<void*>(SBE_IMG_VADDR),
-+                                        ((io_sbeState.seeprom_side_to_update ==
-+                                         EEPROM::SBE_PRIMARY ) ?
-+                                            PNOR::SBE_SEEPROM0 :
-+                                            PNOR::SBE_SEEPROM1  ),
-+                                        PNOR::WORKING,
-+                                        imageWasUpdated );
-+
-+            if (imageWasUpdated == true )
-+            {
-+                TRACUCOMP( g_trac_sbe, ERR_MRK"updateSeepromSide() - "
-+                           "HBB Address's MMIO Offset Updated in Image");
-+            }
-+
-+#endif
- 
-             // Inject ECC
-             // clear out back half of page block to use as temp space
-@@ -1941,7 +1974,6 @@ namespace SBE
-                            io_sbeState.seeprom_0_ver.data_crc, isSimics_check);
-             }
- 
--
-             /**************************************************************/
-             /*  Compare SEEPROM 1 with PNOR and Customized Image CRC --   */
-             /*  -- dirty or clean?                                        */
-@@ -2153,22 +2185,55 @@ namespace SBE
- #ifdef CONFIG_SBE_UPDATE_INDEPENDENT
- 
-             // The 2 SBE SEEPROMs are independent of each other
--            // Determine if PNOR is 1- or 2-sided and if there is a
--            // GOLDEN boot involved
-+            // Determine if PNOR is 1- or 2-sided and if the current
-+            // Seeprom is pointing at PNOR's GOLDEN side
-+
-+            PNOR::SideId tmp_side = PNOR::WORKING;
-+            PNOR::SideInfo_t pnor_side_info;
-+            err = PNOR::getSideInfo (tmp_side, pnor_side_info);
-+            if ( err )
-+            {
-+                TRACFCOMP( g_trac_sbe, ERR_MRK
-+                           "SBE Update() - Error returned from "
-+                           "PNOR::getSideInfo() rc=0x%.4X, Target UID=0x%X",
-+                           err->reasonCode(),
-+                           TARGETING::get_huid(io_sbeState.target));
-+                break;
-+            }
- 
--#ifdef CONFIG_PNOR_TWO_SIDE_SUPPORT
-+            TRACUCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: PNOR Info: "
-+                       "side-%c, sideId=0x%X, isGolden=%d, hasOtherSide=%d",
-+                       TARGETING::get_huid(io_sbeState.target),
-+                       pnor_side_info.side, pnor_side_info.id,
-+                       pnor_side_info.isGolden, pnor_side_info.hasOtherSide);
- 
--            // @todo RTC 120734 - ask PNOR if we are in "GOLDEN" mode,
--            // which would mean that we are booting off the the GOLDEN
--            // SBE SEEPROM which corresponds to the GOLDEN side of PNOR
--/*
--            if (true)
-+            if ( pnor_side_info.isGolden == true )
-             {
-                 // If true, nothing to do (covered in istep 6 function)
-                 l_actions = CLEAR_ACTIONS;
- 
-                 TRACFCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: "
--                           "Booting GOLDEN SBE SEEPROM in PNOR 2-sided Mode. "
-+                           "Booting READ_ONLY SEEPROM pointing at PNOR's "
-+                           "GOLDEN side. No updates for cur side=%d. Continue "
-+                            "IPL. (sit=0x%.2X, act=0x%.8X flags=0x%.2X)",
-+                           TARGETING::get_huid(io_sbeState.target),
-+                           io_sbeState.cur_seeprom_side,
-+                           i_system_situation, l_actions,
-+                           io_sbeState.mvpdSbKeyword.flags);
-+                break;
-+            }
-+
-+            else if (  ( pnor_side_info.hasOtherSide == false ) &&
-+                       ( io_sbeState.cur_seeprom_side == READ_ONLY_SEEPROM ) )
-+            {
-+                // Even though current seeprom is not pointing at PNOR's
-+                // GOLDEN side, treat like READ_ONLY if booting from READ_ONLY
-+                // seeprom and and PNOR does not have another side - No Update
-+                // (ie, Palmetto configuration)
-+                l_actions = CLEAR_ACTIONS;
-+
-+                TRACFCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: "
-+                           "Treating cur like READ_ONLY SBE SEEPROM. "
-                            "No updates for cur side=%d. Continue IPL. "
-                            "(sit=0x%.2X, act=0x%.8X flags=0x%.2X)",
-                            TARGETING::get_huid(io_sbeState.target),
-@@ -2179,22 +2244,14 @@ namespace SBE
-             }
-             else // proceed to update this side
-             {
-+                // proceed to update this side
-                 TRACUCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: "
--                           "NOT Booting GOLDEN SBE SEEPROM in PNOR 2-sided "
--                           "mode. Checking for update on cur side=%d ",
-+                           "NOT Booting READ_ONLY SEEPROM. Check for update "
-+                           "on cur side=%d ",
-                            TARGETING::get_huid(io_sbeState.target),
-                            io_sbeState.cur_seeprom_side)
-             }
--*/
--#else
- 
--            // @todo RTC 120734 - check this assumption
--            // Assume that we're only checking/updating the current side
--            TRACUCOMP( g_trac_sbe, INFO_MRK"SBE Update tgt=0x%X: "
--                       "PNOR 1-sided so only check for update on cur side=%d",
--                       TARGETING::get_huid(io_sbeState.target),
--                       io_sbeState.cur_seeprom_side);
--#endif
- 
-             // Check for clean vs. dirty only on cur side
-             if ( i_system_situation & SITUATION_CUR_IS_DIRTY )
-@@ -2203,6 +2260,7 @@ namespace SBE
-                 l_actions |= IPL_RESTART;
-                 l_actions |= DO_UPDATE;
-                 l_actions |= UPDATE_SBE;
-+                l_actions |= UPDATE_MVPD; // even though flags byte not updated
- 
-                 // Set Update side to cur
-                 io_sbeState.seeprom_side_to_update =
--- 
-1.7.4.1
-
diff --git a/openpower/package/hostboot/hostboot-0010-Mark-Centaurs-as-present-functionl-on-IPL.patch b/openpower/package/hostboot/hostboot-0010-Mark-Centaurs-as-present-functionl-on-IPL.patch
deleted file mode 100644
index 9d9ff0f..0000000
--- a/openpower/package/hostboot/hostboot-0010-Mark-Centaurs-as-present-functionl-on-IPL.patch
+++ /dev/null
@@ -1,56 +0,0 @@
-From d569d04ce1b7451af590465e1befab0ae3634ccf Mon Sep 17 00:00:00 2001
-From: Richard J. Knight <rjknight@us.ibm.com>
-Date: Fri, 27 Feb 2015 22:13:21 -0600
-Subject: [PATCH 5/7] Mark Centaurs as present/functionl on IPL
-
-    -Update Centaur status sensor after discove targets is called
-     to initialize the Centaur Func sensors on the BMC
-
-Change-Id: I28b1047b50b690b97a20093721467f45455c5217
-RTC:124846
-(cherry picked from commit dd9502f744de8c09425d677570825699a979128f)
----
- src/usr/ipmi/ipmisensor.C |   15 ++++++++++++---
- 1 files changed, 12 insertions(+), 3 deletions(-)
-
-diff --git a/src/usr/ipmi/ipmisensor.C b/src/usr/ipmi/ipmisensor.C
-index fba66a6..4b5b478 100644
---- a/src/usr/ipmi/ipmisensor.C
-+++ b/src/usr/ipmi/ipmisensor.C
-@@ -894,14 +894,19 @@ namespace SENSOR
-         // get all targets of the passed in type, functional or not
-         switch( i_type )
-         {
--            case TARGETING::TYPE_PROC:
--                getAllChips( l_tList, TARGETING::TYPE_PROC, false );
--                break;
- 
-             case TARGETING::TYPE_DIMM:
-                 getAllLogicalCards( l_tList, TARGETING::TYPE_DIMM, false );
-                 break;
- 
-+            case TARGETING::TYPE_MEMBUF:
-+                getAllChips( l_tList, TARGETING::TYPE_MEMBUF, false );
-+                break;
-+
-+            case TARGETING::TYPE_PROC:
-+                getAllChips( l_tList, TARGETING::TYPE_PROC, false );
-+                break;
-+
-             case TARGETING::TYPE_CORE:
-                 getAllChiplets( l_tList, TARGETING::TYPE_CORE, false);
-                 break;
-@@ -1024,6 +1029,10 @@ namespace SENSOR
- 
-     void updateBMCSensorStatus()
-     {
-+
-+        // send status of all MEMBUF targets
-+        updateBMCSensorStatus(TARGETING::TYPE_MEMBUF);
-+
-         // send status of all DIMM targets
-         updateBMCSensorStatus(TARGETING::TYPE_DIMM);
- 
--- 
-1.7.4.1
-
diff --git a/openpower/package/hostboot/hostboot-0011-Update-Shutdown-Path-for-SBE-Updates.patch b/openpower/package/hostboot/hostboot-0011-Update-Shutdown-Path-for-SBE-Updates.patch
deleted file mode 100644
index dc80e92..0000000
--- a/openpower/package/hostboot/hostboot-0011-Update-Shutdown-Path-for-SBE-Updates.patch
+++ /dev/null
@@ -1,158 +0,0 @@
-From c8c9edd25a04a8ff1974fd75e27a3b24b71030fc Mon Sep 17 00:00:00 2001
-From: Mike Baiocchi <baiocchi@us.ibm.com>
-Date: Fri, 27 Feb 2015 13:55:34 -0600
-Subject: [PATCH 6/7] Update Shutdown Path for SBE Updates
-
-This change will do the following:
--- Flush out a console message to alert the user that the system is
-   shutting down to perform a SBE Update.
--- Set the watchdog timer to 15 seconds before shutting down.
--- Set the watchdog timer to NO_ACTIONS such that the boot count
-   sensor will handle the re-IPL.
-
-Change-Id: I3e8ca07030e50a56cd8bafc514bab036e3fdab96
-RTC: 120734
-(cherry picked from commit 20163b32e98f40e9346863e5954184958acc9af5)
----
- src/include/usr/ipmi/ipmiwatchdog.H |    1 +
- src/usr/sbe/sbe_resolve_sides.C     |   33 +++++++++++++++++++++++++--------
- src/usr/sbe/sbe_resolve_sides.H     |    4 ++++
- src/usr/sbe/sbe_update.C            |   14 ++++++++++++++
- 4 files changed, 44 insertions(+), 8 deletions(-)
-
-diff --git a/src/include/usr/ipmi/ipmiwatchdog.H b/src/include/usr/ipmi/ipmiwatchdog.H
-index f23b771..62840ce 100644
---- a/src/include/usr/ipmi/ipmiwatchdog.H
-+++ b/src/include/usr/ipmi/ipmiwatchdog.H
-@@ -79,6 +79,7 @@ enum TIMER_USE
-  */
- enum TIMER_ACTIONS
- {
-+    NO_ACTIONS              =   0x00, // all bits
-     PRE_TIMEOUT_INT_SMI     =   0x10, // bit 4
-     PRE_TIMEOUT_INT_NMI     =   0x20, // bit 5
-     PRE_TIMEOUT_INT_MSG     =   0x30, // bits 4 & 5
-diff --git a/src/usr/sbe/sbe_resolve_sides.C b/src/usr/sbe/sbe_resolve_sides.C
-index df9958d..90217b6 100644
---- a/src/usr/sbe/sbe_resolve_sides.C
-+++ b/src/usr/sbe/sbe_resolve_sides.C
-@@ -40,6 +40,7 @@
- #include <sys/misc.h>
- #include <hwas/common/deconfigGard.H>
- #include <initservice/initserviceif.H>
-+#include <console/consoleif.H>
- #include <config.h>
- #include <ipmi/ipmiwatchdog.H>
- #include <ipmi/ipmisensor.H>
-@@ -285,7 +286,20 @@ errlHndl_t resolveProcessorSbeSeeproms()
-                        l_restartNeeded);
- 
- #ifdef CONFIG_BMC_IPMI
--                sbePreShutdownIpmiCalls();
-+            sbePreShutdownIpmiCalls();
-+#endif
-+
-+#ifdef CONFIG_CONSOLE
-+  #ifdef CONFIG_BMC_IPMI
-+            CONSOLE::displayf(SBE_COMP_NAME, "System Shutting Down In %d "
-+                              "Seconds To Perform SBE Update\n",
-+                              SET_WD_TIMER_IN_SECS);
-+  #else
-+            CONSOLE::displayf(SBE_COMP_NAME, "System Shutting Down To "
-+                              "Perform SBE Update\n");
-+  #endif
-+
-+            CONSOLE::flush();
- #endif
- 
-             TRACFCOMP( g_trac_sbe,
-@@ -1276,7 +1290,6 @@ errlHndl_t resolveImageHBBaddr(TARGETING::Target* i_target,
- void sbePreShutdownIpmiCalls( void )
- {
-     errlHndl_t err = NULL;
--
-     TRACFCOMP( g_trac_sbe, ENTER_MRK"sbePreShutdownIpmiCalls");
- 
-     do{
-@@ -1328,13 +1341,17 @@ void sbePreShutdownIpmiCalls( void )
-         }
- 
-         // @todo RTC 124679 - Remove Once BMC Monitors Shutdown Attention
--        // Set Watchdog Timer To 10 seconds
--        const uint16_t SET_WD_TIMER_10_SECS = 10;
-+        // Set Watchdog Timer before calling doShutdown()
-         TRACFCOMP( g_trac_sbe,"sbePreShutdownIpmiCalls: "
-                    "Set Watch Dog Timer To %d Seconds",
--                   SET_WD_TIMER_10_SECS);
--
--        err = IPMIWATCHDOG::setWatchDogTimer(SET_WD_TIMER_10_SECS);
-+                   SET_WD_TIMER_IN_SECS);
-+
-+        err = IPMIWATCHDOG::setWatchDogTimer(
-+                               SET_WD_TIMER_IN_SECS,  // new time
-+                               static_cast<uint8_t>
-+                                          (IPMIWATCHDOG::DO_NOT_STOP |
-+                                           IPMIWATCHDOG::BIOS_FRB2), // default
-+                               IPMIWATCHDOG::NO_ACTIONS); // boot count reset
-         if(err)
-         {
-                TRACFCOMP( g_trac_sbe,
-@@ -1342,7 +1359,7 @@ void sbePreShutdownIpmiCalls( void )
-                           "FAIL Setting Watch Dog Timer to %d seconds. "
-                           "Committing Error Log rc=0x%.4X eid=0x%.8X "
-                           "plid=0x%.8X, but continuing shutdown",
--                          SET_WD_TIMER_10_SECS,
-+                          SET_WD_TIMER_IN_SECS,
-                           err->reasonCode(),
-                           err->eid(),
-                           err->plid());
-diff --git a/src/usr/sbe/sbe_resolve_sides.H b/src/usr/sbe/sbe_resolve_sides.H
-index 42f727a..d7c1f7c 100644
---- a/src/usr/sbe/sbe_resolve_sides.H
-+++ b/src/usr/sbe/sbe_resolve_sides.H
-@@ -50,6 +50,10 @@ namespace SBE
-                                       { EEPROM::SBE_PRIMARY,
-                                         EEPROM::SBE_BACKUP };
- 
-+    // @todo RTC 124679 - Remove Once BMC Monitors Shutdown Attention
-+    // Set Watchdog Timer To 15 seconds before calling doShutdown()
-+    const uint16_t SET_WD_TIMER_IN_SECS = 15;
-+
-     /******************************************/
-     /*  Enums                                 */
-     /******************************************/
-diff --git a/src/usr/sbe/sbe_update.C b/src/usr/sbe/sbe_update.C
-index 562798b..a20c1a8 100644
---- a/src/usr/sbe/sbe_update.C
-+++ b/src/usr/sbe/sbe_update.C
-@@ -46,6 +46,7 @@
- #include <sys/msg.h>
- #include <hwas/common/deconfigGard.H>
- #include <initservice/initserviceif.H>
-+#include <console/consoleif.H>
- #include <config.h>
- #include <sbe/sbeif.H>
- #include <sbe/sbereasoncodes.H>
-@@ -371,6 +372,19 @@ namespace SBE
-                 sbePreShutdownIpmiCalls();
- #endif
- 
-+#ifdef CONFIG_CONSOLE
-+  #ifdef CONFIG_BMC_IPMI
-+            CONSOLE::displayf(SBE_COMP_NAME, "System Shutting Down In %d "
-+                              "Seconds To Perform SBE Update\n",
-+                              SET_WD_TIMER_IN_SECS);
-+  #else
-+            CONSOLE::displayf(SBE_COMP_NAME, "System Shutting Down To "
-+                              "Perform SBE Update\n");
-+  #endif
-+
-+            CONSOLE::flush();
-+#endif
-+
-                 TRACFCOMP( g_trac_sbe,
-                            INFO_MRK"updateProcessorSbeSeeproms(): Calling "
-                            "INITSERVICE::doShutdown() with "
--- 
-1.7.4.1
-
diff --git a/openpower/package/hostboot/hostboot.mk b/openpower/package/hostboot/hostboot.mk
index 9c39190..e7bb202 100644
--- a/openpower/package/hostboot/hostboot.mk
+++ b/openpower/package/hostboot/hostboot.mk
@@ -4,7 +4,7 @@
 #
 ################################################################################
 
-HOSTBOOT_VERSION ?= a91a8f7b3d35490845272e839e372329114df7a4
+HOSTBOOT_VERSION ?= bda236e6e0c7d3aa5165160abbd5ead92ac0a68e
 HOSTBOOT_SITE ?= $(call github,open-power,hostboot,$(HOSTBOOT_VERSION))
 
 HOSTBOOT_LICENSE = Apache-2.0
diff --git a/openpower/package/openpower-pnor/openpower-pnor.mk b/openpower/package/openpower-pnor/openpower-pnor.mk
index 15e4417..8854207 100644
--- a/openpower/package/openpower-pnor/openpower-pnor.mk
+++ b/openpower/package/openpower-pnor/openpower-pnor.mk
@@ -8,11 +8,21 @@
 # make doesn't care for quotes in the dependencies.
 XML_PACKAGE=$(subst $\",,$(BR2_OPENPOWER_XML_PACKAGE))
 
-OPENPOWER_PNOR_VERSION ?= 94389f62eabecf00ef129b4184bf4ba2bc9cd193
+OPENPOWER_PNOR_VERSION ?= 1be961dfe88a31662792838ce9dc57798bf33a52
 OPENPOWER_PNOR_SITE ?= $(call github,open-power,pnor,$(OPENPOWER_PNOR_VERSION))
 
 OPENPOWER_PNOR_LICENSE = Apache-2.0
-OPENPOWER_PNOR_DEPENDENCIES = hostboot hostboot-binaries $(XML_PACKAGE) skiboot host-openpower-ffs occ
+OPENPOWER_PNOR_DEPENDENCIES = hostboot hostboot-binaries $(XML_PACKAGE) skiboot host-openpower-ffs occ capp-ucode
+
+ifeq ($(BR2_TARGET_SKIBOOT_EMBED_PAYLOAD),n)
+
+ifeq ($(BR2_TARGET_ROOTFS_INITRAMFS),y)
+OPENPOWER_PNOR_DEPENDENCIES += linux26-rebuild-with-initramfs
+else
+OPENPOWER_PNOR_DEPENDENCIES += linux
+endif
+
+endif
 
 OPENPOWER_PNOR_INSTALL_IMAGES = YES
 OPENPOWER_PNOR_INSTALL_TARGET = NO
@@ -33,7 +43,8 @@
             -targeting_binary_source $(BR2_OPENPOWER_TARGETING_BIN_FILENAME) \
             -sbe_binary_filename $(BR2_HOSTBOOT_BINARY_SBE_FILENAME) \
             -sbec_binary_filename $(BR2_HOSTBOOT_BINARY_SBEC_FILENAME) \
-            -occ_binary_filename $(OCC_STAGING_DIR)/$(BR2_OCC_BIN_FILENAME)
+            -occ_binary_filename $(OCC_STAGING_DIR)/$(BR2_OCC_BIN_FILENAME) \
+            -capp_binary_filename $(BINARIES_DIR)/$(BR2_CAPP_UCODE_BIN_FILENAME)
 
         mkdir -p $(STAGING_DIR)/pnor/
         $(TARGET_MAKE_ENV) $(@D)/create_pnor_image.pl \
@@ -43,6 +54,7 @@
             -scratch_dir $(OPENPOWER_PNOR_SCRATCH_DIR) \
             -outdir $(STAGING_DIR)/pnor/ \
             -payload $(BINARIES_DIR)/$(BR2_SKIBOOT_LID_NAME) \
+            -bootkernel $(BINARIES_DIR)/$(LINUX_IMAGE_NAME) \
             -sbe_binary_filename $(BR2_HOSTBOOT_BINARY_SBE_FILENAME) \
             -sbec_binary_filename $(BR2_HOSTBOOT_BINARY_SBEC_FILENAME) \
             -occ_binary_filename $(OCC_STAGING_DIR)/$(BR2_OCC_BIN_FILENAME) \
diff --git a/openpower/package/palmetto-xml/palmetto-xml.mk b/openpower/package/palmetto-xml/palmetto-xml.mk
index 72803ff..b3268a0 100644
--- a/openpower/package/palmetto-xml/palmetto-xml.mk
+++ b/openpower/package/palmetto-xml/palmetto-xml.mk
@@ -4,7 +4,7 @@
 #
 ################################################################################
 
-PALMETTO_XML_VERSION = 84f5bf5cc10459a85340cd0cc82a8c65b5bc4c97
+PALMETTO_XML_VERSION = 167ded68387aa69fabb28e6cafaa6ae4bf165a40
 PALMETTO_XML_SITE = $(call github,open-power,palmetto-xml,$(PALMETTO_XML_VERSION))
 
 PALMETTO_XML_LICENSE = Apache-2.0
