diff options
Diffstat (limited to 'src/usr/targeting/xmltohb/genHwsvMrwXml.pl')
-rwxr-xr-x | src/usr/targeting/xmltohb/genHwsvMrwXml.pl | 2876 |
1 files changed, 0 insertions, 2876 deletions
diff --git a/src/usr/targeting/xmltohb/genHwsvMrwXml.pl b/src/usr/targeting/xmltohb/genHwsvMrwXml.pl deleted file mode 100755 index b77546049..000000000 --- a/src/usr/targeting/xmltohb/genHwsvMrwXml.pl +++ /dev/null @@ -1,2876 +0,0 @@ -#!/usr/bin/perl -# IBM_PROLOG_BEGIN_TAG -# This is an automatically generated prolog. -# -# $Source: src/usr/targeting/xmltohb/genHwsvMrwXml.pl $ -# -# IBM CONFIDENTIAL -# -# COPYRIGHT International Business Machines Corp. 2012,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 -# Author: Van Lee vanlee@us.ibm.com -# -# Usage: -# -# genHwsvMrwXml.pl --system=systemname --mrwdir=pathname -# [--build=hb] [--outfile=XmlFilename] -# --system=systemname -# Specify which system MRW XML to be generated -# --mrwdir=pathname -# Specify the complete dir pathname of the MRW. -# --build=hb -# Specify HostBoot build (hb) -# --outfile=XmlFilename -# Specify the filename for the output XML. If omitted, the output -# is written to STDOUT which can be saved by redirection. -# -# Purpose: -# -# This perl script processes the various xml files of the Tuleta MRW to -# extract the needed information for generating the final xml file. -# - -use strict; -use XML::Simple; -use Data::Dumper; - -################################################################################ -# Set PREFERRED_PARSER to XML::Parser. Otherwise it uses XML::SAX which contains -# bugs that result in XML parse errors that can be fixed by adjusting white- -# space (i.e. parse errors that do not make sense). -################################################################################ -$XML::Simple::PREFERRED_PARSER = 'XML::Parser'; - -my $mrwdir = ""; -my $sysname = ""; -my $usage = 0; -my $outFile = ""; -my $build = "fsp"; -use Getopt::Long; -GetOptions( "mrwdir:s" => \$mrwdir, - "system:s" => \$sysname, - "outfile:s" => \$outFile, - "build:s" => \$build, - "help" => \$usage, ); - -if ($usage || ($mrwdir eq "")) -{ - display_help(); - exit 0; -} - -if ($outFile ne "") -{ - open OUTFILE, '+>', $outFile || - die "ERROR: unable to create $outFile\n"; - select OUTFILE; -} - -my $SYSNAME = uc($sysname); - -open (FH, "<$mrwdir/${sysname}-system-policy.xml") || - die "ERROR: unable to open $mrwdir/${sysname}-system-policy.xml\n"; -close (FH); - -my $policy = XMLin("$mrwdir/${sysname}-system-policy.xml"); - -my $SystemAttrs = XMLin("$mrwdir/${sysname}-system-policy.xml", - forcearray=>['required-policy-settings']); -my @systemAttr; - -use constant SYS_ATTR_START_INDEX=>0; - -foreach my $i (@{$SystemAttrs->{'required-policy-settings'}}) -{ - my $freqA = sprintf("0x%04X",$i->{'proc_a_frequency'}->{content}); - my $freqPB = sprintf("0x%04X",$i->{'proc_pb_frequency'}->{content}); - my $freqPCIE = sprintf("0x%04X",$i->{'proc_pcie_frequency'}->{content}); - my $freqX = sprintf("0x%04X",$i->{'proc_x_frequency'}->{content}); - - #TODO: SW187611 remove the hard core value for FREQ_CORE_FLOOR - - push @systemAttr, ["ALL_MCS_IN_INTERLEAVING_GROUP", - $i->{all_mcs_in_interleaving_group}, - "FREQ_A", - $freqA, - "FREQ_CORE_FLOOR", - "0x2580", - "FREQ_PB", - $freqPB, - "FREQ_PCIE", - $freqPCIE, - "FREQ_X", - $freqX, - "MSS_CLEANER_ENABLE", - $i->{mss_cleaner_enable}, - "MSS_MBA_ADDR_INTERLEAVE_BIT", - $i->{mss_mba_addr_interleave_bit}, - "MSS_MBA_CACHELINE_INTERLEAVE_MODE", - $i->{mss_mba_cacheline_interleave_mode}, - "MSS_MCA_HASH_MODE", - $i->{mss_mca_hash_mode}, - "MSS_PREFETCH_ENABLE", - $i->{mss_prefetch_enable}, - "PROC_EPS_TABLE_TYPE", - $i->{proc_eps_table_type}, - "PROC_FABRIC_PUMP_MODE", - $i->{proc_fabric_pump_mode}, - "PROC_X_BUS_WIDTH", - $i->{proc_x_bus_width}]; -} - -open (FH, "<$mrwdir/${sysname}-proc-pcie-settings.xml") || - die "ERROR: unable to open $mrwdir/${sysname}-proc-pcie-settings.xml\n"; -close (FH); - -my $ProcPcie = XMLin("$mrwdir/${sysname}-proc-pcie-settings.xml"); - -use constant PCIE_NODE_INDEX => 0; -use constant PCIE_POS_INDEX => 1; -#the constant below is used in the addProcPcieAttrs() function. Reason to start -#at 2 is because the first two entries are not part of the loop to print out -#the pcie data - -use constant PCIE_START_INDEX =>2; - -my @procPcie; -foreach my $i (@{$ProcPcie->{'processor-settings'}}) -{ - push @procPcie, [$i->{target}->{node}, - $i->{target}->{position}, - "PROC_PCIE_IOP_G2_PLL_CONTROL0", - $i->{proc_pcie_iop_g2_pll_control0_iop0}, - $i->{proc_pcie_iop_g2_pll_control0_iop1}, - "PROC_PCIE_IOP_G3_PLL_CONTROL0", - $i->{proc_pcie_iop_g3_pll_control0_iop0}, - $i->{proc_pcie_iop_g3_pll_control0_iop1}, - "PROC_PCIE_IOP_PCS_CONTROL0", - $i->{proc_pcie_iop_pcs_control0_iop0}, - $i->{proc_pcie_iop_pcs_control0_iop1}, - "PROC_PCIE_IOP_PCS_CONTROL1", - $i->{proc_pcie_iop_pcs_control1_iop0}, - $i->{proc_pcie_iop_pcs_control1_iop1}, - "PROC_PCIE_IOP_PLL_GLOBAL_CONTROL0", - $i->{proc_pcie_iop_pll_global_control0_iop0}, - $i->{proc_pcie_iop_pll_global_control0_iop1}, - "PROC_PCIE_IOP_PLL_GLOBAL_CONTROL1", - $i->{proc_pcie_iop_pll_global_control1_iop0}, - $i->{proc_pcie_iop_pll_global_control1_iop1}, - "PROC_PCIE_IOP_RX_PEAK", - $i->{proc_pcie_iop_rx_peak_iop0}, - $i->{proc_pcie_iop_rx_peak_iop1}, - "PROC_PCIE_IOP_RX_SDL", - $i->{proc_pcie_iop_rx_sdl_iop0}, - $i->{proc_pcie_iop_rx_sdl_iop1}, - "PROC_PCIE_IOP_RX_VGA_CONTROL2", - $i->{proc_pcie_iop_rx_vga_control2_iop0}, - $i->{proc_pcie_iop_rx_vga_control2_iop1}, - "PROC_PCIE_IOP_TX_BWLOSS1", - $i->{proc_pcie_iop_tx_bwloss1_iop0}, - $i->{proc_pcie_iop_tx_bwloss1_iop1}, - "PROC_PCIE_IOP_TX_FIFO_OFFSET", - $i->{proc_pcie_iop_tx_fifo_offset_iop0}, - $i->{proc_pcie_iop_tx_fifo_offset_iop1}, - "PROC_PCIE_IOP_TX_RCVRDETCNTL", - $i->{proc_pcie_iop_tx_rcvrdetcntl_iop0}, - $i->{proc_pcie_iop_tx_rcvrdetcntl_iop1}, - "PROC_PCIE_IOP_ZCAL_CONTROL", - $i->{proc_pcie_iop_zcal_control_iop0}, - $i->{proc_pcie_iop_zcal_control_iop1}]; -} - - -my @SortedPcie = sort byPcieNodePos @procPcie; - -open (FH, "<$mrwdir/${sysname}-chip-ids.xml") || - die "ERROR: unable to open $mrwdir/${sysname}-chip-ids.xml\n"; -close (FH); - -my $chipIds = XMLin("$mrwdir/${sysname}-chip-ids.xml"); - -use constant CHIP_ID_NODE => 0; -use constant CHIP_ID_POS => 1; -use constant CHIP_ID_PATH => 2; - -my @chipIDs; -foreach my $i (@{$chipIds->{'chip-id'}}) -{ - push @chipIDs, [ $i->{node}, $i->{position}, $i->{'instance-path'} ]; -} - -open (FH, "<$mrwdir/${sysname}-power-busses.xml") || - die "ERROR: unable to open $mrwdir/${sysname}-power-busses.xml\n"; -close (FH); - -my $powerbus = XMLin("$mrwdir/${sysname}-power-busses.xml"); - -my @pbus; -use constant PBUS_FIRST_END_POINT_INDEX => 0; -use constant PBUS_SECOND_END_POINT_INDEX => 1; -use constant PBUS_DOWNSTREAM_INDEX => 2; -use constant PBUS_UPSTREAM_INDEX => 3; -foreach my $i (@{$powerbus->{'power-bus'}}) -{ - # Pull out the connection information from the description - # example: n0:p0:A2 to n0:p2:A2 - my $endp1 = $i->{'description'}; - my $endp2 = $endp1; - $endp1 =~ s/^(.*) to.*/$1/; - $endp2 =~ s/.* to (.*)\s*$/$1/; - # Grab the lane swap information - my $dwnstrm_swap = $i->{'downstream-n-p-lane-swap-mask'}; - my $upstrm_swap = $i->{'upstream-n-p-lane-swap-mask'}; - #print STDOUT "powerbus: $endp1, $endp2, $dwnstrm_swap, $upstrm_swap\n"; - push @pbus, [ lc($endp1), lc($endp2), $dwnstrm_swap, $upstrm_swap ]; - push @pbus, [ lc($endp2), lc($endp1), $dwnstrm_swap, $upstrm_swap ]; -} - -open (FH, "<$mrwdir/${sysname}-dmi-busses.xml") || - die "ERROR: unable to open $mrwdir/${sysname}-dmi-busses.xml\n"; -close (FH); - -my $dmibus = XMLin("$mrwdir/${sysname}-dmi-busses.xml"); - -my @dbus_mcs; -use constant DBUS_MCS_NODE_INDEX => 0; -use constant DBUS_MCS_PROC_INDEX => 1; -use constant DBUS_MCS_UNIT_INDEX => 2; -use constant DBUS_MCS_DOWNSTREAM_INDEX => 3; - -my @dbus_centaur; -use constant DBUS_CENTAUR_NODE_INDEX => 0; -use constant DBUS_CENTAUR_MEMBUF_INDEX => 1; -use constant DBUS_CENTAUR_UPSTREAM_INDEX => 2; -foreach my $dmi (@{$dmibus->{'dmi-bus'}}) -{ - # First grab the MCS information - # MCS is always master so it gets downstream - my $node = $dmi->{'mcs'}->{'target'}->{'node'}; - my $proc = $dmi->{'mcs'}->{'target'}->{'position'}; - my $mcs = $dmi->{'mcs'}->{'target'}->{'chipUnit'}; - my $swap = $dmi->{'downstream-n-p-lane-swap-mask'}; - #print STDOUT "dbus_mcs: n$node:p$proc:mcs:$mcs swap:$swap\n"; - push @dbus_mcs, [ $node, $proc, $mcs, $swap ]; - - # Now grab the centuar chip information - # Centaur is always slave so it gets upstream - my $node = $dmi->{'centaur'}->{'target'}->{'node'}; - my $membuf = $dmi->{'centaur'}->{'target'}->{'position'}; - my $swap = $dmi->{'upstream-n-p-lane-swap-mask'}; - #print STDOUT "dbus_centaur: n$node:cen$membuf swap:$swap\n"; - push @dbus_centaur, [ $node, $membuf, $swap ]; -} - - -open (FH, "<$mrwdir/${sysname}-cent-vrds.xml") || - die "ERROR: unable to open $mrwdir/${sysname}-cent-vrds.xml\n"; -close (FH); - -my $vmemCentaur = XMLin("$mrwdir/${sysname}-cent-vrds.xml"); - -# Capture all pnor attributes into the @unsortedPnorTargets array -use constant VMEM_DEV_PATH_FIELD => 0; -use constant VMEM_I2C_ADDR_FIELD => 1; -use constant VMEM_ID_FIELD => 2; -use constant VMEM_NODE_FIELD => 3; -use constant VMEM_POS_FIELD => 4; - -my $vmemId = 0x0; - -my @unsortedVmem; -my @vmemArray; -my @vmemDevAddr; -my $vmemValue =0; -my $found=0; -my $loc=0; -my $newValue =0; - -foreach my $i (@{$vmemCentaur->{'centaur-vrd-connection'}}) -{ - my $vmemDev = $i->{'vrd'}->{'i2c-dev-path'}; - my $vmemAddr = $i->{'vrd'}->{'i2c-address'}; - - for my $j (0 .. $#vmemDevAddr) - { - if ( ($vmemDev eq $vmemDevAddr[$j][VMEM_DEV_PATH_FIELD]) && - ($vmemAddr eq $vmemDevAddr[$j][VMEM_I2C_ADDR_FIELD]) ) - { - $found =1; - $vmemValue=$vmemDevAddr[$j][VMEM_ID_FIELD]; - last; - } - else - { - $found=0; - } - } - if ($found ==0) - { - $vmemValue=$newValue++; - push (@vmemDevAddr,[$vmemDev, $vmemAddr, $vmemValue]); - } - - - my $vmemNode = $i->{'centaur'}->{'target'}->{'node'}; - my $vmemPosition = $i->{'centaur'}->{'target'}->{'position'}; - - push (@unsortedVmem,[$vmemDev, $vmemAddr, $vmemValue, $vmemNode, - $vmemPosition]); -} - - -my @SortedVmem = sort byVmemNodePos @unsortedVmem; - - -open (FH, "<$mrwdir/${sysname}-lpc2spi.xml") || - die "ERROR: unable to open $mrwdir/${sysname}-lpc2spi.xml\n"; -close (FH); - -my $pnorPath = XMLin("$mrwdir/${sysname}-lpc2spi.xml", - forcearray=>['proc-to-pnor-connection']); - -# Capture all pnor attributes into the @unsortedPnorTargets array -use constant PNOR_MTD_CHAR_FIELD => 0; -use constant PNOR_BLOCK_DEV_FIELD => 1; -use constant PNOR_POS_FIELD => 2; -use constant PNOR_NODE_FIELD => 3; -use constant PNOR_PROC_FIELD => 4; - -my @unsortedPnorTargets; -foreach my $i (@{$pnorPath->{'proc-to-pnor-connection'}}) -{ - my $mtdCharDev = $i->{'lpc2spi'}->{'fsp-dev-paths'}->{'fsp-dev-path'}-> - {'character-dev-path'}; - my $mtdBlockDev = $i->{'lpc2spi'}->{'fsp-dev-paths'}->{'fsp-dev-path'}-> - {'block-dev-path'}; - - my $pnorPosition = $i->{'flash'}->{'target'}->{'position'}; - my $nodePosition = $i->{'flash'}->{'target'}->{'node'}; - - my $procPosition = $i->{'processor'}->{'target'}->{'position'}; - - push (@unsortedPnorTargets,[$mtdCharDev, $mtdBlockDev, $pnorPosition, - $nodePosition, $procPosition]); - -} - -my @SortedPnor = sort byPnorNodePos @unsortedPnorTargets; - -open (FH, "<$mrwdir/${sysname}-cec-chips.xml") || - die "ERROR: unable to open $mrwdir/${sysname}-cec-chips.xml\n"; -close (FH); - -my $devpath = XMLin("$mrwdir/${sysname}-cec-chips.xml", - KeyAttr=>'instance-path'); - -open (FH, "<$mrwdir/${sysname}-i2c-busses.xml") || - die "ERROR: unable to open $mrwdir/${sysname}-i2c-busses.xml\n"; -close (FH); - -my $i2c_devices = XMLin("$mrwdir/${sysname}-i2c-busses.xml"); - -open (FH, "<$mrwdir/${sysname}-pcie-busses.xml") || - die "ERROR: unable to open $mrwdir/${sysname}-pcie-busses.xml\n"; -close (FH); - -my $pcie_buses = XMLin("$mrwdir/${sysname}-pcie-busses.xml"); -my %pcie_list; - -foreach my $pcie_bus (@{$pcie_buses->{'pcie-bus'}}) -{ - foreach my $lane_set (0,1) - { - $pcie_list{$pcie_bus->{source}->{'instance-path'}}->{$pcie_bus-> - {source}->{iop}}->{$lane_set}-> - {'lane-mask'} = 0; - $pcie_list{$pcie_bus->{source}->{'instance-path'}}->{$pcie_bus-> - {source}->{iop}}->{$lane_set}-> - {'dsmp-capable'} = 0; - $pcie_list{$pcie_bus->{source}->{'instance-path'}}->{$pcie_bus-> - {source}->{iop}}->{$lane_set}-> - {'lane-swap'} = 0; - $pcie_list{$pcie_bus->{source}->{'instance-path'}}->{$pcie_bus-> - {source}->{iop}}->{$lane_set}-> - {'lane-reversal'} = 0; - $pcie_list{$pcie_bus->{source}->{'instance-path'}}->{$pcie_bus-> - {source}->{iop}}->{$lane_set}-> - {'is-slot'} = 0; - } - -} -foreach my $pcie_bus (@{$pcie_buses->{'pcie-bus'}}) -{ - - my $dsmp_capable = 0; - my $is_slot = 0; - if((exists($pcie_bus->{source}->{'dsmp-capable'}))&& - ($pcie_bus->{source}->{'dsmp-capable'} eq 'Yes')) - { - - $dsmp_capable = 1; - } - - if((exists($pcie_bus->{endpoint}->{'is-slot'}))&& - ($pcie_bus->{endpoint}->{'is-slot'} eq 'Yes')) - { - - $is_slot = 1; - } - my $lane_set = 0; - if(($pcie_bus->{source}->{'lane-mask'} eq '0xFFFF')|| - ($pcie_bus->{source}->{'lane-mask'} eq '0xFF00')) - { - $lane_set = 0; - } - else - { - if($pcie_bus->{source}->{'lane-mask'} eq '0x00FF') - { - $lane_set = 1; - } - - } - $pcie_list{$pcie_bus->{source}->{'instance-path'}}->{$pcie_bus->{source}-> - {iop}}->{$lane_set}->{'lane-mask'} = $pcie_bus->{source}->{'lane-mask'}; - $pcie_list{$pcie_bus->{source}->{'instance-path'}}->{$pcie_bus->{source}-> - {iop}}->{$lane_set}->{'dsmp-capable'} = $dsmp_capable; - $pcie_list{$pcie_bus->{source}->{'instance-path'}}->{$pcie_bus->{source}-> - {iop}}->{$lane_set}->{'lane-swap'} = oct($pcie_bus->{source}-> - {'lane-swap-bits'}); - $pcie_list{$pcie_bus->{source}->{'instance-path'}}->{$pcie_bus->{source}-> - {iop}}->{$lane_set}->{'lane-reversal'} = oct($pcie_bus->{source}-> - {'lane-reversal-bits'}); - $pcie_list{$pcie_bus->{source}->{'instance-path'}}->{$pcie_bus->{source}-> - {iop}}->{$lane_set}->{'is-slot'} = $is_slot; - -} -my %bifurcation_list; -foreach my $pcie_bus (@{$pcie_buses->{'pcie-bus'}}) -{ - foreach my $lane_set (0,1) - { - $bifurcation_list{$pcie_bus->{source}->{'instance-path'}}->{$pcie_bus-> - {source}->{iop}}->{$lane_set}->{'lane-mask'}= 0; - $bifurcation_list{$pcie_bus->{source}->{'instance-path'}}->{$pcie_bus-> - {source}->{iop}}->{$lane_set}->{'lane-swap'}= 0; - $bifurcation_list{$pcie_bus->{source}->{'instance-path'}}->{$pcie_bus-> - {source}->{iop}}->{$lane_set}->{'lane-reversal'}= 0; - } - - -} -foreach my $pcie_bus (@{$pcie_buses->{'pcie-bus'}}) -{ - - if( exists($pcie_bus->{source}->{'bifurcation-settings'})) - { - my $bi_cnt = 0; - foreach my $bifurc (@{$pcie_bus->{source}->{'bifurcation-settings'}-> - {'bifurcation-setting'}}) - { - my $lane_swap = 0; - $bifurcation_list{$pcie_bus->{source}->{'instance-path'}}-> - {$pcie_bus->{source}->{iop}}{$bi_cnt}-> - {'lane-mask'} = $bifurc->{'lane-mask'}; - $bifurcation_list{$pcie_bus->{source}->{'instance-path'}}-> - {$pcie_bus->{source}->{iop}}{$bi_cnt}-> - {'lane-swap'} = oct($bifurc->{'lane-swap-bits'}); - $bifurcation_list{$pcie_bus->{source}->{'instance-path'}}-> - {$pcie_bus->{source}->{iop}}{$bi_cnt}-> - {'lane-reversal'} = oct($bifurc-> - {'lane-reversal-bits'}); - $bi_cnt++; - - } - - - } -} - - -my %sbe_i2c_paths; -foreach my $i2c_device (@{$i2c_devices->{'i2c-device'}}) -{ - if( (exists($i2c_device->{'content-type'})) - && ($i2c_device->{'content-type'} eq 'SBE_VPD')) - { - my $dev_path = - $i2c_device->{'system-paths'}->{'system-path'}->{'fsp-device-path'}; - my $ipath = $i2c_device->{'i2c-master'}{'instance-path'}; - - # @TODO via RTC: 60269 - # Uncomment the line below and remove the next when once correct size - # is available in MRW - #my $size = $i2c_device->{'size'}; - my $size = "2c0512"; - my $addr = $i2c_device->{'address'}; - - # @TODO via RTC: 60436 - # Read primary device directly from MRW - if($addr eq 'AE') - { - $sbe_i2c_paths{$ipath}->{'secondary-path'} - = 'L,'.$dev_path.','.$size.','.$addr; - } - else - { - $sbe_i2c_paths{$ipath}->{'primary-path'} - = 'L,'.$dev_path.','.$size.','.$addr; - } - } -} - - -open (FH, "<$mrwdir/${sysname}-targets.xml") || - die "ERROR: unable to open $mrwdir/${sysname}-targets.xml\n"; -close (FH); - -my $eTargets = XMLin("$mrwdir/${sysname}-targets.xml"); - -# Capture all targets into the @Targets array -use constant NAME_FIELD => 0; -use constant NODE_FIELD => 1; -use constant POS_FIELD => 2; -use constant UNIT_FIELD => 3; -use constant PATH_FIELD => 4; -use constant LOC_FIELD => 5; -use constant ORDINAL_FIELD => 6; -use constant FRU_PATH => 7; -use constant PLUG_POS => 8; -my @Targets; -foreach my $i (@{$eTargets->{target}}) -{ - my $plugPosition = $i->{'plug-xpath'}; - my $frupath = ""; - $plugPosition =~ s/.*mrw:position\/text\(\)=\'(.*)\'\]$/$1/; - if (exists $devpath->{chip}->{$i->{'instance-path'}}->{'fru-instance-path'}) - { - $frupath = $devpath->{chip}->{$i->{'instance-path'}}-> - {'fru-instance-path'}; - } - - push @Targets, [ $i->{'ecmd-common-name'}, $i->{node}, $i->{position}, - $i->{'chip-unit'}, $i->{'instance-path'}, $i->{location}, - 0,$frupath, $plugPosition ]; -} - -open (FH, "<$mrwdir/${sysname}-fsi-busses.xml") || - die "ERROR: unable to open $mrwdir/${sysname}-fsi-busses.xml\n"; -close (FH); - -my $fsiBus = XMLin("$mrwdir/${sysname}-fsi-busses.xml"); - -# Capture all FSI connections into the @Fsis array -use constant FSI_TYPE_FIELD => 0; -use constant FSI_LINK_FIELD => 1; -use constant FSI_TARGET_FIELD => 2; -my @Fsis; -foreach my $i (@{$fsiBus->{'fsi-bus'}}) -{ - push @Fsis, [ $i->{master}->{type}, $i->{master}->{link}, - "n$i->{slave}->{target}->{node}:p$i->{slave}->{target}->{position}" ]; -} - -open (FH, "<$mrwdir/${sysname}-psi-busses.xml") || - die "ERROR: unable to open $mrwdir/${sysname}-psi-busses.xml\n"; -close (FH); - -my $psiBus = XMLin("$mrwdir/${sysname}-psi-busses.xml", - forcearray=>['psi-bus']); - -# Capture all PSI connections into the @PSIs array -use constant PSI_FSP_INSTANCE_PATH_FIELD => 0; -use constant PSI_MASTER_NODE_FIELD => 1; -use constant PSI_MASTER_POS_FIELD => 2; -use constant PSI_MASTER_CHIP_UNIT_FIELD => 3; -use constant PSI_PROC_NODE_FIELD => 4; -use constant PSI_PROC_POS_FIELD => 5; -use constant PSI_SLAVE_CHIP_UNIT_FIELD => 6; -use constant PSI_MASTER_DEV_PATH => 7; -use constant PSI_ORDINAL_ID => 8; - - -my @PSIs; -foreach my $i (@{$psiBus->{'psi-bus'}}) -{ - push @PSIs, [ - $i->{fsp}->{'instance-path'}, - $i->{fsp}->{'psi-unit'}->{target}->{node}, - $i->{fsp}->{'psi-unit'}->{target}->{position}, - $i->{fsp}->{'psi-unit'}->{target}->{chipUnit}, - $i->{processor}->{target}->{node}, - $i->{processor}->{target}->{position}, - $i->{processor}->{'psi-unit'}->{target}->{chipUnit}, - $i->{fsp}->{'psi-dev-path'}, - "", - ]; -} - -#Sort PSI array based on Node,Position & Chip Unit. -my @SPSIs = sort byPSINodePosChpUnit @PSIs; - -my $PSIOrdinal = 0; -# Increment the Ordinal ID in sequential order for PSI. -for my $i ( 0 .. $#SPSIs ) -{ - $SPSIs[$i] [PSI_ORDINAL_ID] = $PSIOrdinal; - $PSIOrdinal += 2; #Leave the immediate next one for peer (proc) PSI target. -} - -open (FH, "<$mrwdir/${sysname}-memory-busses.xml") || - die "ERROR: unable to open $mrwdir/${sysname}-memory-busses.xml\n"; -close (FH); - -my $memBus = XMLin("$mrwdir/${sysname}-memory-busses.xml"); - -# Capture all memory buses info into the @Membuses array -use constant MCS_TARGET_FIELD => 0; -use constant CENTAUR_TARGET_FIELD => 1; -use constant DIMM_TARGET_FIELD => 2; -use constant DIMM_PATH_FIELD => 3; -use constant CFSI_LINK_FIELD => 4; -use constant BUS_NODE_FIELD => 5; -use constant BUS_POS_FIELD => 6; -use constant BUS_ORDINAL_FIELD => 7; -use constant DIMM_POS_FIELD => 8; - -my @Membuses; -foreach my $i (@{$memBus->{'memory-bus'}}) -{ - push @Membuses, [ - "n$i->{mcs}->{target}->{node}:p$i->{mcs}->{target}->{position}:mcs" . - $i->{mcs}->{target}->{chipUnit}, - "n$i->{mba}->{target}->{node}:p$i->{mba}->{target}->{position}:mba" . - $i->{mba}->{target}->{chipUnit}, - "n$i->{dimm}->{target}->{node}:p$i->{dimm}->{target}->{position}", - $i->{dimm}->{'instance-path'}, $i->{'fsi-link'}, - $i->{mcs}->{target}->{node}, - $i->{mcs}->{target}->{position}, 0, - $i->{dimm}->{'instance-path'} ]; -} - -# Sort the memory busses, based on their Node, Pos & instance paths -my @SMembuses = sort byDimmNodePos @Membuses; -my $BOrdinal_ID = 0; - -# Increment the Ordinal ID in sequential order for dimms. -for my $i ( 0 .. $#SMembuses ) -{ - $SMembuses[$i] [BUS_ORDINAL_FIELD] = $BOrdinal_ID; - $BOrdinal_ID += 1; -} - -# Rewrite each DIMM instance path's DIMM instance to be indexed from 0 -for my $i ( 0 .. $#SMembuses ) -{ - $SMembuses[$i][DIMM_PATH_FIELD] =~ s/[0-9]*$/$i/; -} - -# Find master processor's node and proc. The FSP master is always connected to -# the msater processor. The master processor's node is used as the system node - -my $node = 0; -my $Mproc = 0; -for my $i ( 0 .. $#Fsis ) -{ - if ((lc($Fsis[$i][FSI_TYPE_FIELD]) eq "fsp master") && - (lc($Fsis[$i][FSI_TARGET_FIELD]) eq "n[0-9]+:p[0-9]+")) - { - $node = $Fsis[$i][FSI_TARGET_FIELD]; - $Mproc = $node; - $node =~ s/n(.*):p.*/$1/; - $Mproc =~ s/.*p(.*)/$1/; - } -} - -# Generate @STargets array from the @Targets array to have the order as shown -# belows. The rest of the codes assume that this order is in place -# -# pu -# ex (one or more EX of pu before it) -# mcs (one or more MCS of pu before it) -# (Repeat for remaining pu) -# memb -# mba (to for membuf before it) -# (Repeat for remaining membuf) -# - -# Sort the target array based on Target Type,Node,Position and Chip-Unit. -my @SortedTargets = sort byTargetTypeNodePosChipunit @Targets; -my $Type = $SortedTargets[0][NAME_FIELD]; -my $ordinal_ID = 0; - -# Increment the Ordinal ID in sequential order for same family Type. -for my $i ( 0 .. $#SortedTargets ) -{ - if($SortedTargets[$i][NAME_FIELD] ne $Type) - { - $ordinal_ID = 0; - } - $SortedTargets[$i] [ORDINAL_FIELD] = $ordinal_ID; - $Type = $SortedTargets[$i][NAME_FIELD]; - $ordinal_ID += 1; -} - -my @fields; -my @STargets; -for my $i ( 0 .. $#SortedTargets ) -{ - if ($SortedTargets[$i][NAME_FIELD] eq "pu") - { - for my $k ( 0 .. PLUG_POS ) - { - $fields[$k] = $SortedTargets[$i][$k]; - } - push @STargets, [ @fields ]; - - my $position = $SortedTargets[$i][POS_FIELD]; - - for my $j ( 0 .. $#SortedTargets ) - { - if (($SortedTargets[$j][NAME_FIELD] eq "ex") && - ($SortedTargets[$j][POS_FIELD] eq $position)) - { - for my $k ( 0 .. PLUG_POS ) - { - $fields[$k] = $SortedTargets[$j][$k]; - } - push @STargets, [ @fields ]; - } - } - - for my $j ( 0 .. $#SortedTargets ) - { - if (($SortedTargets[$j][NAME_FIELD] eq "mcs") && - ($SortedTargets[$j][POS_FIELD] eq $position)) - { - for my $k ( 0 .. PLUG_POS ) - { - $fields[$k] = $SortedTargets[$j][$k]; - } - push @STargets, [ @fields ]; - } - } - } -} - -for my $i ( 0 .. $#SortedTargets ) -{ - if ($SortedTargets[$i][NAME_FIELD] eq "memb") - { - for my $k ( 0 .. PLUG_POS ) - { - $fields[$k] = $SortedTargets[$i][$k]; - } - push @STargets, [ @fields ]; - - my $position = $SortedTargets[$i][POS_FIELD]; - - for my $j ( 0 .. $#SortedTargets ) - { - if (($SortedTargets[$j][NAME_FIELD] eq "mba") && - ($SortedTargets[$j][POS_FIELD] eq $position)) - { - for my $k ( 0 .. PLUG_POS ) - { - $fields[$k] = $SortedTargets[$j][$k]; - } - push @STargets, [ @fields ]; - } - } - } -} - -# Finally, generate the xml file. -print "<!-- Source path = $mrwdir -->\n"; - -print "<attributes>\n"; - -# First, generate system target (always sys0) -my $sys = 0; -generate_sys(); - -# Second, generate system node using the master processor's node -generate_system_node(); - -# Third generate the FSP chip -if ($build eq "fsp") -{ - - #check if fsp xml is present - open (FH, "<$mrwdir/${sysname}-fsp.xml") || - die "ERROR: unable to open $mrwdir/${sysname}-fsp.xml\n"; - close (FH); - - my $fspXml = XMLin("$mrwdir/${sysname}-fsp.xml"); - - #TODO Via 48545 - #IN RFSP scenario, there will be more than one FSP in system XML. - #Verify it during RFSP design - - # Get MBX dev path from XML and send it as an argument - generate_system_fsp( $fspXml->{'host-mailbox-dev-path'}); -} - -# Fourth, generate the proc, occ, ex-chiplet, mcs-chiplet -# unit-tp (if on fsp), pcie bus and A/X-bus. -my $ex_count = 0; -my $mcs_count = 0; -my $proc_ordinal_id =0; -my $fru_id = 0; -my @fru_paths; -my $hwTopology =0; -for (my $do_core = 0, my $i = 0; $i <= $#STargets; $i++) -{ - if ($STargets[$i][NAME_FIELD] eq "pu") - { - my $fru_found = 0; - my $fru_path = $STargets[$i][FRU_PATH]; - my $proc = $STargets[$i][POS_FIELD]; - my $ipath = $STargets[$i][PATH_FIELD]; - $proc_ordinal_id = $STargets[$i][ORDINAL_FIELD]; - - use constant FRU_PATHS => 0; - use constant FRU_ID => 1; - - $hwTopology = $STargets[$i][NODE_FIELD] << 12; - $fru_path =~ m/.*-([0-9]*)$/; - $hwTopology |= $1 <<8; - $ipath =~ m/.*-([0-9]*)$/; - $hwTopology |= $1 <<4; - my $lognode; - my $logid; - for (my $j = 0; $j <= $#chipIDs; $j++) - { - if ($chipIDs[$j][CHIP_ID_PATH] eq $ipath) - { - $lognode = $chipIDs[$j][CHIP_ID_NODE]; - $logid = $chipIDs[$j][CHIP_ID_POS]; - last; - } - } - - if($#fru_paths < 0) - { - $fru_id = 0; - push @fru_paths, [ $fru_path, $fru_id ]; - } - else - { - for (my $k = 0; $k <= $#fru_paths; $k++) - { - if ( $fru_paths[$k][FRU_PATHS] eq $fru_path) - { - $fru_id = $fru_paths[$k][FRU_ID]; - $fru_found = 1; - last; - } - - } - if ($fru_found == 0) - { - $fru_id = $#fru_paths + 1; - push @fru_paths, [ $fru_path, $fru_id ]; - } - } - if ($proc eq $Mproc) - { - generate_proc($proc, $ipath, $lognode, $logid, - $proc_ordinal_id, 1, 0, 0,$fru_id,$hwTopology); - if ($build eq "fsp") - { - generate_occ($proc); - for my $psi ( 0 .. $#SPSIs ) - { - if(($STargets[$i][NODE_FIELD] eq - $SPSIs[$psi][PSI_PROC_NODE_FIELD]) && - ($STargets[$i][POS_FIELD] eq - $SPSIs[$psi][PSI_PROC_POS_FIELD] )) - { - my $fsp = 0; - if(chop($SPSIs[$psi][PSI_FSP_INSTANCE_PATH_FIELD]) eq '1') - { - $fsp = 1; - } - generate_proc_psi($SPSIs[$psi][PSI_PROC_NODE_FIELD], - $SPSIs[$psi][PSI_PROC_POS_FIELD], - $SPSIs[$psi][PSI_SLAVE_CHIP_UNIT_FIELD], - $SPSIs[$psi][PSI_MASTER_NODE_FIELD], - $SPSIs[$psi][PSI_MASTER_CHIP_UNIT_FIELD], - $SPSIs[$psi][PSI_ORDINAL_ID], - $fsp); - } - } - } - } - else - { - my $fsi; - for (my $j = 0; $j <= $#Fsis; $j++) - { - if ($Fsis[$j][FSI_TARGET_FIELD] eq "n${node}:p$proc") - { - $fsi = $Fsis[$j][FSI_LINK_FIELD]; - last; - } - } - generate_proc($proc, $ipath, $lognode, $logid, - $proc_ordinal_id, 0, 1, $fsi,$fru_id,$hwTopology); - if ($build eq "fsp") - { - generate_occ($proc); - for my $psi ( 0 .. $#SPSIs ) - { - if(($STargets[$i][NODE_FIELD] eq - $SPSIs[$psi][PSI_PROC_NODE_FIELD]) && - ($STargets[$i][POS_FIELD] eq - $SPSIs[$psi][PSI_PROC_POS_FIELD] )) - { - my $fsp = 0; - if(chop($SPSIs[$psi][PSI_FSP_INSTANCE_PATH_FIELD]) eq '1') - { - $fsp = 1; - } - generate_proc_psi($SPSIs[$psi][PSI_PROC_NODE_FIELD], - $SPSIs[$psi][PSI_PROC_POS_FIELD], - $SPSIs[$psi][PSI_SLAVE_CHIP_UNIT_FIELD], - $SPSIs[$psi][PSI_MASTER_NODE_FIELD], - $SPSIs[$psi][PSI_MASTER_CHIP_UNIT_FIELD], - $SPSIs[$psi][PSI_ORDINAL_ID], - $fsp); - } - } - } - } - } - elsif ($STargets[$i][NAME_FIELD] eq "ex") - { - my $proc = $STargets[$i][POS_FIELD]; - my $ex = $STargets[$i][UNIT_FIELD]; - if ($do_core == 0) - { - if ($ex_count == 0) - { - print "\n<!-- $SYSNAME n${node}p$proc EX units -->\n"; - } - generate_ex($proc, $ex, $STargets[$i][ORDINAL_FIELD]); - $ex_count++; - if ($STargets[$i+1][NAME_FIELD] eq "mcs") - { - $do_core = 1; - $i -= $ex_count; - $ex_count = 0; - } - } - else - { - if ($ex_count == 0) - { - print "\n<!-- $SYSNAME n${node}p$proc core units -->\n"; - } - generate_ex_core($proc,$ex,$STargets[$i][ORDINAL_FIELD]); - $ex_count++; - if ($STargets[$i+1][NAME_FIELD] eq "mcs") - { - $do_core = 0; - $ex_count = 0; - } - } - } - elsif ($STargets[$i][NAME_FIELD] eq "mcs") - { - my $proc = $STargets[$i][POS_FIELD]; - my $mcs = $STargets[$i][UNIT_FIELD]; - if ($mcs_count == 0) - { - print "\n<!-- $SYSNAME n${node}p$proc MCS units -->\n"; - } - generate_mcs($proc,$mcs, $STargets[$i][ORDINAL_FIELD]); - $mcs_count++; - if (($STargets[$i+1][NAME_FIELD] eq "pu") || - ($STargets[$i+1][NAME_FIELD] eq "memb")) - { - $mcs_count = 0; - generate_pcies($proc,$proc_ordinal_id); - generate_ax_buses($proc, "A",$proc_ordinal_id); - generate_ax_buses($proc, "X",$proc_ordinal_id); - } - } -} - -# Fifth, generate the Centaur, MBS, and MBA - -my $memb; -my $membMcs; -my $mba_count = 0; -my $vmem_id =0; -my $vmem_count =0; - -for my $i ( 0 .. $#STargets ) -{ - if ($STargets[$i][NAME_FIELD] eq "memb") - { - $memb = $STargets[$i][POS_FIELD]; - my $ipath = $STargets[$i][PATH_FIELD]; - my $centaur = "n${node}:p${memb}"; - my $found = 0; - my $cfsi; - for my $j ( 0 .. $#Membuses ) - { - my $mba = $Membuses[$j][CENTAUR_TARGET_FIELD]; - $mba =~ s/(.*):mba.*$/$1/; - if ($mba eq $centaur) - { - $membMcs = $Membuses[$j][MCS_TARGET_FIELD]; - $cfsi = $Membuses[$j][CFSI_LINK_FIELD]; - $found = 1; - last; - } - } - if ($found == 0) - { - die "ERROR. Can't locate Centaur from memory bus table\n"; - } - my $relativeCentaurRid = $STargets[$i][PLUG_POS]; - - #should note that the $SortedVmem is sorted by node and position and - #currently $STargets is also sorted by node and postion. If this ever - #changes then will need to make a modification here - my $vmemDevPath=$SortedVmem[$vmem_count][VMEM_DEV_PATH_FIELD]; - my $vmemAddr=$SortedVmem[$vmem_count][VMEM_I2C_ADDR_FIELD]; - my $vmem_id=$SortedVmem[$vmem_count][VMEM_ID_FIELD]; - $vmem_count++; - - generate_centaur( $memb, $membMcs, $cfsi, $ipath, - $STargets[$i][ORDINAL_FIELD],$relativeCentaurRid, - $vmem_id, $vmemDevPath, $vmemAddr); - } - elsif ($STargets[$i][NAME_FIELD] eq "mba") - { - if ($mba_count == 0) - { - print "\n"; - print "<!-- $SYSNAME Centaur MBAs affiliated with membuf$memb -->"; - print "\n"; - } - my $mba = $STargets[$i][UNIT_FIELD]; - generate_mba( $memb, $membMcs, $mba, $STargets[$i][ORDINAL_FIELD] ); - $mba_count += 1; - if ($mba_count == 2) - { - $mba_count = 0; - print "\n<!-- $SYSNAME Centaur n${node}p${memb} : end -->\n" - } - } -} - -# Sixth, generate DIMM targets - -print "\n<!-- $SYSNAME Centaur DIMMs -->\n"; - -for my $i ( 0 .. $#SMembuses ) -{ - my $proc = $SMembuses[$i][MCS_TARGET_FIELD]; - my $mcs = $proc; - $proc =~ s/.*:p(.*):.*/$1/; - $mcs =~ s/.*mcs(.*)/$1/; - my $ctaur = $SMembuses[$i][CENTAUR_TARGET_FIELD]; - my $mba = $ctaur; - $ctaur =~ s/.*:p(.*):mba.*$/$1/; - $mba =~ s/.*:mba(.*)$/$1/; - my $pos = $SMembuses[$i][DIMM_TARGET_FIELD]; - $pos =~ s/.*:p(.*)/$1/; - my $dimm = $SMembuses[$i][DIMM_PATH_FIELD]; - $dimm =~ s/.*dimm-(.*)/$1/; - my $relativeDimmRid = $dimm; - my $dimmPos = $SMembuses[$i][DIMM_POS_FIELD]; - $dimmPos =~ s/.*dimm-(.*)/$1/; - my $relativePos = $dimmPos; - print "\n<!-- C-DIMM n${node}:p${pos} -->\n"; - for my $id ( 0 .. 7 ) - { - my $dimmid = $dimm; - $dimmid <<= 3; - $dimmid |= $id; - $dimmid = sprintf ("%d", $dimmid); - generate_dimm( $proc, $mcs, $ctaur, $pos, $dimmid, $id, - ($SMembuses[$i][BUS_ORDINAL_FIELD]*8)+$id, - $relativeDimmRid,$relativePos); - } -} - -if ($build eq "fsp") -{ - print "\n<!--$SYSNAME PNOR -->\n"; - for my $i (0 .. $#SortedPnor) - { - generate_pnor($sys,$SortedPnor[$i][PNOR_NODE_FIELD], - $SortedPnor[$i][PNOR_POS_FIELD],$SortedPnor[$i][PNOR_MTD_CHAR_FIELD], - $SortedPnor[$i][PNOR_BLOCK_DEV_FIELD], - $SortedPnor[$i][PNOR_PROC_FIELD],$i); - } -} - -print "\n</attributes>\n"; - -# All done! -#close ($outFH); -exit 0; - -########## Subroutines ############## - -################################################################################ -# Compares two MRW Targets based on the Type,Node,Position & Chip-Unit # -################################################################################ - -sub byTargetTypeNodePosChipunit ($$) -{ - # Operates on two Targets, based on the following parameters Targets will - # get sorted, - # 1.Type of the Target.Ex; pu , ex , mcs ,mba etc. - # 2.Node of the Target.Node instance number, integer 0,1,2 etc. - # 3.Position of the Target, integer 0,1,2 etc. - # 4.ChipUnit of the Target , integer 0,1,2 etc. - # Note the above order is sequential & comparison is made in the same order. - - #Assume always $lhsInstance < $rhsInstance, will reduce redundant coding. - my $retVal = -1; - - # Get just the instance path for each supplied memory bus - my $lhsInstance_Type = $_[0][NAME_FIELD]; - my $rhsInstance_Type = $_[1][NAME_FIELD]; - - if($lhsInstance_Type eq $rhsInstance_Type) - { - my $lhsInstance_Node = $_[0][NODE_FIELD]; - my $rhsInstance_Node = $_[1][NODE_FIELD]; - - if(int($lhsInstance_Node) eq int($rhsInstance_Node)) - { - my $lhsInstance_Pos = $_[0][POS_FIELD]; - my $rhsInstance_Pos = $_[1][POS_FIELD]; - - if(int($lhsInstance_Pos) eq int($rhsInstance_Pos)) - { - my $lhsInstance_ChipUnit = $_[0][UNIT_FIELD]; - my $rhsInstance_ChipUnit = $_[1][UNIT_FIELD]; - - if(int($lhsInstance_ChipUnit) eq int($rhsInstance_ChipUnit)) - { - die "ERROR: Duplicate Targets: 2 Targets with same \ - TYPE: $lhsInstance_Type NODE: $lhsInstance_Node \ - POSITION: $lhsInstance_Pos \ - & CHIP-UNIT: $lhsInstance_ChipUnit\n"; - } - elsif(int($lhsInstance_ChipUnit) > int($rhsInstance_ChipUnit)) - { - $retVal = 1; - } - } - elsif(int($lhsInstance_Pos) > int($rhsInstance_Pos)) - { - $retVal = 1; - } - } - elsif(int($lhsInstance_Node) > int($rhsInstance_Node)) - { - $retVal = 1; - } - } - elsif($lhsInstance_Type gt $rhsInstance_Type) - { - $retVal = 1; - } - return $retVal; -} - -################################################################################ -# Compares two MRW DIMMs based on the Node,Position & DIMM instance # -################################################################################ - -sub byDimmNodePos($$) -{ - # Operates on two Targets, based on the following parameters Targets will - # get sorted, - # 1.Node of the Target.Node instance number, integer 0,1,2 etc. - # 2.Position of the Target, integer 0,1,2 etc. - # 3.On two DIMM instance paths, each in the form of: - # assembly-0/shilin-0/dimm-X - # - # Assumes that "X is always a decimal number, and that every DIMM in the - # system has a unique value of "X", including for multi-node systems and for - # systems whose DIMMs are contained on different parts of the system - # topology - # - # Note, in the path example above, the parts leading up to the dimm-X could - # be arbitrarily deep and have different types/instance values - # - # Note the above order is sequential & comparison is made in the same order. - - #Assume always $lhsInstance < $rhsInstance, will reduce redundant coding. - my $retVal = -1; - - my $lhsInstance_node = $_[0][BUS_NODE_FIELD]; - my $rhsInstance_node = $_[1][BUS_NODE_FIELD]; - if(int($lhsInstance_node) eq int($rhsInstance_node)) - { - my $lhsInstance_pos = $_[0][BUS_POS_FIELD]; - my $rhsInstance_pos = $_[1][BUS_POS_FIELD]; - if(int($lhsInstance_pos) eq int($rhsInstance_pos)) - { - # Get just the instance path for each supplied memory bus - my $lhsInstance = $_[0][DIMM_PATH_FIELD]; - my $rhsInstance = $_[1][DIMM_PATH_FIELD]; - # Replace each with just its DIMM instance value (a string) - $lhsInstance =~ s/.*-([0-9]*)$/$1/; - $rhsInstance =~ s/.*-([0-9]*)$/$1/; - - if(int($lhsInstance) eq int($rhsInstance)) - { - die "ERROR: Duplicate Dimms: 2 Dimms with same TYPE, \ - NODE: $lhsInstance_node POSITION: $lhsInstance_pos & \ - PATH FIELD: $lhsInstance\n"; - } - elsif(int($lhsInstance) > int($rhsInstance)) - { - $retVal = 1; - } - } - elsif(int($lhsInstance_pos) > int($rhsInstance_pos)) - { - $retVal = 1; - } - } - elsif(int($lhsInstance_node) > int($rhsInstance_node)) - { - $retVal = 1; - } - return $retVal; -} - -################################################################################ -# Compares two MRW DIMM instance paths based only on the DIMM instance # -################################################################################ - -sub byDimmInstancePath ($$) -{ - # Operates on two DIMM instance paths, each in the form of: - # assembly-0/shilin-0/dimm-X - # - # Assumes that "X is always a decimal number, and that every DIMM in the - # system has a unique value of "X", including for multi-node systems and for - # systems whose DIMMs are contained on different parts of the system - # topology - # - # Note, in the path example above, the parts leading up to the dimm-X could - # be arbitrarily deep and have different types/instance values - - # Get just the instance path for each supplied memory bus - my $lhsInstance = $_[0][DIMM_PATH_FIELD]; - my $rhsInstance = $_[1][DIMM_PATH_FIELD]; - - # Replace each with just its DIMM instance value (a string) - $lhsInstance =~ s/.*-([0-9]*)$/$1/; - $rhsInstance =~ s/.*-([0-9]*)$/$1/; - - # Convert each DIMM instance value string to int, and return comparison - return int($lhsInstance) <=> int($rhsInstance); -} - -################################################################################ -# Compares two PNOR instances based on the node and position # -################################################################################ -sub byPnorNodePos($$) -{ - my $retVal = -1; - - my $lhsInstance_node = $_[0][PNOR_NODE_FIELD]; - my $rhsInstance_node = $_[1][PNOR_NODE_FIELD]; - if(int($lhsInstance_node) eq int($rhsInstance_node)) - { - my $lhsInstance_pos = $_[0][PNOR_POS_FIELD]; - my $rhsInstance_pos = $_[1][PNOR_POS_FIELD]; - if(int($lhsInstance_pos) eq int($rhsInstance_pos)) - { - die "ERROR: Duplicate pnor positions: 2 pnors with same - node and position, \ - NODE: $lhsInstance_node POSITION: $lhsInstance_pos\n"; - } - elsif(int($lhsInstance_pos) > int($rhsInstance_pos)) - { - $retVal = 1; - } - } - elsif(int($lhsInstance_node) > int($rhsInstance_node)) - { - $retVal = 1; - } - return $retVal; -} - -################################################################################ -# Compares two proc pcie instances based on the node and position # -################################################################################ -sub byPcieNodePos($$) -{ - my $retVal = -1; - - my $lhsInstance_node = $_[0][PCIE_NODE_INDEX]; - my $rhsInstance_node = $_[1][PCIE_NODE_INDEX]; - if(int($lhsInstance_node) eq int($rhsInstance_node)) - { - my $lhsInstance_pos = $_[0][PCIE_POS_INDEX]; - my $rhsInstance_pos = $_[1][PCIE_POS_INDEX]; - if(int($lhsInstance_pos) eq int($rhsInstance_pos)) - { - die "ERROR: Duplicate pcie positions: 2 pcie with same - node and position, \ - NODE: $lhsInstance_node POSITION: $lhsInstance_pos\n"; - } - elsif(int($lhsInstance_pos) > int($rhsInstance_pos)) - { - $retVal = 1; - } - } - elsif(int($lhsInstance_node) > int($rhsInstance_node)) - { - $retVal = 1; - } - return $retVal; -} - -################################################################################ -# Compares two Vmem instances based on the node and position # -################################################################################ -sub byVmemNodePos($$) -{ - my $retVal = -1; - - my $lhsInstance_node = $_[0][VMEM_NODE_FIELD]; - my $rhsInstance_node = $_[1][VMEM_NODE_FIELD]; - if(int($lhsInstance_node) eq int($rhsInstance_node)) - { - my $lhsInstance_pos = $_[0][VMEM_POS_FIELD]; - my $rhsInstance_pos = $_[1][VMEM_POS_FIELD]; - if(int($lhsInstance_pos) eq int($rhsInstance_pos)) - { - die "ERROR: Duplicate vmem positions: 2 vmem with same - node and position, \ - NODE: $lhsInstance_node POSITION: $lhsInstance_pos\n"; - } - elsif(int($lhsInstance_pos) > int($rhsInstance_pos)) - { - $retVal = 1; - } - } - elsif(int($lhsInstance_node) > int($rhsInstance_node)) - { - $retVal = 1; - } - return $retVal; -} - -################################################################################ -# Compares two PSI Units instances based on the node, position & chip unit # -################################################################################ -sub byPSINodePosChpUnit($$) -{ - my $retVal = -1; - - my $lhsInstance_node = $_[0][PSI_MASTER_NODE_FIELD]; - my $rhsInstance_node = $_[1][PSI_MASTER_NODE_FIELD]; - if(int($lhsInstance_node) eq int($rhsInstance_node)) - { - my $lhsInstance_pos = $_[0][PSI_MASTER_POS_FIELD]; - my $rhsInstance_pos = $_[1][PSI_MASTER_POS_FIELD]; - if(int($lhsInstance_pos) eq int($rhsInstance_pos)) - { - my $lhsInstance_chip_unit = $_[0][PSI_MASTER_CHIP_UNIT_FIELD]; - my $rhsInstance_chip_unit = $_[1][PSI_MASTER_CHIP_UNIT_FIELD]; - if(int($lhsInstance_chip_unit) eq int($rhsInstance_chip_unit)) - { - die "ERROR: Duplicate psi master units : 2 psi units with \ - same node, position and chip unit \ - NODE: $lhsInstance_node POSITION: $lhsInstance_pos \ - CHIP UNIT: $lhsInstance_chip_unit \n"; - } - elsif(int($lhsInstance_chip_unit) > int($rhsInstance_chip_unit)) - { - $retVal = 1; - - } - } - elsif(int($lhsInstance_pos) > int($rhsInstance_pos)) - { - $retVal = 1; - } - } - elsif(int($lhsInstance_node) > int($rhsInstance_node)) - { - $retVal = 1; - } - return $retVal; -} - -sub generate_sys -{ - my $proc_refclk = $policy->{'required-policy-settings'}-> - {'processor-refclock-frequency'}->{content}; - my $mem_refclk = $policy->{'required-policy-settings'}-> - {'memory-refclock-frequency'}->{content}; - - print " -<!-- $SYSNAME System with new values--> - -<targetInstance> - <id>sys$sys</id> - <type>sys-sys-power8</type> - <attribute> - <id>PHYS_PATH</id> - <default>physical:sys-$sys</default> - </attribute> - <attribute> - <id>AFFINITY_PATH</id> - <default>affinity:sys-$sys</default> - </attribute> - <attribute> - <id>FREQ_PROC_REFCLOCK</id> - <default>$proc_refclk</default> - </attribute> - <attribute> - <id>FREQ_MEM_REFCLOCK</id> - <default>$mem_refclk</default> - </attribute> - <!-- PAYLOAD_BASE and PAYLOAD_ENTRY should be from FW xml --> - <attribute> - <id>PAYLOAD_BASE</id> - <default>256</default> - </attribute> - <attribute> - <id>PAYLOAD_ENTRY</id> - <default>0x180</default> - </attribute>\n"; - - print " <!-- System Attributes from MRW -->\n"; - addSysAttrs(); - print " <!-- End System Attributes from MRW -->\n"; - - print " - <!-- The default value of the following three attributes are written --> - <!-- by the HWP using them. The default values are not from MRW. They --> - <!-- are included here FYI. --> - <attribute> - <id>PROC_EPS_GB_DIRECTION</id> - <default>0</default> - </attribute> - <attribute> - <id>PROC_EPS_GB_PERCENTAGE</id> - <default>0x14</default> - </attribute> - <attribute> - <id>PROC_FABRIC_ASYNC_SAFE_MODE</id> - <default>0</default> - </attribute> - <attribute> - <id>SP_FUNCTIONS</id> - <default> - <field><id>fsiSlaveInit</id><value>1</value></field> - <field><id>mailboxEnabled</id><value>1</value></field> - <field><id>fsiMasterInit</id><value>1</value></field> - <field><id>reserved</id><value>0</value></field> - </default> - </attribute> - <attribute> - <id>HB_SETTINGS</id> - <default> - <field><id>traceContinuous</id><value>0</value></field> - <field><id>traceScanDebug</id><value>0</value></field> - <field><id>reserved</id><value>0</value></field> - </default> - </attribute> - <attribute> - <id>PAYLOAD_KIND</id> - <default>PHYP</default> - </attribute> - <!-- TODO. These must be from MRW. Hardcoded for now --> - <attribute> - <id>PAYLOAD_BASE</id> - <default>256</default> - </attribute> - <attribute> - <id>PAYLOAD_ENTRY</id> - <default>0x180</default> - </attribute> - <attribute> - <id>MSS_MCA_HASH_MODE</id> - <default>0</default> - </attribute> - <attribute> - <id>MSS_MBA_ADDR_INTERLEAVE_BIT</id> - <default>24</default> - </attribute> - <attribute> - <id>MSS_MBA_CACHELINE_INTERLEAVE_MODE</id> - <default>1</default> - </attribute> - <attribute> - <id>MSS_PREFETCH_ENABLE</id> - <default>1</default> - </attribute> - <attribute> - <id>MSS_CLEANER_ENABLE</id> - <default>1</default> - </attribute>"; - - if($build eq "fsp") - { - print " - <attribute> - <id>ORDINAL_ID</id> - <default>0</default> - </attribute>"; - } - -print " -</targetInstance> - -"; -} - -# TODO via RTC:49504 -# Need to support RFSP and dynamically generate HUID,RID and ORDINALID. -sub generate_system_fsp -{ - #get the mailbox dev path - my ($fspMbxPath) = @_; - print " -<!-- $SYSNAME System fsp0 --> - -<targetInstance> - <id>sys${sys}node${node}fsp0</id> - <type>chip-fsp-power8</type> - <attribute> - <id>HUID</id> - <default>0x00150000</default> - </attribute> - <attribute> - <id>POSITION</id> - <default>0</default> - </attribute> - <attribute> - <id>PHYS_PATH</id> - <default>physical:sys-${sys}/node-${node}/fsp-0</default> - </attribute> - <attribute> - <id>AFFINITY_PATH</id> - <default>affinity:sys-${sys}/node-${node}/fsp-0</default> - </attribute> - <attribute> - <id>CHIP_ID</id> - <default>0xF0F1</default> - </attribute> - <attribute> - <id>EC</id> - <default>0x10</default> - </attribute> - <attribute> - <id>HOST_MAILBOX_DEV_PATH</id> - <default>${fspMbxPath}</default> - </attribute>"; - - if ($build eq "fsp") - { - print " - <attribute> - <id>RID</id> - <default>0x0200</default> - </attribute> - <attribute> - <id>ORDINAL_ID</id> - <default>0</default> - </attribute>"; - } - - print " -</targetInstance> -"; - -#Create the corresponding the fsp-psi targets. -generate_fsp_psi(); - -} - - -sub generate_system_node -{ - print " -<!-- $SYSNAME System node $node --> - -<targetInstance> - <id>sys${sys}node${node}</id> - <type>enc-node-power8</type> - <attribute><id>HUID</id><default>0x00020000</default></attribute> - <attribute> - <id>PHYS_PATH</id> - <default>physical:sys-$sys/node-$node</default> - </attribute> - <attribute> - <id>AFFINITY_PATH</id> - <default>affinity:sys-$sys/node-$node</default> - </attribute>"; - - if($build eq "fsp") - { - print " - <attribute> - <id>RID</id> - <default>0x800</default> - </attribute> - <attribute> - <id>ORDINAL_ID</id> - <default>$node</default> - </attribute>"; - } - - print " -</targetInstance> -"; - - if ($build eq "fsp") - { - print " -<!-- APSS For system node $node --> - -<targetInstance> - <id>sys0node0apss0</id> - <type>apss</type> - <attribute><id>HUID</id><default>0x00120000</default></attribute> - <attribute><id>ORDINAL_ID</id><default>$node</default></attribute> - <attribute> - <id>PHYS_PATH</id> - <default>physical:sys-$sys/node-$node/apss-$node</default> - </attribute> - <attribute> - <id>AFFINITY_PATH</id> - <default>affinity:sys-$sys/node-$node/apss-$node</default> - </attribute> -</targetInstance> - -<!-- DPSS For system node $node --> - -<targetInstance> - <id>sys0node0dpss0</id> - <type>dpss</type> - <attribute><id>HUID</id><default>0x00110000</default></attribute> - <attribute><id>ORDINAL_ID</id><default>$node</default></attribute> - <attribute> - <id>PHYS_PATH</id> - <default>physical:sys-$sys/node-$node/dpss-$node</default> - </attribute> - <attribute> - <id>AFFINITY_PATH</id> - <default>affinity:sys-$node/node-$node/dpss-$node</default> - </attribute> -</targetInstance> - -"; - } -} - -sub generate_proc -{ - my ($proc, $ipath, $lognode, $logid, $ordinalId, $master, $slave, $fsi, - $fruid,$hwTopology) = @_; - my $uidstr = sprintf("0x%02X05%04X",${node},${proc}+${node}*8); - my $scompath = $devpath->{chip}->{$ipath}->{'scom-path'}; - my $scanpath = $devpath->{chip}->{$ipath}->{'scan-path'}; - my $scomsize = length($scompath) + 1; - my $scansize = length($scanpath) + 1; - my $mboxpath = ""; - my $mboxsize = 0; - if (exists $devpath->{chip}->{$ipath}->{'mailbox-path'}) - { - $mboxpath = $devpath->{chip}->{$ipath}->{'mailbox-path'}; - $mboxsize = length($mboxpath) + 1; - } - print " -<!-- $SYSNAME n${node}p${proc} processor chip --> - -<targetInstance> - <id>sys${sys}node${node}proc${proc}</id> - <type>chip-processor-murano</type> - <attribute><id>HUID</id><default>${uidstr}</default></attribute> - <attribute><id>POSITION</id><default>${proc}</default></attribute> - <attribute><id>SCOM_SWITCHES</id> - <default> - <field><id>useFsiScom</id><value>$slave</value></field> - <field><id>useXscom</id><value>$master</value></field> - <field><id>useInbandScom</id><value>0</value></field> - <field><id>reserved</id><value>0</value></field> - </default> - </attribute> - <attribute> - <id>PHYS_PATH</id> - <default>physical:sys-$sys/node-$node/proc-$proc</default> - </attribute> - <attribute> - <id>AFFINITY_PATH</id> - <default>affinity:sys-$sys/node-$node/proc-$proc</default> - </attribute> - <attribute> - <id>FABRIC_NODE_ID</id> - <default>$lognode</default> - </attribute> - <attribute> - <id>FABRIC_CHIP_ID</id> - <default>$logid</default> - </attribute> - <attribute><id>VPD_REC_NUM</id><default>$proc</default></attribute>"; - - if ($slave) - { - print " - <!-- FSI is connected via proc${Mproc}:MFSI-$fsi --> - <attribute> - <id>FSI_MASTER_CHIP</id> - <default>physical:sys-$sys/node-$node/proc-$Mproc</default> - </attribute> - <attribute> - <id>FSI_MASTER_TYPE</id> - <default>MFSI</default> - </attribute> - <attribute> - <id>FSI_MASTER_PORT</id> - <default>$fsi</default> - </attribute> - <attribute> - <id>FSI_SLAVE_CASCADE</id> - <default>0</default> - </attribute> - <attribute> - <id>FSI_OPTION_FLAGS</id> - <default>0</default> - </attribute>"; - } - - #TODO RTC [59707] - #Update Lane equalization values - - if ($build eq "fsp") - { - print " - <attribute> - <id>ORDINAL_ID</id> - <default>$ordinalId</default> - </attribute> - <attribute> - <id>FSP_SCOM_DEVICE_PATH</id> - <default>$scompath</default> - <sizeInclNull>$scomsize</sizeInclNull> - </attribute> - <attribute> - <id>FSP_SCAN_DEVICE_PATH</id> - <default>$scanpath</default> - <sizeInclNull>$scansize</sizeInclNull> - </attribute> - <attribute> - <id>RID</id> - <default>0x100$proc</default> - </attribute> - <attribute> - <id>FRU_ID</id> - <default>$fruid</default> - </attribute> - <attribute> - <id>PROC_PCIE_IOP_SWAP_NON_BIFURCATED</id> - <default> - $pcie_list{$ipath}{0}{0}{'lane-swap'}, - $pcie_list{$ipath}{0}{1}{'lane-swap'}, - $pcie_list{$ipath}{1}{0}{'lane-swap'}, - $pcie_list{$ipath}{1}{1}{'lane-swap'} - </default> - </attribute> - <attribute> - <id>PROC_PCIE_IOP_REVERSAL_NON_BIFURCATED</id> - <default> - $pcie_list{$ipath}{0}{0}{'lane-reversal'}, - $pcie_list{$ipath}{0}{1}{'lane-reversal'}, - $pcie_list{$ipath}{1}{0}{'lane-reversal'}, - $pcie_list{$ipath}{1}{1}{'lane-reversal'} - </default> - </attribute> - <attribute> - <id>PROC_PCIE_LANE_MASK_NON_BIFURCATED</id> - <default> - $pcie_list{$ipath}{0}{0}{'lane-mask'}, - $pcie_list{$ipath}{0}{1}{'lane-mask'}, - $pcie_list{$ipath}{1}{0}{'lane-mask'}, - $pcie_list{$ipath}{1}{1}{'lane-mask'} - </default> - </attribute> - <attribute> - <id>PROC_PCIE_IOP_SWAP_BIFURCATED</id> - <default> - $bifurcation_list{$ipath}{0}{0}{'lane-swap'}, - $bifurcation_list{$ipath}{0}{1}{'lane-swap'}, - $bifurcation_list{$ipath}{1}{0}{'lane-swap'}, - $bifurcation_list{$ipath}{1}{1}{'lane-swap'} - </default> - </attribute> - <attribute> - <id>PROC_PCIE_LANE_MASK_BIFURCATED</id> - <default> - $bifurcation_list{$ipath}{0}{0}{'lane-mask'}, - $bifurcation_list{$ipath}{0}{1}{'lane-mask'}, - $bifurcation_list{$ipath}{1}{0}{'lane-mask'}, - $bifurcation_list{$ipath}{1}{1}{'lane-mask'} - </default> - </attribute> - <attribute> - <id>PROC_PCIE_IOP_REVERSAL_BIFURCATED</id> - <default> - $bifurcation_list{$ipath}{0}{0}{'lane-reversal'}, - $bifurcation_list{$ipath}{0}{1}{'lane-reversal'}, - $bifurcation_list{$ipath}{1}{0}{'lane-reversal'}, - $bifurcation_list{$ipath}{1}{1}{'lane-reversal'} - </default> - </attribute> - <attribute> - <id>PROC_PCIE_DSMP_CAPABLE</id> - <default> - $pcie_list{$ipath}{0}{0}{'dsmp-capable'}, - $pcie_list{$ipath}{0}{1}{'dsmp-capable'}, - $pcie_list{$ipath}{1}{0}{'dsmp-capable'}, - $pcie_list{$ipath}{1}{1}{'dsmp-capable'} - </default> - </attribute> - <attribute> - <id>PROC_PCIE_IS_SLOT</id> - <default> - $pcie_list{$ipath}{0}{0}{'is-slot'}, - $pcie_list{$ipath}{0}{1}{'is-slot'}, - $pcie_list{$ipath}{1}{0}{'is-slot'}, - $pcie_list{$ipath}{1}{1}{'is-slot'} - </default> - </attribute> - <attribute> - <id>PROC_HW_TOPOLOGY</id> - <default>$hwTopology</default> - </attribute> - <attribute> - <id>PROC_PCIE_LANE_EQUALIZATION</id> - <default>0,0,0,0</default> - </attribute> - <attribute> - <id>PRIMARY_SBE_SEEPROM_ADDRESS</id> - <default>$sbe_i2c_paths{$ipath}->{'primary-path'}</default> - </attribute> - <attribute> - <id>SECONDARY_SBE_SEEPROM_ADDRESS</id> - <default>$sbe_i2c_paths{$ipath}->{'secondary-path'}</default> - </attribute>"; - } - - if (($mboxsize != 0) && ($build eq "fsp")) - { - print " - <attribute> - <id>FSP_MBOX_DEVICE_PATH</id> - <default>$mboxpath</default> - <sizeInclNull>$mboxsize</sizeInclNull> - </attribute>"; - } - - # Data from PHYP Memory Map - print "\n"; - print " <!-- Data from PHYP Memory Map -->\n"; - - # Calculate the FSP and PSI BRIGDE BASE ADDR - my $fspBase = 0; - my $psiBase = 0; - foreach my $i (@{$psiBus->{'psi-bus'}}) - { - if ( $i->{'processor'}->{target}->{position} eq $proc ) - { - $fspBase = 0x0003FFE000000000 + 0x100000000*$proc; - $psiBase = 0x0003FFFE80000000 + 0x100000*$proc; - last; - } - } - - # Starts at 1024TB - 128GB, 4GB per proc - printf( " <attribute><id>FSP_BASE_ADDR</id>\n" ); - printf( " <default>0x%016X</default>\n", $fspBase ); - printf( " </attribute>\n" ); - - # Starts at 1024TB - 6GB, 1MB per link/proc - printf( " <attribute><id>PSI_BRIDGE_BASE_ADDR</id>\n" ); - printf( " <default>0x%016X</default>\n", $psiBase ); - printf( " </attribute>\n" ); - - # Starts at 1024TB - 2GB, 1MB per proc - printf( " <attribute><id>INTP_BASE_ADDR</id>\n" ); - printf( " <default>0x%016X</default>\n", - 0x0003FFFF80000000 + 0x100000*$proc ); - printf( " </attribute>\n" ); - - # Starts at 1024TB - 7GB, 1MB per PHB (=4MB per proc) - printf( " <attribute><id>PHB_BASE_ADDRS</id>\n" ); - printf( " <default>\n" ); - printf( " 0x%016X,0x%016X,\n", - 0x0003FFFE40000000 + 0x400000*$proc + 0x100000*0, - 0x0003FFFE40000000 + 0x400000*$proc + 0x100000*1 ); - printf( " 0x%016X,0x%016X\n", - 0x0003FFFE40000000 + 0x400000*$proc + 0x100000*2, - 0x0003FFFE40000000 + 0x400000*$proc + 0x100000*3 ); - printf( " </default>\n" ); - printf( " </attribute>\n" ); - - # Starts at 976TB, 64GB per PHB (=256GB per proc) - printf( " <attribute><id>PCI_BASE_ADDRS</id>\n" ); - printf( " <default>\n" ); - printf( " 0x%016X,0x%016X,\n", - 0x0003D00000000000 + 0x4000000000*$proc + 0x1000000000*0, - 0x0003D00000000000 + 0x4000000000*$proc + 0x1000000000*1 ); - printf( " 0x%016X,0x%016X\n", - 0x0003D00000000000 + 0x4000000000*$proc + 0x1000000000*2, - 0x0003D00000000000 + 0x4000000000*$proc + 0x1000000000*3 ); - printf( " </default>\n" ); - printf( " </attribute>\n" ); - - # Starts at 1024TB - 3GB - printf( " <attribute><id>RNG_BASE_ADDR</id>\n" ); - printf( " <default>0x%016X</default>\n", - 0x0003FFFF40000000 + 0x1000*$proc ); - printf( " </attribute>\n" ); - - print " <!-- End PHYP Memory Map -->\n\n"; - # end PHYP Memory Map - - print " <!-- PROC_PCIE_ attributes -->\n"; - addProcPcieAttrs( $proc, $node ); - print " <!-- End PROC_PCIE_ attributes -->\n"; - - print " - <!-- The default value of the following three attributes are written by --> - <!-- the FSP. They are included here because VBU/VPO uses faked PNOR. --> - <attribute> - <id>PROC_PCIE_IOP_CONFIG</id> - <default>0</default> - </attribute> - <attribute> - <id>PROC_PCIE_IOP_SWAP</id> - <default>$pcie_list{$ipath}{0}{0}{'lane-swap'}, - $pcie_list{$ipath}{1}{0}{'lane-swap'} - </default> - </attribute> - <attribute> - <id>PROC_PCIE_PHB_ACTIVE</id> - <default>0</default> - </attribute> -</targetInstance>\n"; - -} - -sub generate_occ -{ - my ($proc) = @_; - - # RTC: 49574 - # The calculations for HUID and ordinal ID are not correct for multi-node - # configurations, since HUID doesn't take into account the node value, and - # the oridinal ID repeats on every node. Fix these with the multi-node - # story - my $uidstr = sprintf("0x0013000%01X",$proc); - my $ordinalId = $proc; - - print " -<!-- $SYSNAME n${node}p${proc} OCC units --> - -<targetInstance> - <id>sys${sys}node${node}proc${proc}occ$proc</id> - <type>occ</type> - <attribute><id>HUID</id><default>${uidstr}</default></attribute> - <attribute><id>ORDINAL_ID</id><default>$ordinalId</default></attribute> - <attribute> - <id>PHYS_PATH</id> - <default>physical:sys-$sys/node-$node/proc-$proc/occ-$proc</default> - </attribute> - <attribute> - <id>AFFINITY_PATH</id> - <default>affinity:sys-$sys/node-$node/proc-$proc/occ-$proc</default> - </attribute> -</targetInstance>\n"; - -} - -sub generate_fsp_psi -{ - my $fsp = 0; - my $old_fsp = -1; - - for my $psi ( 0 .. $#SPSIs ) - { - $fsp = (chop($SPSIs[$psi][PSI_FSP_INSTANCE_PATH_FIELD]) eq '0') ? 0 : 1; - if($fsp ne $old_fsp) - { - print " -<!-- $SYSNAME n${node}fsp${fsp} PSI units -->"; - } - - generate_fsp_psi_units( $SPSIs[$psi][PSI_PROC_NODE_FIELD], - $SPSIs[$psi][PSI_PROC_POS_FIELD], - $SPSIs[$psi][PSI_SLAVE_CHIP_UNIT_FIELD], - $SPSIs[$psi][PSI_MASTER_NODE_FIELD], - $SPSIs[$psi][PSI_MASTER_CHIP_UNIT_FIELD], - $SPSIs[$psi][PSI_MASTER_DEV_PATH], - $SPSIs[$psi][PSI_ORDINAL_ID], - $fsp ); - $old_fsp = $fsp; - } -} - -sub generate_fsp_psi_units -{ - my ( $proc_node, $proc_pos, $proc_chip_unit, - $fsp_node, $fsp_chip_unit, $dev_path,$psi_ordinal, $fsp ) = @_; - - # RTC: 49574 - # The calculation for HUID is not correct for multi-node - # configurations, since ordinal ID should not be used in HUID calculations. - # Instead, the lower byte should repeat for every node. - # Fix this with the multi-node story - my $uidstr = sprintf("0x%02X14%04X",${node},$psi_ordinal); - - print " -<targetInstance> - <id>sys${sys}node${fsp_node}fsp${fsp}psi${fsp_chip_unit}</id> - <type>unit-psi-power8</type> - <attribute> - <id>HUID</id> - <default>${uidstr}</default> - </attribute> - <attribute> - <id>ORDINAL_ID</id> - <default>${psi_ordinal}</default> - </attribute> - <attribute> - <id>CHIP_UNIT</id> - <default>${fsp_chip_unit}</default> - </attribute> - <attribute> - <id>PSI_DEVICE_PATH</id> - <default>${dev_path}</default> - </attribute> - <attribute> - <id>PRIMARY_CAPABILITIES</id> - <default> - <field><id>supportsFsiScom</id><value>0</value></field> - <field><id>supportsXscom</id><value>0</value></field> - <field><id>supportsInbandScom</id><value>0</value></field> - <field><id>reserved</id><value>0</value></field> - </default> - </attribute> - <attribute> - <id>PHYS_PATH</id> - <default>physical:sys-${sys}/node-${fsp_node}/fsp-${fsp}/" - . "psi-${fsp_chip_unit}</default> - </attribute> - <attribute> - <id>AFFINITY_PATH</id> - <default>affinity:sys-${sys}/node-${fsp_node}/fsp-${fsp}/" - . "psi-${fsp_chip_unit}</default> - </attribute> - <attribute> - <id>PEER_TARGET</id> - <default>physical:sys-${sys}/node-${proc_node}/proc-${proc_pos}/" - . "psi-${proc_chip_unit}</default> - </attribute>"; -if($fsp_chip_unit eq 0) -{ -print" - <attribute> - <id>PSI_LINK_STATE</id> - <default>ACTIVE</default> - </attribute>"; -} -print" -</targetInstance>\n"; -} - -sub generate_proc_psi -{ - my ($proc_node,$proc_pos,$proc_chip_unit, - $fsp_node,$fsp_chip_unit, $psi_ordinal, $fsp) = @_; - $psi_ordinal += 1; - - my $uidstr = sprintf("0x%02X14%04X",${node},$psi_ordinal); - print " -<!-- $SYSNAME n${proc_node}p${proc_pos} PSI units --> - -<targetInstance> - <id>sys${sys}node${proc_node}proc${proc_pos}psi${proc_chip_unit}</id> - <type>unit-psi-power8</type> - <attribute> - <id>HUID</id> - <default>${uidstr}</default> - </attribute> - <attribute> - <id>ORDINAL_ID</id> - <default>${psi_ordinal}</default> - </attribute> - <attribute> - <id>CHIP_UNIT</id> - <default>${proc_chip_unit}</default> - </attribute> - <attribute> - <id>PHYS_PATH</id> - <default>physical:sys-${sys}/node-${proc_node}/proc-${proc_pos}/" - . "psi-${proc_chip_unit}</default> - </attribute> - <attribute> - <id>AFFINITY_PATH</id> - <default>affinity:sys-${sys}/node-${proc_node}/proc-${proc_pos}/" - . "psi-${proc_chip_unit}</default> - </attribute> - <attribute> - <id>PEER_TARGET</id> - <default>physical:sys-${sys}/node-${fsp_node}/fsp-${fsp}/" - . "psi-${fsp_chip_unit}</default> - </attribute>"; -if($fsp_chip_unit eq 0) -{ -print" - <attribute> - <id>PSI_LINK_STATE</id> - <default>ACTIVE</default> - </attribute>"; -} -print" -</targetInstance>\n"; -} - -sub generate_ex -{ - my ($proc, $ex, $ordinalId) = @_; - my $uidstr = sprintf("0x%02X06%04X",${node},$ex+$proc*16+${node}*8*16); - print " -<targetInstance> - <id>sys${sys}node${node}proc${proc}ex$ex</id> - <type>unit-ex-murano</type> - <attribute><id>HUID</id><default>${uidstr}</default></attribute> - <attribute> - <id>PHYS_PATH</id> - <default>physical:sys-$sys/node-$node/proc-$proc/ex-$ex</default> - </attribute> - <attribute> - <id>AFFINITY_PATH</id> - <default>affinity:sys-$sys/node-$node/proc-$proc/ex-$ex</default> - </attribute> - <attribute> - <id>CHIP_UNIT</id> - <default>$ex</default> - </attribute>"; - - if($build eq "fsp") - { - print " - <attribute> - <id>ORDINAL_ID</id> - <default>$ordinalId</default> - </attribute>"; - } - - print " -</targetInstance> -"; -} - -sub generate_ex_core -{ - my ($proc, $ex, $ordinalId) = @_; - my $uidstr = sprintf("0x%02X07%04X",${node},$ex+$proc*16+${node}*8*16); - print " -<targetInstance> - <id>sys${sys}node${node}proc${proc}ex${ex}core0</id> - <type>unit-core-murano</type> - <attribute><id>HUID</id><default>${uidstr}</default></attribute> - <attribute> - <id>PHYS_PATH</id> - <default>physical:sys-$sys/node-$node/proc-$proc/ex-$ex/core-0</default> - </attribute> - <attribute> - <id>AFFINITY_PATH</id> - <default>affinity:sys-$sys/node-$node/proc-$proc/ex-$ex/core-0</default> - </attribute> - <attribute> - <id>CHIP_UNIT</id> - <default>$ex</default> - </attribute>"; - - if($build eq "fsp") - { - print " - <attribute> - <id>ORDINAL_ID</id> - <default>$ordinalId</default> - </attribute>"; - } - - print " -</targetInstance> -"; -} - -sub generate_mcs -{ - my ($proc, $mcs, $ordinalId) = @_; - my $uidstr = sprintf("0x%02X0B%04X",${node},$mcs+$proc*8+${node}*8*8); - - #IBSCOM address range starts at 0x0003E00000000000 (992 TB) - #128GB per MCS/Centaur - #Addresses assigned by logical node, not physical node - #For Murano, each physical node is 2 logical nodes. - my $nodeOffset = 0x40*(${node}*2+(int($proc/2))); - my $procOffset = 0x10*($proc%2); - my $mcsOffset = $nodeOffset + $procOffset + $mcs*2; - my $mscStr = sprintf("0x0003E%02X00000000", $mcsOffset); - - my $lane_swap = 0; - foreach my $dmi ( @dbus_mcs ) - { - if (($dmi->[DBUS_MCS_NODE_INDEX], - $dmi->[DBUS_MCS_PROC_INDEX], - $dmi->[DBUS_MCS_UNIT_INDEX]) eq (${node},$proc,$mcs)) - { - $lane_swap = $dmi->[DBUS_MCS_DOWNSTREAM_INDEX]; - last; - } - } - - print " -<targetInstance> - <id>sys${sys}node${node}proc${proc}mcs$mcs</id> - <type>unit-mcs-murano</type> - <attribute><id>HUID</id><default>${uidstr}</default></attribute> - <attribute> - <id>PHYS_PATH</id> - <default>physical:sys-$sys/node-$node/proc-$proc/mcs-$mcs</default> - </attribute> - <attribute> - <id>AFFINITY_PATH</id> - <default>affinity:sys-$sys/node-$node/proc-$proc/mcs-$mcs</default> - </attribute> - <attribute> - <id>CHIP_UNIT</id> - <default>$mcs</default> - </attribute> - <attribute><id>IBSCOM_MCS_BASE_ADDR</id> - <!-- baseAddr = 0x0003E00000000000, 128GB per MCS --> - <default>$mscStr</default> - </attribute> - <!-- TODO When MRW provides the information, these two attributes - should be included. values of X come from MRW. - <attribute> - <id>EI_BUS_RX_MSB_LSB_SWAP</id> - <default>X</default> - </attribute> - <attribute> - <id>EI_BUS_TX_MSB_LSB_SWAP</id> - <default>X</default> - </attribute> - --> - <attribute> - <id>EI_BUS_TX_LANE_INVERT</id> - <default>$lane_swap</default> - </attribute>"; - - if($build eq "fsp") - { - print " - <attribute> - <id>ORDINAL_ID</id> - <default>$ordinalId</default> - </attribute>"; - } - - print " -</targetInstance> -"; -} - -sub generate_pcies -{ - my ($proc,$ordinalId) = @_; - my $proc_name = "n${node}:p${proc}"; - print "\n<!-- $SYSNAME n${node}p${proc} PCI units -->\n"; - for my $i ( 0 .. 2 ) - { - generate_a_pcie( $proc, $i, ($ordinalId*3)+$i ); - } -} - -sub generate_a_pcie -{ - my ($proc, $phb, $ordinalId) = @_; - my $uidstr = sprintf("0x%02X10%04X",${node},$phb+$proc*3+${node}*8*3); - print " -<targetInstance> - <id>sys${sys}node${node}proc${proc}pci${phb}</id> - <type>unit-pci-murano</type> - <attribute><id>HUID</id><default>${uidstr}</default></attribute> - <attribute> - <id>PHYS_PATH</id> - <default>physical:sys-$sys/node-$node/proc-$proc/pci-$phb</default> - </attribute> - <attribute> - <id>AFFINITY_PATH</id> - <default>affinity:sys-$sys/node-$node/proc-$proc/pci-$phb</default> - </attribute> - <attribute> - <id>CHIP_UNIT</id> - <default>$phb</default> - </attribute>"; - - if($build eq "fsp") - { - print " - <attribute> - <id>ORDINAL_ID</id> - <default>$ordinalId</default> - </attribute>"; - } - - print " -</targetInstance> -"; -} - -sub generate_ax_buses -{ - my ($proc, $type, $ordinalId) = @_; - - my $proc_name = "n${node}p${proc}"; - print "\n<!-- $SYSNAME $proc_name ${type}BUS units -->\n"; - my $minbus = ($type eq "A") ? 0 : 1; - my $maxbus = ($type eq "A") ? 2 : 1; - my $numperchip = ($type eq "A") ? 3 : 4; - my $typenum = ($type eq "A") ? 0x0F : 0x0E; - $type = lc( $type ); - for my $i ( $minbus .. $maxbus ) - { - my $uidstr = sprintf( "0x%02X%02X%04X", - ${node}, - $typenum, - $i+$proc*($numperchip)+${node}*8*($numperchip)); - $ordinalId = $i+($ordinalId*($numperchip)); - - my $peer = 0; - my $p_proc = 0; - my $p_port = 0; - my $lane_swap = 0; - foreach my $pbus ( @pbus ) - { - if ($pbus->[PBUS_FIRST_END_POINT_INDEX] eq "n${node}:p${proc}:${type}${i}") - { - $peer = 1; - $p_proc = $pbus->[PBUS_SECOND_END_POINT_INDEX]; - $p_port = $p_proc; - my $p_node = $pbus->[PBUS_SECOND_END_POINT_INDEX]; - $p_node =~ s/^n(.*):p.*:.*$/$1/; - $p_proc =~ s/^.*:p(.*):.*$/$1/; - $p_port =~ s/.*:p.*:.(.*)$/$1/; - # Calculation from Pete Thomsen for 'master' chip - if(((${node}*100) + $proc) < (($p_node*100) + $p_proc)) - { - # This chip is lower so it's master so it gets - # the downstream data. - $lane_swap = $pbus->[PBUS_DOWNSTREAM_INDEX]; - } - else - { - # This chip is higher so it's the slave chip - # and gets the upstream - $lane_swap = $pbus->[PBUS_UPSTREAM_INDEX]; - } - last; - } - } - print " -<targetInstance> - <id>sys${sys}node${node}proc${proc}${type}bus$i</id> - <type>unit-${type}bus-murano</type> - <attribute><id>HUID</id><default>${uidstr}</default></attribute> - <attribute> - <id>PHYS_PATH</id> - <default>physical:sys-$sys/node-$node/proc-$proc/${type}bus-$i</default> - </attribute> - <attribute> - <id>AFFINITY_PATH</id> - <default>affinity:sys-$sys/node-$node/proc-$proc/${type}bus-$i</default> - </attribute> - <attribute> - <id>CHIP_UNIT</id> - <default>$i</default> - </attribute>"; - if ($peer) - { - print " - <attribute> - <id>PEER_TARGET</id> - <default>physical:sys-$sys/node-$node/proc-$p_proc/" - . "${type}bus-$p_port</default> - </attribute>"; - } - - if($build eq "fsp") - { - print " - <attribute> - <id>ORDINAL_ID</id> - <default>$ordinalId</default> - </attribute>"; - } - if($type eq "a") - { - print " - <attribute> - <id>EI_BUS_TX_LANE_INVERT</id> - <default>$lane_swap</default> - </attribute>"; - } - - print "\n</targetInstance>\n"; - } -} - -sub generate_centaur -{ - my ($ctaur, $mcs, $cfsi, $ipath, $ordinalId, $relativeCentaurRid, - $vmemId, $vmemDevPath, $vmemAddr) = @_; - my $scompath = $devpath->{chip}->{$ipath}->{'scom-path'}; - my $scanpath = $devpath->{chip}->{$ipath}->{'scan-path'}; - my $scomsize = length($scompath) + 1; - my $scansize = length($scanpath) + 1; - my $proc = $mcs; - $proc =~ s/.*:p(.*):.*/$1/g; - $mcs =~ s/.*:.*:mcs(.*)/$1/g; - - my $uidstr = sprintf("0x%02X04%04X",${node},$mcs+$proc*8+${node}*8*8); - - my $lane_swap = 0; - foreach my $dmi ( @dbus_centaur ) - { - if (($dmi->[DBUS_CENTAUR_NODE_INDEX], - $dmi->[DBUS_CENTAUR_MEMBUF_INDEX]) eq (${node},$ctaur)) - { - $lane_swap = $dmi->[DBUS_CENTAUR_UPSTREAM_INDEX]; - last; - } - } - - print " -<!-- $SYSNAME Centaur n${node}p${ctaur} : start --> - -<targetInstance> - <id>sys${sys}node${node}membuf${ctaur}</id> - <type>chip-membuf-centaur</type> - <attribute><id>HUID</id><default>${uidstr}</default></attribute> - <attribute><id>POSITION</id><default>$ctaur</default></attribute> - <attribute> - <id>PHYS_PATH</id> - <default>physical:sys-$sys/node-$node/membuf-$ctaur</default> - </attribute> - <attribute> - <id>AFFINITY_PATH</id> - <default>affinity:sys-$sys/node-$node/proc-$proc/mcs-$mcs/" - . "membuf-$ctaur</default> - </attribute> - <attribute> - <id>VMEM_ID</id> - <default>$vmemId</default> - </attribute> - <!-- TODO When MRW provides the information, these two attributes - should be included. values of X come from MRW. - <attribute> - <id>EI_BUS_RX_MSB_LSB_SWAP</id> - <default>X</default> - </attribute> - <attribute> - <id>EI_BUS_TX_MSB_LSB_SWAP</id> - <default>X</default> - </attribute> - --> - - <!-- FSI is connected via proc$proc:cMFSI-$cfsi --> - <attribute> - <id>FSI_MASTER_CHIP</id> - <default>physical:sys-$sys/node-$node/proc-$proc</default> - </attribute> - <attribute> - <id>FSI_MASTER_TYPE</id> - <default>CMFSI</default> - </attribute> - <attribute> - <id>FSI_MASTER_PORT</id> - <default>$cfsi</default> - </attribute> - <attribute> - <id>FSI_SLAVE_CASCADE</id> - <default>0</default> - </attribute> - <attribute> - <id>FSI_OPTION_FLAGS</id> - <default>0</default> - </attribute> - <attribute><id>VPD_REC_NUM</id><default>$ctaur</default></attribute> - <attribute> - <id>EI_BUS_TX_LANE_INVERT</id> - <default>$lane_swap</default> - </attribute>"; - - if ($build eq "fsp") - { - my $ridHex=sprintf("0xD0%02X",$relativeCentaurRid); - print " - <attribute> - <id>FSP_SCOM_DEVICE_PATH</id> - <default>$scompath</default> - <sizeInclNull>$scomsize</sizeInclNull> - </attribute> - <attribute> - <id>FSP_SCAN_DEVICE_PATH</id> - <default>$scanpath</default> - <sizeInclNull>$scansize</sizeInclNull> - </attribute> - <attribute> - <id>RID</id> - <default>$ridHex</default> - </attribute> - <attribute> - <id>ORDINAL_ID</id> - <default>$ordinalId</default> - </attribute> - <attribute> - <id>FSP_VMEM_DEVICE_PATH</id> - <default>$vmemDevPath</default> - </attribute> - <attribute> - <id>FSP_VMEM_I2C_ADDR</id> - <default>$vmemAddr</default> - </attribute>"; - } - print "\n</targetInstance>\n"; - - $uidstr = sprintf("0x%02X0C%04X",${node},$mcs+$proc*8+${node}*8*8); - print " -<!-- $SYSNAME Centaur MBS affiliated with membuf$ctaur --> - -<targetInstance> - <id>sys${sys}node${node}membuf${ctaur}mbs0</id> - <type>unit-mbs-centaur</type> - <attribute><id>HUID</id><default>${uidstr}</default></attribute> - <attribute> - <id>PHYS_PATH</id> - <default>physical:sys-$sys/node-$node/membuf-$ctaur/mbs-0</default> - </attribute> - <attribute> - <id>AFFINITY_PATH</id> - <default>affinity:sys-$sys/node-$node/proc-$proc/mcs-$mcs/" - . "membuf-$ctaur/mbs-0</default> - </attribute>"; - - if($build eq "fsp") - { - print " - <attribute> - <id>ORDINAL_ID</id> - <default>$ordinalId</default> - </attribute>"; - } - - print " -</targetInstance> -"; -} - -sub generate_mba -{ - my ($ctaur, $mcs, $mba, $ordinalId) = @_; - my $proc = $mcs; - $proc =~ s/.*:p(.*):.*/$1/g; - $mcs =~ s/.*:.*:mcs(.*)/$1/g; - - my $uidstr = sprintf("0x%02X0D%04X", - ${node},$mba+$mcs*2+$proc*8*2+${node}*8*8*2); - - print " -<targetInstance> - <id>sys${sys}node${node}membuf${ctaur}mbs0mba$mba</id> - <type>unit-mba-centaur</type> - <attribute><id>HUID</id><default>${uidstr}</default></attribute> - <attribute> - <id>PHYS_PATH</id> - <default>physical:sys-$sys/node-$node/membuf-$ctaur/mbs-0/" - . "mba-$mba</default> - </attribute> - <attribute> - <id>AFFINITY_PATH</id> - <default>affinity:sys-$sys/node-$node/proc-$proc/mcs-$mcs/" - . "membuf-$ctaur/mbs-0/mba-$mba</default> - </attribute> - <attribute> - <id>CHIP_UNIT</id> - <default>$mba</default> - </attribute>"; - - if($build eq "fsp") - { - print " - <attribute> - <id>ORDINAL_ID</id> - <default>$ordinalId</default> - </attribute>"; - } - - print " -</targetInstance> -"; -} - -# Since each Centaur has only one dimm, it is assumed to be attached to port 0 -# of the MBA0 chiplet. -sub generate_dimm -{ - my ($proc, $mcs, $ctaur, $pos, $dimm, $id, $ordinalId, $relativeDimmRid, $relativePos) - = @_; - - my $x = $id; - $x = int ($x / 4); - my $y = $id; - $y = int(($y - 4 * $x) / 2); - my $z = $id; - $z = $z % 2; - my $zz = $id; - $zz = $zz % 4; - #$x = sprintf ("%d", $x); - #$y = sprintf ("%d", $y); - #$z = sprintf ("%d", $z); - #$zz = sprintf ("%d", $zz); - my $uidstr = sprintf("0x%02X03%04X",${node},$dimm+${node}*512); - - # Calculate the VPD Record number value - my $vpdRec = 0; - - # Set offsets based on mba and dimm values - if( 1 == $x ) - { - $vpdRec = $vpdRec + 4; - } - if( 1 == $y ) - { - $vpdRec = $vpdRec + 2; - } - if( 1 == $z ) - { - $vpdRec = $vpdRec + 1; - } - - my $position = ($proc * 64) + 8 * $mcs + $vpdRec; - - # Adjust offset based on MCS value - $vpdRec = ($mcs * 8) + $vpdRec; - # Adjust offset basedon processor value - $vpdRec = ($proc * 64) + $vpdRec; - - my $dimmHex=sprintf("0xD0%02X",$relativePos); - print " -<targetInstance> - <id>sys${sys}node${node}dimm$dimm</id> - <type>lcard-dimm-cdimm</type> - <attribute><id>HUID</id><default>${uidstr}</default></attribute> - <attribute><id>POSITION</id><default>$position</default></attribute> - <attribute> - <id>PHYS_PATH</id> - <default>physical:sys-$sys/node-$node/dimm-$dimm</default> - </attribute> - <attribute> - <id>AFFINITY_PATH</id> - <default>affinity:sys-$sys/node-$node/proc-$proc/mcs-$mcs/" - . "membuf-$pos/mbs-0/mba-$x/dimm-$zz</default> - </attribute> - <attribute> - <id>MBA_DIMM</id> - <default>$z</default> - </attribute> - <attribute> - <id>MBA_PORT</id> - <default>$y</default> - </attribute> - <attribute><id>VPD_REC_NUM</id><default>$vpdRec</default></attribute>"; - - if ($build eq "fsp") - { - print" - <attribute> - <id>RID</id> - <default>$dimmHex</default> - </attribute> - <attribute> - <id>ORDINAL_ID</id> - <default>$ordinalId</default> - </attribute>"; - } - -print "\n</targetInstance>\n"; -} - -sub generate_pnor -{ - my ($sys, $node, $pnor, $charPath, $blockPath,$proc,$count) = @_; - -# @TODO via RTC: 48523 -# Will need to compute the HUID using the workbook info to determine max # parts -# per node - my $uidstr = sprintf("0x%02X16%04X",${node},$pnor+${node}*2); - -# @TODO via RTC: 37573 -# Will need to re-evaluate how to compute the PNOR RID value once -# the new system comes out. Currently the 0x800 RID value is only -# for the TULETA system - print " -<targetInstance> - <id>sys${sys}node${node}pnor${pnor}</id> - <type>chip-pnor-power8</type> - <attribute><id>HUID</id><default>${uidstr}</default></attribute> - <attribute> - <id>POSITION</id> - <default>$pnor</default> - </attribute> - <attribute> - <id>PHYS_PATH</id> - <default>physical:sys-$sys/node-$node/pnor-$pnor</default> - </attribute> - <attribute> - <id>AFFINITY_PATH</id> - <default>affinity:sys-$sys/node-$node/proc-$proc/pnor-$pnor</default> - </attribute> - <attribute> - <id>PRIMARY_CAPABILITIES</id> - <default> - <field><id>supportsFsiScom</id><value>0</value></field> - <field><id>supportsXscom</id><value>0</value></field> - <field><id>supportsInbandScom</id><value>0</value></field> - <field><id>reserved</id><value>0</value></field> - </default> - </attribute> - <attribute> - <id>FSP_A_MTD_DEVICE_PATH</id> - <default>$charPath</default> - </attribute> - <attribute> - <id>FSP_A_MTDBLOCK_DEVICE_PATH</id> - <default>$blockPath</default> - </attribute>"; - - if($build eq "fsp") - { - print " - <attribute> - <id>RID</id> - <default>0x800</default> - </attribute> - <attribute> - <id>ORDINAL_ID</id> - <default>$count</default> - </attribute>"; - } - - print "\n</targetInstance>\n"; -} - -sub addSysAttrs -{ - for my $i (0 .. $#systemAttr) - { - my $j =0; - my $sysAttrArraySize=$#{$systemAttr[$i]}; - while ($j<$sysAttrArraySize) - { - print " <attribute>\n"; - print " <id>$systemAttr[$i][SYS_ATTR_START_INDEX+$j]</id>\n"; - $j++; - print " <default>\n"; - print " $systemAttr[$i][SYS_ATTR_START_INDEX+$j]\n"; - print " </default>\n"; - print " </attribute>\n"; - $j++; - } - } -} - -sub addProcPcieAttrs -{ - my ($position,$nodeId) = @_; - - for my $i (0 .. $#SortedPcie) - { - if (($SortedPcie[$i][PCIE_POS_INDEX] == $position) && - ($SortedPcie[$i][PCIE_NODE_INDEX] == $node) ) - { - #found the corresponding proc and node - my $j =0; - #subtract to from the size because the start position is 2 over - my $pcieArraySize=$#{$SortedPcie[$i]}-PCIE_START_INDEX; - while ($j<$pcieArraySize) - { - print " <attribute>\n"; - print " <id>$SortedPcie[$i][PCIE_START_INDEX+$j]</id>\n"; - $j++; - print " <default>\n"; - print " $SortedPcie[$i][PCIE_START_INDEX+$j]"; - print ","; - $j++; - print "$SortedPcie[$i][PCIE_START_INDEX+$j]\n"; - print " </default>\n"; - print " </attribute>\n"; - $j++; - } - } - } -} - -sub display_help -{ - use File::Basename; - my $scriptname = basename($0); - print STDERR " -Usage: - - $scriptname --help - $scriptname --system=sysname --mrwdir=pathname - [--build=hb] [--outfile=XmlFilename] - --system=systemname - Specify which system MRW XML to be generated - --mrwdir=pathname - Specify the complete dir pathname of the MRW. - --build=hb - Specify HostBoot build (hb) - --outfile=XmlFilename - Specify the filename for the output XML. If omitted, the output - is written to STDOUT which can be saved by redirection. -\n"; -} |