summaryrefslogtreecommitdiffstats
path: root/src/build
diff options
context:
space:
mode:
authorMike Baiocchi <baiocchi@us.ibm.com>2013-09-20 14:47:15 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2013-10-28 12:21:53 -0500
commita094332bbe8807c8f24aeb79f34be063845cea10 (patch)
tree7b05b516287bd27d971ee8404a980bfad311ac2b /src/build
parent7b8d4a482ca2d110f3bf67b7a8e1bed758318420 (diff)
downloadtalos-hostboot-a094332bbe8807c8f24aeb79f34be063845cea10.tar.gz
talos-hostboot-a094332bbe8807c8f24aeb79f34be063845cea10.zip
Initial Support for Updating SBE SEEPROM
This initial commit will be used to create the new SBE directories and files. It also supports the usr functions to find and copy SBE PNOR images. NOTE: It will not enable Updating SBE SEEPROMs in the IPL. Change-Id: I3f545a134493c7595ce50fd885478bbe606de472 RTC: 47032 Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/6311 Tested-by: Jenkins Server Reviewed-by: ADAM R. MUHLE <armuhle@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com> Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/build')
-rwxr-xr-xsrc/build/buildpnor/buildSbePart.pl348
-rw-r--r--src/build/mkrules/dist.targets.mk1
-rwxr-xr-xsrc/build/mkrules/hbfw/img/makefile72
3 files changed, 416 insertions, 5 deletions
diff --git a/src/build/buildpnor/buildSbePart.pl b/src/build/buildpnor/buildSbePart.pl
new file mode 100755
index 000000000..11269bcfe
--- /dev/null
+++ b/src/build/buildpnor/buildSbePart.pl
@@ -0,0 +1,348 @@
+#!/usr/bin/perl
+# IBM_PROLOG_BEGIN_TAG
+# This is an automatically generated prolog.
+#
+# $Source: src/build/buildpnor/buildSbePart.pl $
+#
+# IBM CONFIDENTIAL
+#
+# COPYRIGHT International Business Machines Corp. 2013
+#
+# p1
+#
+# Object Code Only (OCO) source materials
+# Licensed Internal Code Source Materials
+# IBM HostBoot Licensed Internal Code
+#
+# The source code for this program is not published or otherwise
+# divested of its trade secrets, irrespective of what has been
+# deposited with the U.S. Copyright Office.
+#
+# Origin: 30
+#
+# IBM_PROLOG_END_TAG
+
+#Builds an SBE partition for PNOR based on user-provided SBE images
+#It works for both Processor SBE-IPL images and Centaur SBE images
+
+use strict;
+use File::Basename;
+use File::Temp qw/ tempfile tempdir /;
+
+my $TRAC_ERR = 0;
+# 0=errors, >0 for more traces, leaving at 1 to keep key milestone traces.
+my $g_trace = 1;
+
+my $progName = File::Basename::basename $0;
+my $outBin = "";
+my %ecImgs;
+my $injectVerHdrs = undef;
+my $tocVersion = 1; #Only version 1 currently defined
+
+if ($#ARGV < 0) {
+ usage();
+ exit;
+}
+
+
+#Parse the commandline args
+for (my $i=0; $i < $#ARGV + 1; $i++)
+{
+ if ($ARGV[$i] =~ /-h/) {
+ usage();
+ exit 0;
+ }
+ elsif($ARGV[$i] =~ /--injectVersionHeaders/) {
+ $injectVerHdrs = 1;
+ trace(2, "injectVersionHeaders flag specified");
+ }
+ elsif($ARGV[$i] =~ /--sbeOutBin/) {
+ $outBin = $ARGV[++$i];
+ trace(2, "SBE output Binary File=$outBin");
+ }
+ elsif($ARGV[$i] =~ /--ecImg/) {
+ my $argName = $ARGV[$i];
+ my $argVal = $ARGV[++$i];
+ saveInputFile("--ecImg", $argName, $argVal, \%ecImgs);
+ }
+ else {
+ traceErr("Unrecognized Input: $ARGV[$i]");
+ exit 1;
+ }
+}
+
+
+#Verify all the SBE images exist
+my $rc = verifyFilesExist(\%ecImgs);
+if($rc != 0)
+{
+ trace(0, "$progName: Error detected from call to verifyFilesExist(). Exiting");
+ exit 1;
+}
+
+#Generate the output image
+my $rc = genOutputImage($injectVerHdrs, $tocVersion, $outBin, \%ecImgs);
+if($rc != 0)
+{
+ trace(0, "$progName: Error detected from call to genOutputImage(). Exiting");
+ exit 1;
+}
+
+
+################################################################################
+# saveInputFile - save inputfile name into ecImgss array
+################################################################################
+sub saveInputFile
+{
+ my ($i_argPrefix, $i_argName, $i_argVal, $i_ecImgs) = @_;
+ my $this_func = (caller(0))[3];
+
+ #$i_argName will be something like --ecIMG_10
+ #This substr command should return just the 10, which is the image EC Level
+ my $ecLevel = substr($i_argName,
+ length($i_argPrefix)+1,
+ length($i_argName)-length($i_argPrefix));
+
+ trace(10, "$this_func: $ecLevel=$i_argVal");
+
+ $$i_ecImgs{$ecLevel} = $i_argVal;
+
+ trace(10, "$this_func: $$i_ecImgs{$ecLevel}");
+
+ #no return code expected
+}
+
+################################################################################
+# verifyFilesExist - Verify all the input files exist
+################################################################################
+sub verifyFilesExist
+{
+ my ($i_ecImgs) = @_;
+ my $this_func = (caller(0))[3];
+ my $key;
+ my $rc = 0;
+
+ for $key ( keys %$i_ecImgs)
+ {
+ unless(-e $$i_ecImgs{$key})
+ {
+ my $inputFile = $$i_ecImgs{$key};
+ trace(0, "$this_func: Specified input file ($inputFile) for key ($key) does not exist. Aborting!");
+ $rc = 1;
+ last;
+ }
+ else
+ {
+ trace(10, "$this_func: $$i_ecImgs{$key} exists");
+ }
+ }
+
+ return $rc;
+}
+
+################################################################################
+# genOutputImage - Generate output image
+# -Build SBE TOC in first 128 bytes
+# -Insert 4K header in front of each image with SHA512 as version
+# -Insert each SBE image after corresponding header
+################################################################################
+#Output image layout (Defined in Hostboot SBE Layout document)
+#word 0: 'SBE\0' eyecatcher
+#word 1: SBE TOC Layout version - currently only 1 is defined
+#word 2: SBE image EC
+#word 3: Sbe image offset in partition
+#word 4: SBE image size
+#Repeat words 2-4 for each supported EC
+
+#Actual SBE Images start at offset 0x1000 and must always be on a 4k boundary.
+################################################################################
+sub genOutputImage
+{
+ my ($i_injectVerHdrs, $i_tocVersion, $i_outBin, $i_ecImgs) = @_;
+ my $this_func = (caller(0))[3];
+ my $key;
+ my %ecOffsets;
+ my $rc = 0;
+ my $FILEHANDLE;
+ my $curOffset = 0x1000; #first offset is at 4k
+ trace(4, "$this_func: >>Enter");
+
+#open output file
+ open( $FILEHANDLE, ">:raw", $i_outBin)
+ or die "Can't open $i_outBin file for writing";
+
+ #Build the TOC
+ #WORD 0: EyeCatcher - "SBE\0" in ASCII
+ my @charArray = split //, 'SBE';
+ my $curChar;
+ foreach $curChar (@charArray)
+ {
+ print $FILEHANDLE pack('C', ord($curChar));
+ }
+
+ #Pad byte for null character after SBE
+ insertPadBytes($FILEHANDLE, 1);
+
+ #WORD 1: Version = 0x00000001
+ print $FILEHANDLE pack('N', 1);
+
+ #Insert header data for each EC provided
+ for $key ( keys %{$i_ecImgs})
+ {
+ trace(2, "$this_func: Inserting header for EC=$key");
+ my $filesize = -s $$i_ecImgs{$key};
+
+ if($i_injectVerHdrs)
+ {
+ $filesize += 0x1000;
+ }
+
+ #EC Word
+ print $FILEHANDLE pack('N', hex($key));
+
+ #Offset Word
+ print $FILEHANDLE pack('N', $curOffset);
+
+ #Size Word
+ print $FILEHANDLE pack('N', $filesize);
+
+ #safe offset for inserting images
+ $ecOffsets{$key} = $curOffset;
+
+ #generate next to 4k offset
+ $curOffset += $filesize;
+ if (($curOffset & 0x00000FFF) != 0)
+ {
+ $curOffset = $curOffset & 0xFFFFF000;
+ $curOffset += 0x1000;
+ }
+ }
+
+ close $FILEHANDLE;
+
+ #Insert actual image for each EC provided
+ for $key ( keys %{$i_ecImgs})
+ {
+ trace(2, "$this_func: Inserting data for EC=$key, offset=$ecOffsets{$key}");
+
+ my $seekOffset = $ecOffsets{$key};
+ my $inFile = $$i_ecImgs{$key};
+
+ #Image is prefixed with 4k header containing version
+ if($i_injectVerHdrs)
+ {
+ my $headerOffset = $seekOffset;
+ $seekOffset += 0x1000;
+
+ my $headerFh;
+ my $headerFile;
+ ($headerFh, $headerFile) = tempfile(UNLINK => 1);
+ #Disable file handle buffering
+
+ trace(0, "$this_func: headerFile=$headerFile");
+
+
+ #Insert 'VERSION\0' Eyecatcher
+ my @eyeCatchArray = split //, 'VERSION';
+ foreach $curChar (@eyeCatchArray)
+ {
+ print $headerFh pack('C', ord($curChar));
+ }
+ #Pad byte for null character after VERSION
+ insertPadBytes($headerFh, 1);
+
+ #make sure date written to file handle is flushed to disk
+ close $headerFh;
+
+ #Create the SHA512 hash
+ my $cmd = "sha512sum $inFile \| awk \'\{print $1\}\' \| xxd -ps -r \>> $headerFile";
+ system( $cmd ) == 0 or die "Creating $headerFile failed!";
+
+ #Write to output file
+ my $hdrdd = "dd if=$headerFile of=$i_outBin bs=1 seek=$headerOffset";
+ system ( $hdrdd ) == 0 or die "Couldn't Write $headerFile to $i_outBin!";
+ }
+ my $ddCmd = "dd if=$inFile of=$i_outBin bs=1 seek=$seekOffset";
+ system ( $ddCmd ) == 0 or die "Couldn't Write $inFile to $i_outBin!";
+
+ }
+
+ trace(4, "$this_func: <<Exit");
+
+ return $rc;
+}
+
+#################################################
+# Insert specifed number of pad bytes into file
+#
+#################################################
+sub insertPadBytes
+{
+ my ($i_FILEHANDLE, $i_padBytes) = @_;
+ my $i;
+ print $i_FILEHANDLE pack("C[$i_padBytes]", map { 0 } 1..$i_padBytes);
+
+}
+
+
+
+################################################################################
+# trace
+################################################################################
+sub traceErr
+{
+ my $i_string = shift;
+ trace($TRAC_ERR, $i_string);
+}
+
+################################################################################
+# trace
+################################################################################
+sub trace
+{
+ my $i_traceLevel;
+ my $i_string;
+
+ ($i_traceLevel, $i_string) = @_;
+
+ #traceLevel 0 is for errors
+ if($i_traceLevel == 0)
+ {
+ print "ERROR: ".$i_string."\n";
+ }
+ elsif ($g_trace >= $i_traceLevel)
+ {
+ print "TRACE: ".$i_string."\n";
+ }
+}
+
+
+
+################################################################################
+# print usage instructions
+################################################################################
+sub usage
+{
+print <<"ENDUSAGE";
+ $progName = Creates SBE partition with SBE TOC based on input data.
+
+ Usage:
+ $progName --sbeOutBin <complete SBE Partition image>
+ [--ecImg_10 <EC 10 SBE image>] [--ecImg_20 <EC_20_SBE_image>]
+ [--injectVersionHeaders]
+
+ Parms:
+ -h Print this help text
+ --sbeOutBin <file> Name of output file for PNOR Binary
+ --ecImg_<EC> <file> This is a special paramater. It is used to specify
+ input files to use for populating the partition with
+ supported SBE EC specific images
+ Examples: --binFile_10 s1_10.sbe_seeprom.bin
+ --binFile_13 s1_13.sbe_seeprom.bin
+ --binFile_20 s1_20.sbe_seeprom.bin
+ --injectVersionHeaders Injects a 4k header at the top of each image
+ containing a SHA512 Hash computed over the image.
+
+
+ENDUSAGE
+}
diff --git a/src/build/mkrules/dist.targets.mk b/src/build/mkrules/dist.targets.mk
index 44405b6a2..a17e95c0c 100644
--- a/src/build/mkrules/dist.targets.mk
+++ b/src/build/mkrules/dist.targets.mk
@@ -169,6 +169,7 @@ simics.tar_CONTENTS = \
fsp.tar_CONTENTS = \
obj/genfiles/hwp_id.html \
src/build/mkrules/hbfw/fsp/makefile \
+ src/build/buildpnor/buildSbePart.pl \
src/build/buildpnor/buildpnor.pl \
src/build/buildpnor/defaultPnorLayout.xml \
img/simics_MURANO_targeting.bin \
diff --git a/src/build/mkrules/hbfw/img/makefile b/src/build/mkrules/hbfw/img/makefile
index 94647f827..4e6aa8179 100755
--- a/src/build/mkrules/hbfw/img/makefile
+++ b/src/build/mkrules/hbfw/img/makefile
@@ -36,8 +36,13 @@ VPATH += ../fsp
DEFAULT_PATH = ${.PATH}
SRCPATH = ${DEFAULT_PATH:M*src*}
-build_all: cp_hbfiles
-install_all: build_pnor_images
+build_all: cp_hbfiles
+install_all: build_sbe_partitions build_pnor_images
+
+#Some useful search paths
+HBFW_OBJPATH = ${.PATH:M*obj*}
+ENGD_OBJPATH = ${HBFW_OBJPATH:S/hbfw\/img/engd\/href/g}
+
#################################################
# Copy Hostboot binary images to obj dir to be grabbed
@@ -96,6 +101,57 @@ clobber_cp_hbfiles:
rm -f ${ALL_HB_IMAGES} \
sbe.header secureboot.header hb.footer hostboot.stage.bin
+#################################################
+### SAMPLE for building an SBE Partition with multiple ECs
+#################################################
+#S1_EC10_BIN = ${ENGD_OBJPATH:Fs1_10.sbe_seeprom.bin}
+#s1SbePartition.bin: ${SBE_BUILD_SCRIPT} ${S1_EC10_BIN}
+# ${buildSbePart.pl:P} --sbeOutBin s1SbePartition.bin \
+# --ecImg_10 ${S1_EC10_BIN}
+#################################################
+SBE_BUILD_SCRIPT = ${buildSbePart.pl:P}
+
+S1_EC10_BIN = ${ENGD_OBJPATH:Fs1_10.sbe_seeprom.hdr.bin}
+S1_EC12_BIN = ${ENGD_OBJPATH:Fs1_12.sbe_seeprom.hdr.bin}
+S1_EC13_BIN = ${ENGD_OBJPATH:Fs1_13.sbe_seeprom.hdr.bin}
+S1_EC20_BIN = ${ENGD_OBJPATH:Fs1_20.sbe_seeprom.hdr.bin}
+P8_EC10_BIN = ${ENGD_OBJPATH:Fp8_10.sbe_seeprom.hdr.bin}
+CENT_EC10_BIN = ${ENGD_OBJPATH:Fcentaur_10.sbe_seeprom.hdr.bin}
+CENT_EC20_BIN = ${ENGD_OBJPATH:Fcentaur_20.sbe_seeprom.hdr.bin}
+
+SBE_PART_INFO = \
+ s1SbePartition.bin:10=${S1_EC10_BIN},12=${S1_EC12_BIN},13=${S1_EC13_BIN},20=${S1_EC20_BIN} \
+ p8SbePartition.bin:10=${P8_EC10_BIN} \
+ centSbePartition.bin:10=${CENT_EC10_BIN},20=${CENT_EC20_BIN}
+
+
+__SBE_PART_BUILD/% : .SPECTARG .PMAKE
+ @${MAKE:T:R} BUILD_SPECIFIC_SBEPART \
+ "SBE_PART_PARAMS=${.TARGET:s/__SBE_PART_BUILD\///:s/:/ /g}"
+
+.ifdef SBE_PART_PARAMS
+
+SBEPART_TARGET = ${SBE_PART_PARAMS:xs/ .*//}
+SBEPART_SECTIONS = ${SBE_PART_PARAMS:xs/[^ ]* //:xs/ .*//}
+SBEPART_BINS = ${SBEPART_SECTIONS:s/,/ /g:xS/[^=]*=//g}
+SBEPART_BIN_OPTION = ${SBEPART_SECTIONS:s/,/ /g:S/^/--ecImg_/g:s/=/ /g:p}
+
+BUILD_SPECIFIC_SBEPART: .SPECTARG ${SBEPART_TARGET}
+ #@echo TARGET ${SBEPART_TARGET}
+ #@echo LAYOUT ${SBEPART_LAYOUT}
+ #@echo BINARIES ${SBEPART_BINS}
+ #@echo BIN_OPTION ${SBEPART_BIN_OPTION}
+
+${SBEPART_TARGET}: ${SBEPART_LAYOUT} ${SBEPART_BINS} ${PNOR_BUILD_SCRIPT}
+ ${SBE_BUILD_SCRIPT} --sbeOutBin ${SBEPART_TARGET} \
+ ${SBEPART_BIN_OPTION}
+
+.endif
+
+build_sbe_partitions: .SPECTARG ${SBE_PART_INFO:S/^/__SBE_PART_BUILD\//g}
+
+clobber_build_sbe_partitions:
+ ${SBE_PART_INFO:@image@${pnorimg:!rm -f ${image:s/:/ /g:xs/ .*//};!e}@}
#################################################
### SAMPLE for building a PNOR image
@@ -123,10 +179,16 @@ HOSTBOOT_DEFAULT_SECTIONS = HBB=${BASE_W_HEADER_ECC_IMAGE},HBI=${EXT_HEADER_IMAG
HBFW_OBJPATH = ${.PATH:M*obj*}
ENGD_OBJPATH = ${HBFW_OBJPATH:S/hbfw\/img/engd\/href/g}
+MURANO_TARG_IMG = simics_MURANO_targeting.bin
+VENICE_TARG_IMG = simics_VENICE_targeting.bin
MURANO_SLW_IMG = ${ENGD_OBJPATH:Fs1.ref_image.bin}
VENICE_SLW_IMG = ${ENGD_OBJPATH:Fp8.ref_image.bin}
-MURANO_SECT = HBD=simics_MURANO_targeting.bin,WINK=${MURANO_SLW_IMG}
-VENICE_SECT = HBD=simics_VENICE_targeting.bin,WINK=${VENICE_SLW_IMG}
+MURANO_SBE_IMG = s1SbePartition.bin
+VENICE_SBE_IMG = p8SbePartition.bin
+SBEC_IMG = centSbePartition.bin
+MURANO_SECT = HBD=${MURANO_TARG_IMG},SBE=${MURANO_SBE_IMG},SBEC=${SBEC_IMG},WINK=${MURANO_SLW_IMG}
+VENICE_SECT = HBD=${VENICE_TARG_IMG},SBE=${VENICE_SBE_IMG},SBEC=${SBEC_IMG},WINK=${VENICE_SLW_IMG}
+
PNOR_IMG_INFO = \
murano.pnor:defaultPnorLayout.xml:${MURANO_SECT},${HOSTBOOT_DEFAULT_SECTIONS} \
@@ -180,7 +242,7 @@ clobber_build_pnor_images:
FLASH_DEST = $(MAKETOP)$(OBJECTDIRTOP)../images/$(CONTEXT)/lab/flash
FLASH_IMG = ${BASE_IMAGE} ${BASE_ECC_IMAGE}
-update_images_for_sandbox: build_pnor_images
+update_images_for_sandbox: build_sbe_partitions build_pnor_images
mkdir -p ${FLASH_DEST}
#Copy hostboot base image to flash dir
${FLASH_IMG:@image@${baseimg:!cd ${FLASH_DEST}; cp -f ${.PATH:F${image}} ${image};!e}@}
OpenPOWER on IntegriCloud