From f81a76dc1e804534b3190b4aa64b83f707bd24a3 Mon Sep 17 00:00:00 2001 From: Nick Bofferding Date: Tue, 13 May 2014 14:59:42 -0500 Subject: Support dynamic VID for AVDD, VPP, VCS, VDD memory voltage domains - Added AVDD, VPP, VCS, VPP voltage domain ID attributes - Added offset voltage attributes for all 5 memory voltage domains - Added VPP base voltage attribute - Added HWP attributes for all 5 memory voltage domain offset calcs - Added all new attributes to appropriate targets - Updated MRW parser to populate voltage domain ID attributes - Updated MRW parser to populate HWP related optional system attributes - Updated mss_volt istep to set offset voltages for all domains/membufs - Updated VID compare/equality operators to handle voltage domain type - Updated VID populator to add VID programming info from all domains - Updated VID messages to populate and receive voltage domain type - Added dynamic VID HWPs, attributes, error XML files Change-Id: I58f9eb13e4083b192d99308b8314cda0c1078800 RTC: 99246 Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/11091 Tested-by: Jenkins Server Reviewed-by: A. Patrick Williams III --- src/usr/targeting/common/genHwsvMrwXml.pl | 237 +++++++++++++++++++----------- 1 file changed, 149 insertions(+), 88 deletions(-) (limited to 'src/usr/targeting/common/genHwsvMrwXml.pl') diff --git a/src/usr/targeting/common/genHwsvMrwXml.pl b/src/usr/targeting/common/genHwsvMrwXml.pl index 031752633..a93c4a12e 100755 --- a/src/usr/targeting/common/genHwsvMrwXml.pl +++ b/src/usr/targeting/common/genHwsvMrwXml.pl @@ -122,7 +122,6 @@ if ($sysname =~ /brazos/) $placement = 0x3; #DRAWER } - push @systemAttr, [ "FREQ_PROC_REFCLOCK", $reqPol->{'processor-refclock-frequency'}->{content}, @@ -219,6 +218,61 @@ if ($MAXNODE > 1 && $sysname !~ m/mfg/) push @systemAttr, ["DO_ABUS_DECONFIG", 0]; } +# Process optional policies related to dyanmic VID +my $optMrwPolicies = $sysPolicy->{"optional-policy-settings"}; +use constant MRW_NAME => 'mrw-name'; + +my %optTargPolicies = (); +$optTargPolicies{'MSS_CENT_AVDD_OFFSET_DISABLE'}{MRW_NAME} + = "mem_avdd_offset_disable" ; +$optTargPolicies{'MSS_CENT_VDD_OFFSET_DISABLE'}{MRW_NAME} + = "mem_vdd_offset_disable" ; +$optTargPolicies{'MSS_CENT_VCS_OFFSET_DISABLE'}{MRW_NAME} + = "mem_vcs_offset_disable" ; +$optTargPolicies{'MSS_VOLT_VPP_OFFSET_DISABLE'}{MRW_NAME} + = "mem_vpp_offset_disable" ; +$optTargPolicies{'MSS_VOLT_VDDR_OFFSET_DISABLE'}{MRW_NAME} + = "mem_vddr_offset_disable" ; +$optTargPolicies{'MSS_CENT_AVDD_SLOPE_ACTIVE'}{MRW_NAME} + = "mem_avdd_slope_active" ; +$optTargPolicies{'MSS_CENT_AVDD_SLOPE_INACTIVE'}{MRW_NAME} + = "mem_avdd_slope_inactive" ; +$optTargPolicies{'MSS_CENT_AVDD_INTERCEPT'}{MRW_NAME} + = "mem_avdd_intercept" ; +$optTargPolicies{'MSS_CENT_VDD_SLOPE_ACTIVE'}{MRW_NAME} + = "mem_vdd_slope_active" ; +$optTargPolicies{'MSS_CENT_VDD_SLOPE_INACTIVE'}{MRW_NAME} + = "mem_vdd_slope_inactive" ; +$optTargPolicies{'MSS_CENT_VDD_INTERCEPT'}{MRW_NAME} + = "mem_vdd_intercept" ; +$optTargPolicies{'MSS_CENT_VCS_SLOPE_ACTIVE'}{MRW_NAME} + = "mem_vcs_slope_active" ; +$optTargPolicies{'MSS_CENT_VCS_SLOPE_INACTIVE'}{MRW_NAME} + = "mem_vcs_slope_inactive" ; +$optTargPolicies{'MSS_CENT_VCS_INTERCEPT'}{MRW_NAME} + = "mem_vcs_intercept" ; +$optTargPolicies{'MSS_VOLT_VPP_SLOPE'}{MRW_NAME} + = "mem_vpp_slope" ; +$optTargPolicies{'MSS_VOLT_VPP_INTERCEPT'}{MRW_NAME} + = "mem_vpp_intercept" ; +$optTargPolicies{'MSS_VOLT_DDR3_VDDR_SLOPE'}{MRW_NAME} + = "mem_ddr3_vddr_slope" ; +$optTargPolicies{'MSS_VOLT_DDR3_VDDR_INTERCEPT'}{MRW_NAME} + = "mem_ddr3_vddr_intercept" ; +$optTargPolicies{'MSS_VOLT_DDR4_VDDR_SLOPE'}{MRW_NAME} + = "mem_ddr4_vddr_slope" ; +$optTargPolicies{'MSS_VOLT_DDR4_VDDR_INTERCEPT'}{MRW_NAME} + = "mem_ddr4_vddr_intercept" ; + +foreach my $policy ( keys %optTargPolicies ) +{ + if(exists $optMrwPolicies->{ $optTargPolicies{$policy}{MRW_NAME}}) + { + push @systemAttr, [ $policy , + $optMrwPolicies->{$optTargPolicies{$policy}{MRW_NAME}}]; + } +} + #------------------------------------------------------------------------------ # Process the pm-settings MRW file #------------------------------------------------------------------------------ @@ -458,60 +512,100 @@ foreach my $dmi (@{$dmibus->{'dmi-bus'}}) # Process the cent-vrds MRW file #------------------------------------------------------------------------------ my $cent_vrds_file = open_mrw_file($mrwdir, "${sysname}-cent-vrds.xml"); -my $vmemCentaur = XMLin($cent_vrds_file); - -# 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 $mrwMemVoltageDomains = XMLin($cent_vrds_file); + +our %vrmHash = (); +my %membufVrmUuidHash = (); +my %vrmIdHash = (); +my %validVrmTypes + = ('VMEM' => 1,'AVDD' => 1,'VCS' => 1,'VPP' => 1,'VDD' => 1); +use constant VRM_I2C_DEVICE_PATH => 'vrmI2cDevicePath'; +use constant VRM_I2C_ADDRESS => 'vrmI2cAddress'; +use constant VRM_DOMAIN_TYPE => 'vrmDomainType'; +use constant VRM_DOMAIN_ID => 'vrmDomainId'; +use constant VRM_UUID => 'vrmUuid'; + +foreach my $mrwMemVoltageDomain ( + @{$mrwMemVoltageDomains->{'centaur-vrd-connection'}}) +{ + if( (!exists $mrwMemVoltageDomain->{'vrd'}->{'i2c-dev-path'}) + || (!exists $mrwMemVoltageDomain->{'vrd'}->{'i2c-address'}) + || (ref($mrwMemVoltageDomain->{'vrd'}->{'i2c-dev-path'}) eq "HASH") + || (ref($mrwMemVoltageDomain->{'vrd'}->{'i2c-address'}) eq "HASH") + || ($mrwMemVoltageDomain->{'vrd'}->{'i2c-dev-path'} eq "") + || ($mrwMemVoltageDomain->{'vrd'}->{'i2c-address'} eq "")) + { + next; + } -my $vmemId = 0x0; + my $vrmDev = $mrwMemVoltageDomain->{'vrd'}->{'i2c-dev-path'}; + my $vrmAddr = $mrwMemVoltageDomain->{'vrd'}->{'i2c-address'}; + my $vrmType = uc $mrwMemVoltageDomain->{'vrd'}->{'type'}; + my $membufInstance = + "n" . $mrwMemVoltageDomain->{'centaur'}->{'target'}->{'node'} . + ":p" . $mrwMemVoltageDomain->{'centaur'}->{'target'}->{'position'}; -my @unsortedVmem; -my @vmemArray; -my @vmemDevAddr; -my $vmemValue =0; -my $found=0; -my $loc=0; -my $newValue =0; + if(!exists $validVrmTypes{$vrmType}) + { + die "Illegal VRM type of $vrmType used\n"; + } -foreach my $i (@{$vmemCentaur->{'centaur-vrd-connection'}}) -{ - my $vmemDev = $i->{'vrd'}->{'i2c-dev-path'}; - my $vmemAddr = $i->{'vrd'}->{'i2c-address'}; + if(!exists $vrmIdHash{$vrmType}) + { + $vrmIdHash{$vrmType} = 0; + } - for my $j (0 .. $#vmemDevAddr) + my $uuid = -1; + foreach my $vrm ( keys %vrmHash ) { - if ( ($vmemDev eq $vmemDevAddr[$j][VMEM_DEV_PATH_FIELD]) && - ($vmemAddr eq $vmemDevAddr[$j][VMEM_I2C_ADDR_FIELD]) ) + if( ($vrmHash{$vrm}{VRM_I2C_DEVICE_PATH} eq $vrmDev ) + && ($vrmHash{$vrm}{VRM_I2C_ADDRESS} eq $vrmAddr) + && ($vrmHash{$vrm}{VRM_DOMAIN_TYPE} eq $vrmType) ) { - $found =1; - $vmemValue=$vmemDevAddr[$j][VMEM_ID_FIELD]; + $uuid = $vrm; last; } - else - { - $found=0; - } + } - if ($found ==0) + + if($uuid == -1) { - $vmemValue=$newValue++; - push (@vmemDevAddr,[$vmemDev, $vmemAddr, $vmemValue]); + my $vrm = scalar keys %vrmHash; + $vrmHash{$vrm}{VRM_I2C_DEVICE_PATH} = $vrmDev; + $vrmHash{$vrm}{VRM_I2C_ADDRESS} = $vrmAddr; + $vrmHash{$vrm}{VRM_DOMAIN_TYPE} = $vrmType; + $vrmHash{$vrm}{VRM_DOMAIN_ID} = + $vrmIdHash{$vrmType}++; + $uuid = $vrm; } - - my $vmemNode = $i->{'centaur'}->{'target'}->{'node'}; - my $vmemPosition = $i->{'centaur'}->{'target'}->{'position'}; - - push (@unsortedVmem,[$vmemDev, $vmemAddr, $vmemValue, $vmemNode, - $vmemPosition]); + $membufVrmUuidHash{$membufInstance}{$vrmType}{VRM_UUID} = $uuid; } +my $vrmDebug = 0; +if($vrmDebug) +{ + foreach my $membuf ( keys %membufVrmUuidHash) + { + print STDOUT "Membuf instance: " . $membuf . "\n"; -my @SortedVmem = sort byVmemNodePos @unsortedVmem; + foreach my $vrmType ( keys %{$membufVrmUuidHash{$membuf}} ) + { + print STDOUT "VRM type: " . $vrmType . "\n"; + print STDOUT "VRM UUID: " . + $membufVrmUuidHash{$membuf}{$vrmType}{VRM_UUID} . "\n"; + } + } + + foreach my $vrm ( keys %vrmHash) + { + print STDOUT "VRM UUID: " . $vrm . "\n"; + print STDOUT "VRM type: " . $vrmHash{$vrm}{VRM_DOMAIN_TYPE} . "\n"; + print STDOUT "VRM id: " . $vrmHash{$vrm}{VRM_DOMAIN_ID} . "\n"; + print STDOUT "VRM dev: " . $vrmHash{$vrm}{VRM_I2C_DEVICE_PATH} . "\n"; + print STDOUT "VRM addr: " . $vrmHash{$vrm}{VRM_I2C_ADDRESS} . "\n"; + } +} #------------------------------------------------------------------------------ # Process the cec-chips and pcie-busses MRW files @@ -1021,7 +1115,6 @@ my @fru_paths; my $hasProc = 0; my $hash_ax_buses; my $axBusesHuidInit = 0; -my $vmem_count =0; for (my $curnode = 0; $curnode <= $MAXNODE; $curnode++) { @@ -1260,7 +1353,6 @@ for (my $do_core = 0, my $i = 0; $i <= $#STargets; $i++) my $memb; my $membMcs; my $mba_count = 0; -my $vmem_id =0; for my $i ( 0 .. $#STargets ) { @@ -1321,17 +1413,9 @@ for my $i ( 0 .. $#STargets ) my $relativeCentaurRid = $STargets[$i][PLUG_POS] + (CDIMM_RID_NODE_MULTIPLIER * $STargets[$i][NODE_FIELD]); - #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, \@fsi, \@altfsi, $ipath, $STargets[$i][ORDINAL_FIELD],$relativeCentaurRid, - $vmem_id, $vmemDevPath, $vmemAddr, $ipath); + $ipath, $membufVrmUuidHash{"n${node}:p${memb}"}); } elsif ($STargets[$i][NAME_FIELD] eq "mba") { @@ -1651,37 +1735,6 @@ sub byNodePos($$) 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; -} - sub generate_sys { my $plat = 0; @@ -3035,7 +3088,8 @@ sub generate_logicalDimms sub generate_centaur { my ($ctaur, $mcs, $fsiA, $altfsiA, $ipath, $ordinalId, $relativeCentaurRid, - $vmemId, $vmemDevPath, $vmemAddr, $ipath) = @_; + $ipath, $membufVrmUuidHash) = @_; + my @fsi = @{$fsiA}; my @altfsi = @{$altfsiA}; my $scomFspApath = $devpath->{chip}->{$ipath}->{'scom-path-a'}; @@ -3106,10 +3160,6 @@ sub generate_centaur INSTANCE_PATH instance:$ipath - - VMEM_ID - $vmemId - EI_BUS_TX_MSBSWAP $msb_swap @@ -3192,10 +3242,21 @@ sub generate_centaur $lane_swap "; + foreach my $vrmType ( keys %$membufVrmUuidHash ) + { + my $key = $membufVrmUuidHash->{$vrmType}{VRM_UUID}; + print + "\n" + . " \n" + . " $vrmType" . "_ID\n" + . " $vrmHash{$key}{VRM_DOMAIN_ID}\n" + . " "; + } + # call to do any fsp per-centaur attributes do_plugin('fsp_centaur', $scomFspApath, $scomFspAsize, $scanFspApath, $scanFspAsize, $scomFspBpath, $scomFspBsize, $scanFspBpath, - $scanFspBsize, $vmemDevPath, $vmemAddr, $relativeCentaurRid, $ordinalId); + $scanFspBsize, $relativeCentaurRid, $ordinalId, $membufVrmUuidHash); print "\n\n"; -- cgit v1.2.3