summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Lim <youhour@us.ibm.com>2016-10-04 14:59:13 -0500
committerGitHub <noreply@github.com>2016-10-04 14:59:13 -0500
commit90b04d63fb4d236990e2834aeada410619bcee85 (patch)
tree3224beac82f34353ddf34a34bca731625c676cb4
parent00aa62ffd7a0f354b46ba15a67933d0339466a07 (diff)
parent1ad5b8331b9a3c4b784d70b482d129d807421036 (diff)
downloadvpdtools-90b04d63fb4d236990e2834aeada410619bcee85.tar.gz
vpdtools-90b04d63fb4d236990e2834aeada410619bcee85.zip
Merge pull request #1 from open-power/master
update
-rw-r--r--README22
-rwxr-xr-xcreateVpd.py205
-rw-r--r--docs/xmlformat.md193
-rw-r--r--examples/README26
-rw-r--r--examples/comments/comments.tvpd32
-rw-r--r--examples/mixeddata/mixeddata.tvpd35
-rw-r--r--examples/p8/memcard1_ddr3/memcard1_ddr3.tvpd (renamed from examples/memcard1_ddr3/memcard1_ddr3.tvpd)0
-rw-r--r--examples/p8/memcard1_ddr3/openPower_mer0_MCsample.xml (renamed from examples/memcard1_ddr3/openPower_mer0_MCsample.xml)0
-rw-r--r--examples/p8/memcard1_ddr3/openPower_opfr_sample.xml (renamed from examples/memcard1_ddr3/openPower_opfr_sample.xml)0
-rw-r--r--examples/p8/memcard1_ddr3/openPower_spdx_membuf1_sample.xml (renamed from examples/memcard1_ddr3/openPower_spdx_membuf1_sample.xml)0
-rw-r--r--examples/p8/memcard1_ddr3/openPower_veir_MCsample.xml (renamed from examples/memcard1_ddr3/openPower_veir_MCsample.xml)0
-rw-r--r--examples/p8/memcard1_ddr3/openPower_ver0_MCsample.xml (renamed from examples/memcard1_ddr3/openPower_ver0_MCsample.xml)0
-rw-r--r--examples/p8/memcard1_ddr3/openPower_vini_sample.xml (renamed from examples/memcard1_ddr3/openPower_vini_sample.xml)0
-rw-r--r--examples/p8/memcard1_ddr3/openPower_vmsc_sample.xml (renamed from examples/memcard1_ddr3/openPower_vmsc_sample.xml)0
-rw-r--r--examples/p8/memcard1_ddr3/openPower_vndr_sample.xml (renamed from examples/memcard1_ddr3/openPower_vndr_sample.xml)0
-rw-r--r--examples/p8/memcard1_ddr3/openPower_vrtn_sample.xml (renamed from examples/memcard1_ddr3/openPower_vrtn_sample.xml)0
-rw-r--r--examples/p8/memcard1_ddr4/memcard1_ddr4.tvpd (renamed from examples/memcard1_ddr4/memcard1_ddr4.tvpd)0
-rw-r--r--examples/p8/memcard1_ddr4/openPower_mer0_MCsample.xml (renamed from examples/memcard1_ddr4/openPower_mer0_MCsample.xml)0
-rw-r--r--examples/p8/memcard1_ddr4/openPower_opfr_sample.xml (renamed from examples/memcard1_ddr4/openPower_opfr_sample.xml)0
-rw-r--r--examples/p8/memcard1_ddr4/openPower_spdx_membuf1_ddr4_sample.xml (renamed from examples/memcard1_ddr4/openPower_spdx_membuf1_ddr4_sample.xml)0
-rw-r--r--examples/p8/memcard1_ddr4/openPower_veir_MCsample.xml (renamed from examples/memcard1_ddr4/openPower_veir_MCsample.xml)0
-rw-r--r--examples/p8/memcard1_ddr4/openPower_ver0_MCsample.xml (renamed from examples/memcard1_ddr4/openPower_ver0_MCsample.xml)0
-rw-r--r--examples/p8/memcard1_ddr4/openPower_vini_sample.xml (renamed from examples/memcard1_ddr4/openPower_vini_sample.xml)0
-rw-r--r--examples/p8/memcard1_ddr4/openPower_vmsc_sample.xml (renamed from examples/memcard1_ddr4/openPower_vmsc_sample.xml)0
-rw-r--r--examples/p8/memcard1_ddr4/openPower_vndr_sample.xml (renamed from examples/memcard1_ddr4/openPower_vndr_sample.xml)0
-rw-r--r--examples/p8/memcard1_ddr4/openPower_vrtn_sample.xml (renamed from examples/memcard1_ddr4/openPower_vrtn_sample.xml)0
-rw-r--r--examples/p8/memcard4_ddr3/memcard4_ddr3.tvpd (renamed from examples/memcard4_ddr3/memcard4_ddr3.tvpd)0
-rw-r--r--examples/p8/memcard4_ddr3/openPower_mer0_MCsample.xml (renamed from examples/memcard4_ddr3/openPower_mer0_MCsample.xml)0
-rw-r--r--examples/p8/memcard4_ddr3/openPower_opfr_sample.xml (renamed from examples/memcard4_ddr3/openPower_opfr_sample.xml)0
-rw-r--r--examples/p8/memcard4_ddr3/openPower_spdx_membuf4_sample.xml (renamed from examples/memcard4_ddr3/openPower_spdx_membuf4_sample.xml)0
-rw-r--r--examples/p8/memcard4_ddr3/openPower_veir_MCsample.xml (renamed from examples/memcard4_ddr3/openPower_veir_MCsample.xml)0
-rw-r--r--examples/p8/memcard4_ddr3/openPower_ver0_MCsample.xml (renamed from examples/memcard4_ddr3/openPower_ver0_MCsample.xml)0
-rw-r--r--examples/p8/memcard4_ddr3/openPower_vini_sample.xml (renamed from examples/memcard4_ddr3/openPower_vini_sample.xml)0
-rw-r--r--examples/p8/memcard4_ddr3/openPower_vmsc_sample.xml (renamed from examples/memcard4_ddr3/openPower_vmsc_sample.xml)0
-rw-r--r--examples/p8/memcard4_ddr3/openPower_vndr_sample.xml (renamed from examples/memcard4_ddr3/openPower_vndr_sample.xml)0
-rw-r--r--examples/p8/memcard4_ddr3/openPower_vrtn_sample.xml (renamed from examples/memcard4_ddr3/openPower_vrtn_sample.xml)0
-rw-r--r--examples/p8/memcard4_ddr4/memcard4_ddr4.tvpd (renamed from examples/memcard4_ddr4/memcard4_ddr4.tvpd)0
-rw-r--r--examples/p8/memcard4_ddr4/openPower_mer0_MCsample.xml (renamed from examples/memcard4_ddr4/openPower_mer0_MCsample.xml)0
-rw-r--r--examples/p8/memcard4_ddr4/openPower_opfr_sample.xml (renamed from examples/memcard4_ddr4/openPower_opfr_sample.xml)0
-rw-r--r--examples/p8/memcard4_ddr4/openPower_spdx_membuf4_ddr4_sample.xml (renamed from examples/memcard4_ddr4/openPower_spdx_membuf4_ddr4_sample.xml)0
-rw-r--r--examples/p8/memcard4_ddr4/openPower_veir_MCsample.xml (renamed from examples/memcard4_ddr4/openPower_veir_MCsample.xml)0
-rw-r--r--examples/p8/memcard4_ddr4/openPower_ver0_MCsample.xml (renamed from examples/memcard4_ddr4/openPower_ver0_MCsample.xml)0
-rw-r--r--examples/p8/memcard4_ddr4/openPower_vini_sample.xml (renamed from examples/memcard4_ddr4/openPower_vini_sample.xml)0
-rw-r--r--examples/p8/memcard4_ddr4/openPower_vmsc_sample.xml (renamed from examples/memcard4_ddr4/openPower_vmsc_sample.xml)0
-rw-r--r--examples/p8/memcard4_ddr4/openPower_vndr_sample.xml (renamed from examples/memcard4_ddr4/openPower_vndr_sample.xml)0
-rw-r--r--examples/p8/memcard4_ddr4/openPower_vrtn_sample.xml (renamed from examples/memcard4_ddr4/openPower_vrtn_sample.xml)0
-rw-r--r--examples/p8/sysplanar/openPower_mer0_sample.xml (renamed from examples/sysplanar/openPower_mer0_sample.xml)0
-rw-r--r--examples/p8/sysplanar/openPower_opfr_sample.xml (renamed from examples/sysplanar/openPower_opfr_sample.xml)0
-rw-r--r--examples/p8/sysplanar/openPower_osys_sample.xml (renamed from examples/sysplanar/openPower_osys_sample.xml)0
-rw-r--r--examples/p8/sysplanar/openPower_veir_sample.xml (renamed from examples/sysplanar/openPower_veir_sample.xml)0
-rw-r--r--examples/p8/sysplanar/openPower_ver0_sample.xml (renamed from examples/sysplanar/openPower_ver0_sample.xml)0
-rw-r--r--examples/p8/sysplanar/openPower_vini_sample.xml (renamed from examples/sysplanar/openPower_vini_sample.xml)0
-rw-r--r--examples/p8/sysplanar/openPower_vmsc_sample.xml (renamed from examples/sysplanar/openPower_vmsc_sample.xml)0
-rw-r--r--examples/p8/sysplanar/openPower_vndr_sample.xml (renamed from examples/sysplanar/openPower_vndr_sample.xml)0
-rw-r--r--examples/p8/sysplanar/openPower_vrtn_sample.xml (renamed from examples/sysplanar/openPower_vrtn_sample.xml)0
-rw-r--r--examples/p8/sysplanar/sysplanar.tvpd (renamed from examples/sysplanar/sysplanar.tvpd)0
-rw-r--r--examples/p8/sysplanar32_ddr3/openPower_mer0_sample.xml (renamed from examples/sysplanar32_ddr3/openPower_mer0_sample.xml)0
-rw-r--r--examples/p8/sysplanar32_ddr3/openPower_opfr_sample.xml (renamed from examples/sysplanar32_ddr3/openPower_opfr_sample.xml)0
-rw-r--r--examples/p8/sysplanar32_ddr3/openPower_osys_sample.xml (renamed from examples/sysplanar32_ddr3/openPower_osys_sample.xml)0
-rw-r--r--examples/p8/sysplanar32_ddr3/openPower_spdx_membuf32_sample.xml (renamed from examples/sysplanar32_ddr3/openPower_spdx_membuf32_sample.xml)0
-rw-r--r--examples/p8/sysplanar32_ddr3/openPower_veir_sample.xml (renamed from examples/sysplanar32_ddr3/openPower_veir_sample.xml)0
-rw-r--r--examples/p8/sysplanar32_ddr3/openPower_ver0_sample.xml (renamed from examples/sysplanar32_ddr3/openPower_ver0_sample.xml)0
-rw-r--r--examples/p8/sysplanar32_ddr3/openPower_vini_sample.xml (renamed from examples/sysplanar32_ddr3/openPower_vini_sample.xml)0
-rw-r--r--examples/p8/sysplanar32_ddr3/openPower_vmsc_sample.xml (renamed from examples/sysplanar32_ddr3/openPower_vmsc_sample.xml)0
-rw-r--r--examples/p8/sysplanar32_ddr3/openPower_vndr_sample.xml (renamed from examples/sysplanar32_ddr3/openPower_vndr_sample.xml)0
-rw-r--r--examples/p8/sysplanar32_ddr3/openPower_vrtn_sample.xml (renamed from examples/sysplanar32_ddr3/openPower_vrtn_sample.xml)0
-rw-r--r--examples/p8/sysplanar32_ddr3/sysplanar32_ddr3.tvpd (renamed from examples/sysplanar32_ddr3/sysplanar32_ddr3.tvpd)0
-rw-r--r--examples/p8/sysplanar32_ddr4/openPower_mer0_sample.xml (renamed from examples/sysplanar32_ddr4/openPower_mer0_sample.xml)0
-rw-r--r--examples/p8/sysplanar32_ddr4/openPower_opfr_sample.xml (renamed from examples/sysplanar32_ddr4/openPower_opfr_sample.xml)0
-rw-r--r--examples/p8/sysplanar32_ddr4/openPower_osys_sample.xml (renamed from examples/sysplanar32_ddr4/openPower_osys_sample.xml)0
-rw-r--r--examples/p8/sysplanar32_ddr4/openPower_spdx_membuf32_ddr4_sample.xml (renamed from examples/sysplanar32_ddr4/openPower_spdx_membuf32_ddr4_sample.xml)0
-rw-r--r--examples/p8/sysplanar32_ddr4/openPower_veir_sample.xml (renamed from examples/sysplanar32_ddr4/openPower_veir_sample.xml)0
-rw-r--r--examples/p8/sysplanar32_ddr4/openPower_ver0_sample.xml (renamed from examples/sysplanar32_ddr4/openPower_ver0_sample.xml)0
-rw-r--r--examples/p8/sysplanar32_ddr4/openPower_vini_sample.xml (renamed from examples/sysplanar32_ddr4/openPower_vini_sample.xml)0
-rw-r--r--examples/p8/sysplanar32_ddr4/openPower_vmsc_sample.xml (renamed from examples/sysplanar32_ddr4/openPower_vmsc_sample.xml)0
-rw-r--r--examples/p8/sysplanar32_ddr4/openPower_vndr_sample.xml (renamed from examples/sysplanar32_ddr4/openPower_vndr_sample.xml)0
-rw-r--r--examples/p8/sysplanar32_ddr4/openPower_vrtn_sample.xml (renamed from examples/sysplanar32_ddr4/openPower_vrtn_sample.xml)0
-rw-r--r--examples/p8/sysplanar32_ddr4/sysplanar32_ddr4.tvpd (renamed from examples/sysplanar32_ddr4/sysplanar32_ddr4.tvpd)0
-rw-r--r--examples/p9/sysplanar32_ddr4/openPower_memd_sample.xml549
-rw-r--r--examples/p9/sysplanar32_ddr4/openPower_mer0_sample.xml23
-rw-r--r--examples/p9/sysplanar32_ddr4/openPower_opfr_sample.xml58
-rw-r--r--examples/p9/sysplanar32_ddr4/openPower_osys_sample.xml51
-rw-r--r--examples/p9/sysplanar32_ddr4/openPower_ver0_sample.xml22
-rw-r--r--examples/p9/sysplanar32_ddr4/openPower_vini_sample.xml107
-rw-r--r--examples/p9/sysplanar32_ddr4/openPower_vmsc_sample.xml23
-rw-r--r--examples/p9/sysplanar32_ddr4/openPower_vndr_sample.xml30
-rw-r--r--examples/p9/sysplanar32_ddr4/openPower_vrtn_sample.xml37
-rw-r--r--examples/p9/sysplanar32_ddr4/sysplanar32_ddr4.tvpd46
88 files changed, 1389 insertions, 70 deletions
diff --git a/README b/README
index 0b76d43..3d6f6a8 100644
--- a/README
+++ b/README
@@ -42,18 +42,18 @@ Also included are examples of complete memcard and sysplanar templates
sysplanar creation example
--------------------------
-$ ~/vpdtools/createVpd.py -m ~/vpdtools/examples/sysplanar/sysplanar.tvpd -i ~/vpdtools/examples/sysplanar -o /tmp/vpdout
+$ ~/vpdtools/createVpd.py -m ~/vpdtools/examples/p8/sysplanar/sysplanar.tvpd -i ~/vpdtools/examples/p8/sysplanar -o /tmp/vpdout
==== Stage 1: Parsing tvpd XML
- Parsing tvpd ~/vpdtools/examples/sysplanar/sysplanar.tvpd
- Parsing tvpd ~/vpdtools/examples/sysplanar/openPower_vini_sample.xml
- Parsing tvpd ~/vpdtools/examples/sysplanar/openPower_osys_sample.xml
- Parsing tvpd ~/vpdtools/examples/sysplanar/openPower_opfr_sample.xml
- Parsing tvpd ~/vpdtools/examples/sysplanar/openPower_vndr_sample.xml
- Parsing tvpd ~/vpdtools/examples/sysplanar/openPower_veir_sample.xml
- Parsing tvpd ~/vpdtools/examples/sysplanar/openPower_ver0_sample.xml
- Parsing tvpd ~/vpdtools/examples/sysplanar/openPower_mer0_sample.xml
- Parsing tvpd ~/vpdtools/examples/sysplanar/openPower_vmsc_sample.xml
- Parsing tvpd ~/vpdtools/examples/sysplanar/openPower_vrtn_sample.xml
+ Parsing tvpd ~/vpdtools/examples/p8/sysplanar/sysplanar.tvpd
+ Parsing tvpd ~/vpdtools/examples/p8/sysplanar/openPower_vini_sample.xml
+ Parsing tvpd ~/vpdtools/examples/p8/sysplanar/openPower_osys_sample.xml
+ Parsing tvpd ~/vpdtools/examples/p8/sysplanar/openPower_opfr_sample.xml
+ Parsing tvpd ~/vpdtools/examples/p8/sysplanar/openPower_vndr_sample.xml
+ Parsing tvpd ~/vpdtools/examples/p8/sysplanar/openPower_veir_sample.xml
+ Parsing tvpd ~/vpdtools/examples/p8/sysplanar/openPower_ver0_sample.xml
+ Parsing tvpd ~/vpdtools/examples/p8/sysplanar/openPower_mer0_sample.xml
+ Parsing tvpd ~/vpdtools/examples/p8/sysplanar/openPower_vmsc_sample.xml
+ Parsing tvpd ~/vpdtools/examples/p8/sysplanar/openPower_vrtn_sample.xml
==== Stage 2: Verifying tvpd syntax
Checking record VINI
Checking record OSYS
diff --git a/createVpd.py b/createVpd.py
index ad7a564..ec81180 100755
--- a/createVpd.py
+++ b/createVpd.py
@@ -44,6 +44,20 @@ import os
############################################################
# Classes - Classes - Classes - Classes - Classes - Classes
############################################################
+# This parser extension is necessary to save comments and write them back out in the final file
+# By default, element tree doesn't preserve comments
+# http://stackoverflow.com/questions/4474754/how-to-keep-comments-while-parsing-xml-using-python-elementtree
+class PCParser(ET.XMLTreeBuilder):
+ def __init__(self):
+ ET.XMLTreeBuilder.__init__(self)
+ # assumes ElementTree 1.2.X
+ self._parser.CommentHandler = self.handle_comment
+
+ def handle_comment(self, data):
+ self._target.start(ET.Comment, {})
+ self._target.data(data)
+ self._target.end(ET.Comment)
+
class RecordInfo:
"""Stores the info about each vpd record"""
def __init__(self):
@@ -100,7 +114,9 @@ def parseTvpd(tvpdFile, topLevel):
# Read in the file
# If there are tag mismatch errors or other general gross format problems, it will get caught here
# Once we return from this function, then we'll check to make sure only supported tags were given, etc..
- tvpdRoot = ET.parse(tvpdFile).getroot()
+ # Invoke the extended PCParser, which will handle preserving comments in the output file
+ parser = PCParser()
+ tvpdRoot = ET.parse(tvpdFile, parser=parser).getroot()
# Print the top level tags from the parsing
if (clDebug):
@@ -124,10 +140,14 @@ def parseTvpd(tvpdFile, topLevel):
# Go thru the tags at this level
for vpd in tvpdRoot:
+ # Comments aren't basestring tags
+ if not isinstance(vpd.tag, basestring):
+ continue
+
# See if this is a tag we even expect
if vpd.tag not in vpdTags:
out.error("Unsupported tag <%s> found while parsing the <vpd> level" % vpd.tag)
- errorsFound+=1
+ errorsFound += 1
# We continue here because we don't want to parse down this hierarcy path when we don't know what it is
continue
# It was a supported tag
@@ -143,17 +163,22 @@ def parseTvpd(tvpdFile, topLevel):
recordName = vpd.attrib.get("name")
if (recordName == None):
out.error("A <record> tag is missing the name attribute")
- errorsFound+=1
+ errorsFound += 1
recordName = "INVALID" # Set the invalid name so the code below can use it without issue
# Loop thru the tags defined for this record
for record in vpd:
+ # Comments aren't basestring tags
+ if not isinstance(record.tag, basestring):
+ continue
+
# See if this is a tag we even expect
if record.tag not in recordTags:
out.error("Unsupported tag <%s> found while parsing the <record> level for record %s" % (record.tag, recordName))
- errorsFound+=1
+ errorsFound += 1
# We continue here because we don't want to parse down this hierarcy path when we don't know what it is
continue
+
# It was a supported tag
else:
recordTags[record.tag]+=1
@@ -167,27 +192,31 @@ def parseTvpd(tvpdFile, topLevel):
keywordName = record.attrib.get("name")
if (keywordName == None):
out.error("<keyword> tag in record %s is missing the name attribute" % (recordName))
- errorsFound+=1
+ errorsFound += 1
keywordName = "INVALID" # Set the invalid name so the code below can use it without issue
# Loop thru the tags defined for this keyword
for keyword in record:
+ # Comments aren't basestring tags
+ if not isinstance(keyword.tag, basestring):
+ continue
+
# See if this is a tag we even expect
if keyword.tag not in keywordTags:
out.error("Unsupported tag <%s> found while parsing the <keyword> level for keyword %s in record %s" % (keyword.tag, keywordName, recordName))
- errorsFound+=1
+ errorsFound += 1
# We continue here because we don't want to parse down this hierarcy path when we don't know what it is
continue
# It was a supported tag
else:
- keywordTags[keyword.tag] +=1
+ keywordTags[keyword.tag] += 1
# We've checked for unknown keyword tags, now make sure we have the right number of each
# This is a simple one, we can only have 1 of each
for tag in keywordTags:
if (keywordTags[tag] != 1):
out.error("The tag <%s> was expected to have a count of 1, but was found with a count of %d for keyword %s in record %s" % (tag, keywordTags[tag], keywordName, recordName))
- errorsFound+=1
+ errorsFound += 1
# We've checked for unknown record tags, now make sure we've got the right number, they don't conflict, etc..
recordTagTotal = bool(recordTags["keyword"]) + bool(recordTags["rbinfile"]) + bool(recordTags["rtvpdfile"])
@@ -195,16 +224,16 @@ def parseTvpd(tvpdFile, topLevel):
if (recordTagTotal > 1):
out.error("For record %s, more than one tag of type keyword, rbinfile or rtvpdfile was given!" % (recordName))
out.error("Use of only 1 at a time is supported for a given record!")
- errorsFound+=1
+ errorsFound += 1
# We checked if we had more than 1, let's make sure we have at least 1
if (recordTagTotal < 1):
out.error("For record %s, 0 tags of type keyword, rbinfile or rtvpdfile were given!" % (recordName))
out.error("1 tag of the 3 must be in use for the record to be valid!")
- errorsFound+=1
+ errorsFound += 1
# Make sure the rdesc is available
if (recordTags["keyword"] and recordTags["rdesc"] != 1):
out.error("The tag <rdesc> was expected to have a count of 1, but was found with a count of %d for record %s" % (recordTags["rdesc"], recordName))
- errorsFound+=1
+ errorsFound += 1
# Do some checking of what we found at the vpd level
# Top level is the manifest passed in on the command line
@@ -217,19 +246,19 @@ def parseTvpd(tvpdFile, topLevel):
for tag in ["name", "size", "VD"]:
if (vpdTags[tag] != comparer):
out.error("The tag <%s> was expected to have a count of %d, but was found with a count of %d" % (tag, comparer, vpdTags[tag]))
- errorsFound+=1
+ errorsFound += 1
# Make sure at least one record tag was found
if (vpdTags["record"] == 0):
out.error("At least one <record> must be defined for the file to be valid!")
- errorsFound+=1
+ errorsFound += 1
# If this is an included tvpd, it can only have 1 record in it
# This check is just by convention. If a compelling case to change it was provided, it could be done
if (topLevel == False):
if (vpdTags["record"] > 1):
out.error("More than 1 record entry found in %s. Only 1 record is allowed!" % (tvpdFile))
- errorsFound+=1
+ errorsFound += 1
######
# All done, vary our return based upon the errorsFound
@@ -282,8 +311,9 @@ def packKeyword(keyword, length, data, format):
# Write it
keywordPack += bytearray(data.encode())
elif (format == "hex"):
- # fromhex will deal with spacing in the data, but not carriage returns
- # Remove those before we get to fromhex
+ # Remove white space and carriage returns from the data before we get to fromhex
+ # If we don't, it throws off the ljust logic below to set the field to proper length
+ data = data.replace(" ","")
data = data.replace("\n","")
# Pad if necessary (* 2 to convert nibble data to byte length)
data = data.ljust((length * 2), '0')
@@ -321,6 +351,18 @@ def calcPadFill(record):
return pfLength
+# Check input hex data for proper formatting
+def checkHexDataFormat(kwdata):
+ # Remove white space and carriage returns from the kwdata
+ kwdata = kwdata.replace(" ","")
+ kwdata = kwdata.replace("\n","")
+ # Now look to see if there are any characters other than 0-9 & a-f
+ match = re.search("([^0-9a-fA-F]+)", kwdata)
+ if (match):
+ out.error("A non hex character \"%s\" was found at %s in the kwdata" % (match.group(), match.span()))
+ return (match, kwdata)
+
+
############################################################
# Main - Main - Main - Main - Main - Main - Main - Main
############################################################
@@ -422,7 +464,7 @@ maxSizeBytes = re.match('[0-9]*', vpdSize).group()
if (maxSizeBytes == ''):
maxSizeBytes = '0'
out.error("No number detected in the size string. Format of string must be number first, then units, e.g. 16KB. Remove any characters or white space from in front of the number.")
- errorsFound+=1
+ errorsFound += 1
# Make a new string with the number removed
sizeUnits = vpdSize[len(maxSizeBytes):]
# Remove a space, if one was inserted between the number and units
@@ -437,10 +479,10 @@ elif (sizeUnits == "Mb" or sizeUnits == "MB"):
maxSizeBytes = int(maxSizeBytes) * 1024 * 1024
elif (sizeUnits == ""):
out.error("Please specify units at the end of the size string. Acceptable units: B; KB; MB.")
- errorsFound+=1
+ errorsFound += 1
else:
out.error("Unexpected units in the size string. Expected: B; KB; MB. Yours: %s" % sizeUnits)
- errorsFound+=1
+ errorsFound += 1
# Look for rtvpdfile lines
for record in manifest.iter("record"):
@@ -453,14 +495,14 @@ for record in manifest.iter("record"):
fileName = findFile(rtvpdfile.text, clInputPath)
if (fileName == None):
out.error("The rtvpdfile %s could not be found! Please check your tvpd or input path" % (rtvpdfile.text))
- errorsFound+=1
+ errorsFound += 1
break
# Read in the rtvpdfile since it exists
(rc, recordTvpd) = parseTvpd(fileName, False)
if (rc):
out.error("Error occurred reading in %s" % fileName)
- errorsFound+=1
+ errorsFound += 1
break
# Merge the new record into the main manifest
@@ -479,7 +521,7 @@ for record in manifest.iter("record"):
subRecordName = subRecord.attrib.get("name")
if (subRecordName != recordName):
out.error("The record (%s) found in %s doesn't match the record name in the manifest (%s)" % (subRecordName, rtvpd.text, recordName))
- errorsFound+=1
+ errorsFound += 1
break
# Everything looks good, insert/remove
@@ -514,7 +556,7 @@ for record in manifest.iter("record"):
# Make sure we aren't finding a record we haven't already seen
if (recordName in recordNames):
out.error("The record \"%s\" has previously been defined in the tvpd" % recordName)
- errorsFound+=1
+ errorsFound += 1
else:
recordNames[recordName] = 1
@@ -522,7 +564,7 @@ for record in manifest.iter("record"):
# Make sure the record name is 4 charaters long
if (len(recordName) != 4):
out.error("The record name entry \"%s\" is not 4 characters long" % recordName)
- errorsFound+=1
+ errorsFound += 1
# --------
# Do very basic checking on the rbinfile if found
@@ -536,7 +578,7 @@ for record in manifest.iter("record"):
rbinfile = findFile(rbinfile, clInputPath)
if (rbinfile == None):
out.error("The rbinfile %s could not be found! Please check your tvpd or input path" % (rbinfile))
- errorsFound+=1
+ errorsFound += 1
break
# It does, read it in so we can check the record name
@@ -562,42 +604,57 @@ for record in manifest.iter("record"):
# Setup a dictionary of the supported tags
kwTags = {"keyword" : False, "kwdesc" : False, "kwformat" : False, "kwlen" : False, "kwdata" : False}
+ # Setup a dictionary of the supported tags in the kwdata tag
+ kwdTags = {"ascii" : False, "hex" : False}
# --------
# Make sure we aren't finding a record we haven't already seen
if (keywordName in keywordNames):
out.error("The keyword \"%s\" has previously been defined in record %s" % (keywordName, recordName))
- errorsFound+=1
+ errorsFound += 1
else:
keywordNames[keywordName] = 1
# --------
# We'll loop through all the tags found in this keyword and check for all required and any extra ones
for kw in keyword.iter():
+ # Comments aren't basestring tags
+ if not isinstance(kw.tag, basestring):
+ continue
+
if kw.tag in kwTags:
# Mark that we found a required tag
kwTags[kw.tag] = True
# Save the values we'll need into variables for ease of use
if (kw.tag == "kwformat"):
kwformat = kw.text.lower() # lower() for ease of compare
-
+
if (kw.tag == "kwlen"):
kwlen = int(kw.text)
-
+
if (kw.tag == "kwdata"):
- kwdata = kw.text
+ # If it's mixed format, we want kwdata to actually hold all the xml tags contained in this kwdata
+ # Otherwise, grab the plain text so we can treat it like data later
+ if (kwformat == "mixed"):
+ kwdata = kw
+ else:
+ kwdata = kw.text
+ elif kw.tag in kwdTags:
+ # Ignore the kwdTags for now, we'll check them later
+ next
+
else:
# Flag that we found an unsupported tag. This may help catch typos, etc..
out.error("The unsupported tag \"<%s>\" was found in keyword %s in record %s" % (kw.tag, keywordName, recordName))
- errorsFound+=1
+ errorsFound += 1
# --------
# Make sure all the required kwTags were found
for kw in kwTags:
if (kwTags[kw] == False):
out.error("Required tag \"<%s>\" was not found in keyword %s in record %s" % (kw, keywordName, recordName))
- errorsFound+=1
+ errorsFound += 1
# Now we know the basics of the template are correct, now do more indepth checking of length, etc..
@@ -605,13 +662,13 @@ for record in manifest.iter("record"):
# Make sure the keyword is two characters long
if (len(keywordName) != 2):
out.error("The length of the keyword %s in record %s is not 2 characters long" % (keywordName, recordName))
- errorsFound+=1
+ errorsFound += 1
# --------
# A check to make sure the RT keyword kwdata matches the name of the record we are in
if ((keywordName == "RT") and (recordName != kwdata)):
out.error("The value of the RT keyword \"%s\" does not match the record name \"%s\"" % (kwdata, recordName))
- errorsFound+=1
+ errorsFound += 1
# --------
# Check that the length specified isn't longer than the keyword supports
@@ -622,7 +679,7 @@ for record in manifest.iter("record"):
maxlen = 255
if (kwlen > maxlen):
out.error("The specified length %d is bigger than the max length %d for keyword %s in record %s" % (kwlen, maxlen, keywordName, recordName))
- errorsFound+=1
+ errorsFound += 1
# --------
# If the input format is bin, make sure the file exists and then read in the data
@@ -631,7 +688,7 @@ for record in manifest.iter("record"):
databinfile = findFile(kwdata, clInputPath)
if (databinfile == None):
out.error("The databinfile %s could not be found! Please check your tvpd or input path" % (kwdata))
- errorsFound+=1
+ errorsFound += 1
break
# It does, read it in so we can check the record name
@@ -641,14 +698,47 @@ for record in manifest.iter("record"):
# --------
# If the input format is hex, make sure the input data is hex only
if (kwformat == "hex"):
- # Remove white space and carriage returns from the kwdata
- kwdata = kwdata.replace(" ","")
- kwdata = kwdata.replace("\n","")
- # Now look to see if there are any characters other than 0-9 & a-f
- match = re.search("([^0-9a-fA-F]+)", kwdata)
- if (match):
- out.error("A non hex character \"%s\" was found at %s in the kwdata for keyword %s in record %s" % (match.group(), match.span(), keywordName, recordName))
- errorsFound+=1
+ (rc, kwdata) = checkHexDataFormat(kwdata)
+ if (rc):
+ out.error("checkHexDataFormat return an error for for keyword %s in record %s" % (keywordName, recordName))
+ errorsFound += 1
+
+ # --------
+ # If the input format is mixed, loop over the kwdata and verify it is formatted properly
+ if (kwformat == "mixed"):
+ # We can't use the length check code below for the mixed case, so track it here and check below
+ kwdatalen = 0
+ # We need to verify the format and length of the ascii or hex keywords embedded in here
+ for kwd in kwdata.iter():
+ # Comments aren't basestring tags
+ if not isinstance(kwd.tag, basestring):
+ continue
+
+ # Make sure it only contains the two keywords we expect
+ if kwd.tag.lower() in kwdTags:
+ if (kwd.tag.lower() == "ascii"):
+ kwdatalen += len(kwd.text)
+
+ if (kwd.tag.lower() == "hex"):
+ (rc, kwdata) = checkHexDataFormat(kwd.text)
+ if (rc):
+ out.error("checkHexDataFormat return an error for for keyword %s in record %s" % (keywordName, recordName))
+ errorsFound += 1
+ # Nibbles to bytes
+ kwdatalen += (len(kwdata)/2)
+
+ elif (kwd.tag.lower() == "kwdata"):
+ next # Ignore this tag at this level
+
+ else:
+ # Flag that we found an unsupported tag. This may help catch typos, etc..
+ out.error("The unsupported tag \"<%s>\" was found in kwdata for keyword %s in record %s" % (kwd.tag, keywordName, recordName))
+ errorsFound += 1
+
+ # Done looping through the tags we found, now check that the length isn't too long
+ if (kwdatalen > kwlen):
+ out.error("The total length of the mixed data is longer than the given <kwlen> for keyword %s in record %s" % (keywordName, recordName))
+ errorsFound += 1
# --------
# Verify that the data isn't longer than the length given
@@ -656,15 +746,18 @@ for record in manifest.iter("record"):
if (kwformat == "ascii" or kwformat == "bin"):
if (len(kwdata) > kwlen):
out.error("The length of the value is longer than the given <kwlen> for keyword %s in record %s" % (keywordName, recordName))
- errorsFound+=1
+ errorsFound += 1
elif (kwformat == "hex"):
# Convert hex nibbles to bytes for len compare
if ((len(kwdata)/2) > kwlen):
out.error("The length of the value is longer than the given <kwlen> for keyword %s in record %s" % (keywordName, recordName))
- errorsFound+=1
+ errorsFound += 1
+ elif (kwformat == "mixed"):
+ # The mixed tag length checking was handled above
+ next
else:
out.error("Unknown keyword format \"%s\" given for keyword %s in record %s" % (kwformat, keywordName, recordName))
- errorsFound+=1
+ errorsFound += 1
# Done with the record, reset the output
out.setIndent(2)
@@ -673,7 +766,7 @@ for record in manifest.iter("record"):
if (errorsFound):
out.msg("")
out.error("%d error%s found in the tvpd data. Please review the above errors and correct them." % (errorsFound, "s" if (errorsFound > 1) else ""))
- tvpdFileName = clOutputPath + "/" + vpdName + "-err.tvpd"
+ tvpdFileName = os.path.join(clOutputPath, vpdName + "-err.tvpd")
writeTvpd(manifest, tvpdFileName)
out.msg("Wrote tvpd file to help in debug: %s" % tvpdFileName)
exit(errorsFound)
@@ -683,8 +776,8 @@ out.setIndent(0)
out.msg("==== Stage 3: Creating binary VPD image")
out.setIndent(2)
# Create our output file names
-tvpdFileName = clOutputPath + "/" + vpdName + ".tvpd"
-vpdFileName = clOutputPath + "/" + vpdName + ".vpd"
+tvpdFileName = os.path.join(clOutputPath, vpdName + ".tvpd")
+vpdFileName = os.path.join(clOutputPath, vpdName + ".vpd")
# This is our easy one, write the XML back out
# Write out the full template vpd representing the data contained in our image
@@ -865,12 +958,22 @@ for record in manifest.iter("record"):
# Get the full path to the file given, error checked before
databinfile = findFile(kwdata, clInputPath)
kwdata = open(databinfile, mode='rb').read()
+ # If the input format is mixed, we need to concat the data together before packing
+ # We'll force all the data to hex and tell it to pack as hex
+ if (kwformat == "mixed"):
+ kwdata = "" # Reset
+ for kwd in keyword.find("kwdata"):
+ if (kwd.tag == "hex"):
+ kwdata += kwd.text
+ if (kwd.tag == "ascii"):
+ kwdata += kwd.text.encode("hex")
+ kwformat = "hex"
keywordPack = packKeyword(keywordName, kwlen, kwdata, kwformat)
recordInfo[recordName].record += keywordPack
# If the user wanted discrete binary files for each keyword writen out, we'll do it here
if (clBinaryKeywords):
- kvpdFileName = clOutputPath + "/" + vpdName + "-" + recordName + "-" + keywordName + ".kvpd"
+ kvpdFileName = os.path.join(clOutputPath, vpdName + "-" + recordName + "-" + keywordName + ".kvpd")
out.msg("Wrote record %s keyword %s kvpd file: %s" % (recordName, keywordName, kvpdFileName))
kvpdFile = open(kvpdFileName, "wb")
kvpdFile.write(keywordPack)
@@ -957,7 +1060,7 @@ for record in manifest.iter("record"):
writeDataToVPD(vpdFile, recordInfo[recordName].record)
# If the user wanted discrete binary files for each record writen out, we'll do it here
if (clBinaryRecords):
- rvpdFileName = clOutputPath + "/" + vpdName + "-" + recordName + ".rvpd"
+ rvpdFileName = os.path.join(clOutputPath, vpdName + "-" + recordName + ".rvpd")
out.msg("Wrote %s record rvpd file: %s" % (recordName, rvpdFileName))
rvpdFile = open(rvpdFileName, "wb")
rvpdFile.write(recordInfo[recordName].record)
diff --git a/docs/xmlformat.md b/docs/xmlformat.md
new file mode 100644
index 0000000..249081e
--- /dev/null
+++ b/docs/xmlformat.md
@@ -0,0 +1,193 @@
+## Introduction
+
+This file will describe the xml of the vpd template file format used to
+describe the contents of a VPD image
+
+## High Level Description
+
+The template VPD format is XML, used to describe the contents of a binary VPD image. The template file is fed into createVpd.py. It in turn interprets that XML, error checks it and creates a binary VPD image.
+
+The template consists of 3 levels
+* `<vpd>` - information about the overall VPD image
+* `<record>` - information about a record in `<vpd>`
+* `<keyword>` - information about a keyword contained in a `<record>`
+
+The XML Hierarchy looks like the following:
+``` xml
+<vpd>
+ <record>
+ <keyword>
+ </keyword>
+ <keyword>
+ </keyword>
+ </record>
+ <record>
+ <keyword>
+ ..
+ </record>
+ <record>
+ ..
+</vpd>
+```
+
+## `<vpd>`
+This section covers the required tags in the <vpd> section of the template description
+
+The top level `<vpd>` tag is required in all template files, whether it is a top level manifest description of a full image or simply a record level description. The tag requirements in the <vpd> section depend upon usage.
+
+### Tags included in the `<vpd>` section
+`<name></name>`
+Used to define the output name of the files created by the tool. This information is not stuck into the binary VPD image.
+
+If the special name of FILENAME is given, then the name of the top level manifest file will be used for the name on any output files.
+
+Can be used only once in the top level description
+Cannot be included in single record definitions
+
+`<size></size>`
+Used to define the maximum size of the binary image. If the create image will exceede this size, an error is generated by the tool.
+
+Can be used only once in the top level description
+Cannot be included in single record definitions
+
+`<VD></VD>`
+The hex value to be stuck in for the VD keyword in the VHDR
+
+Can be used only once in the top level description
+Cannot be included in single record definitions
+
+``` xml
+<record>
+ ..
+</record>
+```
+Defines the creation of a record within VPD. Please see the section on the `<record>` tag for more information on valid fields and syntax
+
+When creating a top level VPD template, at least 1 `<record>` must be defined.
+When creating a record only template description, only 1 `<record>` tag can be used. It is not allowed to include different records in a record only template.
+
+A sample `<vpd>` section would look like this:
+``` xml
+<vpd>
+ <name>simple</name>
+ <size>16kb</size>
+ <VD>01</VD>
+ <record ..>
+</vpd>
+```
+
+## `<record>`
+The record tag is used to describe the information that will go into a VPD record. You can specify this information 3 different ways.
+ * By defining the keywords to go in the record using the `<keyword>` tag
+ * By pointing to a different file with the `<rtvpdfile>` tag. That file contains the record definition that uses the `<keyword>` tag
+ * By pointing to a fully created binary representation of the record using the `<rbinfile>` tag
+One 1 of these 3 tags can be given at a time and the creation program checks to make sure that is the case.
+
+``` xml
+<record name=”NAME”>
+</record>
+```
+The name attribute is required in a ```<record>``` and must be 4 characters long.
+
+### Tags included in the `<record>`
+`<rdesc></rdesc>`
+A text description of the contents/purpose of a record. Only 1 `<rdesc>` is allowed per record
+
+``` xml
+<keyword>
+ ..
+</keyword>
+```
+Defines a keyword within a record. Please see the `<keyword>` section of the document for further descriptions.
+
+`<rtvpdfile></rtvpdfile>`
+Contains the name or path and name to a file describing the record
+
+`<rbinfile></rbinfile>`
+Contains the name or path and name to the binary version of a record. It is assumed that this file is correctly formatted and only minimally checked to make sure the record names match.
+
+A sample `<record>` section would look like this:
+
+``` xml
+<record name=”NAME”>
+ <rdesc> The NAME record</rdesc>
+ <keyword..>
+</record>
+```
+
+The inclusion of a record tvpd file would look like this:
+``` xml
+<record name=”NAME”>
+ <rtvdfile>record-NAME.tvpd</rtvpdfile>
+</record>
+```
+
+The inclusion of a record binary file would look like this:
+``` xml
+<record name=”NAME”>
+ <rbinfile>record-NAME.bin</rbinfile>
+</record>
+```
+
+## `<keyword>`
+The `<keyword>` tag is used to describe the contents of a keyword within a record.
+
+``` xml
+<keyword NAME=”NM”>
+ ..
+</keyword>
+```
+The name attribute is required and only 2 characters long
+
+### Tags included in the `<keyword>`
+
+`<kwdesc></kwdesc>`
+A description of the contents of the keyword. Only 1 tag allowed per keyword.
+
+`<kwformat></kwformat>`
+The format of the data in the `<kwdata>` tag. It can be three different values
+ * hex
+ * ascii
+ * bin
+hex and ascii data are both specified within the `<kwdata>` tag. When using the bin type, the `<kwdata>` tag is a reference to a binary file that contains just data for the keyword
+
+`<kwlen></kwlen>`
+The length of the keyword. If the data given is shorter than the keyword, the data will be right padded with zeros. If the data is longer than the `<kwlen>`, then an error is generated.
+
+`<kwdata></kwdata>`
+The data to go into the keyword. It is checked to make sure it matches the format specified. For example, that hex data has only valid hex characters.
+
+Sample keyword sections would look like this:
+
+For hex data:
+``` xml
+<keyword name="NM">
+ <kwdesc>The name keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>4</kwlen>
+ <kwdata>01AEF78DB</kwdata>
+</keyword>
+```
+
+For ascii data:
+``` xml
+<keyword name="NM">
+ <kwdesc>The name keyword</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>4</kwlen>
+ <kwdata>NAME</kwdata>
+</keyword>
+```
+
+For bin data:
+``` xml
+<keyword name="NM">
+ <kwdesc>The name keyword</kwdesc>
+ <kwformat>bin</kwformat>
+ <kwlen>4</kwlen>
+ <kwdata>name.bin</kwdata>
+</keyword>
+```
+
+## Examples
+Please see the examples dir in this repo for complete representations multiple types of template files \ No newline at end of file
diff --git a/examples/README b/examples/README
index 10f7a5a..3822563 100644
--- a/examples/README
+++ b/examples/README
@@ -1,33 +1,43 @@
Full Image Examples
===================
-memcard1_ddr3: This is an example of a VPD template for a DDR3 memory riser
+Power8 FRU VPD example:
+======================
+
+p8/memcard1_ddr3: This is an example of a VPD template for a DDR3 memory riser
card with a single memory buffer(Centaur).
-memcard4_ddr3: This is an example of a VPD template for a DDR3 memory riser
+p8/memcard4_ddr3: This is an example of a VPD template for a DDR3 memory riser
card with 2 to 4 memory buffer (Centaurs).
-memcard1_ddr4: This is an example of a VPD template for a DDR4 memory riser
+p8/memcard1_ddr4: This is an example of a VPD template for a DDR4 memory riser
card with a single memory buffer(Centaur).
-memcard4_ddr4: This is an example of a VPD template for a DDR4 memory riser
+p8/memcard4_ddr4: This is an example of a VPD template for a DDR4 memory riser
card with 2 to 4 memory buffer (Centaurs).
-sysplanar: This is an example of a VPD template for an OpenPower system
+p8/sysplanar: This is an example of a VPD template for an OpenPower system
planar (aka mother board) that does not have any memory
buffer on the card. A memory riser card will be plugged
onto this system planar.
-sysplanar32_ddr3: This is an example of a VPD template for an OpenPower system
+p8/sysplanar32_ddr3: This is an example of a VPD template for an OpenPower system
planar (aka mother board) that has upto 32 memory buffers
(Centaurs) on the card. DDR3 ISDIMMs are plugged onto this
system planar.
-sysplanar32_ddr4: This is an example of a VPD template for an OpenPower system
+p8/sysplanar32_ddr4: This is an example of a VPD template for an OpenPower system
planar (aka mother board) that has upto 32 memory buffers
(Centaurs) on the card. DDR3 ISDIMMs are plugged onto this
system planar.
+Power9 FRU VPD example:
+======================
+p9/sysplanar32_ddr4: This is an example of a VPD template for an OpenPower P9 system
+ planar (aka mother board) that has DDR4 ISDIMMs direct attach to
+ the processor on the same card that the ISDIMM are plugged onto.
+
+
Syntax Examples
===============
bindatainput: Shows the syntax to have a binary input file for the keyword
@@ -41,4 +51,4 @@ rbinfile: Shows how to include a binary file that contains an entire
simple: Most basic syntax example
tworecords: Shows how to define multiple records within one top level
- input file \ No newline at end of file
+ input file
diff --git a/examples/comments/comments.tvpd b/examples/comments/comments.tvpd
new file mode 100644
index 0000000..386911d
--- /dev/null
+++ b/examples/comments/comments.tvpd
@@ -0,0 +1,32 @@
+<?xml version='1.0' encoding='utf-8'?>
+<!-- top level comment -->
+<vpd>
+ <!-- vpd level comment -->
+ <name>FILENAME</name>
+ <size>16kb</size>
+ <VD>01</VD>
+ <record name="VINI">
+ <!-- record level comment -->
+ <rdesc>The VINI record</rdesc>
+ <keyword name="RT">
+ <!-- keyword level comment -->
+ <kwdesc>The Record Type keyword</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>4</kwlen>
+ <kwdata>VINI</kwdata>
+ </keyword>
+ <keyword name="MX">
+ <kwdesc>The Mixed Data keyword</kwdesc>
+ <kwformat>mixed</kwformat>
+ <kwlen>128</kwlen>
+ <kwdata>
+ <!-- kwdata level comment -->
+ <hex>
+ <!-- mixed level comment -->
+ FEEDB0B0DEADBEEF
+ </hex>
+ <ascii>STRING</ascii>
+ </kwdata>
+ </keyword>
+ </record>
+</vpd>
diff --git a/examples/mixeddata/mixeddata.tvpd b/examples/mixeddata/mixeddata.tvpd
new file mode 100644
index 0000000..ae15c69
--- /dev/null
+++ b/examples/mixeddata/mixeddata.tvpd
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='utf-8'?>
+<vpd>
+ <name>FILENAME</name>
+ <size>16kb</size>
+ <VD>01</VD>
+ <record name="VINI">
+ <rdesc>The VINI record</rdesc>
+ <keyword name="MX">
+ <kwdesc>Mixed Data Keyword</kwdesc>
+ <kwformat>mixed</kwformat>
+ <kwlen>128</kwlen>
+ <kwdata>
+ <hex>
+ 0123456789ABCDEF
+ </hex>
+ <ascii>STRING</ascii>
+ <hex>
+ FEEDB0B0 DEADBEEF
+ </hex>
+ </kwdata>
+ </keyword>
+ <keyword name="AS">
+ <kwdesc>The ascii keyword</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>20</kwlen>
+ <kwdata>This is text data</kwdata>
+ </keyword>
+ <keyword name="HX">
+ <kwdesc>The Hex keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>4</kwlen>
+ <kwdata>00000000</kwdata>
+ </keyword>
+ </record>
+</vpd>
diff --git a/examples/memcard1_ddr3/memcard1_ddr3.tvpd b/examples/p8/memcard1_ddr3/memcard1_ddr3.tvpd
index 0ec2368..0ec2368 100644
--- a/examples/memcard1_ddr3/memcard1_ddr3.tvpd
+++ b/examples/p8/memcard1_ddr3/memcard1_ddr3.tvpd
diff --git a/examples/memcard1_ddr3/openPower_mer0_MCsample.xml b/examples/p8/memcard1_ddr3/openPower_mer0_MCsample.xml
index b139c06..b139c06 100644
--- a/examples/memcard1_ddr3/openPower_mer0_MCsample.xml
+++ b/examples/p8/memcard1_ddr3/openPower_mer0_MCsample.xml
diff --git a/examples/memcard1_ddr3/openPower_opfr_sample.xml b/examples/p8/memcard1_ddr3/openPower_opfr_sample.xml
index ed8b5b2..ed8b5b2 100644
--- a/examples/memcard1_ddr3/openPower_opfr_sample.xml
+++ b/examples/p8/memcard1_ddr3/openPower_opfr_sample.xml
diff --git a/examples/memcard1_ddr3/openPower_spdx_membuf1_sample.xml b/examples/p8/memcard1_ddr3/openPower_spdx_membuf1_sample.xml
index d9e9ff8..d9e9ff8 100644
--- a/examples/memcard1_ddr3/openPower_spdx_membuf1_sample.xml
+++ b/examples/p8/memcard1_ddr3/openPower_spdx_membuf1_sample.xml
diff --git a/examples/memcard1_ddr3/openPower_veir_MCsample.xml b/examples/p8/memcard1_ddr3/openPower_veir_MCsample.xml
index 5948a09..5948a09 100644
--- a/examples/memcard1_ddr3/openPower_veir_MCsample.xml
+++ b/examples/p8/memcard1_ddr3/openPower_veir_MCsample.xml
diff --git a/examples/memcard1_ddr3/openPower_ver0_MCsample.xml b/examples/p8/memcard1_ddr3/openPower_ver0_MCsample.xml
index 933c01c..933c01c 100644
--- a/examples/memcard1_ddr3/openPower_ver0_MCsample.xml
+++ b/examples/p8/memcard1_ddr3/openPower_ver0_MCsample.xml
diff --git a/examples/memcard1_ddr3/openPower_vini_sample.xml b/examples/p8/memcard1_ddr3/openPower_vini_sample.xml
index 72bbaab..72bbaab 100644
--- a/examples/memcard1_ddr3/openPower_vini_sample.xml
+++ b/examples/p8/memcard1_ddr3/openPower_vini_sample.xml
diff --git a/examples/memcard1_ddr3/openPower_vmsc_sample.xml b/examples/p8/memcard1_ddr3/openPower_vmsc_sample.xml
index cc65fbd..cc65fbd 100644
--- a/examples/memcard1_ddr3/openPower_vmsc_sample.xml
+++ b/examples/p8/memcard1_ddr3/openPower_vmsc_sample.xml
diff --git a/examples/memcard1_ddr3/openPower_vndr_sample.xml b/examples/p8/memcard1_ddr3/openPower_vndr_sample.xml
index f8d6438..f8d6438 100644
--- a/examples/memcard1_ddr3/openPower_vndr_sample.xml
+++ b/examples/p8/memcard1_ddr3/openPower_vndr_sample.xml
diff --git a/examples/memcard1_ddr3/openPower_vrtn_sample.xml b/examples/p8/memcard1_ddr3/openPower_vrtn_sample.xml
index 4c2a97e..4c2a97e 100644
--- a/examples/memcard1_ddr3/openPower_vrtn_sample.xml
+++ b/examples/p8/memcard1_ddr3/openPower_vrtn_sample.xml
diff --git a/examples/memcard1_ddr4/memcard1_ddr4.tvpd b/examples/p8/memcard1_ddr4/memcard1_ddr4.tvpd
index 87ab6b0..87ab6b0 100644
--- a/examples/memcard1_ddr4/memcard1_ddr4.tvpd
+++ b/examples/p8/memcard1_ddr4/memcard1_ddr4.tvpd
diff --git a/examples/memcard1_ddr4/openPower_mer0_MCsample.xml b/examples/p8/memcard1_ddr4/openPower_mer0_MCsample.xml
index b139c06..b139c06 100644
--- a/examples/memcard1_ddr4/openPower_mer0_MCsample.xml
+++ b/examples/p8/memcard1_ddr4/openPower_mer0_MCsample.xml
diff --git a/examples/memcard1_ddr4/openPower_opfr_sample.xml b/examples/p8/memcard1_ddr4/openPower_opfr_sample.xml
index efe5d38..efe5d38 100644
--- a/examples/memcard1_ddr4/openPower_opfr_sample.xml
+++ b/examples/p8/memcard1_ddr4/openPower_opfr_sample.xml
diff --git a/examples/memcard1_ddr4/openPower_spdx_membuf1_ddr4_sample.xml b/examples/p8/memcard1_ddr4/openPower_spdx_membuf1_ddr4_sample.xml
index 7408d43..7408d43 100644
--- a/examples/memcard1_ddr4/openPower_spdx_membuf1_ddr4_sample.xml
+++ b/examples/p8/memcard1_ddr4/openPower_spdx_membuf1_ddr4_sample.xml
diff --git a/examples/memcard1_ddr4/openPower_veir_MCsample.xml b/examples/p8/memcard1_ddr4/openPower_veir_MCsample.xml
index 5948a09..5948a09 100644
--- a/examples/memcard1_ddr4/openPower_veir_MCsample.xml
+++ b/examples/p8/memcard1_ddr4/openPower_veir_MCsample.xml
diff --git a/examples/memcard1_ddr4/openPower_ver0_MCsample.xml b/examples/p8/memcard1_ddr4/openPower_ver0_MCsample.xml
index 933c01c..933c01c 100644
--- a/examples/memcard1_ddr4/openPower_ver0_MCsample.xml
+++ b/examples/p8/memcard1_ddr4/openPower_ver0_MCsample.xml
diff --git a/examples/memcard1_ddr4/openPower_vini_sample.xml b/examples/p8/memcard1_ddr4/openPower_vini_sample.xml
index 9245886..9245886 100644
--- a/examples/memcard1_ddr4/openPower_vini_sample.xml
+++ b/examples/p8/memcard1_ddr4/openPower_vini_sample.xml
diff --git a/examples/memcard1_ddr4/openPower_vmsc_sample.xml b/examples/p8/memcard1_ddr4/openPower_vmsc_sample.xml
index cc65fbd..cc65fbd 100644
--- a/examples/memcard1_ddr4/openPower_vmsc_sample.xml
+++ b/examples/p8/memcard1_ddr4/openPower_vmsc_sample.xml
diff --git a/examples/memcard1_ddr4/openPower_vndr_sample.xml b/examples/p8/memcard1_ddr4/openPower_vndr_sample.xml
index f8d6438..f8d6438 100644
--- a/examples/memcard1_ddr4/openPower_vndr_sample.xml
+++ b/examples/p8/memcard1_ddr4/openPower_vndr_sample.xml
diff --git a/examples/memcard1_ddr4/openPower_vrtn_sample.xml b/examples/p8/memcard1_ddr4/openPower_vrtn_sample.xml
index 4c2a97e..4c2a97e 100644
--- a/examples/memcard1_ddr4/openPower_vrtn_sample.xml
+++ b/examples/p8/memcard1_ddr4/openPower_vrtn_sample.xml
diff --git a/examples/memcard4_ddr3/memcard4_ddr3.tvpd b/examples/p8/memcard4_ddr3/memcard4_ddr3.tvpd
index 570dfa8..570dfa8 100644
--- a/examples/memcard4_ddr3/memcard4_ddr3.tvpd
+++ b/examples/p8/memcard4_ddr3/memcard4_ddr3.tvpd
diff --git a/examples/memcard4_ddr3/openPower_mer0_MCsample.xml b/examples/p8/memcard4_ddr3/openPower_mer0_MCsample.xml
index b139c06..b139c06 100644
--- a/examples/memcard4_ddr3/openPower_mer0_MCsample.xml
+++ b/examples/p8/memcard4_ddr3/openPower_mer0_MCsample.xml
diff --git a/examples/memcard4_ddr3/openPower_opfr_sample.xml b/examples/p8/memcard4_ddr3/openPower_opfr_sample.xml
index ed8b5b2..ed8b5b2 100644
--- a/examples/memcard4_ddr3/openPower_opfr_sample.xml
+++ b/examples/p8/memcard4_ddr3/openPower_opfr_sample.xml
diff --git a/examples/memcard4_ddr3/openPower_spdx_membuf4_sample.xml b/examples/p8/memcard4_ddr3/openPower_spdx_membuf4_sample.xml
index e376a2e..e376a2e 100644
--- a/examples/memcard4_ddr3/openPower_spdx_membuf4_sample.xml
+++ b/examples/p8/memcard4_ddr3/openPower_spdx_membuf4_sample.xml
diff --git a/examples/memcard4_ddr3/openPower_veir_MCsample.xml b/examples/p8/memcard4_ddr3/openPower_veir_MCsample.xml
index 5948a09..5948a09 100644
--- a/examples/memcard4_ddr3/openPower_veir_MCsample.xml
+++ b/examples/p8/memcard4_ddr3/openPower_veir_MCsample.xml
diff --git a/examples/memcard4_ddr3/openPower_ver0_MCsample.xml b/examples/p8/memcard4_ddr3/openPower_ver0_MCsample.xml
index 933c01c..933c01c 100644
--- a/examples/memcard4_ddr3/openPower_ver0_MCsample.xml
+++ b/examples/p8/memcard4_ddr3/openPower_ver0_MCsample.xml
diff --git a/examples/memcard4_ddr3/openPower_vini_sample.xml b/examples/p8/memcard4_ddr3/openPower_vini_sample.xml
index 72bbaab..72bbaab 100644
--- a/examples/memcard4_ddr3/openPower_vini_sample.xml
+++ b/examples/p8/memcard4_ddr3/openPower_vini_sample.xml
diff --git a/examples/memcard4_ddr3/openPower_vmsc_sample.xml b/examples/p8/memcard4_ddr3/openPower_vmsc_sample.xml
index cc65fbd..cc65fbd 100644
--- a/examples/memcard4_ddr3/openPower_vmsc_sample.xml
+++ b/examples/p8/memcard4_ddr3/openPower_vmsc_sample.xml
diff --git a/examples/memcard4_ddr3/openPower_vndr_sample.xml b/examples/p8/memcard4_ddr3/openPower_vndr_sample.xml
index f8d6438..f8d6438 100644
--- a/examples/memcard4_ddr3/openPower_vndr_sample.xml
+++ b/examples/p8/memcard4_ddr3/openPower_vndr_sample.xml
diff --git a/examples/memcard4_ddr3/openPower_vrtn_sample.xml b/examples/p8/memcard4_ddr3/openPower_vrtn_sample.xml
index 4c2a97e..4c2a97e 100644
--- a/examples/memcard4_ddr3/openPower_vrtn_sample.xml
+++ b/examples/p8/memcard4_ddr3/openPower_vrtn_sample.xml
diff --git a/examples/memcard4_ddr4/memcard4_ddr4.tvpd b/examples/p8/memcard4_ddr4/memcard4_ddr4.tvpd
index 7e23ef7..7e23ef7 100644
--- a/examples/memcard4_ddr4/memcard4_ddr4.tvpd
+++ b/examples/p8/memcard4_ddr4/memcard4_ddr4.tvpd
diff --git a/examples/memcard4_ddr4/openPower_mer0_MCsample.xml b/examples/p8/memcard4_ddr4/openPower_mer0_MCsample.xml
index b139c06..b139c06 100644
--- a/examples/memcard4_ddr4/openPower_mer0_MCsample.xml
+++ b/examples/p8/memcard4_ddr4/openPower_mer0_MCsample.xml
diff --git a/examples/memcard4_ddr4/openPower_opfr_sample.xml b/examples/p8/memcard4_ddr4/openPower_opfr_sample.xml
index efe5d38..efe5d38 100644
--- a/examples/memcard4_ddr4/openPower_opfr_sample.xml
+++ b/examples/p8/memcard4_ddr4/openPower_opfr_sample.xml
diff --git a/examples/memcard4_ddr4/openPower_spdx_membuf4_ddr4_sample.xml b/examples/p8/memcard4_ddr4/openPower_spdx_membuf4_ddr4_sample.xml
index 7d753d2..7d753d2 100644
--- a/examples/memcard4_ddr4/openPower_spdx_membuf4_ddr4_sample.xml
+++ b/examples/p8/memcard4_ddr4/openPower_spdx_membuf4_ddr4_sample.xml
diff --git a/examples/memcard4_ddr4/openPower_veir_MCsample.xml b/examples/p8/memcard4_ddr4/openPower_veir_MCsample.xml
index 5948a09..5948a09 100644
--- a/examples/memcard4_ddr4/openPower_veir_MCsample.xml
+++ b/examples/p8/memcard4_ddr4/openPower_veir_MCsample.xml
diff --git a/examples/memcard4_ddr4/openPower_ver0_MCsample.xml b/examples/p8/memcard4_ddr4/openPower_ver0_MCsample.xml
index 933c01c..933c01c 100644
--- a/examples/memcard4_ddr4/openPower_ver0_MCsample.xml
+++ b/examples/p8/memcard4_ddr4/openPower_ver0_MCsample.xml
diff --git a/examples/memcard4_ddr4/openPower_vini_sample.xml b/examples/p8/memcard4_ddr4/openPower_vini_sample.xml
index 9245886..9245886 100644
--- a/examples/memcard4_ddr4/openPower_vini_sample.xml
+++ b/examples/p8/memcard4_ddr4/openPower_vini_sample.xml
diff --git a/examples/memcard4_ddr4/openPower_vmsc_sample.xml b/examples/p8/memcard4_ddr4/openPower_vmsc_sample.xml
index cc65fbd..cc65fbd 100644
--- a/examples/memcard4_ddr4/openPower_vmsc_sample.xml
+++ b/examples/p8/memcard4_ddr4/openPower_vmsc_sample.xml
diff --git a/examples/memcard4_ddr4/openPower_vndr_sample.xml b/examples/p8/memcard4_ddr4/openPower_vndr_sample.xml
index f8d6438..f8d6438 100644
--- a/examples/memcard4_ddr4/openPower_vndr_sample.xml
+++ b/examples/p8/memcard4_ddr4/openPower_vndr_sample.xml
diff --git a/examples/memcard4_ddr4/openPower_vrtn_sample.xml b/examples/p8/memcard4_ddr4/openPower_vrtn_sample.xml
index 4c2a97e..4c2a97e 100644
--- a/examples/memcard4_ddr4/openPower_vrtn_sample.xml
+++ b/examples/p8/memcard4_ddr4/openPower_vrtn_sample.xml
diff --git a/examples/sysplanar/openPower_mer0_sample.xml b/examples/p8/sysplanar/openPower_mer0_sample.xml
index b70f1bc..b70f1bc 100644
--- a/examples/sysplanar/openPower_mer0_sample.xml
+++ b/examples/p8/sysplanar/openPower_mer0_sample.xml
diff --git a/examples/sysplanar/openPower_opfr_sample.xml b/examples/p8/sysplanar/openPower_opfr_sample.xml
index 95680a7..95680a7 100644
--- a/examples/sysplanar/openPower_opfr_sample.xml
+++ b/examples/p8/sysplanar/openPower_opfr_sample.xml
diff --git a/examples/sysplanar/openPower_osys_sample.xml b/examples/p8/sysplanar/openPower_osys_sample.xml
index c2c1c62..c2c1c62 100644
--- a/examples/sysplanar/openPower_osys_sample.xml
+++ b/examples/p8/sysplanar/openPower_osys_sample.xml
diff --git a/examples/sysplanar/openPower_veir_sample.xml b/examples/p8/sysplanar/openPower_veir_sample.xml
index 6d16f6d..6d16f6d 100644
--- a/examples/sysplanar/openPower_veir_sample.xml
+++ b/examples/p8/sysplanar/openPower_veir_sample.xml
diff --git a/examples/sysplanar/openPower_ver0_sample.xml b/examples/p8/sysplanar/openPower_ver0_sample.xml
index f4b7a2e..f4b7a2e 100644
--- a/examples/sysplanar/openPower_ver0_sample.xml
+++ b/examples/p8/sysplanar/openPower_ver0_sample.xml
diff --git a/examples/sysplanar/openPower_vini_sample.xml b/examples/p8/sysplanar/openPower_vini_sample.xml
index 5c2265a..5c2265a 100644
--- a/examples/sysplanar/openPower_vini_sample.xml
+++ b/examples/p8/sysplanar/openPower_vini_sample.xml
diff --git a/examples/sysplanar/openPower_vmsc_sample.xml b/examples/p8/sysplanar/openPower_vmsc_sample.xml
index cc65fbd..cc65fbd 100644
--- a/examples/sysplanar/openPower_vmsc_sample.xml
+++ b/examples/p8/sysplanar/openPower_vmsc_sample.xml
diff --git a/examples/sysplanar/openPower_vndr_sample.xml b/examples/p8/sysplanar/openPower_vndr_sample.xml
index f8d6438..f8d6438 100644
--- a/examples/sysplanar/openPower_vndr_sample.xml
+++ b/examples/p8/sysplanar/openPower_vndr_sample.xml
diff --git a/examples/sysplanar/openPower_vrtn_sample.xml b/examples/p8/sysplanar/openPower_vrtn_sample.xml
index 4c2a97e..4c2a97e 100644
--- a/examples/sysplanar/openPower_vrtn_sample.xml
+++ b/examples/p8/sysplanar/openPower_vrtn_sample.xml
diff --git a/examples/sysplanar/sysplanar.tvpd b/examples/p8/sysplanar/sysplanar.tvpd
index 0cbb258..0cbb258 100644
--- a/examples/sysplanar/sysplanar.tvpd
+++ b/examples/p8/sysplanar/sysplanar.tvpd
diff --git a/examples/sysplanar32_ddr3/openPower_mer0_sample.xml b/examples/p8/sysplanar32_ddr3/openPower_mer0_sample.xml
index b70f1bc..b70f1bc 100644
--- a/examples/sysplanar32_ddr3/openPower_mer0_sample.xml
+++ b/examples/p8/sysplanar32_ddr3/openPower_mer0_sample.xml
diff --git a/examples/sysplanar32_ddr3/openPower_opfr_sample.xml b/examples/p8/sysplanar32_ddr3/openPower_opfr_sample.xml
index 95680a7..95680a7 100644
--- a/examples/sysplanar32_ddr3/openPower_opfr_sample.xml
+++ b/examples/p8/sysplanar32_ddr3/openPower_opfr_sample.xml
diff --git a/examples/sysplanar32_ddr3/openPower_osys_sample.xml b/examples/p8/sysplanar32_ddr3/openPower_osys_sample.xml
index c2c1c62..c2c1c62 100644
--- a/examples/sysplanar32_ddr3/openPower_osys_sample.xml
+++ b/examples/p8/sysplanar32_ddr3/openPower_osys_sample.xml
diff --git a/examples/sysplanar32_ddr3/openPower_spdx_membuf32_sample.xml b/examples/p8/sysplanar32_ddr3/openPower_spdx_membuf32_sample.xml
index 5bf9a97..5bf9a97 100644
--- a/examples/sysplanar32_ddr3/openPower_spdx_membuf32_sample.xml
+++ b/examples/p8/sysplanar32_ddr3/openPower_spdx_membuf32_sample.xml
diff --git a/examples/sysplanar32_ddr3/openPower_veir_sample.xml b/examples/p8/sysplanar32_ddr3/openPower_veir_sample.xml
index 6d16f6d..6d16f6d 100644
--- a/examples/sysplanar32_ddr3/openPower_veir_sample.xml
+++ b/examples/p8/sysplanar32_ddr3/openPower_veir_sample.xml
diff --git a/examples/sysplanar32_ddr3/openPower_ver0_sample.xml b/examples/p8/sysplanar32_ddr3/openPower_ver0_sample.xml
index f4b7a2e..f4b7a2e 100644
--- a/examples/sysplanar32_ddr3/openPower_ver0_sample.xml
+++ b/examples/p8/sysplanar32_ddr3/openPower_ver0_sample.xml
diff --git a/examples/sysplanar32_ddr3/openPower_vini_sample.xml b/examples/p8/sysplanar32_ddr3/openPower_vini_sample.xml
index 5c2265a..5c2265a 100644
--- a/examples/sysplanar32_ddr3/openPower_vini_sample.xml
+++ b/examples/p8/sysplanar32_ddr3/openPower_vini_sample.xml
diff --git a/examples/sysplanar32_ddr3/openPower_vmsc_sample.xml b/examples/p8/sysplanar32_ddr3/openPower_vmsc_sample.xml
index cc65fbd..cc65fbd 100644
--- a/examples/sysplanar32_ddr3/openPower_vmsc_sample.xml
+++ b/examples/p8/sysplanar32_ddr3/openPower_vmsc_sample.xml
diff --git a/examples/sysplanar32_ddr3/openPower_vndr_sample.xml b/examples/p8/sysplanar32_ddr3/openPower_vndr_sample.xml
index f8d6438..f8d6438 100644
--- a/examples/sysplanar32_ddr3/openPower_vndr_sample.xml
+++ b/examples/p8/sysplanar32_ddr3/openPower_vndr_sample.xml
diff --git a/examples/sysplanar32_ddr3/openPower_vrtn_sample.xml b/examples/p8/sysplanar32_ddr3/openPower_vrtn_sample.xml
index 4c2a97e..4c2a97e 100644
--- a/examples/sysplanar32_ddr3/openPower_vrtn_sample.xml
+++ b/examples/p8/sysplanar32_ddr3/openPower_vrtn_sample.xml
diff --git a/examples/sysplanar32_ddr3/sysplanar32_ddr3.tvpd b/examples/p8/sysplanar32_ddr3/sysplanar32_ddr3.tvpd
index 9959356..9959356 100644
--- a/examples/sysplanar32_ddr3/sysplanar32_ddr3.tvpd
+++ b/examples/p8/sysplanar32_ddr3/sysplanar32_ddr3.tvpd
diff --git a/examples/sysplanar32_ddr4/openPower_mer0_sample.xml b/examples/p8/sysplanar32_ddr4/openPower_mer0_sample.xml
index b70f1bc..b70f1bc 100644
--- a/examples/sysplanar32_ddr4/openPower_mer0_sample.xml
+++ b/examples/p8/sysplanar32_ddr4/openPower_mer0_sample.xml
diff --git a/examples/sysplanar32_ddr4/openPower_opfr_sample.xml b/examples/p8/sysplanar32_ddr4/openPower_opfr_sample.xml
index 95680a7..95680a7 100644
--- a/examples/sysplanar32_ddr4/openPower_opfr_sample.xml
+++ b/examples/p8/sysplanar32_ddr4/openPower_opfr_sample.xml
diff --git a/examples/sysplanar32_ddr4/openPower_osys_sample.xml b/examples/p8/sysplanar32_ddr4/openPower_osys_sample.xml
index c2c1c62..c2c1c62 100644
--- a/examples/sysplanar32_ddr4/openPower_osys_sample.xml
+++ b/examples/p8/sysplanar32_ddr4/openPower_osys_sample.xml
diff --git a/examples/sysplanar32_ddr4/openPower_spdx_membuf32_ddr4_sample.xml b/examples/p8/sysplanar32_ddr4/openPower_spdx_membuf32_ddr4_sample.xml
index 160a192..160a192 100644
--- a/examples/sysplanar32_ddr4/openPower_spdx_membuf32_ddr4_sample.xml
+++ b/examples/p8/sysplanar32_ddr4/openPower_spdx_membuf32_ddr4_sample.xml
diff --git a/examples/sysplanar32_ddr4/openPower_veir_sample.xml b/examples/p8/sysplanar32_ddr4/openPower_veir_sample.xml
index 6d16f6d..6d16f6d 100644
--- a/examples/sysplanar32_ddr4/openPower_veir_sample.xml
+++ b/examples/p8/sysplanar32_ddr4/openPower_veir_sample.xml
diff --git a/examples/sysplanar32_ddr4/openPower_ver0_sample.xml b/examples/p8/sysplanar32_ddr4/openPower_ver0_sample.xml
index f4b7a2e..f4b7a2e 100644
--- a/examples/sysplanar32_ddr4/openPower_ver0_sample.xml
+++ b/examples/p8/sysplanar32_ddr4/openPower_ver0_sample.xml
diff --git a/examples/sysplanar32_ddr4/openPower_vini_sample.xml b/examples/p8/sysplanar32_ddr4/openPower_vini_sample.xml
index 5c2265a..5c2265a 100644
--- a/examples/sysplanar32_ddr4/openPower_vini_sample.xml
+++ b/examples/p8/sysplanar32_ddr4/openPower_vini_sample.xml
diff --git a/examples/sysplanar32_ddr4/openPower_vmsc_sample.xml b/examples/p8/sysplanar32_ddr4/openPower_vmsc_sample.xml
index cc65fbd..cc65fbd 100644
--- a/examples/sysplanar32_ddr4/openPower_vmsc_sample.xml
+++ b/examples/p8/sysplanar32_ddr4/openPower_vmsc_sample.xml
diff --git a/examples/sysplanar32_ddr4/openPower_vndr_sample.xml b/examples/p8/sysplanar32_ddr4/openPower_vndr_sample.xml
index f8d6438..f8d6438 100644
--- a/examples/sysplanar32_ddr4/openPower_vndr_sample.xml
+++ b/examples/p8/sysplanar32_ddr4/openPower_vndr_sample.xml
diff --git a/examples/sysplanar32_ddr4/openPower_vrtn_sample.xml b/examples/p8/sysplanar32_ddr4/openPower_vrtn_sample.xml
index 4c2a97e..4c2a97e 100644
--- a/examples/sysplanar32_ddr4/openPower_vrtn_sample.xml
+++ b/examples/p8/sysplanar32_ddr4/openPower_vrtn_sample.xml
diff --git a/examples/sysplanar32_ddr4/sysplanar32_ddr4.tvpd b/examples/p8/sysplanar32_ddr4/sysplanar32_ddr4.tvpd
index c48db63..c48db63 100644
--- a/examples/sysplanar32_ddr4/sysplanar32_ddr4.tvpd
+++ b/examples/p8/sysplanar32_ddr4/sysplanar32_ddr4.tvpd
diff --git a/examples/p9/sysplanar32_ddr4/openPower_memd_sample.xml b/examples/p9/sysplanar32_ddr4/openPower_memd_sample.xml
new file mode 100644
index 0000000..8ad1843
--- /dev/null
+++ b/examples/p9/sysplanar32_ddr4/openPower_memd_sample.xml
@@ -0,0 +1,549 @@
+<?xml version="1.0"?>
+<vpd>
+
+ <record name="MEMD">
+ <rdesc>Memory data record</rdesc>
+
+ <keyword name="RT">
+ <kwdesc>The Record Type keyword</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>4</kwlen>
+ <kwdata>MEMD</kwdata>
+ </keyword>
+
+ <keyword name="VD">
+ <kwdesc>Record Version keyword</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>2</kwlen>
+ <kwdata>01</kwdata>
+ </keyword>
+
+ <keyword name="VM">
+ <kwdesc>Memory data version keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>4</kwlen>
+ <kwdata>00000000</kwdata>
+ </keyword>
+
+ <keyword name="MR">
+ <kwdesc>Memory Rotator Mapper keyword </kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="J0">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="J1">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="J2">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="J3">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="J4">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="J5">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="J6">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="J7">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="J8">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="J9">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="JA">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="JB">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="JC">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="JD">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="JE">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="JF">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="JG">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="JH">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="JI">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="JJ">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="JK">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="JL">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="JM">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="JN">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="JO">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="JP">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="JQ">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="JR">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="JS">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="JT">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="JU">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="JV">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="JW">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="JX">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="JY">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="JZ">
+ <kwdesc>Memory Rotator Data keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="MT">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="X0">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="X1">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="X2">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="X3">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="X4">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="X5">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="X6">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="X7">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="X8">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="X9">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="XA">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="XB">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="XC">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="XD">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="XE">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="XF">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="XG">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="XH">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="XI">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="XJ">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="XK">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="XL">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="XM">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="XN">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="XO">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="XP">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="XQ">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="XR">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="XS">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="XT">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="XU">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="XV">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="XW">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="XX">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="XY">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="XZ">
+ <kwdesc>Memory Terminator Mapper keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>255</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ </record>
+
+</vpd>
+
diff --git a/examples/p9/sysplanar32_ddr4/openPower_mer0_sample.xml b/examples/p9/sysplanar32_ddr4/openPower_mer0_sample.xml
new file mode 100644
index 0000000..cdb7c41
--- /dev/null
+++ b/examples/p9/sysplanar32_ddr4/openPower_mer0_sample.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<vpd>
+
+ <record name="MER0">
+ <rdesc>The Manufacturing repair data record</rdesc>
+
+ <keyword name="RT">
+ <kwdesc>The Record Type keyword</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>4</kwlen>
+ <kwdata>MER0</kwdata>
+ </keyword>
+
+ <keyword name="#I">
+ <kwdesc>Repair Data </kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>198</kwlen>
+ <kwdata>455202062000</kwdata>
+ </keyword>
+
+ </record>
+
+</vpd>
diff --git a/examples/p9/sysplanar32_ddr4/openPower_opfr_sample.xml b/examples/p9/sysplanar32_ddr4/openPower_opfr_sample.xml
new file mode 100644
index 0000000..7416f58
--- /dev/null
+++ b/examples/p9/sysplanar32_ddr4/openPower_opfr_sample.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0"?>
+<vpd>
+
+ <record name="OPFR">
+ <rdesc>The OPFR record</rdesc>
+
+ <keyword name="RT">
+ <kwdesc>The Record Type keyword</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>4</kwlen>
+ <kwdata>OPFR</kwdata>
+ </keyword>
+
+ <keyword name="VD">
+ <kwdesc>Record Version</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>2</kwlen>
+ <kwdata>02</kwdata>
+ </keyword>
+
+ <keyword name="VN">
+ <kwdesc>Vendor Name</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>16</kwlen>
+ <kwdata>0000000000000000</kwdata>
+ </keyword>
+
+ <keyword name="DR">
+ <kwdesc>FRU Description</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>16</kwlen>
+ <kwdata>SYSTEM PLANAR </kwdata>
+ </keyword>
+
+ <keyword name="VP">
+ <kwdesc>Card Part Number</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>16</kwlen>
+ <kwdata>0000000000000000</kwdata>
+ </keyword>
+
+ <keyword name="VS">
+ <kwdesc>Card Serial Number</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>16</kwlen>
+ <kwdata>0000000000000000</kwdata>
+ </keyword>
+
+ <keyword name="MB">
+ <kwdesc>Manufacturing Build Date</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>8</kwlen>
+ <kwdata>0000000000000000</kwdata>
+ </keyword>
+
+ </record>
+
+</vpd>
diff --git a/examples/p9/sysplanar32_ddr4/openPower_osys_sample.xml b/examples/p9/sysplanar32_ddr4/openPower_osys_sample.xml
new file mode 100644
index 0000000..c2c1c62
--- /dev/null
+++ b/examples/p9/sysplanar32_ddr4/openPower_osys_sample.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<vpd>
+
+ <record name="OSYS">
+ <rdesc>The OpenPower System Record</rdesc>
+
+ <keyword name="RT">
+ <kwdesc>The Record Type keyword</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>4</kwlen>
+ <kwdata>OSYS</kwdata>
+ </keyword>
+
+ <keyword name="VD">
+ <kwdesc>Record Version</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>2</kwlen>
+ <kwdata>01</kwdata>
+ </keyword>
+
+ <keyword name="DR">
+ <kwdesc>FRU Description</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>16</kwlen>
+ <kwdata>SYSTEM </kwdata>
+ </keyword>
+
+ <keyword name="MM">
+ <kwdesc>Machine Type Model</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>16</kwlen>
+ <kwdata>0000000000000000</kwdata>
+ </keyword>
+
+ <keyword name="SS">
+ <kwdesc>System Serial Number</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>16</kwlen>
+ <kwdata>0000000000000000</kwdata>
+ </keyword>
+
+ <keyword name="ET">
+ <kwdesc>Enclosure Type</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>1</kwlen>
+ <kwdata>02</kwdata>
+ </keyword>
+
+ </record>
+
+</vpd>
diff --git a/examples/p9/sysplanar32_ddr4/openPower_ver0_sample.xml b/examples/p9/sysplanar32_ddr4/openPower_ver0_sample.xml
new file mode 100644
index 0000000..a834cc2
--- /dev/null
+++ b/examples/p9/sysplanar32_ddr4/openPower_ver0_sample.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<vpd>
+ <record name="VER0">
+ <rdesc>The Vendor repair data record</rdesc>
+
+ <keyword name="RT">
+ <kwdesc>The Record Type keyword</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>4</kwlen>
+ <kwdata>VER0</kwdata>
+ </keyword>
+
+ <keyword name="#I">
+ <kwdesc>Repair Data </kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>198</kwlen>
+ <kwdata>455202062000</kwdata>
+ </keyword>
+
+ </record>
+
+</vpd>
diff --git a/examples/p9/sysplanar32_ddr4/openPower_vini_sample.xml b/examples/p9/sysplanar32_ddr4/openPower_vini_sample.xml
new file mode 100644
index 0000000..7acf3b6
--- /dev/null
+++ b/examples/p9/sysplanar32_ddr4/openPower_vini_sample.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0"?>
+<vpd>
+
+ <record name="VINI">
+ <rdesc>Initial VPD Record</rdesc>
+
+ <keyword name="RT">
+ <kwdesc>The Record Type keyword</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>4</kwlen>
+ <kwdata>VINI</kwdata>
+ </keyword>
+
+ <keyword name="DR">
+ <kwdesc>Description</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>16</kwlen>
+ <kwdata>SYSTEM PLANAR </kwdata>
+ </keyword>
+
+ <keyword name="CE">
+ <kwdesc>CCIN Extension</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>1</kwlen>
+ <kwdata>1</kwdata>
+ </keyword>
+
+ <keyword name="VZ">
+ <kwdesc>Overall VPD version</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>2</kwlen>
+ <kwdata>01</kwdata>
+ </keyword>
+
+ <keyword name="FN">
+ <kwdesc>FRU Number</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>7</kwlen>
+ <kwdata>0000000</kwdata>
+ </keyword>
+
+ <keyword name="PN">
+ <kwdesc>Card Part Number</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>7</kwlen>
+ <kwdata>0000000</kwdata>
+ </keyword>
+
+ <keyword name="SN">
+ <kwdesc>Card Serial Number</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>12</kwlen>
+ <kwdata>000000000000</kwdata>
+ </keyword>
+
+ <keyword name="CC">
+ <kwdesc>Card CCIN Number</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>4</kwlen>
+ <kwdata>P0XX</kwdata>
+ </keyword>
+
+ <keyword name="HE">
+ <kwdesc>Hardware EC</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>4</kwlen>
+ <kwdata>0001</kwdata>
+ </keyword>
+
+ <keyword name="CT">
+ <kwdesc>Card Type</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>4</kwlen>
+ <kwdata>00000000</kwdata>
+ </keyword>
+
+ <keyword name="HW">
+ <kwdesc>Hardware Level</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>2</kwlen>
+ <kwdata>0001</kwdata>
+ </keyword>
+
+ <keyword name="B3">
+ <kwdesc>Hardware Characteristics</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>6</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="B4">
+ <kwdesc>Manufacturing FRU Control</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>1</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="B7">
+ <kwdesc>Hardware Level</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>12</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ </record>
+
+</vpd>
diff --git a/examples/p9/sysplanar32_ddr4/openPower_vmsc_sample.xml b/examples/p9/sysplanar32_ddr4/openPower_vmsc_sample.xml
new file mode 100644
index 0000000..cc65fbd
--- /dev/null
+++ b/examples/p9/sysplanar32_ddr4/openPower_vmsc_sample.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<vpd>
+
+ <record name="VMSC">
+ <rdesc>The VMSC record</rdesc>
+
+ <keyword name="RT">
+ <kwdesc>The Record Type keyword</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>4</kwlen>
+ <kwdata>VMSC</kwdata>
+ </keyword>
+
+ <keyword name="IN">
+ <kwdesc>Free Space for Software Data</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>205</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ </record>
+
+</vpd>
diff --git a/examples/p9/sysplanar32_ddr4/openPower_vndr_sample.xml b/examples/p9/sysplanar32_ddr4/openPower_vndr_sample.xml
new file mode 100644
index 0000000..f8d6438
--- /dev/null
+++ b/examples/p9/sysplanar32_ddr4/openPower_vndr_sample.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<vpd>
+
+ <record name="VNDR">
+ <rdesc>The VNDR record</rdesc>
+
+ <keyword name="RT">
+ <kwdesc>The Record Type keyword</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>4</kwlen>
+ <kwdata>VNDR</kwdata>
+ </keyword>
+
+ <keyword name="VD">
+ <kwdesc>Record Version</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>2</kwlen>
+ <kwdata>01</kwdata>
+ </keyword>
+
+ <keyword name="IN">
+ <kwdesc>Vendor Specific Data</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>128</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ </record>
+
+</vpd>
diff --git a/examples/p9/sysplanar32_ddr4/openPower_vrtn_sample.xml b/examples/p9/sysplanar32_ddr4/openPower_vrtn_sample.xml
new file mode 100644
index 0000000..4c2a97e
--- /dev/null
+++ b/examples/p9/sysplanar32_ddr4/openPower_vrtn_sample.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<vpd>
+
+ <record name="VRTN">
+ <rdesc>The VRTN record</rdesc>
+
+ <keyword name="RT">
+ <kwdesc>The Record Type keyword</kwdesc>
+ <kwformat>ascii</kwformat>
+ <kwlen>4</kwlen>
+ <kwdata>VRTN</kwdata>
+ </keyword>
+
+ <keyword name="SO">
+ <kwdesc>The SO keyword</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>2</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="IN">
+ <kwdesc>Free Space for Sofware Data</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>254</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ <keyword name="I2">
+ <kwdesc>Additional Free Space for Sofware Data</kwdesc>
+ <kwformat>hex</kwformat>
+ <kwlen>254</kwlen>
+ <kwdata>00</kwdata>
+ </keyword>
+
+ </record>
+
+</vpd>
diff --git a/examples/p9/sysplanar32_ddr4/sysplanar32_ddr4.tvpd b/examples/p9/sysplanar32_ddr4/sysplanar32_ddr4.tvpd
new file mode 100644
index 0000000..edac7a9
--- /dev/null
+++ b/examples/p9/sysplanar32_ddr4/sysplanar32_ddr4.tvpd
@@ -0,0 +1,46 @@
+<?xml version="1.0"?>
+<vpd>
+ <!-- OpenPower P9 system Planar with direct attached ISDIMM FRU VPD-->
+ <!-- DDR4 ISDIMMs are plugged onto this system board -->
+
+ <name>FILENAME</name>
+ <size>64kb</size>
+ <VD>01</VD>
+
+ <record name="VINI">
+ <rtvpdfile>openPower_vini_sample.xml</rtvpdfile>
+ </record>
+
+ <record name="OSYS">
+ <rtvpdfile>openPower_osys_sample.xml</rtvpdfile>
+ </record>
+
+ <record name="OPFR">
+ <rtvpdfile>openPower_opfr_sample.xml</rtvpdfile>
+ </record>
+
+ <record name="VNDR">
+ <rtvpdfile>openPower_vndr_sample.xml</rtvpdfile>
+ </record>
+
+ <record name="MEMD">
+ <rtvpdfile>openPower_memd_sample.xml</rtvpdfile>
+ </record>
+
+ <record name="VER0">
+ <rtvpdfile>openPower_ver0_sample.xml</rtvpdfile>
+ </record>
+
+ <record name="MER0">
+ <rtvpdfile>openPower_mer0_sample.xml</rtvpdfile>
+ </record>
+
+ <record name="VMSC">
+ <rtvpdfile>openPower_vmsc_sample.xml</rtvpdfile>
+ </record>
+
+ <record name="VRTN">
+ <rtvpdfile>openPower_vrtn_sample.xml</rtvpdfile>
+ </record>
+
+</vpd>
OpenPOWER on IntegriCloud