Merge pull request #190 from guillesilva/master-next
Firestone OCC fixes for full frequency range on slave OCCs
diff --git a/README b/README
index 9f61021..2e84fbb 100644
--- a/README
+++ b/README
@@ -10,8 +10,9 @@
1. Install Ubuntu 14.04 or Debian 7.5 64-bit.
2. Install the packages necessary for the build:
-> sudo apt-get install cscope ctags libz-dev libexpat-dev libc6-dev-i386 \
- build-essential g++ git bison flex gcc-multilib g++-multilib unzip \
+> sudo apt-get install cscope ctags libz-dev libexpat-dev \
+ python language-pack-en \
+ build-essential g++ git bison flex unzip \
libxml-simple-perl libxml-sax-perl libxml2-dev libxml2-utils xsltproc
3. Continue with the clone, environment setup, and build as noted above.
diff --git a/buildroot b/buildroot
index 9ac423f..80a2f83 160000
--- a/buildroot
+++ b/buildroot
@@ -1 +1 @@
-Subproject commit 9ac423f6f0d99b33e7bb7ad703cf83e80716da8a
+Subproject commit 80a2f83e60f3fd21a38e2bc9aac149f2c3a9ffdd
diff --git a/openpower/configs/firestone_defconfig b/openpower/configs/firestone_defconfig
index d72cb81..cd32a2c 100644
--- a/openpower/configs/firestone_defconfig
+++ b/openpower/configs/firestone_defconfig
@@ -8,6 +8,7 @@
BR2_HOSTBOOT_BINARY_SBE_FILENAME="venice_sbe.img.ecc"
BR2_HOSTBOOT_BINARY_SBEC_FILENAME="centaur_sbec_pad.img.ecc"
+BR2_HOSTBOOT_BINARY_WINK_FILENAME="p8.ref_image.hdr.bin.ecc"
BR2_OCC_BIN_FILENAME="occ.bin"
@@ -37,7 +38,7 @@
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="1444a4e78a9ce324b0b6ac243ccfbfc8fce25d7e"
+BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="d0ff068a9962ba96d4e6ddfba2a4e9fd8bc9a763"
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
diff --git a/openpower/configs/garrison_defconfig b/openpower/configs/garrison_defconfig
new file mode 100644
index 0000000..c5bde78
--- /dev/null
+++ b/openpower/configs/garrison_defconfig
@@ -0,0 +1,59 @@
+BR2_powerpc64=y
+BR2_powerpc_power8=y
+BR2_OPENPOWER_PLATFORM=y
+
+BR2_OPENPOWER_CONFIG_NAME="garrison"
+BR2_OPENPOWER_XML_PACKAGE="garrison-xml"
+BR2_HOSTBOOT_CONFIG_FILE="garrison.config"
+
+BR2_HOSTBOOT_BINARY_SBE_FILENAME="venice_sbe.img.ecc"
+BR2_HOSTBOOT_BINARY_SBEC_FILENAME="centaur_sbec_pad.img.ecc"
+BR2_HOSTBOOT_BINARY_WINK_FILENAME="n1.ref_image.hdr.bin.ecc"
+
+BR2_OCC_BIN_FILENAME="occ.bin"
+
+BR2_GARRISON_SYSTEM_XML_FILENAME="GARRISON_hb.system.xml"
+BR2_GARRISON_MRW_XML_FILENAME="GARRISON_hb.mrw.xml"
+BR2_GARRISON_BIOS_XML_FILENAME="GARRISON_bios.xml"
+
+BR2_OPENPOWER_TARGETING_BIN_FILENAME="GARRISON_HB.targeting.bin"
+BR2_OPENPOWER_TARGETING_ECC_FILENAME="GARRISON_HB.targeting.bin.ecc"
+BR2_CAPP_UCODE_BIN_FILENAME="cappucode.bin"
+
+BR2_OPENPOWER_PNOR_XML_LAYOUT_FILENAME="defaultPnorLayoutWithGoldenSide.xml"
+BR2_OPENPOWER_PNOR_FILENAME="garrison.pnor"
+BR2_OPENPOWER_PNOR_UPDATE_FILENAME="garrison_update.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="d0ff068a9962ba96d4e6ddfba2a4e9fd8bc9a763"
+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 64b827a..edcad58 100644
--- a/openpower/configs/habanero_defconfig
+++ b/openpower/configs/habanero_defconfig
@@ -8,6 +8,7 @@
BR2_HOSTBOOT_BINARY_SBE_FILENAME="venice_sbe.img.ecc"
BR2_HOSTBOOT_BINARY_SBEC_FILENAME="centaur_sbec_pad.img.ecc"
+BR2_HOSTBOOT_BINARY_WINK_FILENAME="p8.ref_image.hdr.bin.ecc"
BR2_OCC_BIN_FILENAME="occ.bin"
@@ -37,7 +38,7 @@
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="1444a4e78a9ce324b0b6ac243ccfbfc8fce25d7e"
+BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="d0ff068a9962ba96d4e6ddfba2a4e9fd8bc9a763"
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
diff --git a/openpower/configs/hostboot/firestone.config b/openpower/configs/hostboot/firestone.config
index 4b96cd9..b7bc93c 100755
--- a/openpower/configs/hostboot/firestone.config
+++ b/openpower/configs/hostboot/firestone.config
@@ -18,6 +18,10 @@
set CVPD_WRITE_TO_HW
set CVPD_READ_FROM_PNOR
set CVPD_WRITE_TO_PNOR
+set PVPD_READ_FROM_HW
+set PVPD_WRITE_TO_HW
+set PVPD_READ_FROM_PNOR
+set PVPD_WRITE_TO_PNOR
set SKIP_RESTRICT_EX_UNITS
unset CDIMM_FORMAT_FOR_CVPD
@@ -32,16 +36,29 @@
# turn on console output
set CONSOLE
-set CONSOLE_AST2400
+set BMC_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
+unset DISABLE_HOSTBOOT_RUNTIME
+
+# Compile in hostboot runtime PRD
+set HBRT_PRD
+set HTMGT
+set START_OCC_DURING_BOOT
+
+#PNOR flags
+set PNOR_TWO_SIDE_SUPPORT
+
+set BMC_BT_LPC_IPMI
# Enable Checktop Analysis
set ENABLE_CHECKSTOP_ANALYSIS
+# Hostboot will detect hardware changes
+set HOST_HCDB_SUPPORT
+
+# set for trace debug to console
+unset CONSOLE_OUTPUT_TRACE
diff --git a/openpower/configs/hostboot/garrison.config b/openpower/configs/hostboot/garrison.config
new file mode 100755
index 0000000..c78bc7a
--- /dev/null
+++ b/openpower/configs/hostboot/garrison.config
@@ -0,0 +1,61 @@
+# 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
+set MVPD_WRITE_TO_HW
+set MVPD_READ_FROM_PNOR
+set MVPD_WRITE_FROM_PNOR
+set DJVPD_READ_FROM_HW
+set DJVPD_WRITE_TO_HW
+set DJVPD_READ_FROM_PNOR
+set DJVPD_WRITE_TO_PNOR
+set CVPD_READ_FROM_HW
+set CVPD_WRITE_TO_HW
+set CVPD_READ_FROM_PNOR
+set CVPD_WRITE_TO_PNOR
+set PVPD_READ_FROM_HW
+set PVPD_WRITE_TO_HW
+set PVPD_READ_FROM_PNOR
+set PVPD_WRITE_TO_PNOR
+set SKIP_RESTRICT_EX_UNITS
+unset CDIMM_FORMAT_FOR_CVPD
+
+# 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 BMC_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
+
+#PNOR flags
+set PNOR_TWO_SIDE_SUPPORT
+
+set BMC_BT_LPC_IPMI
+
+# Enable Checktop Analysis
+set ENABLE_CHECKSTOP_ANALYSIS
+
+# Hostboot will detect hardware changes
+set HOST_HCDB_SUPPORT
+
+# set for trace debug to console
+unset CONSOLE_OUTPUT_TRACE
diff --git a/openpower/configs/hostboot/habanero.config b/openpower/configs/hostboot/habanero.config
index 90e5735..b5d28b4a9 100755
--- a/openpower/configs/hostboot/habanero.config
+++ b/openpower/configs/hostboot/habanero.config
@@ -18,6 +18,10 @@
set CVPD_WRITE_TO_HW
set CVPD_READ_FROM_PNOR
set CVPD_WRITE_TO_PNOR
+set PVPD_READ_FROM_HW
+set PVPD_WRITE_TO_HW
+set PVPD_READ_FROM_PNOR
+set PVPD_WRITE_TO_PNOR
set SKIP_RESTRICT_EX_UNITS
unset CDIMM_FORMAT_FOR_CVPD
@@ -34,7 +38,7 @@
# turn on console output
set CONSOLE
-set CONSOLE_AST2400
+set BMC_AST2400
# Enable Kingston dimm voltage workaround
set KINGSTON_1_35_VOLT
@@ -58,5 +62,8 @@
# Enable Checktop Analysis
set ENABLE_CHECKSTOP_ANALYSIS
+# Hostboot will detect hardware changes
+set HOST_HCDB_SUPPORT
+
# set for trace debug to console
unset CONSOLE_OUTPUT_TRACE
diff --git a/openpower/configs/hostboot/palmetto.config b/openpower/configs/hostboot/palmetto.config
index 12ebc2c..4288585 100755
--- a/openpower/configs/hostboot/palmetto.config
+++ b/openpower/configs/hostboot/palmetto.config
@@ -18,6 +18,10 @@
set CVPD_WRITE_TO_HW
set CVPD_READ_FROM_PNOR
set CVPD_WRITE_TO_PNOR
+set PVPD_READ_FROM_HW
+set PVPD_WRITE_TO_HW
+set PVPD_READ_FROM_PNOR
+set PVPD_WRITE_TO_PNOR
set SKIP_RESTRICT_EX_UNITS
unset CDIMM_FORMAT_FOR_CVPD
@@ -34,7 +38,7 @@
# turn on console output
set CONSOLE
-set CONSOLE_AST2400
+set BMC_AST2400
set PNOR_IS_32MB
@@ -54,5 +58,8 @@
# Enable Checktop Analysis
set ENABLE_CHECKSTOP_ANALYSIS
+# Hostboot will detect hardware changes
+set HOST_HCDB_SUPPORT
+
# set for trace debug to console
unset CONSOLE_OUTPUT_TRACE
diff --git a/openpower/configs/palmetto_defconfig b/openpower/configs/palmetto_defconfig
index 5a4bf38..b589463 100644
--- a/openpower/configs/palmetto_defconfig
+++ b/openpower/configs/palmetto_defconfig
@@ -8,6 +8,7 @@
BR2_HOSTBOOT_BINARY_SBE_FILENAME="venice_sbe.img.ecc"
BR2_HOSTBOOT_BINARY_SBEC_FILENAME="centaur_sbec_pad.img.ecc"
+BR2_HOSTBOOT_BINARY_WINK_FILENAME="p8.ref_image.hdr.bin.ecc"
BR2_OCC_BIN_FILENAME="occ.bin"
@@ -36,7 +37,7 @@
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="1444a4e78a9ce324b0b6ac243ccfbfc8fce25d7e"
+BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="d0ff068a9962ba96d4e6ddfba2a4e9fd8bc9a763"
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
diff --git a/openpower/package/Config.in b/openpower/package/Config.in
index 83823fb..92ab00f 100644
--- a/openpower/package/Config.in
+++ b/openpower/package/Config.in
@@ -4,6 +4,7 @@
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/garrison-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"
diff --git a/openpower/package/firestone-xml/firestone.mk b/openpower/package/firestone-xml/firestone.mk
index 600c285..76b5755 100644
--- a/openpower/package/firestone-xml/firestone.mk
+++ b/openpower/package/firestone-xml/firestone.mk
@@ -4,7 +4,7 @@
#
################################################################################
-FIRESTONE_XML_VERSION ?= 3383b31643c225f7bcecc8ce08dcbb6803f3e058
+FIRESTONE_XML_VERSION ?= 5123184b9f26bc1068afb9b57e796aecaf61b249
FIRESTONE_XML_SITE ?= $(call github,open-power,firestone-xml,$(FIRESTONE_XML_VERSION))
FIRESTONE_XML_LICENSE = Apache-2.0
@@ -32,7 +32,6 @@
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
diff --git a/openpower/package/garrison-xml/Config.in b/openpower/package/garrison-xml/Config.in
new file mode 100755
index 0000000..a1626d0
--- /dev/null
+++ b/openpower/package/garrison-xml/Config.in
@@ -0,0 +1,23 @@
+config BR2_PACKAGE_GARRISON_XML
+ bool "garrison_xml"
+ default y if (BR2_OPENPOWER_CONFIG_NAME = "garrison")
+ help
+ Utilites for building xml and the targeting binary image
+
+config BR2_GARRISON_SYSTEM_XML_FILENAME
+ string "Garrison targeting system xml filename"
+ default ""
+ help
+ Defines the name of the system XML filename to be used when creating targeting binary image
+
+config BR2_GARRISON_MRW_XML_FILENAME
+ string "Garrison targeting mrw xml filename"
+ default ""
+ help
+ Defines the name of the mrw XML filename to be used when creating targeting binary image
+
+config BR2_GARRISON_BIOS_XML_FILENAME
+ string "Garrison 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/garrison-xml/garrison.mk b/openpower/package/garrison-xml/garrison.mk
new file mode 100644
index 0000000..e81e50c
--- /dev/null
+++ b/openpower/package/garrison-xml/garrison.mk
@@ -0,0 +1,75 @@
+################################################################################
+#
+# garrison_xml
+#
+################################################################################
+
+GARRISON_XML_VERSION ?= 4f4b2373ff8ef35338c20ab3660a0e4d980aeddd
+GARRISON_XML_SITE ?= $(call github,open-power,garrison-xml,$(GARRISON_XML_VERSION))
+
+GARRISON_XML_LICENSE = Apache-2.0
+GARRISON_XML_DEPENDENCIES = hostboot-install-images openpower-mrw-install-images common-p8-xml-install-images
+
+GARRISON_XML_INSTALL_IMAGES = YES
+GARRISON_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
+GARRISON_BIOS_XML_CONFIG_FILE = $(MRW_SCRATCH)/$(BR2_GARRISON_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 GARRISON_XML_BUILD_CMDS
+ # copy the garrison xml where the common lives
+ bash -c 'mkdir -p $(MRW_SCRATCH) && cp -r $(@D)/* $(MRW_SCRATCH)'
+
+ # generate the system mrw xml
+ perl -I $(MRW_HB_TOOLS) \
+ $(MRW_HB_TOOLS)/processMrw.pl -x $(MRW_SCRATCH)/garrison.xml
+
+ # merge in any system specific attributes, hostboot attributes
+ $(MRW_HB_TOOLS)/mergexml.sh $(MRW_SCRATCH)/$(BR2_GARRISON_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_GARRISON_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=$(GARRISON_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 GARRISON_XML_INSTALL_IMAGES_CMDS
+ mv $(MRW_HB_TOOLS)/targeting.bin $(MRW_HB_TOOLS)/$(BR2_OPENPOWER_TARGETING_BIN_FILENAME)
+endef
+
+define GARRISON_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 557a7da..501bceb 100644
--- a/openpower/package/habanero-xml/habanero-xml.mk
+++ b/openpower/package/habanero-xml/habanero-xml.mk
@@ -4,7 +4,7 @@
#
################################################################################
-HABANERO_XML_VERSION ?= b7f0e388bba972fcdcf749f9bb8e31bc9e1022c0
+HABANERO_XML_VERSION ?= 03d911f12311ba884ec9e08a6c114daabfce545a
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 03523c3..d9a23df 100644
--- a/openpower/package/hostboot-binaries/hostboot_binaries.mk
+++ b/openpower/package/hostboot-binaries/hostboot_binaries.mk
@@ -4,7 +4,7 @@
#
################################################################################
-HOSTBOOT_BINARIES_VERSION ?= d41753f2b5e2510d6bc6ce58adf8e55207b8d317
+HOSTBOOT_BINARIES_VERSION ?= 22470e51b6342f9c307e28b3ea7cdb194ff954d4
HOSTBOOT_BINARIES_SITE ?= $(call github,open-power,hostboot-binaries,$(HOSTBOOT_BINARIES_VERSION))
HOSTBOOT_BINARIES_LICENSE = Apache-2.0
@@ -13,7 +13,7 @@
define HOSTBOOT_BINARIES_INSTALL_IMAGES_CMDS
$(INSTALL) -D $(@D)/cvpd.bin $(STAGING_DIR)/hostboot_binaries/cvpd.bin
- $(INSTALL) -D $(@D)/p8.ref_image.hdr.bin.ecc $(STAGING_DIR)/hostboot_binaries/p8.ref_image.hdr.bin.ecc
+ $(INSTALL) -D $(@D)/$(BR2_HOSTBOOT_BINARY_WINK_FILENAME) $(STAGING_DIR)/hostboot_binaries/
$(INSTALL) -D $(@D)/$(BR2_HOSTBOOT_BINARY_SBEC_FILENAME) $(STAGING_DIR)/hostboot_binaries/
$(INSTALL) -D $(@D)/$(BR2_HOSTBOOT_BINARY_SBE_FILENAME) $(STAGING_DIR)/hostboot_binaries/
endef
diff --git a/openpower/package/hostboot/hostboot-0001-Increase-uart-delay.patch b/openpower/package/hostboot/hostboot-0001-Increase-uart-delay.patch
index 74cb584..5c916d2 100644
--- a/openpower/package/hostboot/hostboot-0001-Increase-uart-delay.patch
+++ b/openpower/package/hostboot/hostboot-0001-Increase-uart-delay.patch
@@ -18,7 +18,7 @@
{
const uint64_t DELAY_NS = 100;
- const uint64_t DELAY_LOOPS = 10000;
-+ const uint64_t DELAY_LOOPS = 1000000;
++ const uint64_t DELAY_LOOPS = 100000000;
uint8_t data = 0;
uint64_t loops = 0;
diff --git a/openpower/package/hostboot/hostboot-0004_mss_thermal_undo.patch b/openpower/package/hostboot/hostboot-0003-mss_thermal_undo.patch
similarity index 100%
rename from openpower/package/hostboot/hostboot-0004_mss_thermal_undo.patch
rename to openpower/package/hostboot/hostboot-0003-mss_thermal_undo.patch
diff --git a/openpower/package/hostboot/hostboot-0005-Add-PNOR-Version-Information-to-IPMI-Fru-Inventory.patch b/openpower/package/hostboot/hostboot-0005-Add-PNOR-Version-Information-to-IPMI-Fru-Inventory.patch
deleted file mode 100644
index 6f1b80c..0000000
--- a/openpower/package/hostboot/hostboot-0005-Add-PNOR-Version-Information-to-IPMI-Fru-Inventory.patch
+++ /dev/null
@@ -1,350 +0,0 @@
-From 1674da76fadc52f8c6aff6d8435536dd33b7417f Mon Sep 17 00:00:00 2001
-From: Bill Hoffa <wghoffa@us.ibm.com>
-Date: Mon, 30 Mar 2015 15:11:28 -0500
-Subject: [PATCH] Add PNOR Version Information to IPMI Fru Inventory
-
-Change-Id: Ib49fe67e9c6631b2b7ea0005e692c9aea6d84057
-RTC:123353
----
- src/usr/ipmi/ipmifruinv.C | 207 +++++++++++++++++++++
- src/usr/ipmi/ipmifruinvprvt.H | 47 +++++
- .../targeting/common/xmltohb/attribute_types.xml | 8 +
- src/usr/targeting/common/xmltohb/target_types.xml | 1 +
- 4 files changed, 263 insertions(+)
-
-diff --git a/src/usr/ipmi/ipmifruinv.C b/src/usr/ipmi/ipmifruinv.C
-index 4f0d7d7..aaf62d1 100644
---- a/src/usr/ipmi/ipmifruinv.C
-+++ b/src/usr/ipmi/ipmifruinv.C
-@@ -37,6 +37,7 @@
- #include "ipmifruinvprvt.H"
- #include <stdio.h>
- #include <assert.h>
-+#include <pnor/pnorif.H>
-
- extern trace_desc_t * g_trac_ipmi;
-
-@@ -84,6 +85,10 @@ IpmiFruInv *IpmiFruInv::Factory(TARGETING::TargetHandleList i_targets,
- // @todo-RTC:117702
- l_fru = new backplaneIpmiFruInv(l_target, i_targets, i_updateData);
- break;
-+ case TARGETING::TYPE_SYS:
-+ // Use sys target for setting System Firmware Info
-+ l_fru = new systemFwIpmiFruInv(l_target);
-+ break;
- default:
- assert(false,
- "IpmiFruInv::Factory: No support for target type given: [%08x]",
-@@ -927,6 +932,199 @@ errlHndl_t backplaneIpmiFruInv::addVpdData(std::vector<uint8_t> &io_data,
- return l_errl;
- }
-
-+//##############################################################################
-+systemFwIpmiFruInv::systemFwIpmiFruInv( TARGETING::TargetHandle_t i_target )
-+ :IpmiFruInv(i_target)
-+{
-+
-+};
-+
-+errlHndl_t systemFwIpmiFruInv::buildInternalUseArea(std::vector<uint8_t>
-+ &io_data)
-+{
-+ //This section not needed for proc type
-+ return IpmiFruInv::buildEmptyArea(io_data);
-+}
-+
-+errlHndl_t systemFwIpmiFruInv::buildChassisInfoArea(std::vector<uint8_t>
-+ &io_data)
-+{
-+ //This section not needed for system firmware type
-+ return IpmiFruInv::buildEmptyArea(io_data);
-+}
-+
-+errlHndl_t systemFwIpmiFruInv::buildBoardInfoArea(std::vector<uint8_t> &io_data)
-+{
-+ //This section not needed for system firmware type
-+ return IpmiFruInv::buildEmptyArea(io_data);
-+}
-+
-+errlHndl_t systemFwIpmiFruInv::buildProductInfoArea(std::vector<uint8_t>
-+ &io_data)
-+{
-+ errlHndl_t l_errl = NULL;
-+
-+ do {
-+ //Set formatting data that goes at the beginning of the record
-+ preFormatProcessing(io_data, true);
-+
-+ uint8_t l_data[] = {IPMIFRUINV::TYPELENGTH_BYTE_NULL,
-+ IPMIFRUINV::TYPELENGTH_BYTE_ASCII + 18, 'O','p','e',
-+ 'n','P','O','W','E','R',' ','F','i','r','m','w','a',
-+ 'r','e', IPMIFRUINV::TYPELENGTH_BYTE_NULL};
-+
-+ io_data.insert( io_data.end(),
-+ &l_data[0],
-+ &l_data[0] + (uint8_t(sizeof(l_data) / sizeof(uint8_t))));
-+
-+ //Get PNOR Version Here
-+ PNOR::SectionInfo_t l_pnorInfo;
-+ l_errl = getSectionInfo( PNOR::VERSION , l_pnorInfo);
-+ if (l_errl) { break; }
-+
-+ uint8_t* l_versionData = reinterpret_cast<uint8_t*>( l_pnorInfo.vaddr );
-+ //Total Bytes in PNOR Version String
-+ uint8_t l_numBytes = 0;
-+ uint8_t l_curOffset = 0;
-+
-+ //Total Number of fields needed to print PNOR Version String
-+ uint8_t l_numFields = 0;
-+ bool l_clearStandardFields = true;
-+
-+ //First determine number of bytes in PNOR Version string
-+ // with the caveat there is a max record size allowed, so
-+ // the string will be cut off if too long
-+ //Also, remove newline chars
-+ while ((l_numBytes < IPMIFRUINV::MAX_RECORD_SIZE -
-+ (uint8_t(sizeof(l_data) / sizeof(uint8_t))) -
-+ IPMIFRUINV::COMMON_HEADER_FORMAT_SIZE - 8)
-+ && (((char)(l_versionData[l_numBytes])) != '\0'))
-+ {
-+
-+ if (((char)(l_versionData[l_numBytes])) == '\n')
-+ {
-+
-+ if (l_numBytes > l_curOffset)
-+ {
-+ //Add on size of this field to the data buffer
-+ io_data.push_back(
-+ IPMIFRUINV::TYPELENGTH_BYTE_ASCII
-+ + (l_numBytes-l_curOffset));
-+
-+ io_data.insert(io_data.end(),
-+ &l_versionData[0]+(l_curOffset),
-+ &l_versionData[0]+(l_numBytes));
-+ }
-+
-+ //Null data for standard fields needs to be indicated once after
-+ // the first segment of data is displayed to match the
-+ // ipmi fru spec
-+ if (l_clearStandardFields)
-+ {
-+ //Add Empty Asset Tag
-+ io_data.push_back(uint8_t(0));
-+ //FRU File ID - Empty
-+ io_data.push_back(IPMIFRUINV::TYPELENGTH_BYTE_NULL);
-+ io_data.push_back(uint8_t(0)); // Empty FRU File ID bytes
-+ l_clearStandardFields = false;
-+ }
-+
-+ //Increment past the newline char
-+ l_curOffset = l_numBytes + 1;
-+ }
-+ l_numBytes++;
-+ }
-+
-+ if (l_curOffset == 0)
-+ {
-+ //Calculate the number of fields required to display this data
-+ // given only MAX_ASCII_FIELD_SIZE bytes can be in any one given
-+ // IPMI fru inventory field
-+ l_numFields = l_numBytes / IPMIFRUINV::MAX_ASCII_FIELD_SIZE;
-+ if (l_numBytes % IPMIFRUINV::MAX_ASCII_FIELD_SIZE)
-+ {
-+ l_numFields += 1;
-+ }
-+
-+ //Count by number of fields, adding the data to the buffer as
-+ // we go.
-+ for (uint8_t i=0; i < l_numFields; i++)
-+ {
-+ //Determine the data size for this particular field
-+ uint8_t l_dataSize=IPMIFRUINV::MAX_ASCII_FIELD_SIZE;
-+ if (i == l_numFields - 1)
-+ {
-+ l_dataSize = l_numBytes -
-+ (i * IPMIFRUINV::MAX_ASCII_FIELD_SIZE);
-+ }
-+
-+ //Add on size of this field to the data buffer
-+ io_data.push_back(IPMIFRUINV::TYPELENGTH_BYTE_ASCII
-+ + l_dataSize);
-+
-+ //Insert this segment of version string data
-+ io_data.insert(io_data.end(),
-+ &l_versionData[0]+(i * IPMIFRUINV::MAX_ASCII_FIELD_SIZE),
-+ &l_versionData[0]+(i * IPMIFRUINV::MAX_ASCII_FIELD_SIZE)
-+ +l_dataSize);
-+
-+ //Null data for standard fields needs to be indicated once after
-+ // the first segment of data is displayed to match the
-+ // ipmi fru spec
-+ if (l_clearStandardFields)
-+ {
-+ //Add Empty Asset Tag
-+ io_data.push_back(uint8_t(0));
-+ //FRU File ID - Empty
-+ io_data.push_back(IPMIFRUINV::TYPELENGTH_BYTE_NULL);
-+ //io_data.push_back(uint8_t(0)); // Empty FRU File ID bytes
-+ l_clearStandardFields = false;
-+ }
-+
-+ }
-+ }
-+ else
-+ {
-+ if (l_numBytes > l_curOffset)
-+ {
-+ io_data.push_back( IPMIFRUINV::TYPELENGTH_BYTE_ASCII
-+ + (l_numBytes-l_curOffset));
-+
-+ io_data.insert(io_data.end(),
-+ &l_versionData[0]+(l_curOffset),
-+ &l_versionData[0]+(l_numBytes));
-+ }
-+
-+ }
-+
-+ if (l_clearStandardFields)
-+ {
-+ //Add Asset Tag
-+ io_data.push_back(uint8_t(0)); //No Asset Tag needed - O bytes
-+ //FRU File ID - Empty
-+ io_data.push_back(IPMIFRUINV::TYPELENGTH_BYTE_NULL);
-+ //io_data.push_back(uint8_t(0)); // Empty FRU File ID bytes
-+ }
-+
-+ io_data.push_back(IPMIFRUINV::END_OF_CUSTOM_FIELDS);
-+
-+ //Finalize section formatting
-+ postFormatProcessing(io_data);
-+
-+ } while(0);
-+
-+ return l_errl;
-+}
-+
-+errlHndl_t systemFwIpmiFruInv::buildMultiRecordInfoArea(std::vector<uint8_t>
-+ &io_data)
-+{
-+ //This section not needed for system firmware type
-+ return IpmiFruInv::buildEmptyArea(io_data);
-+}
-+
-+
-+
- void IpmiFruInv::addEcidData(const TARGETING::TargetHandle_t& i_target,
- const TARGETING::ATTR_ECID_type& i_ecidInfo,
- std::vector<uint8_t> &io_data)
-@@ -997,6 +1195,15 @@ void IPMIFRUINV::setData(bool i_updateData)
- IPMIFRUINV::gatherClearData(pSys, frusToClear);
- }
-
-+ //Get System FW FRU_ID if available
-+ uint32_t l_systemFwFruId;
-+ bool hasSystemFwFruId =
-+ pSys->tryGetAttr<TARGETING::ATTR_BMC_FRU_ID>(l_systemFwFruId);
-+ if (hasSystemFwFruId)
-+ {
-+ l_potentialFrus.push_back(std::make_pair(pSys, l_systemFwFruId));
-+ }
-+
- // Find list of all target types that may need a fru inv. record set
- IPMIFRUINV::gatherSetData(pSys, frusToClear,
- l_potentialFrus, i_updateData);
-diff --git a/src/usr/ipmi/ipmifruinvprvt.H b/src/usr/ipmi/ipmifruinvprvt.H
-index 2573a84..468a47f 100644
---- a/src/usr/ipmi/ipmifruinvprvt.H
-+++ b/src/usr/ipmi/ipmifruinvprvt.H
-@@ -42,6 +42,8 @@ namespace IPMIFRUINV
- COMMON_HEADER_FORMAT_SIZE = 8, //size in bytes
- DEFAULT_CHASSIS_TYPE = 0x05,
- DEFAULT_FRU_OFFSET = 0,
-+ MAX_ASCII_FIELD_SIZE = 0x3F, //size in bytes
-+ MAX_RECORD_SIZE = 0xFF, //size in bytes
- };
- };
-
-@@ -460,4 +462,49 @@ class backplaneIpmiFruInv : public IpmiFruInv
-
- };
-
-+//Child class for building up System Firwmare Fru Inventory Record Data
-+class systemFwIpmiFruInv : public IpmiFruInv
-+{
-+
-+ public:
-+ /**
-+ * @brief Constructor
-+ *
-+ * @param[in] TargetHandle_t, Handle to target for which
-+ * to get relevant IPMI FRU Data from
-+ */
-+ systemFwIpmiFruInv( TARGETING::TargetHandle_t i_target);
-+
-+ /**
-+ * @brief Builds the Internal Use Area Data Section
-+ * @param[in/out] data, The container to put internal use area data in
-+ */
-+ errlHndl_t buildInternalUseArea(std::vector<uint8_t> &io_data);
-+
-+ /**
-+ * @brief Builds the Chassis Info Area Data Section
-+ * @param[in/out] data, The container to put chassis info area data in
-+ */
-+ errlHndl_t buildChassisInfoArea(std::vector<uint8_t> &io_data);
-+
-+ /**
-+ * @brief Builds the Board Info Area Data Section
-+ * @param[in/out] data, The container to put board info area data in
-+ */
-+ errlHndl_t buildBoardInfoArea(std::vector<uint8_t> &io_data);
-+
-+ /**
-+ * @brief Builds the Product Info Area Data Section
-+ * @param[in/out] data, The container to put product info area data in
-+ */
-+ errlHndl_t buildProductInfoArea(std::vector<uint8_t> &io_data);
-+
-+ /**
-+ * @brief Builds the MultiRecord Info Area Data Section
-+ * @param[in/out] data, The container to put multirecord info area data in
-+ */
-+ errlHndl_t buildMultiRecordInfoArea(std::vector<uint8_t> &io_data);
-+
-+};
-+
- #endif
-diff --git a/src/usr/targeting/common/xmltohb/attribute_types.xml b/src/usr/targeting/common/xmltohb/attribute_types.xml
-index ec256de..17729cd 100644
---- a/src/usr/targeting/common/xmltohb/attribute_types.xml
-+++ b/src/usr/targeting/common/xmltohb/attribute_types.xml
-@@ -11659,6 +11659,14 @@ firmware notes: Platforms should initialize this attribute to AUTO (0)</descript
- </attribute>
-
- <attribute>
-+ <id>BMC_FRU_ID</id>
-+ <description>BMC FRU ID attribute for node class</description>
-+ <simpleType><uint32_t><default>0</default></uint32_t></simpleType>
-+ <persistency>non-volatile</persistency>
-+ <readable/>
-+</attribute>
-+
-+<attribute>
- <id>PLCK_IPL_ATTR_OVERRIDES_EXIST</id>
- <description>
- Set to 1 by HWSV to indicate that attribute overrides exist in a PLCK IPL
-diff --git a/src/usr/targeting/common/xmltohb/target_types.xml b/src/usr/targeting/common/xmltohb/target_types.xml
-index 15d7921..82ec014 100644
---- a/src/usr/targeting/common/xmltohb/target_types.xml
-+++ b/src/usr/targeting/common/xmltohb/target_types.xml
-@@ -300,6 +300,7 @@
- <attribute><id>MNFG_TH_CEN_L4_CACHE_CES</id></attribute>
- <attribute><id>OPT_MEMMAP_GROUP_POLICY</id></attribute>
- <attribute><id>FRU_ID</id></attribute>
-+ <attribute><id>BMC_FRU_ID</id></attribute>
- </targetType>
-
- <targetType>
---
-1.8.2.2
-
diff --git a/openpower/package/hostboot/hostboot-0006-Move-slave-sbe-start-before-proc-cen-ref-clk-enable.patch b/openpower/package/hostboot/hostboot-0006-Move-slave-sbe-start-before-proc-cen-ref-clk-enable.patch
deleted file mode 100644
index 06e4730..0000000
--- a/openpower/package/hostboot/hostboot-0006-Move-slave-sbe-start-before-proc-cen-ref-clk-enable.patch
+++ /dev/null
@@ -1,60 +0,0 @@
-From d6882c71233b9c4b2fb801c4f3e588b47c2c73bc Mon Sep 17 00:00:00 2001
-From: Dan Crowell <dcrowell@us.ibm.com>
-Date: Wed, 1 Apr 2015 11:07:42 -0500
-Subject: [PATCH] Move slave sbe start before proc_cen_ref_clk_enable
-
-The proc_cen_ref_clk_enable step contains scoms to the processor
-that do not work if the proc hasn't run through its sbe code yet.
-
-Change-Id: I7665992a01bd66a37cd5e79aa2bb2142a304a8f4
----
- src/include/usr/isteps/istep06list.H | 16 ++++++++--------
- 1 file changed, 8 insertions(+), 8 deletions(-)
-
-diff --git a/src/include/usr/isteps/istep06list.H b/src/include/usr/isteps/istep06list.H
-index 6adb784..6a26b2a 100644
---- a/src/include/usr/isteps/istep06list.H
-+++ b/src/include/usr/isteps/istep06list.H
-@@ -68,12 +68,12 @@ namespace INITSERVICE
- * : Clear deconfigured states
- * 06.8 proc_revert_sbe_mcs_setup
- * : Clean up MCS extent regs
-- * 06.9 proc_cen_ref_clk_enable
-- * : Setup centaur ref clocks
-- * 06.10 host_slave_sbe_config
-+ * 06.10 host_slave_sbe_config
- * 06.11 host_sbe_start
- * 06.12 proc_check_slave_sbe_seeprom_complete
- * : Check Slave SBE Complete
-+ * 06.9 proc_cen_ref_clk_enable
-+ * : Setup centaur ref clocks
- * 06.13 proc_xmit_sbe
- * : vSBE Init of Slave Chips
- *
-@@ -127,11 +127,6 @@ const TaskInfo g_istep06[] = {
- { START_FN, EXT_IMAGE, NORMAL_IPL_OP, false }
- },
- {
-- ISTEPNAME(06,09,"proc_cen_ref_clk_enable"),
-- SLAVE_SBE::call_proc_cen_ref_clk_enable,
-- { START_FN, EXT_IMAGE, NORMAL_IPL_OP, false }
-- },
-- {
- ISTEPNAME(06,10,"host_slave_sbe_config"),
- SLAVE_SBE::call_host_slave_sbe_config,
- { START_FN, EXT_IMAGE, NORMAL_IPL_OP, false }
-@@ -147,6 +142,11 @@ const TaskInfo g_istep06[] = {
- { START_FN, EXT_IMAGE, NORMAL_IPL_OP | MPIPL_OP, false }
- },
- {
-+ ISTEPNAME(06,09,"proc_cen_ref_clk_enable"),
-+ SLAVE_SBE::call_proc_cen_ref_clk_enable,
-+ { START_FN, EXT_IMAGE, NORMAL_IPL_OP, false }
-+ },
-+ {
- ISTEPNAME(06,13,"proc_xmit_sbe"),
- SLAVE_SBE::call_proc_xmit_sbe,
- { START_FN, EXT_IMAGE, NORMAL_IPL_OP, false }
---
-1.8.2.2
-
diff --git a/openpower/package/hostboot/hostboot-0007-Fix-Bug-in-mss_setup_bars.patch b/openpower/package/hostboot/hostboot-0007-Fix-Bug-in-mss_setup_bars.patch
deleted file mode 100644
index 8a14eda..0000000
--- a/openpower/package/hostboot/hostboot-0007-Fix-Bug-in-mss_setup_bars.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From 5b26d8a2da4c8bba72781e45ec89572843f55f35 Mon Sep 17 00:00:00 2001
-From: Mike Baiocchi <baiocchi@us.ibm.com>
-Date: Tue, 21 Apr 2015 13:23:36 -0500
-Subject: [PATCH] Fix Bug in mss_setup_bars
-
-There was an update made to mss_setup_bars.C to fix memory corruption, but
-this commit corrects an issue that was missed by this initial update.
-
-Change-Id: I32889a5d07b33f5496e5ea12ec50a0f26d0e1561
-CQ: SW296125
----
- src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/mss_setup_bars.C | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/mss_setup_bars.C b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/mss_setup_bars.C
-index 274dfdc..6c58193 100644
---- a/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/mss_setup_bars.C
-+++ b/src/usr/hwpf/hwp/dram_initialization/proc_setup_bars/mss_setup_bars.C
-@@ -615,7 +615,7 @@ fapi::ReturnCode mss_setup_bars(const fapi::Target& i_pu_target, std::vector<f
- if(mcs_sz != sizeInfo.MCS_size[group_data[i][j]])
- {
- FAPI_INF(" Group %zd will not be configured as MCS %d is not valid grouped size is %d , present MCS size is %d \n",i,group_data[i][j],mcs_sz, sizeInfo.MCS_size[group_data[i][j]]);
-- for(uint8_t k = 0; k<32;k++) { group_data[i][k]=0; }
-+ for(uint8_t k = 0; k<16;k++) { group_data[i][k]=0; }
- }
- }
- }
---
-1.8.2.2
-
diff --git a/openpower/package/hostboot/hostboot-0007-Fix-handling-of-ECC-protected-partitions-at-runtime.patch b/openpower/package/hostboot/hostboot-0007-Fix-handling-of-ECC-protected-partitions-at-runtime.patch
new file mode 100644
index 0000000..c9385d2
--- /dev/null
+++ b/openpower/package/hostboot/hostboot-0007-Fix-handling-of-ECC-protected-partitions-at-runtime.patch
@@ -0,0 +1,34 @@
+From 69e22b2f8c8425b4f2ec8f7adcf164afed7f2ff8 Mon Sep 17 00:00:00 2001
+From: Dan Crowell <dcrowell@us.ibm.com>
+Date: Mon, 27 Apr 2015 13:48:57 -0500
+Subject: [PATCH] Fix handling of ECC protected partitions at runtime
+
+Modify the code to only check ECC on the logical size of the data
+that is read, rather than on the full physical size.
+
+Change-Id: Ia45989e64ef70e63542274ef59df2cc755f8082e
+---
+ src/usr/pnor/runtime/rt_pnor.C | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/src/usr/pnor/runtime/rt_pnor.C b/src/usr/pnor/runtime/rt_pnor.C
+index d434f26..6e52999 100644
+--- a/src/usr/pnor/runtime/rt_pnor.C
++++ b/src/usr/pnor/runtime/rt_pnor.C
+@@ -405,10 +405,12 @@ errlHndl_t RtPnor::readFromDevice (uint64_t i_procId,
+ {
+ TRACFCOMP(g_trac_pnor, "RtPnor::readFromDevice: removing ECC...");
+ // remove the ECC and fix the original data if it is broken
++ size_t l_eccSize = (l_rc/9)*8;
++ l_eccSize = std::min( l_eccSize, i_size );
+ PNOR::ECC::eccStatus ecc_stat =
+ PNOR::ECC::removeECC(reinterpret_cast<uint8_t*>(l_dataToRead),
+ reinterpret_cast<uint8_t*>(o_data),
+- l_rc); //actual size of read data
++ l_eccSize); //logical size of read data
+
+ // create an error if we couldn't correct things
+ if( ecc_stat == PNOR::ECC::UNCORRECTABLE )
+--
+1.8.2.2
+
diff --git a/openpower/package/hostboot/hostboot-0008-Fix-PCIe-swap-issue.patch b/openpower/package/hostboot/hostboot-0008-Fix-PCIe-swap-issue.patch
new file mode 100644
index 0000000..3777b11
--- /dev/null
+++ b/openpower/package/hostboot/hostboot-0008-Fix-PCIe-swap-issue.patch
@@ -0,0 +1,63 @@
+From a4f739abb72b8ac5748138183b274cca5eef50ff Mon Sep 17 00:00:00 2001
+From: Matt Ploetz <maploetz@us.ibm.com>
+Date: Tue, 12 May 2015 15:32:20 -0500
+Subject: [PATCH] PCIe lane swap fix in processMRW.pl
+
+Change-Id: Iee7127fef7f4a911a77e0c24c896d840b1b45ff4
+---
+ src/usr/targeting/common/processMrw.pl | 25 +++++++++++--------------
+ 1 file changed, 11 insertions(+), 14 deletions(-)
+
+diff --git a/src/usr/targeting/common/processMrw.pl b/src/usr/targeting/common/processMrw.pl
+index 5d44e74..bbdb936 100644
+--- a/src/usr/targeting/common/processMrw.pl
++++ b/src/usr/targeting/common/processMrw.pl
+@@ -805,8 +805,8 @@ sub processPcie
+ $iop_swap{0}{1}{'11'}=$t[7];
+
+ $iop_swap{1}{0}{'00'}=$t[8];
+- $iop_swap{1}{0}{'01'}=$t[9];
+- $iop_swap{1}{0}{'10'}=$t[10];
++ $iop_swap{1}{0}{'10'}=$t[9];
++ $iop_swap{1}{0}{'01'}=$t[10];
+ $iop_swap{1}{0}{'11'}=$t[11];
+ $iop_swap{1}{1}{'00'}=$t[12];
+ $iop_swap{1}{1}{'10'}=$t[13];
+@@ -906,25 +906,22 @@ sub processPcie
+ die "PCIE config for $iop,$iop_lane_swap[$iop],$lane_rev not found\n";
+ }
+ }
+- my $lane_swap_attr0 = sprintf("%s,%s",$iop_lane_swap[0],
+- $iop_lane_swap[1]);
+- my $lane_swap_attr1 = sprintf("%s,0,%s,0",$iop_lane_swap[0],
+- $iop_lane_swap[1]);
++
++ my $lane_rev_attr0 = sprintf("%s,%s",
++ oct($iop_swap_lu[0]),oct($iop_swap_lu[1]));
++ my $lane_rev_attr1 = sprintf("%s,0,%s,0",
++ oct($iop_swap_lu[0]),oct($iop_swap_lu[1]));
+
+ $targetObj->setAttribute($parentTarget, "PROC_PCIE_IOP_SWAP",
+- $lane_swap_attr0);
++ $lane_rev_attr0);
+ $targetObj->setAttribute($parentTarget, "PROC_PCIE_IOP_SWAP_NON_BIFURCATED",
+- $lane_swap_attr1);
++ $lane_rev_attr1);
+ $targetObj->setAttribute($parentTarget, "PROC_PCIE_IOP_SWAP_BIFURCATED",
+ "0,0,0,0");
+-
+- my $lane_rev_attr = sprintf("%s,0,%s,0",
+- oct($iop_swap_lu[0]),oct($iop_swap_lu[1]));
+-
+ $targetObj->setAttribute($parentTarget, "PROC_PCIE_IOP_REVERSAL",
+- $lane_rev_attr);
++ "0,0,0,0");
+ $targetObj->setAttribute($parentTarget,
+- "PROC_PCIE_IOP_REVERSAL_NON_BIFURCATED",$lane_rev_attr);
++ "PROC_PCIE_IOP_REVERSAL_NON_BIFURCATED","0,0,0,0");
+ $targetObj->setAttribute($parentTarget, "PROC_PCIE_IOP_REVERSAL_BIFURCATED",
+ "0,0,0,0");
+
+--
+1.8.2.2
+
diff --git a/openpower/package/hostboot/hostboot-0008-Limit-attribute-NPU_MMIO_BAR_BASE_ADDR-to-Naples-bas.patch b/openpower/package/hostboot/hostboot-0008-Limit-attribute-NPU_MMIO_BAR_BASE_ADDR-to-Naples-bas.patch
deleted file mode 100644
index 8f8a15e..0000000
--- a/openpower/package/hostboot/hostboot-0008-Limit-attribute-NPU_MMIO_BAR_BASE_ADDR-to-Naples-bas.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From 0134ed35efb10842f8a1d59d456e39338e63eaea Mon Sep 17 00:00:00 2001
-From: Mike Baiocchi <baiocchi@us.ibm.com>
-Date: Tue, 21 Apr 2015 16:41:38 -0500
-Subject: [PATCH] Limit attribute NPU_MMIO_BAR_BASE_ADDR to Naples-based
- systems
-
-This commit limits the use of the NPU_MMIO_BAR_BASE_ADDR to the
-systems for which it is defined.
-
-Change-Id: I7eab012a84611365e8e6cb6c44b49c4a4ffac8e4
----
- src/usr/targeting/common/processMrw.pl | 7 ++++++-
- 1 file changed, 6 insertions(+), 1 deletion(-)
-
-diff --git a/src/usr/targeting/common/processMrw.pl b/src/usr/targeting/common/processMrw.pl
-index 3515841..5d44e74 100644
---- a/src/usr/targeting/common/processMrw.pl
-+++ b/src/usr/targeting/common/processMrw.pl
-@@ -580,10 +580,15 @@ sub setupBars
- my $proc = $targetObj->getAttribute($target, "FABRIC_CHIP_ID");
- $targetObj->{TOPOLOGY}->{$node}->{$proc}++;
-
-- my @bars=("NPU_MMIO_BAR_BASE_ADDR","FSP_BASE_ADDR","PSI_BRIDGE_BASE_ADDR",
-+ my @bars=("FSP_BASE_ADDR","PSI_BRIDGE_BASE_ADDR",
- "INTP_BASE_ADDR","PHB_BASE_ADDRS","PCI_BASE_ADDRS_32",
- "PCI_BASE_ADDRS_64","RNG_BASE_ADDR","IBSCOM_PROC_BASE_ADDR");
-
-+ # Attribute only valid in naples-based systems
-+ if (!$targetObj->isBadAttribute($target,"NPU_MMIO_BAR_BASE_ADDR") ) {
-+ push(@bars,"NPU_MMIO_BAR_BASE_ADDR");
-+ }
-+
- foreach my $bar (@bars)
- {
- my ($num,$base,$node_offset,$proc_offset,$offset) = split(/,/,
---
-1.8.2.2
-
diff --git a/openpower/package/hostboot/hostboot-0009-ATTN-IPOLL-interrupt-workaround.patch b/openpower/package/hostboot/hostboot-0009-ATTN-IPOLL-interrupt-workaround.patch
new file mode 100644
index 0000000..eb8d12a
--- /dev/null
+++ b/openpower/package/hostboot/hostboot-0009-ATTN-IPOLL-interrupt-workaround.patch
@@ -0,0 +1,141 @@
+From d2bdfed735f6c5e69b606f0251aba131fec4275d Mon Sep 17 00:00:00 2001
+From: Brian Stegmiller <bjs@us.ibm.com>
+Date: Thu, 14 May 2015 13:47:36 -0500
+Subject: [PATCH] ATTN: IPOLL interrupt workaround
+
+Circumvents issue where interrupts happen before OPAL is ready
+to handle them
+
+Change-Id: I3d378cd03dac51aaa5b2f77e8940eb63f170016b
+Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/17795
+Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
+Tested-by: Jenkins Server
+---
+ src/usr/diag/attn/common/attnsvc_common.C | 83 +++++++++++++++++++++++++++++--
+ 1 file changed, 79 insertions(+), 4 deletions(-)
+
+diff --git a/src/usr/diag/attn/common/attnsvc_common.C b/src/usr/diag/attn/common/attnsvc_common.C
+index c56b8a8..5067438 100644
+--- a/src/usr/diag/attn/common/attnsvc_common.C
++++ b/src/usr/diag/attn/common/attnsvc_common.C
+@@ -43,6 +43,13 @@ using namespace ERRORLOG;
+
+ namespace ATTN
+ {
++const uint64_t MCIFIRACT0 = 0x02011846;
++const uint64_t MCIFIRACT1 = 0x02011847;
++
++const uint64_t MCIFIRMASK = 0x02011843;
++const uint64_t MCIFIRMASK_AND = 0x02011844;
++const uint64_t MCIFIRMASK_OR = 0x02011845;
++
+
+ void getPbGp2Mask(uint64_t i_pos, void * i_data)
+ {
+@@ -104,11 +111,11 @@ errlHndl_t ServiceCommon::configureInterrupts(
+ ConfigureMode i_mode)
+ {
+ errlHndl_t err = NULL;
+-
+- TargetHandleList procs;
++ TargetHandleList procs;
+ getTargetService().getAllChips(procs, TYPE_PROC);
+ TargetHandleList::iterator it = procs.begin();
+
++
+ while(it != procs.end())
+ {
+ uint64_t mask = 0;
+@@ -172,12 +179,10 @@ errlHndl_t ServiceCommon::configureInterrupts(
+
+ #ifndef __HOSTBOOT_RUNTIME
+ // enable attentions in ipoll mask
+-
+ mask = HostMask::nonHost();
+ mask |= HostMask::host();
+
+ // this doesn't have an and/or reg for some reason...
+-
+ err = modifyScom(*it,
+ IPOLL::address,
+ i_mode == UP ? ~mask : mask,
+@@ -187,6 +192,76 @@ errlHndl_t ServiceCommon::configureInterrupts(
+ {
+ break;
+ }
++
++ #else // HOSTBOOT_RUNTIME
++
++ if (i_mode == UP)
++ {
++ HwasState l_functional;
++ uint64_t l_mciAct0 = 0;
++ uint64_t l_mciAct1 = 0;
++ uint64_t l_mciBitMask = 0;
++ TargetHandleList l_mcsList;
++ // Get list of MCS units associated with this proc
++ getTargetService().getMcsList( *it, l_mcsList );
++
++ // We need to set/clear mask bits in the MCIFIRs that
++ // are associated with host attentions. This should
++ // cause interrupts to re-occur if they had happened
++ // prior to starting the opal-prd application.
++ TargetHandleList::iterator l_mcsIt = l_mcsList.begin();
++
++ while(l_mcsIt != l_mcsList.end())
++ {
++ // Make sure functional prior to using
++ if (!((*l_mcsIt)->tryGetAttr<ATTR_HWAS_STATE>(l_functional)))
++ {
++ // Can't tell if functional so skip this MCS
++ break;
++ }
++
++ if ( !(l_functional.functional) )
++ {
++ // Not functional MCS so skip it
++ break;
++ }
++
++ // Read ACTION registers to see if HOST ATTN
++ err = getScom(*l_mcsIt, MCIFIRACT0, l_mciAct0);
++
++ if (NULL == err)
++ {
++ err = getScom(*l_mcsIt, MCIFIRACT1, l_mciAct1);
++ }
++
++ if (NULL == err)
++ {
++ // Create bit mask we will use to write to MCIFIR
++ // (ACT0=1, ACT1=0) indicate bits we want
++ l_mciBitMask = l_mciAct0 & ~l_mciAct1;
++ // Set mask bits
++ err = putScom(*l_mcsIt, MCIFIRMASK_OR, l_mciBitMask);
++ }
++
++ if (NULL == err)
++ {
++ // Clear mask bits
++ err = putScom(*l_mcsIt, MCIFIRMASK_AND, ~l_mciBitMask);
++ }
++
++ // Commit any failure we had and move to next MCS unit
++ if (NULL != err)
++ {
++ errlCommit(err, ATTN_COMP_ID);
++ }
++
++ l_mcsIt++;
++
++ } // end while on MCS units
++
++ l_mcsList.clear();
++ } // end if UP MODE -- enabling
++
+ #endif //__HOSTBOOT_RUNTIME
+
+ ++it;
+--
+1.8.2.2
+
diff --git a/openpower/package/hostboot/hostboot-0009-targeting-support-for-backplane-VPD.patch b/openpower/package/hostboot/hostboot-0009-targeting-support-for-backplane-VPD.patch
deleted file mode 100644
index 5779f22..0000000
--- a/openpower/package/hostboot/hostboot-0009-targeting-support-for-backplane-VPD.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From bc07c585c41d4c6119d8608af27ab7ad1acdaab8 Mon Sep 17 00:00:00 2001
-From: Mike Baiocchi <baiocchi@us.ibm.com>
-Date: Wed, 22 Apr 2015 10:31:08 -0500
-Subject: [PATCH] Add targeting support for backplane VPD
-
-Only the targeting support required by "Updated VPD_REC_NUM numbering"
-
-Change-Id: Ifa095f719b35de2cfae9344496dee63aea190334
-RTC: 118373
----
- src/usr/targeting/common/xmltohb/target_types.xml | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/src/usr/targeting/common/xmltohb/target_types.xml b/src/usr/targeting/common/xmltohb/target_types.xml
-index 82ec014..759b73e 100644
---- a/src/usr/targeting/common/xmltohb/target_types.xml
-+++ b/src/usr/targeting/common/xmltohb/target_types.xml
-@@ -913,6 +913,8 @@
- <attribute><id>FRU_ID</id></attribute>
- <attribute><id>TPM_PRIMARY_INFO</id></attribute>
- <attribute><id>TPM_BACKUP_INFO</id></attribute>
-+ <attribute><id>EEPROM_VPD_PRIMARY_INFO</id></attribute>
-+ <attribute><id>VPD_REC_NUM</id></attribute>
- </targetType>
-
- <targetType>
---
-1.8.2.2
-
diff --git a/openpower/package/hostboot/hostboot-0010-PRD-getBusEndpoints-parameter-issue.patch b/openpower/package/hostboot/hostboot-0010-PRD-getBusEndpoints-parameter-issue.patch
deleted file mode 100644
index 07a64bb..0000000
--- a/openpower/package/hostboot/hostboot-0010-PRD-getBusEndpoints-parameter-issue.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From 82374feb7e8ee67f254b7d8ec657a9239b622975 Mon Sep 17 00:00:00 2001
-From: Zane Shelley <zshelle@us.ibm.com>
-Date: Thu, 23 Apr 2015 11:18:12 -0500
-Subject: [PATCH 1/2] PRD: getBusEndpoints() parameter issue
-
-Change-Id: I947eeb506337f9c2fb8f845bbe04a20fb8b62bde
-CQ: SW304932
----
- .../prdf/common/plat/pegasus/prdfCalloutUtil.C | 2 +-
- .../prdf/common/plat/pegasus/prdfCalloutUtil.H | 4 ++--
- 2 files changed, 3 insertions(+), 3 deletions(-)
-
-diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCalloutUtil.C b/src/usr/diag/prdf/common/plat/pegasus/prdfCalloutUtil.C
-index f09ec6c..67941d6 100644
---- a/src/usr/diag/prdf/common/plat/pegasus/prdfCalloutUtil.C
-+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCalloutUtil.C
-@@ -229,7 +229,7 @@ TargetHandleList getConnectedDimms( TargetHandle_t i_mba,
- //------------------------------------------------------------------------------
-
- int32_t getBusEndpoints( ExtensibleChip * i_chip,
-- TargetHandle_t o_rxTrgt, TargetHandle_t o_txTrgt,
-+ TargetHandle_t & o_rxTrgt, TargetHandle_t & o_txTrgt,
- TYPE i_busType, uint32_t i_busPos )
- {
- #define PRDF_FUNC "[CalloutUtil::getBusEndpoints] "
-diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfCalloutUtil.H b/src/usr/diag/prdf/common/plat/pegasus/prdfCalloutUtil.H
-index fa3e843..502467b 100644
---- a/src/usr/diag/prdf/common/plat/pegasus/prdfCalloutUtil.H
-+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfCalloutUtil.H
-@@ -136,8 +136,8 @@ TARGETING::TargetHandleList getConnectedDimms( TARGETING::TargetHandle_t i_mba,
- *
- */
- int32_t getBusEndpoints( ExtensibleChip * i_chip,
-- TARGETING::TargetHandle_t o_rxTrgt,
-- TARGETING::TargetHandle_t o_txTrgt,
-+ TARGETING::TargetHandle_t & o_rxTrgt,
-+ TARGETING::TargetHandle_t & o_txTrgt,
- TARGETING::TYPE i_busType = TARGETING::TYPE_NA,
- uint32_t i_busPos = 0 );
-
---
-1.7.9.5
-
diff --git a/openpower/package/hostboot/hostboot-0010-Remove-gard-actions-for-memory-plugging-errors.patch b/openpower/package/hostboot/hostboot-0010-Remove-gard-actions-for-memory-plugging-errors.patch
new file mode 100644
index 0000000..ef2a896
--- /dev/null
+++ b/openpower/package/hostboot/hostboot-0010-Remove-gard-actions-for-memory-plugging-errors.patch
@@ -0,0 +1,764 @@
+From c53b40e0dcc250d75a159389e099dd40b64e5468 Mon Sep 17 00:00:00 2001
+From: Dan Crowell <dcrowell@us.ibm.com>
+Date: Wed, 27 May 2015 16:39:23 -0500
+Subject: [PATCH] Remove gard actions for memory plugging errors
+
+Modified errors related to unsupported or invalid dimm
+configurations to no longer gard any hardware.
+
+Change-Id: I67459425e973ad1c6f4cf95ccd164b73bdd46a80
+---
+ .../mss_eff_config/memory_mss_eff_config.xml | 208 +++++----------------
+ .../memory_mss_eff_config_termination.xml | 69 +------
+ 2 files changed, 50 insertions(+), 227 deletions(-)
+
+diff --git a/src/usr/hwpf/hwp/mc_config/mss_eff_config/memory_mss_eff_config.xml b/src/usr/hwpf/hwp/mc_config/mss_eff_config/memory_mss_eff_config.xml
+index ed1de55..c6a2d37 100644
+--- a/src/usr/hwpf/hwp/mc_config/mss_eff_config/memory_mss_eff_config.xml
++++ b/src/usr/hwpf/hwp/mc_config/mss_eff_config/memory_mss_eff_config.xml
+@@ -5,7 +5,7 @@
+ <!-- -->
+ <!-- OpenPOWER HostBoot Project -->
+ <!-- -->
+-<!-- Contributors Listed Below - COPYRIGHT 2013,2014 -->
++<!-- Contributors Listed Below - COPYRIGHT 2013,2015 -->
+ <!-- [+] International Business Machines Corp. -->
+ <!-- -->
+ <!-- -->
+@@ -22,7 +22,7 @@
+ <!-- permissions and limitations under the License. -->
+ <!-- -->
+ <!-- IBM_PROLOG_END_TAG -->
+-<!-- $Id: memory_mss_eff_config.xml,v 1.3 2014/10/20 22:12:59 asaetow Exp $ -->
++<!-- $Id: memory_mss_eff_config.xml,v 1.4 2015-05-27 19:56:31 asaetow Exp $ -->
+ <!-- For file ../../ipl/fapi/mss_eff_config.C -->
+ <!-- // *! OWNER NAME : Anuwat Saetow Email: asaetow@us.ibm.com -->
+ <!-- // *! BACKUP NAME : Mark Bellows Email: bellows@us.ibm.com -->
+@@ -47,9 +47,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -71,9 +68,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -98,9 +92,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -125,9 +116,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -169,10 +157,10 @@
+ <description>Plug rule violation, one position is empty but other are present
+ </description>
+ <FFDC>TARGET_MBA</FFDC>
+- <ffdc>CUR_DIMM_SPD_VALID_U8ARRAY_0_0</ffdc>
+- <ffdc>CUR_DIMM_SPD_VALID_U8ARRAY_0_1</ffdc>
+- <ffdc>CUR_DIMM_SPD_VALID_U8ARRAY_1_0</ffdc>
+- <ffdc>CUR_DIMM_SPD_VALID_U8ARRAY_1_1</ffdc>
++ <ffdc>CUR_DIMM_SPD_VALID_U8ARRAY_0_0</ffdc>
++ <ffdc>CUR_DIMM_SPD_VALID_U8ARRAY_0_1</ffdc>
++ <ffdc>CUR_DIMM_SPD_VALID_U8ARRAY_1_0</ffdc>
++ <ffdc>CUR_DIMM_SPD_VALID_U8ARRAY_1_1</ffdc>
+ <callout>
+ <procedure>MEMORY_PLUGGING_ERROR</procedure>
+ <priority>HIGH</priority>
+@@ -186,10 +174,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- <priority>HIGH</priority>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -198,10 +182,10 @@
+ <description>Plug rule violation, sides do not match
+ </description>
+ <FFDC>TARGET_MBA</FFDC>
+- <ffdc>CUR_DIMM_SPD_VALID_U8ARRAY_0_0</ffdc>
+- <ffdc>CUR_DIMM_SPD_VALID_U8ARRAY_0_1</ffdc>
+- <ffdc>CUR_DIMM_SPD_VALID_U8ARRAY_1_0</ffdc>
+- <ffdc>CUR_DIMM_SPD_VALID_U8ARRAY_1_1</ffdc>
++ <ffdc>CUR_DIMM_SPD_VALID_U8ARRAY_0_0</ffdc>
++ <ffdc>CUR_DIMM_SPD_VALID_U8ARRAY_0_1</ffdc>
++ <ffdc>CUR_DIMM_SPD_VALID_U8ARRAY_1_0</ffdc>
++ <ffdc>CUR_DIMM_SPD_VALID_U8ARRAY_1_1</ffdc>
+
+ <callout>
+ <procedure>MEMORY_PLUGGING_ERROR</procedure>
+@@ -216,10 +200,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- <priority>HIGH</priority>
+- </gard>
+ </hwpError>
+
+
+@@ -229,10 +209,10 @@
+ <description>Plug rule violation, top and bottom do not match
+ </description>
+ <FFDC>TARGET_MBA</FFDC>
+- <ffdc>CUR_DIMM_SPD_VALID_U8ARRAY_0_0</ffdc>
+- <ffdc>CUR_DIMM_SPD_VALID_U8ARRAY_0_1</ffdc>
+- <ffdc>CUR_DIMM_SPD_VALID_U8ARRAY_1_0</ffdc>
+- <ffdc>CUR_DIMM_SPD_VALID_U8ARRAY_1_1</ffdc>
++ <ffdc>CUR_DIMM_SPD_VALID_U8ARRAY_0_0</ffdc>
++ <ffdc>CUR_DIMM_SPD_VALID_U8ARRAY_0_1</ffdc>
++ <ffdc>CUR_DIMM_SPD_VALID_U8ARRAY_1_0</ffdc>
++ <ffdc>CUR_DIMM_SPD_VALID_U8ARRAY_1_1</ffdc>
+
+ <callout>
+ <procedure>MEMORY_PLUGGING_ERROR</procedure>
+@@ -247,10 +227,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- <priority>HIGH</priority>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -259,10 +235,10 @@
+ <description>Incompatable DRAM generation
+ </description>
+ <FFDC>TARGET_MBA</FFDC>
+- <ffdc>DRAM_DEVICE_TYPE_0_0</ffdc>
+- <ffdc>DRAM_DEVICE_TYPE_0_1</ffdc>
+- <ffdc>DRAM_DEVICE_TYPE_1_0</ffdc>
+- <ffdc>DRAM_DEVICE_TYPE_1_1</ffdc>
++ <ffdc>DRAM_DEVICE_TYPE_0_0</ffdc>
++ <ffdc>DRAM_DEVICE_TYPE_0_1</ffdc>
++ <ffdc>DRAM_DEVICE_TYPE_1_0</ffdc>
++ <ffdc>DRAM_DEVICE_TYPE_1_1</ffdc>
+
+ <callout>
+ <procedure>MEMORY_PLUGGING_ERROR</procedure>
+@@ -277,10 +253,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- <priority>HIGH</priority>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -289,10 +261,10 @@
+ <description>Incompatable DIMM type
+ </description>
+ <FFDC>TARGET_MBA</FFDC>
+- <ffdc>MODULE_TYPE_0_0</ffdc>
+- <ffdc>MODULE_TYPE_0_1</ffdc>
+- <ffdc>MODULE_TYPE_1_0</ffdc>
+- <ffdc>MODULE_TYPE_1_1</ffdc>
++ <ffdc>MODULE_TYPE_0_0</ffdc>
++ <ffdc>MODULE_TYPE_0_1</ffdc>
++ <ffdc>MODULE_TYPE_1_0</ffdc>
++ <ffdc>MODULE_TYPE_1_1</ffdc>
+
+ <callout>
+ <procedure>MEMORY_PLUGGING_ERROR</procedure>
+@@ -307,10 +279,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- <priority>HIGH</priority>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -319,10 +287,10 @@
+ <description>Incompatable DIMM ranks
+ </description>
+ <FFDC>TARGET_MBA</FFDC>
+- <ffdc>NUM_RANKS_0_0</ffdc>
+- <ffdc>NUM_RANKS_0_1</ffdc>
+- <ffdc>NUM_RANKS_1_0</ffdc>
+- <ffdc>NUM_RANKS_1_1</ffdc>
++ <ffdc>NUM_RANKS_0_0</ffdc>
++ <ffdc>NUM_RANKS_0_1</ffdc>
++ <ffdc>NUM_RANKS_1_0</ffdc>
++ <ffdc>NUM_RANKS_1_1</ffdc>
+
+ <callout>
+ <procedure>MEMORY_PLUGGING_ERROR</procedure>
+@@ -337,10 +305,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- <priority>HIGH</priority>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -349,10 +313,10 @@
+ <description>Incompatable DIMM banks
+ </description>
+ <FFDC>TARGET_MBA</FFDC>
+- <ffdc>SDRAM_BANKS_0_0</ffdc>
+- <ffdc>SDRAM_BANKS_0_1</ffdc>
+- <ffdc>SDRAM_BANKS_1_0</ffdc>
+- <ffdc>SDRAM_BANKS_1_1</ffdc>
++ <ffdc>SDRAM_BANKS_0_0</ffdc>
++ <ffdc>SDRAM_BANKS_0_1</ffdc>
++ <ffdc>SDRAM_BANKS_1_0</ffdc>
++ <ffdc>SDRAM_BANKS_1_1</ffdc>
+
+ <callout>
+ <procedure>MEMORY_PLUGGING_ERROR</procedure>
+@@ -367,10 +331,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- <priority>HIGH</priority>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -379,10 +339,10 @@
+ <description>Incompatable DIMM rows
+ </description>
+ <FFDC>TARGET_MBA</FFDC>
+- <ffdc>SDRAM_ROWS_0_0</ffdc>
+- <ffdc>SDRAM_ROWS_0_1</ffdc>
+- <ffdc>SDRAM_ROWS_1_0</ffdc>
+- <ffdc>SDRAM_ROWS_1_1</ffdc>
++ <ffdc>SDRAM_ROWS_0_0</ffdc>
++ <ffdc>SDRAM_ROWS_0_1</ffdc>
++ <ffdc>SDRAM_ROWS_1_0</ffdc>
++ <ffdc>SDRAM_ROWS_1_1</ffdc>
+
+ <callout>
+ <procedure>MEMORY_PLUGGING_ERROR</procedure>
+@@ -397,10 +357,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- <priority>HIGH</priority>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -409,10 +365,10 @@
+ <description>Incompatable DIMM columns
+ </description>
+ <FFDC>TARGET_MBA</FFDC>
+- <ffdc>SDRAM_COLS_0_0</ffdc>
+- <ffdc>SDRAM_COLS_0_1</ffdc>
+- <ffdc>SDRAM_COLS_1_0</ffdc>
+- <ffdc>SDRAM_COLS_1_1</ffdc>
++ <ffdc>SDRAM_COLS_0_0</ffdc>
++ <ffdc>SDRAM_COLS_0_1</ffdc>
++ <ffdc>SDRAM_COLS_1_0</ffdc>
++ <ffdc>SDRAM_COLS_1_1</ffdc>
+
+ <callout>
+ <procedure>MEMORY_PLUGGING_ERROR</procedure>
+@@ -427,10 +383,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- <priority>HIGH</priority>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -439,10 +391,10 @@
+ <description>Incompatable DRAM primary bus width
+ </description>
+ <FFDC>TARGET_MBA</FFDC>
+- <ffdc>BUS_WIDTH_0_0</ffdc>
+- <ffdc>BUS_WIDTH_0_1</ffdc>
+- <ffdc>BUS_WIDTH_1_0</ffdc>
+- <ffdc>BUS_WIDTH_1_1</ffdc>
++ <ffdc>BUS_WIDTH_0_0</ffdc>
++ <ffdc>BUS_WIDTH_0_1</ffdc>
++ <ffdc>BUS_WIDTH_1_0</ffdc>
++ <ffdc>BUS_WIDTH_1_1</ffdc>
+
+ <callout>
+ <procedure>MEMORY_PLUGGING_ERROR</procedure>
+@@ -457,10 +409,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- <priority>HIGH</priority>
+- </gard>
+ </hwpError>
+
+
+@@ -483,10 +431,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- <priority>HIGH</priority>
+- </gard>
+ </hwpError>
+
+
+@@ -496,10 +440,10 @@
+ <description>Incompatable DRAM width
+ </description>
+ <FFDC>TARGET_MBA</FFDC>
+- <ffdc>DRAM_WIDTH_0_0</ffdc>
+- <ffdc>DRAM_WIDTH_0_1</ffdc>
+- <ffdc>DRAM_WIDTH_1_0</ffdc>
+- <ffdc>DRAM_WIDTH_1_1</ffdc>
++ <ffdc>DRAM_WIDTH_0_0</ffdc>
++ <ffdc>DRAM_WIDTH_0_1</ffdc>
++ <ffdc>DRAM_WIDTH_1_0</ffdc>
++ <ffdc>DRAM_WIDTH_1_1</ffdc>
+
+ <callout>
+ <procedure>MEMORY_PLUGGING_ERROR</procedure>
+@@ -514,10 +458,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- <priority>HIGH</priority>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -540,10 +480,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- <priority>HIGH</priority>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -566,10 +502,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- <priority>HIGH</priority>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -591,10 +523,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- <priority>HIGH</priority>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -616,10 +544,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- <priority>HIGH</priority>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -641,10 +565,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- <priority>HIGH</priority>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -666,10 +586,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- <priority>HIGH</priority>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -691,10 +607,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- <priority>HIGH</priority>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -716,10 +628,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- <priority>HIGH</priority>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -741,10 +649,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- <priority>HIGH</priority>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -766,10 +670,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- <priority>HIGH</priority>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -791,10 +691,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- <priority>HIGH</priority>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -816,10 +712,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- <priority>HIGH</priority>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -841,10 +733,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- <priority>HIGH</priority>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -866,10 +754,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- <priority>HIGH</priority>
+- </gard>
+ </hwpError>
+
+
+diff --git a/src/usr/hwpf/hwp/mc_config/mss_eff_config/memory_mss_eff_config_termination.xml b/src/usr/hwpf/hwp/mc_config/mss_eff_config/memory_mss_eff_config_termination.xml
+index 9f3c89c..f04b0a6 100644
+--- a/src/usr/hwpf/hwp/mc_config/mss_eff_config/memory_mss_eff_config_termination.xml
++++ b/src/usr/hwpf/hwp/mc_config/mss_eff_config/memory_mss_eff_config_termination.xml
+@@ -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. -->
+@@ -20,7 +22,7 @@
+ <!-- permissions and limitations under the License. -->
+ <!-- -->
+ <!-- IBM_PROLOG_END_TAG -->
+-<!-- $Id: memory_mss_eff_config_termination.xml,v 1.2 2014/04/07 23:02:10 lapietra Exp $ -->
++<!-- $Id: memory_mss_eff_config_termination.xml,v 1.3 2015-05-27 20:02:29 asaetow Exp $ -->
+ <!-- For file ../../ipl/fapi/mss_eff_config_termination.C -->
+ <!-- // *! OWNER NAME : Dave Cadigan Email: dcadiga@us.ibm.com -->
+ <!-- // *! BACKUP NAME : Anuwat Saetow Email: asaetow@us.ibm.com -->
+@@ -195,9 +197,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -220,9 +219,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- </gard>
+ </hwpError>
+ <!-- *********************************************************************** -->
+ <hwpError>
+@@ -245,9 +241,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -271,9 +264,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -297,9 +287,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -323,9 +310,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -349,9 +333,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -374,9 +355,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -400,9 +378,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -425,9 +400,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -450,9 +422,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -476,9 +445,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -497,9 +463,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -523,9 +486,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- </gard>
+ </hwpError>
+ <!-- *********************************************************************** -->
+ <hwpError>
+@@ -650,9 +610,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -675,9 +632,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -699,9 +653,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- </gard>
+ </hwpError>
+
+
+@@ -724,9 +675,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -750,9 +698,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -820,9 +765,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- </gard>
+ </hwpError>
+
+ <!-- *********************************************************************** -->
+@@ -845,9 +787,6 @@
+ <target>TARGET_MBA</target>
+ </deconfigure>
+
+- <gard>
+- <target>TARGET_MBA</target>
+- </gard>
+ </hwpError>
+
+ </hwpErrors>
+--
+2.3.0
+
diff --git a/openpower/package/hostboot/hostboot-0010-add-support-backplane-vpd.patch b/openpower/package/hostboot/hostboot-0010-add-support-backplane-vpd.patch
new file mode 100644
index 0000000..e51afbf
--- /dev/null
+++ b/openpower/package/hostboot/hostboot-0010-add-support-backplane-vpd.patch
@@ -0,0 +1,2271 @@
+From 9597cf58b44fd0c16da9d3592e8fd586a4dbf04d Mon Sep 17 00:00:00 2001
+From: Bill Schwartz <whs@us.ibm.com>
+Date: Fri, 27 Feb 2015 15:41:10 -0600
+Subject: [PATCH] Add support for backplane VPD
+
+Replace the temporary use of mem buf to access planar vpd with new
+planar vpd interfaces.
+
+Change-Id: I24cda4d713806330a9f61d588006d63966f92550
+RTC: 118373
+Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/16326
+Tested-by: Jenkins Server
+Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
+---
+ src/include/usr/devicefw/userif.H | 23 +
+ src/include/usr/vpd/cvpdenums.H | 1 -
+ src/include/usr/vpd/pvpdenums.H | 96 ++++
+ src/include/usr/vpd/vpd_if.H | 8 +
+ src/include/usr/vpd/vpdreasoncodes.H | 4 +
+ src/usr/devtree/bld_devtree.C | 85 ++--
+ src/usr/hwas/hwasPlat.C | 6 +-
+ src/usr/hwas/hwasPlatCallout.C | 6 +-
+ src/usr/i2c/eepromdd.C | 5 +
+ src/usr/ipmi/ipmifruinv.C | 502 +++++++++++++--------
+ src/usr/ipmi/ipmifruinvprvt.H | 112 ++++-
+ src/usr/targeting/common/xmltohb/target_types.xml | 2 +
+ .../targeting/common/xmltohb/target_types_hb.xml | 5 +
+ src/usr/vpd/HBconfig | 27 ++
+ src/usr/vpd/cvpd.C | 36 +-
+ src/usr/vpd/cvpd.H | 22 +-
+ src/usr/vpd/ipvpd.C | 50 +-
+ src/usr/vpd/ipvpd.H | 22 +-
+ src/usr/vpd/pvpd.C | 369 +++++++++++++++
+ src/usr/vpd/pvpd.H | 149 ++++++
+ src/usr/vpd/vpd.C | 17 +-
+ src/usr/vpd/vpd.H | 1 +
+ src/usr/vpd/vpd.mk | 5 +-
+ 23 files changed, 1307 insertions(+), 246 deletions(-)
+ create mode 100644 src/include/usr/vpd/pvpdenums.H
+ create mode 100644 src/usr/vpd/pvpd.C
+ create mode 100644 src/usr/vpd/pvpd.H
+
+diff --git a/src/include/usr/devicefw/userif.H b/src/include/usr/devicefw/userif.H
+index 6d041f2..eac5366 100644
+--- a/src/include/usr/devicefw/userif.H
++++ b/src/include/usr/devicefw/userif.H
+@@ -61,6 +61,7 @@ namespace DeviceFW
+ GPIO,
+ LPC,
+ IPMIBT, // As opposed to other phy's
++ PVPD,
+
+ LAST_ACCESS_TYPE,
+ };
+@@ -166,6 +167,28 @@ namespace DeviceFW
+ static_cast<uint64_t>(( i_location ))
+
+ /**
++ * Construct the device addressing parameters for the PVPD device ops.
++ * @param[in] i_record - The enumeration of the PVPD record to access.
++ * @param[in] i_keyword - The enumeration of the PVPD keyword, located
++ * within the i_record Record to access.
++ */
++ #define DEVICE_PVPD_ADDRESS( i_record, i_keyword )\
++ DEVICE_PVPD_FORCE_ADDRESS( i_record, i_keyword, VPD::AUTOSELECT )
++
++ /**
++ * Construct the device addressing parameters for the PVPD device ops.
++ * @param[in] i_record - The enumeration of the PVPD record to access.
++ * @param[in] i_keyword - The enumeration of the PVPD keyword, located
++ * within the i_record Record to access.
++ * @param[in] i_location - The location of the data (PNOR/SEEPROM)
++ see vpd_if.H
++ */
++ #define DEVICE_PVPD_FORCE_ADDRESS( i_record, i_keyword, i_location )\
++ DeviceFW::PVPD, static_cast<uint64_t>(( i_record )),\
++ static_cast<uint64_t>(( i_keyword )),\
++ static_cast<uint64_t>(( i_location ))
++
++ /**
+ * Construct the device addressing parameters for the SCAN device ops.
+ * @param[in] i_ring - The ring address to scan
+ * @param[in] i_ringlen - The length of the ring to scan in bits
+diff --git a/src/include/usr/vpd/cvpdenums.H b/src/include/usr/vpd/cvpdenums.H
+index 4b5adb2..79b8109 100644
+--- a/src/include/usr/vpd/cvpdenums.H
++++ b/src/include/usr/vpd/cvpdenums.H
+@@ -45,7 +45,6 @@ namespace CVPD
+ OPFR = 0x05,
+ VNDR = 0x06,
+ SPDX = 0x07,
+- OSYS = 0x08,
+ // Last Record
+ CVPD_LAST_RECORD,
+ CVPD_TEST_RECORD, // Test purposes ONLY!
+diff --git a/src/include/usr/vpd/pvpdenums.H b/src/include/usr/vpd/pvpdenums.H
+new file mode 100644
+index 0000000..acf3bbd
+--- /dev/null
++++ b/src/include/usr/vpd/pvpdenums.H
+@@ -0,0 +1,96 @@
++/* IBM_PROLOG_BEGIN_TAG */
++/* This is an automatically generated prolog. */
++/* */
++/* $Source: src/include/usr/vpd/pvpdenums.H $ */
++/* */
++/* OpenPOWER HostBoot Project */
++/* */
++/* 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. */
++/* 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 __PVPDENUMS_H
++#define __PVPDENUMS_H
++
++#include <vpd/ipvpdenums.H>
++
++namespace PVPD
++{
++
++ /**
++ * @brief Enumeration for the PVPD Records that contain
++ * the keyword enumerations below.
++ *
++ */
++ enum pvpdRecord
++ {
++ PVPD_FIRST_RECORD = 0x00,
++ VINI = PVPD_FIRST_RECORD,
++ OSYS = 0x01,
++ OPFR = 0x02,
++ VNDR = 0x03,
++ // Last Record
++ PVPD_LAST_RECORD,
++ PVPD_TEST_RECORD, // Test purposes ONLY!
++
++ //Start common IPVPD enums
++ PVPD_INVALID_RECORD = IPVPD::INVALID_RECORD,
++ };
++
++ /**
++ * @brief Enumerations for PVPD keywords that can be
++ * accessed in the PVPD.
++ */
++ enum pvpdKeyword
++ {
++ PVPD_FIRST_KEYWORD = 0x00,
++ pdI = PVPD_FIRST_KEYWORD,
++ B3 = 0x01,
++ B4 = 0x02,
++ B7 = 0x03,
++ CC = 0x04,
++ CE = 0x05,
++ CT = 0x06,
++ DR = 0x07,
++ ET = 0x08,
++ FN = 0x09,
++ HE = 0x0a,
++ HW = 0x0b,
++ IN = 0x0c,
++ MM = 0x0d,
++ PF = 0x0e,
++ PN = 0x0f,
++ RT = 0x10,
++ SN = 0x11,
++ SS = 0x12,
++ VD = 0x13,
++ VN = 0x14,
++ VP = 0x15,
++ VS = 0x16,
++ VZ = 0x17,
++
++ // Last Keyword
++ PVPD_LAST_KEYWORD,
++ PVPD_TEST_KEYWORD, // Test purposes ONLY!
++
++ //Start common IPVPD enums
++ FULL_RECORD = IPVPD::FULL_RECORD,
++ PVPD_INVALID_KEYWORD = IPVPD::INVALID_KEYWORD,
++ };
++
++}; // end PVPD
++
++#endif
+diff --git a/src/include/usr/vpd/vpd_if.H b/src/include/usr/vpd/vpd_if.H
+index 0b3298a..d3915ee 100644
+--- a/src/include/usr/vpd/vpd_if.H
++++ b/src/include/usr/vpd/vpd_if.H
+@@ -71,6 +71,14 @@ namespace VPD
+ bool cvpdPresent ( TARGETING::Target * i_target );
+
+ /**
++ * @brief This function checks to see if the given pvpd target
++ * is present
++ * @param[in] i_target - Target device to search for pvpd
++ * @return bool - true if pvpd is present, false if it is not.
++ */
++ bool pvpdPresent ( TARGETING::Target * i_target );
++
++ /**
+ * @brief This function checks if the PNOR cache for this target is in
+ * sync with the SEEPROM, if not it loads the PNOR cache from SEEPROM.
+ * @param[in] i_target - Target device
+diff --git a/src/include/usr/vpd/vpdreasoncodes.H b/src/include/usr/vpd/vpdreasoncodes.H
+index 88668b7..2cfe8a6 100644
+--- a/src/include/usr/vpd/vpdreasoncodes.H
++++ b/src/include/usr/vpd/vpdreasoncodes.H
+@@ -61,6 +61,9 @@ enum vpdModuleId
+ VPD_IPVPD_LOAD_PNOR = 0x33,
+ VPD_IPVPD_GET_RECORD_LIST_SEEPROM = 0x34,
+
++ // PVPD
++ VPD_PVPD_PRESENCEDETECT = 0x50,
++
+ // DIMM SPD
+ VPD_SPD_GET_KEYWORD_VALUE = 0x61,
+ VPD_SPD_GET_VALUE = 0x62,
+@@ -131,6 +134,7 @@ enum vpdReasonCode
+ VPD_UNEXPECTED_TARGET_TYPE = VPD_COMP_ID | 0x33,
+ VPD_WRITE_DEST_UNRESOLVED = VPD_COMP_ID | 0x34,
+ VPD_CACHE_SIZE_EXCEEDED = VPD_COMP_ID | 0x35,
++ VPD_INVALID_LENGTH = VPD_COMP_ID | 0x36,
+ };
+
+
+diff --git a/src/usr/devtree/bld_devtree.C b/src/usr/devtree/bld_devtree.C
+index a8ece97..a311efe 100644
+--- a/src/usr/devtree/bld_devtree.C
++++ b/src/usr/devtree/bld_devtree.C
+@@ -45,7 +45,7 @@
+ #include <fsi/fsiif.H>
+ #include <config.h>
+ #include <devicefw/userif.H>
+-#include <vpd/cvpdenums.H>
++#include <vpd/pvpdenums.H>
+ #include <i2c/i2cif.H>
+ #include <i2c/eepromif.H>
+ #include <ipmi/ipmisensor.H>
+@@ -351,12 +351,9 @@ void add_i2c_info( const TARGETING::Target* i_targ,
+ }
+ else if( l_type == TARGETING::TYPE_MEMBUF )
+ {
+- //@fixme-RTC:118373-Remove Hab/Palm workaround
+- // once node vpd is supported
+- sprintf( l_label, "system-vpd" );
+- /*sprintf( l_label, "memb-vpd-%d",
++ sprintf( l_label, "memb-vpd-%d",
+ eep2->assocTarg
+- ->getAttr<TARGETING::ATTR_POSITION>() );*/
++ ->getAttr<TARGETING::ATTR_POSITION>() );
+ }
+ else if( l_type == TARGETING::TYPE_DIMM )
+ {
+@@ -1054,39 +1051,46 @@ errlHndl_t bld_fdt_system(devTree * i_dt, bool i_smallTree)
+ 3) Default to 'unknown'
+ */
+ bool foundvpd = false;
+- // TODO RTC 118373 -- update to account for firestone/memory riser
+- TARGETING::TargetHandleList l_membTargetList;
+- getAllChips(l_membTargetList, TYPE_MEMBUF);
+-
+- //if can't find a centaur for the CVPD, default to unknown
+- if (l_membTargetList.size())
++ TARGETING::TargetHandleList l_nodeTargetList;
++ PredicateCTM predNode(CLASS_ENC, TYPE_NODE);
++ PredicateHwas predFunctional;
++ predFunctional.functional(true);
++ PredicatePostfixExpr nodeCheckExpr;
++ nodeCheckExpr.push(&predNode).push(&predFunctional).And();
++
++ targetService().getAssociated(l_nodeTargetList, sys,
++ TargetService::CHILD, TargetService::IMMEDIATE,
++ &nodeCheckExpr);
++
++ //if can't find a node for the PVPD, default to unknown
++ if (l_nodeTargetList.size())
+ {
+- TARGETING::Target * l_pMem = l_membTargetList[0];
++ TARGETING::Target * l_pNode = l_nodeTargetList[0];
+ size_t vpdSize = 0x0;
+
+ // Note: First read with NULL for o_buffer sets vpdSize to the
+ // correct length
+- errhdl = deviceRead( l_pMem,
++ errhdl = deviceRead( l_pNode,
+ NULL,
+ vpdSize,
+- DEVICE_CVPD_ADDRESS( CVPD::OSYS,
+- CVPD::MM ));
++ DEVICE_PVPD_ADDRESS( PVPD::OSYS,
++ PVPD::MM ));
+
+ if(errhdl)
+ {
+ TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't get OSYS:MM size for HUID=0x%.8X",
+- TARGETING::get_huid(l_pMem));
++ TARGETING::get_huid(l_pNode));
+
+ // Try the OPFR record
+- errlHndl_t opfr_errhdl = deviceRead( l_pMem,
++ errlHndl_t opfr_errhdl = deviceRead( l_pNode,
+ NULL,
+ vpdSize,
+- DEVICE_CVPD_ADDRESS( CVPD::OPFR,
+- CVPD::DR ));
++ DEVICE_PVPD_ADDRESS( PVPD::OPFR,
++ PVPD::DR ));
+ if(opfr_errhdl)
+ {
+ TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't get OPFR:DR size for HUID=0x%.8X",
+- TARGETING::get_huid(l_pMem));
++ TARGETING::get_huid(l_pNode));
+ delete opfr_errhdl; //delete OPFR log, VPD is just bad
+ }
+ else
+@@ -1095,16 +1099,16 @@ errlHndl_t bld_fdt_system(devTree * i_dt, bool i_smallTree)
+ errhdl = NULL;
+ char drBuf[vpdSize+1];
+ memset(&drBuf, 0x0, (vpdSize+1)); //null terminated str
+- errhdl = deviceRead( l_pMem,
++ errhdl = deviceRead( l_pNode,
+ reinterpret_cast<void*>( &drBuf ),
+ vpdSize,
+- DEVICE_CVPD_ADDRESS( CVPD::OPFR,
+- CVPD::DR ));
++ DEVICE_PVPD_ADDRESS( PVPD::OPFR,
++ PVPD::DR ));
+
+ if(errhdl)
+ {
+ TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't read OPFR:DR for HUID=0x%.8X",
+- TARGETING::get_huid(l_pMem));
++ TARGETING::get_huid(l_pNode));
+ }
+ else
+ {
+@@ -1117,16 +1121,16 @@ errlHndl_t bld_fdt_system(devTree * i_dt, bool i_smallTree)
+ {
+ char mmBuf[vpdSize+1];
+ memset(&mmBuf, 0x0, (vpdSize+1)); //ensure null terminated str
+- errhdl = deviceRead( l_pMem,
++ errhdl = deviceRead( l_pNode,
+ reinterpret_cast<void*>( &mmBuf ),
+ vpdSize,
+- DEVICE_CVPD_ADDRESS( CVPD::OSYS,
+- CVPD::MM ));
++ DEVICE_PVPD_ADDRESS( PVPD::OSYS,
++ PVPD::MM ));
+
+ if(errhdl)
+ {
+ TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't read OSYS:MM for HUID=0x%.8X",
+- TARGETING::get_huid(l_pMem));
++ TARGETING::get_huid(l_pNode));
+ }
+ else
+ {
+@@ -1153,42 +1157,40 @@ errlHndl_t bld_fdt_system(devTree * i_dt, bool i_smallTree)
+ 1) OSYS:SS
+ 2) Default to 'unavailable'
+ */
+- // TODO RTC 118373 -- update to account for firestone/memory riser
+ foundvpd = false;
+- if( l_membTargetList.size() )
++ if( l_nodeTargetList.size() )
+ {
+- // TODO RTC 118373 - Should be able to read from attribute
+- TARGETING::Target * l_pMem = l_membTargetList[0];
++ TARGETING::Target * l_pNode = l_nodeTargetList[0];
+ size_t vpdSize = 0x0;
+
+ // Note: First read with NULL for o_buffer sets vpdSize to the
+ // correct length
+- errhdl = deviceRead( l_pMem,
++ errhdl = deviceRead( l_pNode,
+ NULL,
+ vpdSize,
+- DEVICE_CVPD_ADDRESS( CVPD::OSYS,
+- CVPD::SS ));
++ DEVICE_PVPD_ADDRESS( PVPD::OSYS,
++ PVPD::SS ));
+
+ if(errhdl)
+ {
+ TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't get OSYS:SS size for HUID=0x%.8X",
+- TARGETING::get_huid(l_pMem));
++ TARGETING::get_huid(l_pNode));
+ // Note - not supporting old vpd versions without OSYS here
+ }
+ else
+ {
+ char ssBuf[vpdSize+1];
+ memset(&ssBuf, 0x0, (vpdSize+1)); //ensure null terminated str
+- errhdl = deviceRead( l_pMem,
++ errhdl = deviceRead( l_pNode,
+ reinterpret_cast<void*>( &ssBuf ),
+ vpdSize,
+- DEVICE_CVPD_ADDRESS( CVPD::OSYS,
+- CVPD::SS ));
++ DEVICE_PVPD_ADDRESS( PVPD::OSYS,
++ PVPD::SS ));
+
+ if(errhdl)
+ {
+ TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't read OSYS:SS for HUID=0x%.8X",
+- TARGETING::get_huid(l_pMem));
++ TARGETING::get_huid(l_pNode));
+ }
+ else
+ {
+@@ -1205,7 +1207,6 @@ errlHndl_t bld_fdt_system(devTree * i_dt, bool i_smallTree)
+ delete errhdl;
+ errhdl = NULL;
+ }
+-
+ if( !foundvpd ) //serial number not found, default to unavailable
+ {
+ i_dt->addPropertyString(rootNode, "system-id", "unavailable");
+diff --git a/src/usr/hwas/hwasPlat.C b/src/usr/hwas/hwasPlat.C
+index 80c36f9..ef631b5 100644
+--- a/src/usr/hwas/hwasPlat.C
++++ b/src/usr/hwas/hwasPlat.C
+@@ -421,9 +421,13 @@ errlHndl_t platPresenceDetect(TargetHandleList &io_targets)
+ HWAS_DBG("pTarget %.8X - detected present",
+ pTarget->getAttr<ATTR_HUID>());
+
+- // on to the next target
++ // If there is planar VPD, then don't skip the presence detect.
++ // The presence detect will log any problems and load pnor.
++#if !defined(CONFIG_HAVE_PVPD)
++ // on to the next target if there is no Planar VPD
+ pTarget_it++;
+ continue;
++#endif
+ }
+
+ // call deviceRead() to see if they are present
+diff --git a/src/usr/hwas/hwasPlatCallout.C b/src/usr/hwas/hwasPlatCallout.C
+index 0f15082..03756a8 100644
+--- a/src/usr/hwas/hwasPlatCallout.C
++++ b/src/usr/hwas/hwasPlatCallout.C
+@@ -122,10 +122,12 @@ errlHndl_t platHandleHWCallout(
+ } // switch i_deconfigState
+
+ // check to see if this target is the master processor
+- // and if it's been deconfigured.
++ // and if it's being deconfigured.
++ // NOTE: will be non-functional early in IPL before discovery complete.
+ TARGETING::Target *l_masterProc;
+ TARGETING::targetService().masterProcChipTargetHandle(l_masterProc);
+- if (i_pTarget == l_masterProc)
++ if ( (i_pTarget == l_masterProc) &&
++ (NO_DECONFIG != i_deconfigState) )
+ {
+ const TARGETING::HwasState hwasState =
+ l_masterProc->getAttr<TARGETING::ATTR_HWAS_STATE>();
+diff --git a/src/usr/i2c/eepromdd.C b/src/usr/i2c/eepromdd.C
+index 372fcc7..b2e1c90 100755
+--- a/src/usr/i2c/eepromdd.C
++++ b/src/usr/i2c/eepromdd.C
+@@ -97,6 +97,11 @@ DEVICE_REGISTER_ROUTE( DeviceFW::WILDCARD,
+ TARGETING::TYPE_MEMBUF,
+ eepromPerformOp );
+
++// Register the perform Op with the routing code for Nodes.
++DEVICE_REGISTER_ROUTE( DeviceFW::WILDCARD,
++ DeviceFW::EEPROM,
++ TARGETING::TYPE_NODE,
++ eepromPerformOp );
+
+ // ------------------------------------------------------------------
+ // eepromPerformOp
+diff --git a/src/usr/ipmi/ipmifruinv.C b/src/usr/ipmi/ipmifruinv.C
+index cc2f06a..49c5e7e 100644
+--- a/src/usr/ipmi/ipmifruinv.C
++++ b/src/usr/ipmi/ipmifruinv.C
+@@ -29,6 +29,7 @@
+ #include <devicefw/userif.H>
+ #include <vpd/spdenums.H>
+ #include <vpd/cvpdenums.H>
++#include <vpd/pvpdenums.H>
+ #include <targeting/common/commontargeting.H>
+ #include <targeting/common/utilFilter.H>
+ #include <errl/errlmanager.H>
+@@ -51,7 +52,17 @@ inline static bool comparePairs(
+ const std::pair<TARGETING::TargetHandle_t, uint8_t>& i_lhs,
+ const std::pair<TARGETING::TargetHandle_t, uint8_t>& i_rhs)
+ {
+- return (i_lhs.second < i_rhs.second);
++ bool l_compare = i_lhs.second < i_rhs.second;
++
++ // in case of a tie, if the left is a Node, sort it first.
++ if (i_lhs.second == i_rhs.second)
++ {
++ if (TARGETING::TYPE_NODE==i_lhs.first->getAttr<TARGETING::ATTR_TYPE>())
++ {
++ l_compare = true;
++ }
++ }
++ return l_compare;
+ }
+
+ IpmiFruInv::IpmiFruInv(TARGETING::TargetHandle_t i_target)
+@@ -82,7 +93,14 @@ IpmiFruInv *IpmiFruInv::Factory(TARGETING::TargetHandleList i_targets,
+ l_fru = new procIpmiFruInv(l_target, i_updateData);
+ break;
+ case TARGETING::TYPE_MEMBUF:
+- // @todo-RTC:117702
++ // A memory riser card will have a mem buff with a distinct FRU ID
++ l_fru = new membufIpmiFruInv(l_target, i_targets, i_updateData);
++ break;
++ case TARGETING::TYPE_NODE:
++ // When the planar eeprom is shared for planar vpd and memory vpd,
++ // the node and membufs will have the same FRU ID. The node has
++ // been sorted ahead of the membufs. The membufs are extra targets
++ // for their ECIDs.
+ l_fru = new backplaneIpmiFruInv(l_target, i_targets, i_updateData);
+ break;
+ case TARGETING::TYPE_SYS:
+@@ -425,11 +443,11 @@ errlHndl_t isdimmIpmiFruInv::buildProductInfoArea(std::vector<uint8_t> &io_data)
+ io_data.push_back(uint8_t(0)); // Empty FRU File ID bytes
+ io_data.push_back(IPMIFRUINV::END_OF_CUSTOM_FIELDS);
+
+- //Finalize section formatting
+- postFormatProcessing(io_data);
+-
+ } while (0);
+
++ //Finalize section formatting
++ postFormatProcessing(io_data);
++
+ if (l_errl)
+ {
+ TRACFCOMP(g_trac_ipmi,"isdimIpmiFruInv::buildProductInfoArea - Errors "
+@@ -580,11 +598,11 @@ errlHndl_t procIpmiFruInv::buildBoardInfoArea(std::vector<uint8_t> &io_data)
+ //Indicate end of custom fields
+ io_data.push_back(IPMIFRUINV::END_OF_CUSTOM_FIELDS);
+
+- //Complete formatting for this data record
+- postFormatProcessing(io_data);
+-
+ } while (0);
+
++ //Complete formatting for this data record
++ postFormatProcessing(io_data);
++
+ if (l_errl)
+ {
+ TRACFCOMP(g_trac_ipmi,"buildBoardInfoArea - Errors Collecting ISDimm "
+@@ -610,64 +628,18 @@ errlHndl_t procIpmiFruInv::buildMultiRecordInfoArea(
+ errlHndl_t procIpmiFruInv::addVpdData(std::vector<uint8_t> &io_data,
+ uint8_t i_record,
+ uint8_t i_keyword,
+- bool i_ascii)
++ bool i_ascii,
++ bool i_typeLengthByte)
+ {
+- size_t l_vpdSize = 0;
+ errlHndl_t l_errl = NULL;
+
+- do {
+-
+- //First get size of data by passing NULL
+- l_errl = deviceRead(iv_target,
+- NULL,
+- l_vpdSize,
+- DEVICE_MVPD_ADDRESS(i_record, i_keyword));
+-
+- if (l_errl)
+- {
+- TRACFCOMP(g_trac_ipmi,"procIpmiFruInv::addVpdData - Error while "
+- "reading MVPD keyword size");
+- break;
+- }
+-
+- //Assert if vpd field is too large to fit in IPMI fru inventory format
+- assert(l_vpdSize < IPMIFRUINV::TYPELENGTH_BYTE_ASCII);
+-
+- if (l_vpdSize > 0)
+- {
+- //Determine how big data is and expand it to handle the soon to
+- //be read VPD data
+- uint8_t l_offset = io_data.size();
+- io_data.resize(l_offset + 1 + l_vpdSize);
+-
+- //Add on the data to the type/length byte indicating it is ascii
+- // otherwise leave it as binary
+- if (i_ascii)
+- {
+- io_data.at(l_offset) = l_vpdSize
+- + IPMIFRUINV::TYPELENGTH_BYTE_ASCII;
+- }
+- else
+- {
+- io_data.at(l_offset) = l_vpdSize;
+- }
+-
+- //Read the VPD data directly into fru inventory data buffer
+- l_errl = deviceRead(iv_target,&io_data[l_offset+1],l_vpdSize,
+- DEVICE_MVPD_ADDRESS(i_record, i_keyword));
+- }
+- else
+- {
+- TRACFCOMP(g_trac_ipmi,"procIpmiFruInv::addVpdData - "
+- " No size returned for MVPD keyword");
+- }
+- } while(0);
+-
+- if (l_errl)
+- {
+- TRACFCOMP(g_trac_ipmi, "addVpdData - Error acquiring data from Vpd.");
+- }
+-
++ l_errl = addCommonVpdData(iv_target,
++ io_data,
++ DeviceFW::MVPD,
++ i_record,
++ i_keyword,
++ i_ascii,
++ i_typeLengthByte);
+ return l_errl;
+ }
+
+@@ -699,8 +671,7 @@ errlHndl_t backplaneIpmiFruInv::buildChassisInfoArea(
+ preFormatProcessing(io_data, false);
+ //Set Chassis Enclosure Type - Not Ascii
+ // Also, do not include type/length byte
+- //@fixme RTC Story 118373
+- l_errl = addVpdData(io_data, CVPD::OSYS, CVPD::ET, false, false);
++ l_errl = addVpdData(io_data, PVPD::OSYS, PVPD::ET, false, false);
+
+ //Support Legacy VPD without OSYS record
+ if (l_errl)
+@@ -714,12 +685,10 @@ errlHndl_t backplaneIpmiFruInv::buildChassisInfoArea(
+ //Set default chassis type
+ io_data.push_back(IPMIFRUINV::DEFAULT_CHASSIS_TYPE);
+ //Set chassis part number - ascii formatted field
+- //@fixme RTC Story 118373
+- l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::VP, true);
++ l_errl = addVpdData(io_data, PVPD::OPFR, PVPD::VP, true);
+ if (l_errl) { break; }
+ //Set chassis serial number - ascii formatted field
+- //@fixme RTC Story 118373
+- l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::VS, true);
++ l_errl = addVpdData(io_data, PVPD::OPFR, PVPD::VS, true);
+ if (l_errl) { break; }
+ }
+ else
+@@ -728,13 +697,11 @@ errlHndl_t backplaneIpmiFruInv::buildChassisInfoArea(
+ " Using NEW OSYS RECORD FOR Chassis VPD Data");
+
+ //Set chassis part number - ascii formatted field
+- //@fixme RTC Story 118373
+- l_errl = addVpdData(io_data, CVPD::OSYS, CVPD::MM, true);
++ l_errl = addVpdData(io_data, PVPD::OSYS, PVPD::MM, true);
+ if (l_errl) { break; }
+
+ //Set chassis serial number - ascii formatted field
+- //@fixme RTC Story 118373
+- l_errl = addVpdData(io_data, CVPD::OSYS, CVPD::SS, true);
++ l_errl = addVpdData(io_data, PVPD::OSYS, PVPD::SS, true);
+ if (l_errl) { break; }
+
+ }
+@@ -743,10 +710,11 @@ errlHndl_t backplaneIpmiFruInv::buildChassisInfoArea(
+ io_data.push_back(IPMIFRUINV::TYPELENGTH_BYTE_NULL);
+ io_data.push_back(IPMIFRUINV::END_OF_CUSTOM_FIELDS);
+
+- //Complete record data formatting
+- postFormatProcessing(io_data);
+ } while (0);
+
++ //Complete record data formatting
++ postFormatProcessing(io_data);
++
+ if (l_errl)
+ {
+ TRACFCOMP(g_trac_ipmi,"backplaneIpmiFruInv::buildChassisInfoArea - "
+@@ -771,67 +739,39 @@ errlHndl_t backplaneIpmiFruInv::buildBoardInfoArea(
+ io_data.push_back(0);
+
+ //Set Vendor Name - ascii formatted data
+- //@fixme RTC Story 118373
+- l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::VN, true);
++ l_errl = addVpdData(io_data, PVPD::OPFR, PVPD::VN, true);
+ if (l_errl) { break; }
+
+ //Set Product Name - ascii formatted data
+- //@fixme RTC Story 118373
+- l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::DR, true);
++ l_errl = addVpdData(io_data, PVPD::OPFR, PVPD::DR, true);
+ if (l_errl) { break; }
+
+ //Set Product Serial number - ascii formatted data
+- //@fixme RTC Story 118373
+- l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::VS, true);
++ //TODO RTC:117702 use attribute when 122890 is available
++ l_errl = addVpdData(io_data, PVPD::OPFR, PVPD::VS, true);
+ if (l_errl) { break; }
+
+ //Set Product Part number - ascii formatted data
+- //@fixme RTC Story 118373
+- l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::VP, true);
+- if (l_errl) { break; }
++ //TODO RTC:117702 use attribute when 122890 is available
++ l_errl = addVpdData(io_data, PVPD::OPFR, PVPD::VP, true);
+
+ //Push Fru File ID Byte - NULL
+ io_data.push_back(IPMIFRUINV::TYPELENGTH_BYTE_NULL);
+
+- bool l_setCustomData = false;
+- // Check if we should add ECID
+- for (TARGETING::TargetHandleList::const_iterator extraTargets_it =
+- iv_extraTargets.begin();
+- extraTargets_it != iv_extraTargets.end();
+- ++extraTargets_it
+- )
++ //Only set the ECID Data during an update scenario
++ if (iv_isUpdate == true)
+ {
+- TARGETING::TargetHandle_t l_extraTarget = *extraTargets_it;
+-
+- //Only set the ECID Data during an update scenario
+- if (iv_isUpdate == true &&
+- (l_extraTarget->getAttr<TARGETING::ATTR_TYPE>() ==
+- TARGETING::TYPE_MEMBUF))
+- {
+- TARGETING::ATTR_ECID_type ecidInfo;
+- bool getEcid =
+- l_extraTarget->tryGetAttr<TARGETING::ATTR_ECID>(ecidInfo);
+- if (getEcid)
+- {
+- l_setCustomData = true;
+- addEcidData(l_extraTarget, ecidInfo, io_data);
+- }
+- }
++ customEcidData (iv_extraTargets, io_data);
+ }
+
+- //If no Custom data was sent, an Empty Byte is needed
+- if (!l_setCustomData)
+- {
+- io_data.push_back(IPMIFRUINV::TYPELENGTH_BYTE_NULL);
+- }
+ //Indicate End of Custom Fields
+ io_data.push_back(IPMIFRUINV::END_OF_CUSTOM_FIELDS);
+
+- //Complete record data formatting
+- postFormatProcessing(io_data);
+-
+ } while (0);
+
++ //Complete record data formatting
++ postFormatProcessing(io_data);
++
+ if (l_errl)
+ {
+ TRACFCOMP(g_trac_ipmi,"backplaneIpmiFruInv::buildBoardInfoArea - "
+@@ -860,74 +800,17 @@ errlHndl_t backplaneIpmiFruInv::addVpdData(std::vector<uint8_t> &io_data,
+ uint8_t i_keyword,
+ bool i_ascii,
+ bool i_typeLengthByte)
++
+ {
+- size_t l_vpdSize = 0;
+ errlHndl_t l_errl = NULL;
+
+- do {
+- //First get size of data with NULL parameter
+- l_errl = deviceRead(iv_target,
+- NULL,
+- l_vpdSize,
+- //@fixme RTC Story 118373
+- DEVICE_CVPD_ADDRESS(i_record, i_keyword));
+-
+- if (l_errl)
+- {
+- TRACFCOMP(g_trac_ipmi,"backplaneIpmiFruInv::addVpdData - Error "
+- "while reading CVPD keyword size");
+- break;
+- }
+-
+- //Assert if vpd field is too large to fit in IPMI fru inventory format
+- assert(l_vpdSize < IPMIFRUINV::TYPELENGTH_BYTE_ASCII);
+-
+- if (l_vpdSize > 0)
+- {
+- uint8_t l_offset = 0;
+- //Add on the typelength byte if requested
+- if (i_typeLengthByte)
+- {
+- //Determine how big data is and expand it to handle the soon to
+- //be read VPD data
+- l_offset = io_data.size();
+- io_data.resize(l_offset + 1 + l_vpdSize);
+- //Add on the data to the type/length byte indicating it is ascii
+- // otherwise leave it as binary
+- if (i_ascii)
+- {
+- io_data.at(l_offset) = l_vpdSize
+- + IPMIFRUINV::TYPELENGTH_BYTE_ASCII;
+- }
+- else
+- {
+- io_data.at(l_offset) = l_vpdSize;
+- }
+- l_offset += 1;
+- }
+- else
+- {
+- //Determine how big data is and expand it to handle the soon to
+- //be read VPD data
+- l_offset = io_data.size();
+- io_data.resize(l_offset + l_vpdSize);
+- }
+- //Read the VPD data directly into fru inventory data buffer
+- l_errl = deviceRead(iv_target,&io_data[l_offset],l_vpdSize,
+- DEVICE_CVPD_ADDRESS(i_record, i_keyword));
+- }
+- else
+- {
+- TRACFCOMP(g_trac_ipmi,"backplaneIpmiFruInv::addVpdData - "
+- " No size returned for CVPD keyword");
+- }
+- } while(0);
+-
+- if (l_errl)
+- {
+- TRACFCOMP(g_trac_ipmi, "backplaneIpmiFruInv::addVpdData - Error "
+- "acquiring data from Vpd.");
+- }
++ l_errl = addCommonVpdData(iv_target,
++ io_data,
++ DeviceFW::PVPD,
++ i_record,
++ i_keyword,
++ i_ascii,
++ i_typeLengthByte);
+
+ return l_errl;
+ }
+@@ -1106,11 +989,11 @@ errlHndl_t systemFwIpmiFruInv::buildProductInfoArea(std::vector<uint8_t>
+
+ io_data.push_back(IPMIFRUINV::END_OF_CUSTOM_FIELDS);
+
+- //Finalize section formatting
+- postFormatProcessing(io_data);
+-
+ } while(0);
+
++ //Finalize section formatting
++ postFormatProcessing(io_data);
++
+ return l_errl;
+ }
+
+@@ -1121,7 +1004,155 @@ errlHndl_t systemFwIpmiFruInv::buildMultiRecordInfoArea(std::vector<uint8_t>
+ return IpmiFruInv::buildEmptyArea(io_data);
+ }
+
++//##############################################################################
++membufIpmiFruInv::membufIpmiFruInv( TARGETING::TargetHandle_t i_target,
++ TARGETING::TargetHandleList i_extraTargets,
++ bool i_isUpdate)
++ :IpmiFruInv(i_target),
++ iv_isUpdate(i_isUpdate),
++ iv_extraTargets(i_extraTargets)
++{
++};
++
++errlHndl_t membufIpmiFruInv::buildInternalUseArea(
++ std::vector<uint8_t> &io_data)
++{
++ //This section not needed for the mem buf type
++ return IpmiFruInv::buildEmptyArea(io_data);
++}
++
++errlHndl_t membufIpmiFruInv::buildChassisInfoArea(
++ std::vector<uint8_t> &io_data)
++{
++ //This section not needed for the mem buf type
++ return IpmiFruInv::buildEmptyArea(io_data);
++}
++
++errlHndl_t membufIpmiFruInv::buildBoardInfoArea(
++ std::vector<uint8_t> &io_data)
++{
++ errlHndl_t l_errl = NULL;
++
++ do {
++ //Set formatting data that goes at the beginning of the record
++ preFormatProcessing(io_data, true);
++
++ //Set MFG Date/Time - Blank
++ io_data.push_back(0);
++ io_data.push_back(0);
++ io_data.push_back(0);
++
++ //Set Vendor Name - ascii formatted data
++ l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::VN, true);
++ if (l_errl) { break; }
++
++ //Set Product Name - ascii formatted data
++ l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::DR, true);
++ if (l_errl) { break; }
++
++ //Set Product Serial number - ascii formatted data
++ //TODO RTC:117702 use attribute when 122890 is available
++ l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::VS, true);
++ if (l_errl) { break; }
++
++ //Set Product Part number - ascii formatted data
++ //TODO RTC:117702 use attribute when 122890 is available
++ l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::VP, true);
++ if (l_errl) { break; }
++
++ //Push Fru File ID Byte - NULL
++ io_data.push_back(IPMIFRUINV::TYPELENGTH_BYTE_NULL);
++
++ //Only set the ECID Data during an update scenario
++ if (iv_isUpdate == true)
++ {
++ customEcidData (iv_extraTargets, io_data);
++ }
++
++ //Indicate End of Custom Fields
++ io_data.push_back(IPMIFRUINV::END_OF_CUSTOM_FIELDS);
++
++ } while (0);
++
++ //Complete record data formatting
++ postFormatProcessing(io_data);
++
++ if (l_errl)
++ {
++ TRACFCOMP(g_trac_ipmi,"membufIpmiFruInv::buildBoardInfoArea - "
++ "Errors collecting board info data");
++ }
++
++ return l_errl;
++}
++
++errlHndl_t membufIpmiFruInv::buildProductInfoArea(
++ std::vector<uint8_t> &io_data)
++{
++ //This section not needed for the mem buf type
++ return IpmiFruInv::buildEmptyArea(io_data);
++}
++
++errlHndl_t membufIpmiFruInv::buildMultiRecordInfoArea(
++ std::vector<uint8_t> &io_data)
++{
++ //This section not needed for the mem buf type
++ return IpmiFruInv::buildEmptyArea(io_data);
++}
++
++errlHndl_t membufIpmiFruInv::addVpdData(std::vector<uint8_t> &io_data,
++ uint8_t i_record,
++ uint8_t i_keyword,
++ bool i_ascii,
++ bool i_typeLengthByte)
++{
++ errlHndl_t l_errl = NULL;
++
++ l_errl = addCommonVpdData(iv_target,
++ io_data,
++ DeviceFW::CVPD,
++ i_record,
++ i_keyword,
++ i_ascii,
++ i_typeLengthByte);
++ return l_errl;
++}
++//##############################################################################
++void IpmiFruInv::customEcidData(TARGETING::TargetHandleList i_extraTargets,
++ std::vector<uint8_t> &io_data)
++{
++
++ bool l_setCustomData = false;
++ // Check if we should add ECID
++ for (TARGETING::TargetHandleList::const_iterator extraTargets_it =
++ i_extraTargets.begin();
++ extraTargets_it != i_extraTargets.end();
++ ++extraTargets_it
++ )
++ {
++ TARGETING::TargetHandle_t l_extraTarget = *extraTargets_it;
++
++ //Only set the ECID Data during an update scenario
++ if ( l_extraTarget->getAttr<TARGETING::ATTR_TYPE>() ==
++ TARGETING::TYPE_MEMBUF)
++ {
++ TARGETING::ATTR_ECID_type ecidInfo;
++ bool getEcid =
++ l_extraTarget->tryGetAttr<TARGETING::ATTR_ECID>(ecidInfo);
++ if (getEcid)
++ {
++ l_setCustomData = true;
++ addEcidData(l_extraTarget, ecidInfo, io_data);
++ }
++ }
++ }
+
++ //If no Custom data was sent, an Empty Byte is needed
++ if (!l_setCustomData)
++ {
++ io_data.push_back(IPMIFRUINV::TYPELENGTH_BYTE_NULL);
++ }
++}
+
+ void IpmiFruInv::addEcidData(const TARGETING::TargetHandle_t& i_target,
+ const TARGETING::ATTR_ECID_type& i_ecidInfo,
+@@ -1149,6 +1180,94 @@ void IpmiFruInv::addEcidData(const TARGETING::TargetHandle_t& i_target,
+ return;
+ }
+
++errlHndl_t IpmiFruInv::addCommonVpdData(
++ const TARGETING::TargetHandle_t& i_target,
++ std::vector<uint8_t> &io_data,
++ DeviceFW::AccessType i_accessType,
++ uint8_t i_record,
++ uint8_t i_keyword,
++ bool i_ascii,
++ bool i_typeLengthByte)
++{
++ size_t l_vpdSize = 0;
++ errlHndl_t l_errl = NULL;
++
++ do {
++ // First get size with NULL call:
++ // Bypass DEVICE_?VPD_ADDRESS inorder to maximize common code
++ l_errl = deviceRead(i_target,
++ NULL,
++ l_vpdSize,
++ i_accessType,
++ i_record,
++ i_keyword,
++ VPD::AUTOSELECT);
++
++ if (l_errl)
++ {
++ TRACFCOMP(g_trac_ipmi,"addCommonVpdData - Error "
++ "while reading keyword size");
++ break;
++ }
++
++ //Assert if vpd field is too large to fit in IPMI fru inventory format
++ assert(l_vpdSize < IPMIFRUINV::TYPELENGTH_BYTE_ASCII);
++
++ if (l_vpdSize > 0)
++ {
++ uint8_t l_offset = 0;
++ //Add on the typelength byte if requested
++ if (i_typeLengthByte)
++ {
++ //Determine how big data is and expand it to handle the soon to
++ //be read VPD data
++ l_offset = io_data.size();
++ io_data.resize(l_offset + 1 + l_vpdSize);
++ //Add on the data to the type/length byte indicating it is ascii
++ // otherwise leave it as binary
++ if (i_ascii)
++ {
++ io_data.at(l_offset) = l_vpdSize
++ + IPMIFRUINV::TYPELENGTH_BYTE_ASCII;
++ }
++ else
++ {
++ io_data.at(l_offset) = l_vpdSize;
++ }
++ l_offset += 1;
++ }
++ else
++ {
++ //Determine how big data is and expand it to handle the soon to
++ //be read VPD data
++ l_offset = io_data.size();
++ io_data.resize(l_offset + l_vpdSize);
++ }
++ //Read the VPD data directly into fru inventory data buffer
++ l_errl = deviceRead(i_target,
++ &io_data[l_offset],
++ l_vpdSize,
++ i_accessType,
++ i_record,
++ i_keyword,
++ VPD::AUTOSELECT);
++ }
++ else
++ {
++ TRACFCOMP(g_trac_ipmi,"addCommonVpdData - "
++ " No size returned for keyword");
++ }
++ } while(0);
++
++ if (l_errl)
++ {
++ TRACFCOMP(g_trac_ipmi, "addCommonVpdData - Error "
++ "acquiring data from Vpd.");
++ }
++
++ return l_errl;
++}
++
+ void IPMIFRUINV::clearData(uint8_t i_fruId)
+ {
+ uint8_t l_clearData[] =
+@@ -1292,10 +1411,12 @@ void IPMIFRUINV::gatherClearData(const TARGETING::Target* i_pSys,
+ std::map<uint8_t,bool>& io_frusToClear)
+ {
+ TARGETING::PredicateCTM predChip(TARGETING::CLASS_CHIP);
++ TARGETING::PredicateCTM predNode(TARGETING::CLASS_ENC,
++ TARGETING::TYPE_NODE);
+ TARGETING::PredicateCTM predDimm(TARGETING::CLASS_LOGICAL_CARD,
+ TARGETING::TYPE_DIMM);
+ TARGETING::PredicatePostfixExpr checkAllExpr;
+- checkAllExpr.push(&predChip).push(&predDimm).Or();
++ checkAllExpr.push(&predChip).push(&predNode).Or().push(&predDimm).Or();
+ TARGETING::TargetHandleList l_allPossibleFrus;
+ TARGETING::targetService().getAssociated( l_allPossibleFrus, i_pSys,
+ TARGETING::TargetService::CHILD, TARGETING::TargetService::ALL,
+@@ -1336,14 +1457,19 @@ void IPMIFRUINV::gatherSetData(const TARGETING::Target* i_pSys,
+ // may be needed
+ l_present.present(true);
+
++ checkExpr.push(&predChip);
++ TARGETING::PredicateCTM predNode(TARGETING::CLASS_ENC,
++ TARGETING::TYPE_NODE);
++ checkExpr.push(&predNode).Or();
++
+ //When updating data on a later pass ignore dimms
+ if (i_updateData)
+ {
+- checkExpr.push(&predChip).push(&l_present).And();
++ checkExpr.push(&l_present).And();
+ }
+ else
+ {
+- checkExpr.push(&predChip).push(&predDimm).Or().push(&l_present).And();
++ checkExpr.push(&predDimm).Or().push(&l_present).And();
+ }
+
+ TARGETING::TargetHandleList pCheckPres;
+@@ -1374,6 +1500,10 @@ void IPMIFRUINV::gatherSetData(const TARGETING::Target* i_pSys,
+ }
+
+ //Sort the vector by FRU_ID for later use.
++ //When the planar eeprom is shared for planar and memory buffer vpd, the
++ //node and membuffs will have the same FRU ID. For this case, sort the Node
++ //to be ahead of the mem buffs. The mem buffs will be extra targets for
++ //their ECIDs.
+ std::sort(io_potentialFrus.begin(),
+ io_potentialFrus.end(),
+ comparePairs);
+diff --git a/src/usr/ipmi/ipmifruinvprvt.H b/src/usr/ipmi/ipmifruinvprvt.H
+index 468a47f..57d6e13 100644
+--- a/src/usr/ipmi/ipmifruinvprvt.H
++++ b/src/usr/ipmi/ipmifruinvprvt.H
+@@ -186,6 +186,32 @@ class IpmiFruInv
+ const TARGETING::ATTR_ECID_type& i_ecidInfo,
+ std::vector<uint8_t> &io_data);
+
++ /**
++ * @brief Adds Ecid attribute data from extra targets as custom data
++ * @param[in] TargetHandleList, Handle to list of extra
++ * targets associated with this FRU Record
++ * @param[in/out] data, The container to put ECID attribute data in
++ */
++ void customEcidData(TARGETING::TargetHandleList i_extraTargets,
++ std::vector<uint8_t> &io_data);
++
++ /**
++ * @brief Retrieve vpd record keyword and add to IPMI Fru Inventory record
++ * @param[in/out] data, The container with record data
++ * @param[in] access, Indicates vpd module to access (MVPD,PVPD,CPVD)
++ * @param[in] record, Indicates major offset in the VPD to get more data
++ * @param[in] keyword, Indicates minor offset in the VPD to get more data
++ * @param[in] ascii, Indicates if VPD field is in ascii format or not
++ */
++ errlHndl_t addCommonVpdData(
++ const TARGETING::TargetHandle_t& i_target,
++ std::vector<uint8_t> &io_data,
++ DeviceFW::AccessType i_accessType,
++ uint8_t i_record,
++ uint8_t i_keyword,
++ bool i_ascii,
++ bool i_typeLengthByte);
++
+ private:
+
+ /**
+@@ -376,11 +402,13 @@ class procIpmiFruInv : public IpmiFruInv
+ * @param[in] record, Indicates major offset in the VPD to get more data
+ * @param[in] keyword, Indicates minor offset in the VPD to get more data
+ * @param[in] ascii, Indicates if VPD field is in ascii format or not
++ * @param[in] typeLengthBtye, Indicates whether type length to be added.
+ */
+ errlHndl_t addVpdData(std::vector<uint8_t> &io_data,
+ uint8_t i_record,
+ uint8_t i_keyword,
+- bool i_ascii=false);
++ bool i_ascii=false,
++ bool i_typeLengthByte=true);
+
+ };
+
+@@ -453,13 +481,13 @@ class backplaneIpmiFruInv : public IpmiFruInv
+ * @param[in] record, Indicates major offset in the VPD to get more data
+ * @param[in] keyword, Indicates minor offset in the VPD to get more data
+ * @param[in] ascii, Indicates if VPD field is in ascii format or not
++ * @param[in] typeLengthBtye, Indicates whether type length to be added.
+ */
+ errlHndl_t addVpdData(std::vector<uint8_t> &io_data,
+ uint8_t i_record,
+ uint8_t i_keyword,
+ bool i_ascii=false,
+ bool i_typeLengthByte=true);
+-
+ };
+
+ //Child class for building up System Firwmare Fru Inventory Record Data
+@@ -507,4 +535,84 @@ class systemFwIpmiFruInv : public IpmiFruInv
+
+ };
+
++//Child class for building up membuf Fru Inventory Record Data. For example,
++//for a memory riser card Fru.
++class membufIpmiFruInv : public IpmiFruInv
++{
++
++ public:
++
++ /**
++ * @brief Constructor
++ *
++ * @param[in] TargetHandle_t, Handle to target for which
++ * to get relevant IPMI FRU Data from
++ * @param[in] TargetHandleList, Handle to list of extra
++ * targets associated with this FRU Record
++ * @param[in] isUpdate, Indicator if the code is updating
++ * existing data, or setting base data.
++ */
++ membufIpmiFruInv( TARGETING::TargetHandle_t i_target,
++ TARGETING::TargetHandleList i_extraTargets,
++ bool i_isUpdate );
++
++ /**
++ * @brief Builds the Internal Use Area Data Section
++ * @param[in/out] data, The container to put internal use area data in
++ */
++ errlHndl_t buildInternalUseArea(std::vector<uint8_t> &io_data);
++
++ /**
++ * @brief Builds the Chassis Info Area Data Section
++ * @param[in/out] data, The container to put chassis info area data in
++ */
++ errlHndl_t buildChassisInfoArea(std::vector<uint8_t> &io_data);
++
++ /**
++ * @brief Builds the Board Info Area Data Section
++ * @param[in/out] data, The container to put board info area data in
++ */
++ errlHndl_t buildBoardInfoArea(std::vector<uint8_t> &io_data);
++
++ /**
++ * @brief Builds the Product Info Area Data Section
++ * @param[in/out] data, The container to put product info area data in
++ */
++ errlHndl_t buildProductInfoArea(std::vector<uint8_t>& io_data);
++
++ /**
++ * @brief Builds the MultiRecord Info Area Data Section
++ * @param[in/out] data, The container to put multirecord info area data in
++ */
++ errlHndl_t buildMultiRecordInfoArea(std::vector<uint8_t>& io_data);
++
++ protected:
++ //Indicator if a data update is happening.
++ //True - means we are solely updating certain data
++ //False - means we are doing the initial 'base' data set
++ bool iv_isUpdate;
++
++ //The list of Extra Targets if multiple targets are
++ //associated with one FRU_ID
++ TARGETING::TargetHandleList iv_extraTargets;
++
++ private:
++
++ /**
++ * @brief Adds the specified VPD data to the data to build up a given
++ * IPMI Fru Inventory record
++ * @param[in/out] data, The container with record data
++ * @param[in] record, Indicates major offset in the VPD to get more data
++ * @param[in] keyword, Indicates minor offset in the VPD to get more data
++ * @param[in] ascii, Indicates if VPD field is in ascii format or not
++ * @param[in] typeLengthBtye, Indicates whether type length to be added.
++ */
++ errlHndl_t addVpdData(std::vector<uint8_t> &io_data,
++ uint8_t i_record,
++ uint8_t i_keyword,
++ bool i_ascii=false,
++ bool i_typeLengthByte=true);
++
++};
++
+ #endif
+diff --git a/src/usr/targeting/common/xmltohb/target_types.xml b/src/usr/targeting/common/xmltohb/target_types.xml
+index 82ec014..759b73e 100644
+--- a/src/usr/targeting/common/xmltohb/target_types.xml
++++ b/src/usr/targeting/common/xmltohb/target_types.xml
+@@ -913,6 +913,8 @@
+ <attribute><id>FRU_ID</id></attribute>
+ <attribute><id>TPM_PRIMARY_INFO</id></attribute>
+ <attribute><id>TPM_BACKUP_INFO</id></attribute>
++ <attribute><id>EEPROM_VPD_PRIMARY_INFO</id></attribute>
++ <attribute><id>VPD_REC_NUM</id></attribute>
+ </targetType>
+
+ <targetType>
+diff --git a/src/usr/targeting/common/xmltohb/target_types_hb.xml b/src/usr/targeting/common/xmltohb/target_types_hb.xml
+index b0429da..d023f50 100644
+--- a/src/usr/targeting/common/xmltohb/target_types_hb.xml
++++ b/src/usr/targeting/common/xmltohb/target_types_hb.xml
+@@ -180,6 +180,11 @@
+ </targetTypeExtension>
+
+ <targetTypeExtension>
++ <id>enc-node-power8</id>
++ <attribute><id>VPD_SWITCHES</id></attribute>
++</targetTypeExtension>
++
++<targetTypeExtension>
+ <id>lcard-dimm</id>
+ <attribute><id>VPD_SWITCHES</id></attribute>
+ <attribute><id>IPMI_SENSORS</id></attribute>
+diff --git a/src/usr/vpd/HBconfig b/src/usr/vpd/HBconfig
+index 1361834..1d6e6f1 100644
+--- a/src/usr/vpd/HBconfig
++++ b/src/usr/vpd/HBconfig
+@@ -33,6 +33,28 @@ config CVPD_WRITE
+ help
+ Ensure at least one of the CVPD WRITEs are enabled
+
++config PVPD_READ_FROM_PNOR
++ default n
++ help
++ Read Planar VPD data from PNOR cache
++
++config PVPD_READ_FROM_HW
++ default n
++ help
++ Read Planar VPD data from HW resources
++
++config PVPD_WRITE_TO_PNOR
++ default y if PVPD_READ_FROM_PNOR
++ depends on PVPD_READ_FROM_PNOR
++ help
++ Write Planar VPD data to PNOR cache
++
++config PVPD_WRITE_TO_HW
++ default y if PVPD_READ_FROM_HW
++ depends on PVPD_READ_FROM_HW
++ help
++ Write Planar VPD data to HW resources
++
+ config MVPD_READ_FROM_PNOR
+ default y
+ help
+@@ -105,6 +127,11 @@ config HAVE_MBVPD
+ help
+ Have MemBuff/Centaur VPD, PNOR or HW
+
++config HAVE_PVPD
++ default y if PVPD_READ_FROM_PNOR || PVPD_READ_FROM_HW
++ help
++ Have Planar VPD, PNOR or HW
++
+ config PALMETTO_PASS1
+ default n
+ help
+diff --git a/src/usr/vpd/cvpd.C b/src/usr/vpd/cvpd.C
+index 50815f1..fa37dc9 100644
+--- a/src/usr/vpd/cvpd.C
++++ b/src/usr/vpd/cvpd.C
+@@ -5,7 +5,7 @@
+ /* */
+ /* OpenPOWER HostBoot Project */
+ /* */
+-/* Contributors Listed Below - COPYRIGHT 2013,2014 */
++/* Contributors Listed Below - COPYRIGHT 2013,2015 */
+ /* [+] Google Inc. */
+ /* [+] International Business Machines Corp. */
+ /* */
+@@ -31,7 +31,10 @@
+ #include <trace/interface.H>
+ #include <errl/errlentry.H>
+ #include <errl/errlmanager.H>
++#include <targeting/common/commontargeting.H>
+ #include <targeting/common/targetservice.H>
++#include <targeting/common/util.H>
++#include <targeting/common/utilFilter.H>
+ #include <devicefw/driverif.H>
+ #include <vfs/vfs.H>
+ #include <vpd/vpdreasoncodes.H>
+@@ -40,6 +43,7 @@
+ #include <i2c/eepromif.H>
+ #include <config.h>
+ #include "cvpd.H"
++#include "pvpd.H"
+ #include "vpd.H"
+
+ // ----------------------------------------------
+@@ -233,15 +237,41 @@ IpVpdFacade(CVPD::SECTION_SIZE,
+ iv_configInfo.vpdReadHW = true;
+ #else
+ iv_configInfo.vpdReadHW = false;
+-#endif
++#endif
+ #ifdef CONFIG_CVPD_WRITE_TO_PNOR
+ iv_configInfo.vpdWritePNOR = true;
+ #else
+ iv_configInfo.vpdWritePNOR = false;
+-#endif
++#endif
+ #ifdef CONFIG_CVPD_WRITE_TO_HW
+ iv_configInfo.vpdWriteHW = true;
+ #else
+ iv_configInfo.vpdWriteHW = false;
+ #endif
+ }
++
++// Retrun lists of records that should be copied to pnor.
++void CvpdFacade::getRecordLists(
++ const recordInfo* & o_primaryVpdRecords,
++ uint64_t & o_primaryRecSize,
++ const recordInfo* & o_altVpdRecords,
++ uint64_t & o_altRecSize)
++{
++ // Always return this object's list
++ o_primaryVpdRecords = iv_vpdRecords;
++ o_primaryRecSize = iv_recSize;
++
++ // If the planar errprom being shared with a mem buf,
++ // then return the pvpd list as the alternative record list.
++ // At thip point, if the membufs are be processed, then the node
++ // might not have been discovered yet. If pvpd is being cached, then
++ // include the pvpd list as the altnative.
++#ifdef CONFIG_PVPD_READ_FROM_PNOR
++ o_altVpdRecords = Singleton<PvpdFacade>::instance().iv_vpdRecords;
++ o_altRecSize = Singleton<PvpdFacade>::instance().iv_recSize;
++#else
++ o_altVpdRecords = NULL;
++ o_altRecSize = 0;
++#endif
++}
++
+diff --git a/src/usr/vpd/cvpd.H b/src/usr/vpd/cvpd.H
+index e7a2d9f..9c729c3 100644
+--- a/src/usr/vpd/cvpd.H
++++ b/src/usr/vpd/cvpd.H
+@@ -79,7 +79,6 @@ namespace CVPD
+ { OPFR, "OPFR" },
+ { VNDR, "VNDR" },
+ { SPDX, "SPDX" },
+- { OSYS, "OSYS" },
+ // -------------------------------------------------------------------
+ // DO NOT USE!! This is for test purposes ONLY!
+ { CVPD_TEST_RECORD, "TEST" },
+@@ -182,5 +181,26 @@ class CvpdFacade: public IpVpdFacade
+ */
+ CvpdFacade( );
+
++ private:
++
++ /**
++ * @brief This function returns a primary and an alternate list of records
++ * that should be copied to pnor. The Alternate list is optional.
++ *
++ * @param[out] o_primaryVpdRecords - Pointer to array of VPD Records to use
++ *
++ * @param[out] o_primaryRecSize - Size of o_primaryVpdRecords array
++ *
++ * @param[out] o_altVpdRecords - Pointer to array of VPD Records to use
++ *
++ * @param[out] o_altRecSize - Size of o_altVpdRecords array
++ *
++ */
++ void getRecordLists(
++ const recordInfo* & o_primaryVpdRecords,
++ uint64_t & o_primaryRecSize,
++ const recordInfo* & o_altVpdRecords,
++ uint64_t & o_altRecSize);
++
+ };
+ #endif // __CVPD_H
+diff --git a/src/usr/vpd/ipvpd.C b/src/usr/vpd/ipvpd.C
+index 3da20b2..e148bc9 100644
+--- a/src/usr/vpd/ipvpd.C
++++ b/src/usr/vpd/ipvpd.C
+@@ -43,6 +43,7 @@
+ #include <vpd/ipvpdenums.H>
+
+ #include "vpd.H"
++#include "cvpd.H"
+ #include "ipvpd.H"
+ #include "errlud_vpd.H"
+
+@@ -1336,6 +1337,19 @@ IpVpdFacade::getRecordListSeeprom ( std::list<TocPtRecord> & o_recList,
+ return err;
+ }
+
++ // Get the list of records that should be copied to pnor.
++ // The list of records for this vpd sub class will be the primary list.
++ // If the eeprom is being shared, then their might be an alternate list
++ // to also include.
++ const recordInfo* l_primaryVpdRecords = NULL;
++ uint64_t l_primaryRecSize = 0;
++ const recordInfo* l_altVpdRecords = NULL;
++ uint64_t l_altRecSize = 0;
++ getRecordLists(l_primaryVpdRecords,
++ l_primaryRecSize,
++ l_altVpdRecords,
++ l_altRecSize);
++
+ offset = le16toh( toc_rec->record_offset ) + 1; // skip 'large resource'
+
+ // Read the PT keyword(s) from the VTOC
+@@ -1367,20 +1381,36 @@ IpVpdFacade::getRecordListSeeprom ( std::list<TocPtRecord> & o_recList,
+ vtoc_pt_offset < pt_len;
+ vtoc_pt_offset += sizeof(TocPtRecord) )
+ {
++ bool l_found = false;
+ toc_rec =
+ reinterpret_cast<TocPtRecord*>(l_buffer + vtoc_pt_offset);
+
+ // Save record if on the list for this target
+- for ( uint32_t rec = 0; rec < iv_recSize; rec++ )
++ for ( uint32_t rec = 0; rec < l_primaryRecSize; rec++ )
+ {
+ if ( memcmp( toc_rec->record_name,
+- iv_vpdRecords[rec].recordName,
++ l_primaryVpdRecords[rec].recordName,
+ RECORD_BYTE_SIZE ) == 0 )
+ {
+ o_recList.push_back(*toc_rec);
++ l_found = true;
+ break;
+ }
+ }
++ // if not found, check the alternate list
++ if (!l_found)
++ {
++ for ( uint32_t rec = 0; rec < l_altRecSize; rec++ )
++ {
++ if ( memcmp( toc_rec->record_name,
++ l_altVpdRecords[rec].recordName,
++ RECORD_BYTE_SIZE ) == 0 )
++ {
++ o_recList.push_back(*toc_rec);
++ break;
++ }
++ }
++ }
+ }
+ }
+
+@@ -2182,3 +2212,19 @@ void IpVpdFacade::setConfigFlagsHW ( )
+ iv_configInfo.vpdWriteHW = true;
+ }
+ }
++
++// Return the lists of records that should be copied to pnor.
++// The default lists to use are this object's record list and size.
++// No Alternate.
++void IpVpdFacade::getRecordLists(
++ const recordInfo* & o_primaryVpdRecords,
++ uint64_t & o_primaryRecSize,
++ const recordInfo* & o_altVpdRecords,
++ uint64_t & o_altRecSize)
++{
++ o_primaryVpdRecords = iv_vpdRecords;
++ o_primaryRecSize = iv_recSize;
++ o_altVpdRecords = NULL;
++ o_altRecSize = 0;
++}
++
+diff --git a/src/usr/vpd/ipvpd.H b/src/usr/vpd/ipvpd.H
+index 5cc7bec..e4c4162 100644
+--- a/src/usr/vpd/ipvpd.H
++++ b/src/usr/vpd/ipvpd.H
+@@ -677,7 +677,24 @@ class IpVpdFacade
+ errlHndl_t checkBufferSize( size_t i_bufferSize,
+ size_t i_expectedSize,
+ TARGETING::Target * i_target );
+-
++ /**
++ * @brief This function returns a primary and an alternate list of records
++ * that should be copied to pnor. The Alternate list is optional.
++ *
++ * @param[out] o_primaryVpdRecords - Pointer to array of VPD Records to use
++ *
++ * @param[out] o_primaryRecSize - Size of o_primaryVpdRecords array
++ *
++ * @param[out] o_altVpdRecords - Pointer to array of VPD Records to use
++ *
++ * @param[out] o_altRecSize - Size of o_altVpdRecords array
++ *
++ */
++ virtual void getRecordLists(
++ const recordInfo* & o_primaryVpdRecords,
++ uint64_t & o_primaryRecSize,
++ const recordInfo* & o_altVpdRecords,
++ uint64_t & o_altRecSize);
+
+ protected: // Variables
+
+@@ -693,6 +710,8 @@ class IpVpdFacade
+ */
+ uint64_t iv_vpdMaxSections;
+
++
++ public: // Variables
+ /**
+ * @brief Pointer to array of VPD Record information
+ *
+@@ -705,6 +724,7 @@ class IpVpdFacade
+ */
+ uint64_t iv_recSize;
+
++ protected: // Variables
+ /**
+ * @brief Pointer to array of VPD Keyword information
+ *
+diff --git a/src/usr/vpd/pvpd.C b/src/usr/vpd/pvpd.C
+new file mode 100644
+index 0000000..ec62237
+--- /dev/null
++++ b/src/usr/vpd/pvpd.C
+@@ -0,0 +1,369 @@
++/* IBM_PROLOG_BEGIN_TAG */
++/* This is an automatically generated prolog. */
++/* */
++/* $Source: src/usr/vpd/pvpd.C $ */
++/* */
++/* OpenPOWER HostBoot Project */
++/* */
++/* 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. */
++/* 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 */
++// ----------------------------------------------
++// Includes
++// ----------------------------------------------
++#include <string.h>
++#include <endian.h>
++#include <trace/interface.H>
++#include <errl/errlentry.H>
++#include <errl/errlmanager.H>
++#include <targeting/common/targetservice.H>
++#include <targeting/common/util.H>
++#include <targeting/common/utilFilter.H>
++#include <devicefw/driverif.H>
++#include <vfs/vfs.H>
++#include <vpd/vpdreasoncodes.H>
++#include <vpd/pvpdenums.H>
++#include <vpd/vpd_if.H>
++#include <i2c/eepromif.H>
++#include <config.h>
++#include "pvpd.H"
++#include "cvpd.H"
++#include "vpd.H"
++
++// ----------------------------------------------
++// Trace definitions
++// ----------------------------------------------
++extern trace_desc_t* g_trac_vpd;
++
++
++// ------------------------
++// Macros for unit testing
++//#define TRACUCOMP(args...) TRACFCOMP(args)
++#define TRACUCOMP(args...)
++//#define TRACSSCOMP(args...) TRACFCOMP(args)
++#define TRACSSCOMP(args...)
++
++namespace PVPD
++{
++ // ----------------------------------------------
++ // Globals
++ // ----------------------------------------------
++ mutex_t g_mutex = MUTEX_INITIALIZER;
++
++
++ /**
++ * @brief This function will perform the steps required to do a read from
++ * the Hostboot PVPD data.
++ *
++ * @param[in] i_opType - Operation Type - See DeviceFW::OperationType in
++ * driververif.H
++ *
++ * @param[in] i_target - Processor Target device
++ *
++ * @param [in/out] io_buffer - Pointer to the data that was read from
++ * the target device. This parameter, when set to NULL, will return
++ * the keyword size value in io_buflen.
++ *
++ * @param [in/out] io_buflen - Length of the buffer to be read or written
++ * to/from the target. This value should indicate the size of the
++ * io_buffer parameter that has been allocated. Being returned it
++ * will indicate the number of valid bytes in the buffer being
++ * returned. This parameter will contain the size of a keyword when
++ * the io_buffer parameter is passed in NULL.
++ *
++ * @param [in] i_accessType - Access Type - See DeviceFW::AccessType in
++ * usrif.H
++ *
++ * @param [in] i_args - This is an argument list for the device driver
++ * framework.
++ *
++ * @return errlHndl_t - NULL if successful, otherwise a pointer to the
++ * error log.
++ */
++ errlHndl_t pvpdRead ( DeviceFW::OperationType i_opType,
++ TARGETING::Target * i_target,
++ void * io_buffer,
++ size_t & io_buflen,
++ int64_t i_accessType,
++ va_list i_args )
++ {
++ errlHndl_t err = NULL;
++ IpVpdFacade::input_args_t args;
++ args.record = ((pvpdRecord)va_arg( i_args, uint64_t ));
++ args.keyword = ((pvpdKeyword)va_arg( i_args, uint64_t ));
++ args.location = ((VPD::vpdCmdTarget)va_arg( i_args, uint64_t ));
++
++ TRACSSCOMP( g_trac_vpd,
++ ENTER_MRK"pvpdRead()" );
++
++ err = Singleton<PvpdFacade>::instance().read(i_target,
++ io_buffer,
++ io_buflen,
++ args);
++
++ return err;
++ }
++
++
++ /**
++ * @brief This function will perform the steps required to do a write to
++ * the Hostboot PVPD data.
++ *
++ * @param[in] i_opType - Operation Type - See DeviceFW::OperationType in
++ * driververif.H
++ *
++ * @param[in] i_target - Processor Target device
++ *
++ * @param [in/out] io_buffer - Pointer to the data that was read from
++ * the target device. It will also be used to contain data to
++ * be written to the device.
++ *
++ * @param [in/out] io_buflen - Length of the buffer to be read or written
++ * to/from the target. This value should indicate the size of the
++ * io_buffer parameter that has been allocated. Being returned it
++ * will indicate the number of valid bytes in the buffer being
++ * returned.
++ *
++ * @param [in] i_accessType - Access Type - See DeviceFW::AccessType in
++ * usrif.H
++ *
++ * @param [in] i_args - This is an argument list for the device driver
++ * framework.
++ *
++ * @return errlHndl_t - NULL if successful, otherwise a pointer to the
++ * error log.
++ */
++ errlHndl_t pvpdWrite ( DeviceFW::OperationType i_opType,
++ TARGETING::Target * i_target,
++ void * io_buffer,
++ size_t & io_buflen,
++ int64_t i_accessType,
++ va_list i_args )
++ {
++ errlHndl_t err = NULL;
++ IpVpdFacade::input_args_t args;
++ args.record = ((pvpdRecord)va_arg( i_args, uint64_t ));
++ args.keyword = ((pvpdKeyword)va_arg( i_args, uint64_t ));
++ args.location = ((VPD::vpdCmdTarget)va_arg( i_args, uint64_t ));
++
++ TRACSSCOMP( g_trac_vpd,
++ ENTER_MRK"pvpdWrite()" );
++
++
++ err = Singleton<PvpdFacade>::instance().write(i_target,
++ io_buffer,
++ io_buflen,
++ args);
++
++ return err;
++ }
++
++ // Register with the routing code
++ DEVICE_REGISTER_ROUTE( DeviceFW::READ,
++ DeviceFW::PVPD,
++ TARGETING::TYPE_NODE,
++ pvpdRead );
++ DEVICE_REGISTER_ROUTE( DeviceFW::WRITE,
++ DeviceFW::PVPD,
++ TARGETING::TYPE_NODE,
++ pvpdWrite );
++
++}; // end namespace PVPD
++
++#if !defined(__HOSTBOOT_RUNTIME)
++// --------------------------------------------------------
++// Presence Detection
++//---------------------------------------------------------
++
++/**
++ * @brief Performs a presence detect operation on a Node card.
++ *
++ * There is no FSI presence detection, just Planar vpd detection.
++ * Presence is always returned as Success (unless the unlikely case of too
++ * small of a buffer passed). A problem with planar EEPROM is logged but
++ * not passed up so that the enclosure and everything inside is not
++ * deconfigured.
++ *
++ * @param[in] i_opType Operation type, see DeviceFW::OperationType
++ * in driverif.H
++ * @param[in] i_target Presence detect target
++ * @param[in/out] io_buffer Read: Pointer to output data storage
++ * Write: Pointer to input data storage
++ * @param[in/out] io_buflen Input: size of io_buffer (in bytes, always 1)
++ * Output: Success = 1, Failure = 0
++ * @param[in] i_accessType DeviceFW::AccessType enum (userif.H)
++ * @param[in] i_args This is an argument list for DD framework.
++ * In this function, there are no arguments.
++ * @return errlHndl_t
++ */
++errlHndl_t nodePresenceDetect(DeviceFW::OperationType i_opType,
++ TARGETING::Target* i_target,
++ void* io_buffer,
++ size_t& io_buflen,
++ int64_t i_accessType,
++ va_list i_args)
++{
++ errlHndl_t l_errl = NULL;
++ bool pvpd_present = true;
++
++ if (unlikely(io_buflen < sizeof(bool)))
++ {
++ TRACFCOMP(g_trac_vpd,
++ ERR_MRK "nodePresenceDetect> Invalid data length: %d",
++ io_buflen);
++ /*@
++ * @errortype
++ * @moduleid VPD::VPD_PVPD_PRESENCEDETECT
++ * @reasoncode VPD::VPD_INVALID_LENGTH
++ * @userdata1 Data Length
++ * @devdesc presenceDetect> Invalid data length (!= 1 bytes)
++ */
++ l_errl =
++ new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE,
++ VPD::VPD_PVPD_PRESENCEDETECT,
++ VPD::VPD_INVALID_LENGTH,
++ TO_UINT64(io_buflen),
++ true /*SW error*/);
++ io_buflen = 0;
++ return l_errl;
++ }
++
++#if defined(CONFIG_PVPD_READ_FROM_HW) && defined(CONFIG_PVPD_READ_FROM_PNOR)
++ pvpd_present = VPD::pvpdPresent( i_target );
++ if( pvpd_present )
++ {
++ // Check if the VPD data in the PNOR matches the SEEPROM
++ l_errl = VPD::ensureCacheIsInSync( i_target );
++ if( l_errl )
++ {
++ TRACFCOMP(g_trac_vpd,ERR_MRK "nodePresenceDetect>"
++ " Error during ensureCacheIsInSync (PVPD)" );
++ errlCommit( l_errl, FSI_COMP_ID );
++ }
++ }
++ else
++ {
++ TRACFCOMP(g_trac_vpd,
++ ERR_MRK "nodePresenceDetect> failed presence detect");
++
++ // Invalidate PVPD in the PNOR
++ l_errl = VPD::invalidatePnorCache(i_target);
++ if (l_errl)
++ {
++ TRACFCOMP( g_trac_vpd, "Error invalidating PVPD in PNOR" );
++ errlCommit( l_errl, VPD_COMP_ID );
++ }
++ pvpd_present = true;
++ }
++#endif
++
++ // Always return presence.
++ // A returned error deconfigures the node and stops the IPL.
++ memcpy(io_buffer, &pvpd_present, sizeof(pvpd_present));
++ io_buflen = sizeof(pvpd_present);
++
++ return NULL;
++}
++
++// Register as the presence detect for nodes.
++DEVICE_REGISTER_ROUTE(DeviceFW::READ,
++ DeviceFW::PRESENT,
++ TARGETING::TYPE_NODE,
++ nodePresenceDetect);
++#endif
++
++bool VPD::pvpdPresent( TARGETING::Target * i_target )
++{
++ TRACSSCOMP( g_trac_vpd, ENTER_MRK"pvpdPresent()");
++#if(defined( CONFIG_PVPD_READ_FROM_HW ) && !defined( __HOSTBOOT_RUNTIME) )
++
++ return EEPROM::eepromPresence( i_target );
++
++#else
++ return Singleton<PvpdFacade>::instance().hasVpdPresent( i_target,
++ PVPD::OPFR,
++ PVPD::VP );
++#endif
++}
++
++
++//PVPD Class Functions
++/**
++ * @brief Constructor
++ * Planar VPD is included in the Centaur PNOR section.
++ * Including with Centaur vpd minimizes the number of PNOR sections.
++ */
++PvpdFacade::PvpdFacade() :
++IpVpdFacade(CVPD::SECTION_SIZE, // note use of CVPD
++ CVPD::MAX_SECTIONS, // note use of CVPD
++ PVPD::pvpdRecords,
++ (sizeof(PVPD::pvpdRecords)/sizeof(PVPD::pvpdRecords[0])),
++ PVPD::pvpdKeywords,
++ (sizeof(PVPD::pvpdKeywords)/sizeof(PVPD::pvpdKeywords[0])),
++ PNOR::CENTAUR_VPD, // note use of CVPD
++ PVPD::g_mutex,
++ VPD::VPD_WRITE_PLANAR)
++{
++ TRACUCOMP(g_trac_vpd, "PvpdFacade::PvpdFacade> " );
++
++#ifdef CONFIG_PVPD_READ_FROM_PNOR
++ iv_configInfo.vpdReadPNOR = true;
++#else
++ iv_configInfo.vpdReadPNOR = false;
++#endif
++#ifdef CONFIG_PVPD_READ_FROM_HW
++ iv_configInfo.vpdReadHW = true;
++#else
++ iv_configInfo.vpdReadHW = false;
++#endif
++#ifdef CONFIG_PVPD_WRITE_TO_PNOR
++ iv_configInfo.vpdWritePNOR = true;
++#else
++ iv_configInfo.vpdWritePNOR = false;
++#endif
++#ifdef CONFIG_PVPD_WRITE_TO_HW
++ iv_configInfo.vpdWriteHW = true;
++#else
++ iv_configInfo.vpdWriteHW = false;
++#endif
++}
++
++// Retrun lists of records that should be copied to pnor.
++void PvpdFacade::getRecordLists(
++ const recordInfo* & o_primaryVpdRecords,
++ uint64_t & o_primaryRecSize,
++ const recordInfo* & o_altVpdRecords,
++ uint64_t & o_altRecSize)
++{
++ // Always return this object's list
++ o_primaryVpdRecords = iv_vpdRecords;
++ o_primaryRecSize = iv_recSize;
++
++ // If the planar eeprom is being shared with a mem buf,
++ // then return the cvpd list as the alternative record list.
++ // At thip point, if the node is be processed, then the mem buffs
++ // might have not been discovered yet. If cvpd is being cached, then
++ // include the cvpd list as the altnative.
++#ifdef CONFIG_CVPD_READ_FROM_PNOR
++ o_altVpdRecords = Singleton<CvpdFacade>::instance().iv_vpdRecords;
++ o_altRecSize = Singleton<CvpdFacade>::instance().iv_recSize;
++#else
++ o_altVpdRecords = NULL;
++ o_altRecSize = 0;
++#endif
++}
++
+diff --git a/src/usr/vpd/pvpd.H b/src/usr/vpd/pvpd.H
+new file mode 100644
+index 0000000..092dd45
+--- /dev/null
++++ b/src/usr/vpd/pvpd.H
+@@ -0,0 +1,149 @@
++/* IBM_PROLOG_BEGIN_TAG */
++/* This is an automatically generated prolog. */
++/* */
++/* $Source: src/usr/vpd/pvpd.H $ */
++/* */
++/* OpenPOWER HostBoot Project */
++/* */
++/* 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. */
++/* 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 __PVPD_H
++#define __PVPD_H
++
++
++/**
++ * @file pvpd.H
++ *
++ * @brief Provides the interfaces for the PVPD device driver
++ *
++ */
++
++// ----------------------------------------------
++// Includes
++// ----------------------------------------------
++#include <errl/errlentry.H>
++#include <vpd/pvpdenums.H>
++
++#include "ipvpd.H"
++#include <config.h>
++
++namespace PVPD
++{
++
++ /**
++ * @brief Conversion of PVPD Records to corresponding character
++ * representation.
++ */
++ const IpVpdFacade::recordInfo pvpdRecords[] =
++ {
++ // -------------------------------------------------------------------
++ // NOTE: This list must remain an ordered list! There will be a
++ // testcase that checks this. When adding new entries to the
++ // list, be sure that the keyword in each entry (value 0)
++ // are in ascending order.
++ // -------------------------------------------------------------------
++ { VINI, "VINI" },
++ { OSYS, "OSYS" },
++ { OPFR, "OPFR" },
++ { VNDR, "VNDR" },
++ // -------------------------------------------------------------------
++ // DO NOT USE!! This is for test purposes ONLY!
++ { PVPD_TEST_RECORD, "TEST" },
++ // -------------------------------------------------------------------
++ };
++
++ /**
++ * @brief Conversion of PVPD Keywords to corresponding character
++ * representation.
++ */
++ const IpVpdFacade::keywordInfo pvpdKeywords[] =
++ {
++ // -------------------------------------------------------------------
++ // NOTE: This list must remain an ordered list! There will be a
++ // testcase that checks this. When adding new entries to
++ // the list, be sure that the keyword in each entry (value 0)
++ // are in ascending order.
++ // -------------------------------------------------------------------
++ { pdI, "#I" },
++ { B3, "B3" },
++ { B4, "B4" },
++ { B7, "B7" },
++ { CC, "CC" },
++ { CE, "CE" },
++ { CT, "CT" },
++ { DR, "DR" },
++ { ET, "ET" },
++ { FN, "FN" },
++ { HE, "HE" },
++ { HW, "HW" },
++ { IN, "IN" },
++ { MM, "MM" },
++ { PF, "PF" },
++ { PN, "PN" },
++ { RT, "RT" },
++ { SN, "SN" },
++ { SS, "SS" },
++ { VD, "VD" },
++ { VN, "VN" },
++ { VP, "VP" },
++ { VS, "VS" },
++ { VZ, "VZ" },
++
++ // -------------------------------------------------------------------
++ // DO NOT USE!! This is for test purposes ONLY!
++ { PVPD_TEST_KEYWORD, "XX" },
++ // -------------------------------------------------------------------
++
++ //Common ipvpd
++ { FULL_RECORD, "FL"},
++ };
++
++}; // end PVPD namespace
++
++class PvpdFacade: public IpVpdFacade
++{
++ public:
++
++ /**
++ * @brief Constructor
++ */
++ PvpdFacade( );
++
++ private:
++
++ /**
++ * @brief This function returns a primary and an alternate list of records
++ * that should be copied to pnor. The Alternate list is optional.
++ *
++ * @param[out] o_primaryVpdRecords - Pointer to array of VPD Records to use
++ *
++ * @param[out] o_primaryRecSize - Size of o_primaryVpdRecords array
++ *
++ * @param[out] o_altVpdRecords - Pointer to array of VPD Records to use
++ *
++ * @param[out] o_altRecSize - Size of o_altVpdRecords array
++ *
++ */
++ void getRecordLists(
++ const recordInfo* & o_primaryVpdRecords,
++ uint64_t & o_primaryRecSize,
++ const recordInfo* & o_altVpdRecords,
++ uint64_t & o_altRecSize);
++
++};
++#endif // __PVPD_H
+diff --git a/src/usr/vpd/vpd.C b/src/usr/vpd/vpd.C
+index 9b4e1f8..3656696 100755
+--- a/src/usr/vpd/vpd.C
++++ b/src/usr/vpd/vpd.C
+@@ -34,10 +34,9 @@
+ #include "vpd.H"
+ #include "mvpd.H"
+ #include "cvpd.H"
++#include "pvpd.H"
+ #include "spd.H"
+
+-
+-
+ // ----------------------------------------------
+ // Trace definitions
+ // ----------------------------------------------
+@@ -456,6 +455,13 @@ errlHndl_t ensureCacheIsInSync ( TARGETING::Target * i_target )
+ l_keywordPN = CVPD::VP;
+ l_keywordSN = CVPD::VS;
+ }
++ else if( l_type == TARGETING::TYPE_NODE )
++ {
++ l_ipvpd = &(Singleton<PvpdFacade>::instance());
++ l_record = PVPD::OPFR;
++ l_keywordPN = PVPD::VP;
++ l_keywordSN = PVPD::VS;
++ }
+ else if( l_type == TARGETING::TYPE_DIMM )
+ {
+ // SPD does not have a singleton instance
+@@ -487,7 +493,8 @@ errlHndl_t ensureCacheIsInSync ( TARGETING::Target * i_target )
+ do
+ {
+ // Make sure we are comparing the correct pn/sn for CVPD
+- if( l_type == TARGETING::TYPE_MEMBUF )
++ if( ( l_type == TARGETING::TYPE_MEMBUF ) ||
++ ( l_type == TARGETING::TYPE_NODE ) )
+ {
+ bool l_zeroPN;
+ l_err = l_ipvpd->cmpSeepromToZero( i_target,
+@@ -523,6 +530,7 @@ errlHndl_t ensureCacheIsInSync ( TARGETING::Target * i_target )
+ // Compare the Part Numbers in PNOR/SEEPROM
+ bool l_matchPN = false;
+ if( ( l_type == TARGETING::TYPE_PROC ) ||
++ ( l_type == TARGETING::TYPE_NODE ) ||
+ ( l_type == TARGETING::TYPE_MEMBUF ) )
+ {
+ l_err = l_ipvpd->cmpPnorToSeeprom( i_target,
+@@ -577,7 +585,8 @@ errlHndl_t ensureCacheIsInSync ( TARGETING::Target * i_target )
+ HWAS::markTargetChanged(i_target);
+
+ // Load the PNOR data from the SEEPROM
+- if( ( l_type == TARGETING::TYPE_PROC ) ||
++ if( ( l_type == TARGETING::TYPE_PROC ) ||
++ ( l_type == TARGETING::TYPE_NODE ) ||
+ ( l_type == TARGETING::TYPE_MEMBUF ) )
+ {
+ l_err = l_ipvpd->loadPnor( i_target );
+diff --git a/src/usr/vpd/vpd.H b/src/usr/vpd/vpd.H
+index 9c39a7f..e6cada7 100644
+--- a/src/usr/vpd/vpd.H
++++ b/src/usr/vpd/vpd.H
+@@ -50,6 +50,7 @@ enum VPD_MSG_TYPE
+ VPD_WRITE_DIMM = 0x00C1, //< DIMM SPD
+ VPD_WRITE_PROC = 0x00C2, //< Processor MVPD
+ VPD_WRITE_MEMBUF = 0x00C3, //< Centaur FRU VPD
++ VPD_WRITE_PLANAR = 0x00C4, //< Planar VPD
+ };
+
+ /**
+diff --git a/src/usr/vpd/vpd.mk b/src/usr/vpd/vpd.mk
+index 9f85755..65d22e3 100644
+--- a/src/usr/vpd/vpd.mk
++++ b/src/usr/vpd/vpd.mk
+@@ -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.
+@@ -24,5 +26,6 @@
+ OBJS += ipvpd.o
+ OBJS += mvpd.o
+ OBJS += cvpd.o
++OBJS += pvpd.o
+ OBJS += spd.o
+ OBJS += errlud_vpd.o
+--
+1.8.2.2
+
diff --git a/openpower/package/hostboot/hostboot-0011-Fix-for-Bad-DQ-Bitmap-spare-byte-triggering-false-DR.patch b/openpower/package/hostboot/hostboot-0011-Fix-for-Bad-DQ-Bitmap-spare-byte-triggering-false-DR.patch
deleted file mode 100644
index 02202c3..0000000
--- a/openpower/package/hostboot/hostboot-0011-Fix-for-Bad-DQ-Bitmap-spare-byte-triggering-false-DR.patch
+++ /dev/null
@@ -1,260 +0,0 @@
-From 3b397cfb77ca5315f6403874ad10534e5f42f8a6 Mon Sep 17 00:00:00 2001
-From: Corey Swenson <cswenson@us.ibm.com>
-Date: Tue, 14 Apr 2015 13:47:12 -0500
-Subject: [PATCH 1/2] Fix for Bad DQ Bitmap spare byte triggering false DRAM
- repairs
-
-Change-Id: I6b443fc7c05d1fda1f97d180e317ac8a93eb77ad
-RTC: 125477
----
- src/usr/hwpf/hwp/dimmBadDqBitmapAccessHwp.C | 122 ++++++++++++++++++++++------
- 1 file changed, 99 insertions(+), 23 deletions(-)
-
-diff --git a/src/usr/hwpf/hwp/dimmBadDqBitmapAccessHwp.C b/src/usr/hwpf/hwp/dimmBadDqBitmapAccessHwp.C
-index 4c61ab8..98f9bf9 100644
---- a/src/usr/hwpf/hwp/dimmBadDqBitmapAccessHwp.C
-+++ b/src/usr/hwpf/hwp/dimmBadDqBitmapAccessHwp.C
-@@ -5,7 +5,7 @@
- /* */
- /* OpenPOWER HostBoot Project */
- /* */
--/* Contributors Listed Below - COPYRIGHT 2012,2014 */
-+/* Contributors Listed Below - COPYRIGHT 2012,2015 */
- /* [+] International Business Machines Corp. */
- /* */
- /* */
-@@ -22,7 +22,7 @@
- /* permissions and limitations under the License. */
- /* */
- /* IBM_PROLOG_END_TAG */
--// $Id: dimmBadDqBitmapAccessHwp.C,v 1.15 2014/03/27 20:55:12 whs Exp $
-+// $Id: dimmBadDqBitmapAccessHwp.C,v 1.16 2015/04/22 20:09:16 cswenson Exp $
- /**
- * @file dimmBadDqBitmapAccessHwp.C
- *
-@@ -53,6 +53,7 @@
- * whs 02/24/2014 Capture bad DQs as FFDC
- * in mnfg error logs
- * whs 03/27/2014 fix current FFDC bit map
-+ * cswenson 04/22/2014 fix spare byte translate
- */
-
- #include <dimmBadDqBitmapAccessHwp.H>
-@@ -78,23 +79,19 @@ extern "C"
- {
-
- /**
-- * @brief Called by dimmBadDqBitmapAccessHwp() to query ATTR_EFF_DIMM_SPARE
-- * and set bits for unconnected spare DRAM in caller's data.
-+ * @brief Returns bits for unconnected spare DRAM.
- *
- *
- * @param[in] i_mba Reference to MBA Target.
- * @param[in] i_dimm Reference to DIMM Target.
-- * @param[o] o_data Reference to Bad DQ Bitmap set by
-- * the caller. Only the SPARE_DRAM_DQ_BYTE_NUMBER_INDEX
-- * byte is modified by this function.
-+ * @param[o] o_spareByte Reference to the spare byte returned to caller.
- *
- * @return ReturnCode
- */
--
--fapi::ReturnCode dimmUpdateDqBitmapSpareByte(
-+fapi::ReturnCode dimmGetDqBitmapSpareByte(
- const fapi::Target & i_mba,
- const fapi::Target & i_dimm,
-- uint8_t (&o_data)[DIMM_DQ_MAX_DIMM_RANKS][DIMM_DQ_RANK_BITMAP_SIZE])
-+ uint8_t (&o_spareByte)[DIMM_DQ_MAX_DIMM_RANKS])
- {
- fapi::ReturnCode l_rc;
-
-@@ -108,7 +105,7 @@ fapi::ReturnCode dimmUpdateDqBitmapSpareByte(
- l_rc = FAPI_ATTR_GET(ATTR_VPD_DIMM_SPARE, &i_mba, l_mbaSpare);
- if (l_rc)
- {
-- FAPI_ERR("dimmUpdateDqBitmapSpareByte: "
-+ FAPI_ERR("dimmGetDqBitmapSpareByte: "
- "Error getting DRAM Spare data");
- break;
- }
-@@ -117,7 +114,7 @@ fapi::ReturnCode dimmUpdateDqBitmapSpareByte(
- l_rc = FAPI_ATTR_GET(ATTR_MBA_PORT, &i_dimm, l_mbaPort);
- if (l_rc)
- {
-- FAPI_ERR("dimmUpdateDqBitmapSpareByte: "
-+ FAPI_ERR("dimmGetDqBitmapSpareByte: "
- "Error getting MBA port number");
- break;
- }
-@@ -126,7 +123,7 @@ fapi::ReturnCode dimmUpdateDqBitmapSpareByte(
- l_rc = FAPI_ATTR_GET(ATTR_MBA_DIMM, &i_dimm, l_dimm);
- if (l_rc)
- {
-- FAPI_ERR("dimmUpdateDqBitmapSpareByte: "
-+ FAPI_ERR("dimmGetDqBitmapSpareByte: "
- "Error getting dimm number");
- break;
- }
-@@ -139,20 +136,21 @@ fapi::ReturnCode dimmUpdateDqBitmapSpareByte(
- case fapi::ENUM_ATTR_VPD_DIMM_SPARE_NO_SPARE:
- // Set DQ bits reflecting unconnected
- // spare DRAM in caller's data
-- o_data[i][SPARE_DRAM_DQ_BYTE_NUMBER_INDEX] = 0xFF;
-+ o_spareByte[i] = 0xFF;
- break;
-
- case fapi::ENUM_ATTR_VPD_DIMM_SPARE_LOW_NIBBLE:
-- o_data[i][SPARE_DRAM_DQ_BYTE_NUMBER_INDEX] |= 0x0F;
-+ o_spareByte[i] = 0x0F;
- break;
-
- case fapi::ENUM_ATTR_VPD_DIMM_SPARE_HIGH_NIBBLE:
-- o_data[i][SPARE_DRAM_DQ_BYTE_NUMBER_INDEX] |= 0xF0;
-+ o_spareByte[i] = 0xF0;
- break;
-
- // As erroneous value will not be encountered.
- case fapi::ENUM_ATTR_VPD_DIMM_SPARE_FULL_BYTE:
- default:
-+ o_spareByte[i] = 0x0;
- break;
- }
- }
-@@ -161,6 +159,45 @@ fapi::ReturnCode dimmUpdateDqBitmapSpareByte(
- }
-
- /**
-+ * @brief Called by dimmBadDqBitmapAccessHwp() to query ATTR_EFF_DIMM_SPARE
-+ * and set bits for unconnected spare DRAM in caller's data.
-+ *
-+ *
-+ * @param[in] i_mba Reference to MBA Target.
-+ * @param[in] i_dimm Reference to DIMM Target.
-+ * @param[o] o_data Reference to Bad DQ Bitmap set by
-+ * the caller. Only the SPARE_DRAM_DQ_BYTE_NUMBER_INDEX
-+ * byte is modified by this function.
-+ *
-+ * @return ReturnCode
-+ */
-+
-+fapi::ReturnCode dimmUpdateDqBitmapSpareByte(
-+ const fapi::Target & i_mba,
-+ const fapi::Target & i_dimm,
-+ uint8_t (&o_data)[DIMM_DQ_MAX_DIMM_RANKS][DIMM_DQ_RANK_BITMAP_SIZE])
-+{
-+ fapi::ReturnCode l_rc;
-+
-+ uint8_t spareByte[DIMM_DQ_MAX_DIMM_RANKS];
-+ memset(spareByte, 0, sizeof(spareByte));
-+
-+ l_rc = dimmGetDqBitmapSpareByte(i_mba,i_dimm,spareByte);
-+ if (l_rc)
-+ {
-+ FAPI_ERR("dimmUpdateDqBitmapSpareByte: "
-+ "Error getting spare byte");
-+ return l_rc;
-+ }
-+
-+ for (uint32_t i=0; i<DIMM_DQ_MAX_DIMM_RANKS; i++)
-+ {
-+ o_data[i][SPARE_DRAM_DQ_BYTE_NUMBER_INDEX] |= spareByte[i];
-+ }
-+ return l_rc;
-+}
-+
-+/**
- * @brief Called by dimmBadDqBitmapAccessHwp() to query
- * ATTR_SPD_MODULE_MEMORY_BUS_WIDTH in order to determine
- * ECC support for this DIMM. This function will set
-@@ -472,8 +509,13 @@ fapi::ReturnCode dimmBadDqBitmapSet(
- uint8_t (l_prev_data)[DIMM_DQ_MAX_DIMM_RANKS]
- [DIMM_DQ_RANK_BITMAP_SIZE];
- bool badDQSet = false;
-- dimmBadDqBitmapGet(i_mba, i_dimm, l_prev_data, i_wiringData,
-- i_allMnfgFlags);
-+ l_rc = dimmBadDqBitmapGet(i_mba, i_dimm, l_prev_data, i_wiringData,
-+ i_allMnfgFlags);
-+ if (l_rc)
-+ {
-+ FAPI_ERR("dimmBadDqBitmapAccessHwp: Error getting DQ bitmap");
-+ return l_rc;
-+ }
-
- // Check if Bad DQ bit set
- for (uint8_t i = 0; i < DIMM_DQ_MAX_DIMM_RANKS; i++)
-@@ -654,6 +696,18 @@ fapi::ReturnCode dimmBadDqBitmapSet(
- l_pSpdData->iv_reserved3 = 0;
- memset(l_pSpdData->iv_bitmaps, 0, sizeof(l_pSpdData->iv_bitmaps));
-
-+ // Get the spare byte
-+ uint8_t spareByte[DIMM_DQ_MAX_DIMM_RANKS];
-+ memset(spareByte, 0, sizeof(spareByte));
-+
-+ l_rc = dimmGetDqBitmapSpareByte(i_mba,i_dimm,spareByte);
-+ if (l_rc)
-+ {
-+ FAPI_ERR("dimmBadDqBitmapAccessHwp: "
-+ "Error getting spare byte");
-+ break;
-+ }
-+
- // Translate bitmap from Centaur DQ to DIMM DQ point of view for
- // each rank
- for (uint8_t i = 0; i < DIMM_DQ_MAX_DIMM_RANKS; i++)
-@@ -661,6 +715,16 @@ fapi::ReturnCode dimmBadDqBitmapSet(
- // Iterate through all the DQ bits in the rank
- for (uint8_t j = 0; j < DIMM_DQ_NUM_DQS; j++)
- {
-+ if ((j/8) == SPARE_DRAM_DQ_BYTE_NUMBER_INDEX)
-+ {
-+ // The spareByte can be one of: 0x00 0x0F 0xF0 0xFF
-+ // If a bit is set, then that spare is unconnected
-+ // so continue to the next num_dqs, do not translate
-+ if (spareByte[i] & (0x80 >> (j % 8)))
-+ {
-+ continue;
-+ }
-+ }
- if ((i_data[i][j/8]) & (0x80 >> (j % 8)))
- {
- // Centaur DQ bit set in callers data.
-@@ -747,13 +811,25 @@ fapi::ReturnCode dimmBadDqBitmapAccessHwp(
-
- if (i_get)
- {
-- dimmBadDqBitmapGet(i_mba, i_dimm, io_data, l_wiringData,
-- l_allMnfgFlags);
-+ l_rc = dimmBadDqBitmapGet(i_mba, i_dimm, io_data, l_wiringData,
-+ l_allMnfgFlags);
-+ if (l_rc)
-+ {
-+ FAPI_ERR("dimmBadDqBitmapAccessHwp: "
-+ "Error getting DQ bitmap");
-+ break;
-+ }
- }
- else
- {
-- dimmBadDqBitmapSet(i_mba, i_dimm, io_data, l_wiringData,
-- l_allMnfgFlags);
-+ l_rc = dimmBadDqBitmapSet(i_mba, i_dimm, io_data, l_wiringData,
-+ l_allMnfgFlags);
-+ if (l_rc)
-+ {
-+ FAPI_ERR("dimmBadDqBitmapAccessHwp: "
-+ "Error setting DQ bitmap");
-+ break;
-+ }
- }
-
- }while(0);
-@@ -763,4 +839,4 @@ fapi::ReturnCode dimmBadDqBitmapAccessHwp(
- return l_rc;
- }
-
--}
-+}
-\ No newline at end of file
---
-1.8.2.2
-
diff --git a/openpower/package/hostboot/hostboot-0011-Support-for-OCC-Centaur-numbering.patch b/openpower/package/hostboot/hostboot-0011-Support-for-OCC-Centaur-numbering.patch
new file mode 100644
index 0000000..bbbc2ff
--- /dev/null
+++ b/openpower/package/hostboot/hostboot-0011-Support-for-OCC-Centaur-numbering.patch
@@ -0,0 +1,41 @@
+From 9d5d91597d325d63465a4f62a98bb5d8ff0f90a4 Mon Sep 17 00:00:00 2001
+From: Doug Gilbert <dgilbert@us.ibm.com>
+Date: Wed, 3 Jun 2015 14:06:09 -0500
+Subject: [PATCH] Support for OCC Centaur numbering
+
+Change-Id: I11f6641548dbb0a0f4f586f592fa0d357a6c9a84
+RTC: 127111
+Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/18179
+Tested-by: Jenkins Server
+Reviewed-by: Christopher Cain <cjcain@us.ibm.com>
+Reviewed-by: Martha Broyles <mbroyles@us.ibm.com>
+Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
+---
+ src/usr/htmgt/htmgt_cfgdata.C | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/src/usr/htmgt/htmgt_cfgdata.C b/src/usr/htmgt/htmgt_cfgdata.C
+index dcf1f9d..f4bcfd8 100644
+--- a/src/usr/htmgt/htmgt_cfgdata.C
++++ b/src/usr/htmgt/htmgt_cfgdata.C
+@@ -307,6 +307,8 @@ void getMemConfigMessageData(const TargetHandle_t i_occ,
+
+ //Centaur #
+ centPos = (*centaur)->getAttr<ATTR_POSITION>();
++ // ATTR_POSITION is system wide. Must be 0-7 on each OCC
++ centPos = centPos % 8;
+ o_data[index++] = centPos;
+
+ //Dimm # (0xFF since a centaur)
+@@ -425,6 +427,8 @@ void getMemThrottleMessageData(const TargetHandle_t i_occ,
+ for (centaur=centaurs.begin(); centaur!=centaurs.end(); ++centaur)
+ {
+ centPos = (*centaur)->getAttr<ATTR_POSITION>();
++ // ATTR_POSITION is system wide. Must 0-7 on each OCC
++ centPos = centPos % 8;
+
+ mbas.clear();
+ getChildAffinityTargets(mbas, *centaur,
+--
+2.3.0
+
diff --git a/openpower/package/hostboot/hostboot-0012-Disable-Centaur-I2C-at-runtime.patch b/openpower/package/hostboot/hostboot-0012-Disable-Centaur-I2C-at-runtime.patch
deleted file mode 100644
index 3455e34..0000000
--- a/openpower/package/hostboot/hostboot-0012-Disable-Centaur-I2C-at-runtime.patch
+++ /dev/null
@@ -1,104 +0,0 @@
-From e33d32a5c249e5298a545889bba86129218c213d Mon Sep 17 00:00:00 2001
-From: Corey Swenson <cswenson@us.ibm.com>
-Date: Thu, 23 Apr 2015 14:55:20 -0500
-Subject: [PATCH 2/2] Disable Centaur I2C at runtime
-
-Change-Id: I0425f642ed84041e604ad8004f77f0c385227526
----
- src/usr/i2c/runtime/rt_i2c.C | 76 ++++++++++++++++++++++++--------------------
- 1 file changed, 42 insertions(+), 34 deletions(-)
-
-diff --git a/src/usr/i2c/runtime/rt_i2c.C b/src/usr/i2c/runtime/rt_i2c.C
-index 5d21bbf..bdadbbe 100755
---- a/src/usr/i2c/runtime/rt_i2c.C
-+++ b/src/usr/i2c/runtime/rt_i2c.C
-@@ -139,44 +139,52 @@ errlHndl_t i2cPerformOp( DeviceFW::OperationType i_opType,
- proc_engine_port |= (uint64_t)(args.engine) << HBRT_I2C_MASTER_ENGINE_SHIFT;
- proc_engine_port |= (uint64_t)(args.port) << HBRT_I2C_MASTER_PORT_SHIFT;
-
-- if(i_opType == DeviceFW::READ)
-+ // Send I2C op to host interface
-+ // Centaur I2C not yet supported
-+ // @todo RTC:127533 -- Enable Centaur I2C at runtime
-+ if( i_target->getAttr<TARGETING::ATTR_TYPE>() != TARGETING::TYPE_MEMBUF )
- {
-- if(g_hostInterfaces->i2c_read != NULL)
-+ if(i_opType == DeviceFW::READ)
- {
-- rc = g_hostInterfaces->i2c_read
-- (
-- proc_engine_port, // Master Chip/Engine/Port
-- args.devAddr, // Dev Addr
-- args.offset_length, // Offset size
-- offset, // Offset
-- io_buflen, // Buffer length
-- io_buffer // Buffer
-- );
-+ if(g_hostInterfaces->i2c_read != NULL)
-+ {
-+ rc = g_hostInterfaces->i2c_read
-+ (
-+ proc_engine_port, // Master Chip/Engine/Port
-+ args.devAddr, // Dev Addr
-+ args.offset_length, // Offset size
-+ offset, // Offset
-+ io_buflen, // Buffer length
-+ io_buffer // Buffer
-+ );
-+ }
-+ else
-+ {
-+ TRACFCOMP(g_trac_i2c,
-+ ERR_MRK"Hypervisor I2C read interface not linked");
-+ l_host_if_enabled = false;
-+ }
- }
-- else
-- {
-- TRACFCOMP(g_trac_i2c,ERR_MRK"Hypervisor I2C read interface not linked");
-- l_host_if_enabled = false;
-- }
-- }
-- else if (i_opType == DeviceFW::WRITE)
-- {
-- if(g_hostInterfaces->i2c_write != NULL)
-- {
-- rc = g_hostInterfaces->i2c_write
-- (
-- proc_engine_port, // Master Chip/Engine/Port
-- args.devAddr, // Dev Addr
-- args.offset_length, // Offset size
-- offset, // Offset
-- io_buflen, // Buffer length
-- io_buffer // Buffer
-- );
-- }
-- else
-+ else if (i_opType == DeviceFW::WRITE)
- {
-- TRACFCOMP(g_trac_i2c,ERR_MRK"Hypervisor I2C write interface not linked");
-- l_host_if_enabled = false;
-+ if(g_hostInterfaces->i2c_write != NULL)
-+ {
-+ rc = g_hostInterfaces->i2c_write
-+ (
-+ proc_engine_port, // Master Chip/Engine/Port
-+ args.devAddr, // Dev Addr
-+ args.offset_length, // Offset size
-+ offset, // Offset
-+ io_buflen, // Buffer length
-+ io_buffer // Buffer
-+ );
-+ }
-+ else
-+ {
-+ TRACFCOMP(g_trac_i2c,
-+ ERR_MRK"Hypervisor I2C write interface not linked");
-+ l_host_if_enabled = false;
-+ }
- }
- }
-
---
-1.8.2.2
-
diff --git a/openpower/package/hostboot/hostboot.mk b/openpower/package/hostboot/hostboot.mk
index 5f423da..3b7bc6f 100644
--- a/openpower/package/hostboot/hostboot.mk
+++ b/openpower/package/hostboot/hostboot.mk
@@ -4,7 +4,7 @@
#
################################################################################
-HOSTBOOT_VERSION ?= 6bdbe42ee0a2808be1f2f38026e57290cdfa8fc6
+HOSTBOOT_VERSION ?= c646754e720b5cd21534425ca90bb414a4a3ff12
HOSTBOOT_SITE ?= $(call github,open-power,hostboot,$(HOSTBOOT_VERSION))
HOSTBOOT_LICENSE = Apache-2.0
diff --git a/openpower/package/openpower-ffs/openpower-ffs.mk b/openpower/package/openpower-ffs/openpower-ffs.mk
index 1e6b9bf..ff82950 100644
--- a/openpower/package/openpower-ffs/openpower-ffs.mk
+++ b/openpower/package/openpower-ffs/openpower-ffs.mk
@@ -1,4 +1,4 @@
-OPENPOWER_FFS_VERSION ?= bf4630076762d9c20c16c80c1c791f352b046dd1
+OPENPOWER_FFS_VERSION ?= 2e790b8409071ca15767d822dabfa8e60f12c6e2
OPENPOWER_FFS_SITE ?= $(call github,open-power,ffs,$(OPENPOWER_FFS_VERSION))
OPENPOWER_FFS_LICENSE = GPLv2+
diff --git a/openpower/package/openpower-pnor/Config.in b/openpower/package/openpower-pnor/Config.in
index 6a23e51..2234d4e 100644
--- a/openpower/package/openpower-pnor/Config.in
+++ b/openpower/package/openpower-pnor/Config.in
@@ -46,6 +46,11 @@
help
String used to define name of sbec hostboot binary file
+config BR2_HOSTBOOT_BINARY_WINK_FILENAME
+ string "Name of winkle hostboot binary"
+ help
+ String used to define name of winkle hostboot binary file
+
config BR2_OPENPOWER_TARGETING_BIN_FILENAME
string "Name of openpower binary targeting file"
help
diff --git a/openpower/package/openpower-pnor/openpower-pnor.mk b/openpower/package/openpower-pnor/openpower-pnor.mk
index fb7e230..658a949 100644
--- a/openpower/package/openpower-pnor/openpower-pnor.mk
+++ b/openpower/package/openpower-pnor/openpower-pnor.mk
@@ -8,7 +8,7 @@
# make doesn't care for quotes in the dependencies.
XML_PACKAGE=$(subst $\",,$(BR2_OPENPOWER_XML_PACKAGE))
-OPENPOWER_PNOR_VERSION ?= 3748ff041448a3909d5ffc5e62befcfcb597c0c1
+OPENPOWER_PNOR_VERSION ?= ed1682e10526ebd85825427fbf397361bb0e34aa
OPENPOWER_PNOR_SITE ?= $(call github,open-power,pnor,$(OPENPOWER_PNOR_VERSION))
OPENPOWER_PNOR_LICENSE = Apache-2.0
@@ -48,6 +48,7 @@
-targeting_binary_source $(BR2_OPENPOWER_TARGETING_BIN_FILENAME) \
-sbe_binary_filename $(BR2_HOSTBOOT_BINARY_SBE_FILENAME) \
-sbec_binary_filename $(BR2_HOSTBOOT_BINARY_SBEC_FILENAME) \
+ -wink_binary_filename $(BR2_HOSTBOOT_BINARY_WINK_FILENAME) \
-occ_binary_filename $(OCC_STAGING_DIR)/$(BR2_OCC_BIN_FILENAME) \
-capp_binary_filename $(BINARIES_DIR)/$(BR2_CAPP_UCODE_BIN_FILENAME) \
-openpower_version_filename $(OPENPOWER_PNOR_VERSION_FILE)
@@ -63,6 +64,7 @@
-bootkernel $(BINARIES_DIR)/$(LINUX_IMAGE_NAME) \
-sbe_binary_filename $(BR2_HOSTBOOT_BINARY_SBE_FILENAME) \
-sbec_binary_filename $(BR2_HOSTBOOT_BINARY_SBEC_FILENAME) \
+ -wink_binary_filename $(BR2_HOSTBOOT_BINARY_WINK_FILENAME) \
-occ_binary_filename $(OCC_STAGING_DIR)/$(BR2_OCC_BIN_FILENAME) \
-targeting_binary_filename $(BR2_OPENPOWER_TARGETING_ECC_FILENAME) \
-openpower_version_filename $(OPENPOWER_PNOR_VERSION_FILE)
diff --git a/openpower/package/pkg-versions.mk b/openpower/package/pkg-versions.mk
index e3acbda..e2e3af0 100644
--- a/openpower/package/pkg-versions.mk
+++ b/openpower/package/pkg-versions.mk
@@ -70,16 +70,16 @@
echo -n "-" >> $$($(2)_VERSION_FILE); \
\
cd "$$($(2)_SITE)"; (git describe --tags || git log -n1 --pretty=format:'%h' || echo "unknown") \
- | sed 's/\(.*\)-g\([0-9a-f]\{7\}\).*/\2/' | xargs echo -n \
+ | sed 's/\(.*\)-g\([0-9a-f]\{7\}\).*/\2/;s/$(1)-//;' | xargs echo -n \
>> $$($(2)_VERSION_FILE); \
\
-cd "$$($(2)_SITE)"; git describe --all --dirty | grep -e "-dirty" | sed 's/.*\(-dirty\)/\1/' | \
+cd "$$($(2)_SITE)"; git describe --all --dirty | grep -e "-dirty" | sed 's/.*\(-dirty\)/\1/;' | \
xargs echo -n >> $$($(2)_VERSION_FILE); \
else \
\
[ `echo -n $$($(2)_VERSION) | wc -c` == "40" ] && (echo -n $$($(2)_VERSION) | \
- sed "s/^\([0-9a-f]\{7\}\).*/\1/" >> $$($(2)_VERSION_FILE)) \
- || echo -n $$($(2)_VERSION) >> $$($(2)_VERSION_FILE); \
+ sed "s/^\([0-9a-f]\{7\}\).*/\1/;s/$(1)-//;" >> $$($(2)_VERSION_FILE)) \
+ || echo -n $$($(2)_VERSION) | sed -e 's/$(1)-//' >> $$($(2)_VERSION_FILE); \
\
cd "$$(BR2_EXTERNAL)"; git describe --all --dirty | \
if grep -e "-dirty"; then \
diff --git a/openpower/package/skiboot/skiboot.mk b/openpower/package/skiboot/skiboot.mk
index 3b4ad1a..8e443ed 100644
--- a/openpower/package/skiboot/skiboot.mk
+++ b/openpower/package/skiboot/skiboot.mk
@@ -4,7 +4,7 @@
#
################################################################################
-SKIBOOT_VERSION = skiboot-5.0-rc3
+SKIBOOT_VERSION = skiboot-5.0.3
SKIBOOT_SITE = $(call github,open-power,skiboot,$(SKIBOOT_VERSION))
SKIBOOT_INSTALL_IMAGES = YES
SKIBOOT_INSTALL_TARGET = NO