diff options
| author | Dean Sanner <dsanner@us.ibm.com> | 2017-06-01 14:05:18 -0500 |
|---|---|---|
| committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2017-06-08 10:10:23 -0400 |
| commit | f195e428f6b6494c5789c0833291321f564b058e (patch) | |
| tree | ebb1485e5fd0a5b5eb0aaa5be754bbb6fb0d0e57 /src | |
| parent | 4c586e2298ffafed3c1979784e1626868bd46f58 (diff) | |
| download | talos-hostboot-f195e428f6b6494c5789c0833291321f564b058e.tar.gz talos-hostboot-f195e428f6b6494c5789c0833291321f564b058e.zip | |
Dynamic ATTR Override support via debug interface
-Supported by debug tools (ecmd-debug-framework/Cronus)
Only in istep mode and between isteps
Requires HB to be running
-Uses output of attributeOverride tool (same format as ATTR_TMP)
-Introduces two new "debug" isteps
255,4,set_attr_overrides
255,5,clear_attr_overrides
-Once istep is triggered Hostboot sends down address/size
and the debug tool uses putmempba to push data to cache/mem.
Then Hostboot consumes just like ATTR_TMP
Change-Id: I4ade7b85acac077a15bdb36bba1ef9df4263b428
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/41271
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Reviewed-by: Prachi Gupta <pragupta@us.ibm.com>
Reviewed-by: Martin Gloff <mgloff@us.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src')
| -rwxr-xr-x | src/build/debug/Hostboot/Istep.pm | 55 | ||||
| -rwxr-xr-x | src/build/debug/ecmd-debug-framework.pl | 6 | ||||
| -rw-r--r-- | src/include/usr/fapi2/plat_attr_override_sync.H | 17 | ||||
| -rw-r--r-- | src/include/usr/isteps/spless_255list.H | 14 | ||||
| -rw-r--r-- | src/include/usr/util/utilmbox_scratch.H | 3 | ||||
| -rw-r--r-- | src/include/usr/vmmconst.h | 4 | ||||
| -rw-r--r-- | src/usr/fapi2/plat_attr_override_sync.C | 123 | ||||
| -rw-r--r-- | src/usr/initservice/istepdispatcher/sptask.C | 10 |
8 files changed, 220 insertions, 12 deletions
diff --git a/src/build/debug/Hostboot/Istep.pm b/src/build/debug/Hostboot/Istep.pm index be9029d32..8982cc8e9 100755 --- a/src/build/debug/Hostboot/Istep.pm +++ b/src/build/debug/Hostboot/Istep.pm @@ -97,6 +97,7 @@ my $opt_command = 0; my $opt_list = 0; my $opt_resume = 0; my $opt_clear_trace = 0; +my $attr_bin_file = ""; my $command = ""; @@ -245,6 +246,12 @@ sub main $opt_clear_trace = 1; $options[$i] = ""; } + if ( m/^\-{0,2}attr_bin$/ ) + { + $attr_bin_file = $args->{"attr_bin"}; + $options[$i] = ""; + } + } ## endfor ## if there's anything left after this, assume it is a single command @@ -376,9 +383,10 @@ sub checkDebugBuf { my $SCRATCH_MBOX1 = 0x00050038; my $SCRATCH_MBOX2 = 0x00050039; - my $MSG_TYPE_MASK = 0xFF00000000000000; - my $MSG_TYPE_TRACE = 0x0000000000000000; - my $MSG_TYPE_ATTR = 0x0100000000000000; + my $MSG_TYPE_MASK = 0xFF00000000000000; + my $MSG_TYPE_TRACE = 0x0000000000000000; + my $MSG_TYPE_ATTR = 0x0100000000000000; + my $MSG_TYPE_SET_ATTR = 0x0200000000000000; my $dbgAddr = ""; my $dbgSize = ""; @@ -407,6 +415,10 @@ sub checkDebugBuf { handleAttrDump($buffAddr, $buffSize); } + elsif ($msgType == $MSG_TYPE_SET_ATTR) + { + handleAttrOverride($buffAddr, $buffSize); + } #Write 0 to let HB know we extracted buf and it can continue ::writeScom($SCRATCH_MBOX1, 8, 0x0); @@ -481,6 +493,43 @@ sub handleAttrDump } } +## --------------------------------------------------------------------------- +## Push an ATTR override bin to memory +## --------------------------------------------------------------------------- +sub handleAttrOverride +{ + my $buffAddr = shift; + my $buffSize = shift; + + #Check to see if attr.bin file set + if ($attr_bin_file eq "") + { + ::userDisplay "\nATTR BIN File not set, + use [--tool-options='attr_bin=<file> set_attr_overrides']\n"; + exit 1; + } + + #Open the file, get the size + my $attrBinFile; + open ($attrBinFile, '<', $attr_bin_file) or + die "Can't open '$attr_bin_file' $!"; + my $size = -s $attr_bin_file; + + #Check that file size is less than HB allocated size + if ($size > $buffSize) + { + ::userDisplay "BIN file [$attr_bin_file] too big, $size vs $buffSize"; + exit 1; + } + + #Read in file data and actually write to mem + my $contents; + read($attrBinFile,$contents,$size); + ::writeData($buffAddr, $size, $contents); + close $attrBinFile ; +} + + ## --------------------------------------------------------------------------- ## Dump environment variable specified. diff --git a/src/build/debug/ecmd-debug-framework.pl b/src/build/debug/ecmd-debug-framework.pl index 7cb574f46..6514f5b0f 100755 --- a/src/build/debug/ecmd-debug-framework.pl +++ b/src/build/debug/ecmd-debug-framework.pl @@ -6,7 +6,7 @@ # # OpenPOWER HostBoot Project # -# Contributors Listed Below - COPYRIGHT 2013,2016 +# Contributors Listed Below - COPYRIGHT 2013,2017 # [+] International Business Machines Corp. # # @@ -220,15 +220,13 @@ sub writeData my $putmemcmd = "putmempba"; if( $memMode =~ /adu/ ) { $putmemcmd = "putmemproc"; } - my $command = sprintf( - "$putmemcmd -n%d -p%d -cft -fb %s %x -quiet -mode inj > %s", + my $command = sprintf("%s -n%d -p%d -fb %s %x -quiet -mode inj > %s", $putmemcmd, $node, $proc, $filename, $addr, $debugfile); - ::userDisplay($command); if (system($command) != 0) { system("cat $debugfile"); diff --git a/src/include/usr/fapi2/plat_attr_override_sync.H b/src/include/usr/fapi2/plat_attr_override_sync.H index 83d8fff53..4be640e33 100644 --- a/src/include/usr/fapi2/plat_attr_override_sync.H +++ b/src/include/usr/fapi2/plat_attr_override_sync.H @@ -227,6 +227,23 @@ public: void triggerAttrSync(); /** + * @brief This function will clear all attribute overrides in effect. + * This function is called by the debug interface + * + */ + void clearAttrOverrides(); + + /** + * @brief This function will allow the debug interface to set + * attribut overrides "dynamically" at any point in the IPL + * between isteps. The debug interface is used to process + * the attributes in the same format as the ATTR_TMP and ATTR_PERM + * PNOR partition binary blobs + * + */ + void dynSetAttrOverrides(); + + /** * @brief This function actually sends the FAPI Sync tank attributes * across the debug interface */ diff --git a/src/include/usr/isteps/spless_255list.H b/src/include/usr/isteps/spless_255list.H index 3f445ce37..8eb69b7bd 100644 --- a/src/include/usr/isteps/spless_255list.H +++ b/src/include/usr/isteps/spless_255list.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2012,2016 */ +/* Contributors Listed Below - COPYRIGHT 2012,2017 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -64,6 +64,8 @@ namespace INITSERVICE const uint8_t CTL_CONT_TRACE_ENABLE = 0x01; const uint8_t FLUSH_TRACE_BUFS = 0x02; const uint8_t DUMP_FAPI_ATTR = 0x03; + const uint8_t SET_ATTR_OVERRIDES = 0x04; + const uint8_t CLEAR_ATTR_OVERRIDES = 0x05; const TaskInfo g_istep255[] = { @@ -87,6 +89,16 @@ namespace INITSERVICE NULL, { NONE, EXT_IMAGE, IPL_NOOP, false } }, + { + ISTEPNAME(255,4, "set_attr_overrides"), + NULL, + { NONE, EXT_IMAGE, IPL_NOOP, false } + }, + { + ISTEPNAME(255,5, "clear_attr_overrides"), + NULL, + { NONE, EXT_IMAGE, IPL_NOOP, false } + }, }; const DepModInfo g_istep255Dependancies = { diff --git a/src/include/usr/util/utilmbox_scratch.H b/src/include/usr/util/utilmbox_scratch.H index dd9584c18..31d67b8ee 100644 --- a/src/include/usr/util/utilmbox_scratch.H +++ b/src/include/usr/util/utilmbox_scratch.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2012,2016 */ +/* Contributors Listed Below - COPYRIGHT 2012,2017 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -60,6 +60,7 @@ namespace Util MSG_TYPE_TRACE = 0x00, MSG_TYPE_ATTRDUMP = 0x01, + MSG_TYPE_ATTROVERRIDE = 0x02, }; diff --git a/src/include/usr/vmmconst.h b/src/include/usr/vmmconst.h index 8c73b9867..2f25d7d14 100644 --- a/src/include/usr/vmmconst.h +++ b/src/include/usr/vmmconst.h @@ -102,6 +102,10 @@ #define VMM_VADDR_SBE_UPDATE (3 * GIGABYTE) #define VMM_SBE_UPDATE_SIZE (900 * KILOBYTE) #define VMM_VADDR_SBE_UPDATE_END (VMM_VADDR_SBE_UPDATE + VMM_SBE_UPDATE_SIZE) +/** Debug Comm Channel is at 3.5GB, uses 32KB */ +#define VMM_VADDR_DEBUG_COMM ((3 * GIGABYTE) + (500 * MEGABYTE)) +#define VMM_DEBUG_COMM_SIZE (32 * KILOBYTE) +#define VMM_VADDR_DEBUG_COMM_END (VMM_VADDR_DEBUG_COMM + VMM_DEBUG_COMM_SIZE) /** Attribute Resource Provider */ // Note: Not simplified to make it easier to extract with the PNOR targeting diff --git a/src/usr/fapi2/plat_attr_override_sync.C b/src/usr/fapi2/plat_attr_override_sync.C index 33965118c..27659dc06 100644 --- a/src/usr/fapi2/plat_attr_override_sync.C +++ b/src/usr/fapi2/plat_attr_override_sync.C @@ -37,6 +37,8 @@ #include <string.h> #include <vector> #include <sys/msg.h> +#include <sys/mm.h> +#include <errno.h> #include <errl/errlentry.H> #include <errl/errlmanager.H> #include <mbox/mboxif.H> @@ -48,6 +50,7 @@ #include <fapi2AttrSyncData.H> #include <fapi2_attribute_service.H> #include <util/utilmbox_scratch.H> +#include <plat_utils.H> namespace fapi2 { @@ -736,7 +739,15 @@ void AttrOverrideSync::triggerAttrSync() l_attrs[i].iv_dims[1] * l_attrs[i].iv_dims[2] * l_attrs[i].iv_dims[3]; - //Get the data + //Get the data -- limit this to ATTR less than 1K in size + //otherwise can cause memory fragmentation in cache contained HB. + //Specifically this is to weed out the WOF_TABLE_DATA (128K) + if(l_bytes > KILOBYTE) + { + FAPI_INF("triggerAttrSync: ATTR %x bigger [%x] than 1K... skipping", + l_bytes); + continue; + } l_buf = reinterpret_cast<uint8_t *>(realloc(l_buf, l_bytes)); ReturnCode l_rc = rawAccessAttr( @@ -744,12 +755,17 @@ void AttrOverrideSync::triggerAttrSync() l_fapiTarget, &l_buf[0]); // Write the attribute to the SyncAttributeTank to sync to Cronus - if(l_rc == FAPI2_RC_SUCCESS) + errlHndl_t l_pErr = fapi2::rcToErrl(l_rc); + if(!l_pErr) { iv_syncTank.setAttribute(l_attrs[i].iv_attrId, l_fType, l_pos, l_unitPos, l_node, 0, l_bytes, l_buf); } + else + { + delete l_pErr; //Debug tool, ignore errors + } } } @@ -760,6 +776,109 @@ void AttrOverrideSync::triggerAttrSync() } //****************************************************************************** +void AttrOverrideSync::clearAttrOverrides() +{ +#ifndef __HOSTBOOT_RUNTIME + // Debug Channel is clearing all attribute overrides. + FAPI_INF("Debug Channel CLEAR_ALL_OVERRIDES"); + iv_overrideTank.clearAllAttributes(); + TARGETING::Target::theTargOverrideAttrTank().clearAllAttributes(); +#endif +} + +//****************************************************************************** +void AttrOverrideSync::dynSetAttrOverrides() +{ +#ifndef __HOSTBOOT_RUNTIME + errlHndl_t err = NULL; + int64_t rc = 0; + + do + { + // Create a memory block to serve as Debug Comm channel + // NOTE: using mm_alloc_block since this code is running before we + // have mainstore and we must have contiguous blocks of memory for + // Cronus putmempba + rc = mm_alloc_block( NULL, + reinterpret_cast<void*> + (VMM_VADDR_DEBUG_COMM), + VMM_DEBUG_COMM_SIZE); + if(rc == -EALREADY) + { + //-EALREADY inidciates the block is already mapped -- ignore + rc = 0; + } + + if( rc ) + { + // This is a debug interface, just emit trace and exit + FAPI_ERR("dynSetAttrOverrides() - " + "Error from mm_alloc_block : rc=%d", rc ); + break; + } + + rc = mm_set_permission(reinterpret_cast<void*> + (VMM_VADDR_DEBUG_COMM), + VMM_DEBUG_COMM_SIZE, + WRITABLE | ALLOCATE_FROM_ZERO); + if( rc ) + { + // This is a debug interface, just emit trace and exit + FAPI_ERR("dynSetAttrOverrides() - " + "Error from mm_set_permission : rc=%d", rc ); + break; + } + + //Now masquerade this at the ATTR_TMP PNOR section so the underlying + //ATTR override and bin file can be used as is + PNOR::SectionInfo_t l_sectionInfo; + l_sectionInfo.id = PNOR::ATTR_TMP; + l_sectionInfo.name = "ATTR_TMP"; + l_sectionInfo.vaddr = VMM_VADDR_DEBUG_COMM; + l_sectionInfo.flashAddr = 0xFFFFFFFF; //Not used + l_sectionInfo.size = VMM_DEBUG_COMM_SIZE; + l_sectionInfo.eccProtected = false; + l_sectionInfo.sha512Version = false; + l_sectionInfo.sha512perEC = false; + l_sectionInfo.readOnly = true; + l_sectionInfo.reprovision = false; + l_sectionInfo.secure = false; + + + //Send debug message to tool to update memory + //Must clear data to actually alloction phys pages + memset (reinterpret_cast<void*>(VMM_VADDR_DEBUG_COMM), 0xFF, + VMM_DEBUG_COMM_SIZE); + uint64_t l_addr = + mm_virt_to_phys(reinterpret_cast<void*>(VMM_VADDR_DEBUG_COMM)); + FAPI_INF("virt[%llx] phys[%llx]", VMM_VADDR_DEBUG_COMM, l_addr); + Util::writeDebugCommRegs(Util::MSG_TYPE_ATTROVERRIDE, + l_addr, + VMM_DEBUG_COMM_SIZE); + + + FAPI_INF("init: processing dynamic overrides"); + err = TARGETING::getAttrOverrides(l_sectionInfo, NULL); + if (err) + { + FAPI_ERR("Failed getAttrOverrides from dyanmic set"); + errlCommit(err, HWPF_COMP_ID); + break; + } + }while(0); + + // Attempt to clean up after ourselves. Ignore errors on cleanup + // path in debug interface + //release all pages in page block + rc = mm_remove_pages(RELEASE, reinterpret_cast<void*>(VMM_VADDR_DEBUG_COMM), + VMM_DEBUG_COMM_SIZE); + rc = mm_set_permission(reinterpret_cast<void*>(VMM_VADDR_DEBUG_COMM), + VMM_DEBUG_COMM_SIZE, NO_ACCESS | ALLOCATE_FROM_ZERO); +#endif +} + + +//****************************************************************************** void AttrOverrideSync::setAttrActionsFunc(const AttributeId i_attrId, const Target<TARGET_TYPE_ALL>& i_pTarget, const uint32_t i_size, diff --git a/src/usr/initservice/istepdispatcher/sptask.C b/src/usr/initservice/istepdispatcher/sptask.C index 0b36f7484..af9fb3841 100644 --- a/src/usr/initservice/istepdispatcher/sptask.C +++ b/src/usr/initservice/istepdispatcher/sptask.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2012,2016 */ +/* Contributors Listed Below - COPYRIGHT 2012,2017 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -116,6 +116,14 @@ void handleControlCmd( SPLessCmd & io_cmd ) fapi2::theAttrOverrideSync().triggerAttrSync(); break; + case SET_ATTR_OVERRIDES: + fapi2::theAttrOverrideSync().dynSetAttrOverrides(); + break; + + case CLEAR_ATTR_OVERRIDES: + fapi2::theAttrOverrideSync().clearAttrOverrides(); + break; + default: #ifdef CONFIG_CONSOLE_OUTPUT_PROGRESS CONSOLE::displayf(NULL, "Unknown control command %02x", io_cmd.substep); |

