diff options
author | Nick Bofferding <bofferdn@us.ibm.com> | 2014-12-04 14:16:09 -0600 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2015-01-22 17:17:39 -0600 |
commit | f8569146fb30162c9bc9d4730d0476f209071fac (patch) | |
tree | 19a495e078dea43580c38cb4c999cb4eac1e909e /src/usr/targeting/common/genHwsvMrwXml.pl | |
parent | 1bc13e89d35eacba76589ac3c5158d54ce73b35b (diff) | |
download | talos-hostboot-f8569146fb30162c9bc9d4730d0476f209071fac.tar.gz talos-hostboot-f8569146fb30162c9bc9d4730d0476f209071fac.zip |
Support VDDR enable for Firestone
- Assert GPIOs from MRW info to enable VDDR across FSP-less platforms
- Updated MRW parser to parse GPIO info from MRW
- Updated membuf selection algorithm to choose optimal set of GPIO enables
- Defaulted GPIO_INFO attribute to invalid value
- Updated GPIO device driver to use MRW i2c master path
Change-Id: I0da9e0608af3e8368217c863b2606279637711e5
RTC: 117706
Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/14710
Tested-by: Jenkins Server
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/usr/targeting/common/genHwsvMrwXml.pl')
-rwxr-xr-x | src/usr/targeting/common/genHwsvMrwXml.pl | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/src/usr/targeting/common/genHwsvMrwXml.pl b/src/usr/targeting/common/genHwsvMrwXml.pl index 8bfe40097..b63d4db9a 100755 --- a/src/usr/targeting/common/genHwsvMrwXml.pl +++ b/src/usr/targeting/common/genHwsvMrwXml.pl @@ -396,6 +396,19 @@ use constant MAX_NUM_PHB_PER_PROC => 4; # MAX lane settings value is 32 bytes per phb and is hard coded here use constant MAX_LANE_SETTINGS_PER_PHB => 32; +################################################################################ +# If value is hex, convert to regular number +############################################################################### + +sub unhexify { + my($val) = @_; + if($val =~ m/^0[xX][01234567890A-Fa-f]+$/) + { + $val = hex($val); + } + return $val; +} + # Determine values of proc pcie attributes # Currently # PROC_PCIE_LANE_EQUALIZATION PROC_PCIE_IOP_CONFIG PROC_PCIE_PHB_ACTIVE @@ -1234,6 +1247,67 @@ for my $i ( 0 .. $#SMembuses ) } #------------------------------------------------------------------------------ +# Process VDDR GPIO enables +#------------------------------------------------------------------------------ + +my %vddrEnableHash = (); +my $useGpioToEnableVddr = 0; + +if(!$haveFSPs) +{ + $useGpioToEnableVddr = 1; +} + +if($useGpioToEnableVddr) +{ + my $vddrEnablesFile = open_mrw_file($mrwdir, "${sysname}-vddr.xml"); + my $vddrEnables = parse_xml_file( + $vddrEnablesFile, + forcearray=>['vddr-enable']); + + foreach my $vddrEnable (@{$vddrEnables->{'vddr-enable'}}) + { + # Get dependent Centaur info + my $centaurNode = $vddrEnable->{'centaur-target'}->{node}; + my $centaurPosition = $vddrEnable->{'centaur-target'}->{position}; + + # Get I2C master which drives the GPIO for this Centaur + my $i2cMasterNode = $vddrEnable->{i2c}->{'master-target'}->{node}; + my $i2cMasterPosition + = $vddrEnable->{i2c}->{'master-target'}->{position}; + my $i2cMasterPort = $vddrEnable->{i2c}->{port}; + my $i2cMasterEngine = $vddrEnable->{i2c}->{engine}; + + # Get GPIO expander info. For now these are pca9535 specific + # Targeting requires real i2c address to be shifted left one bit + my $i2cAddress = unhexify( $vddrEnable->{i2c}->{address} ) << 1; + my $i2cAddressHexStr = sprintf("0x%X",$i2cAddress); + my $vddrPort = $vddrEnable->{'io-expander'}->{port}; + my $vddrPortPin = $vddrEnable->{'io-expander'}->{pin}; + my $vddrPin = $vddrPort * 8 + $vddrPortPin; + + # Build foreign keys to the Centaur targets + my $vddrKey = "n" . $centaurNode . "p" . $centaurPosition; + my $i2cMasterKey = "n" . $i2cMasterNode . "p" . $i2cMasterPosition; + my $i2cMasterEntityPath = + "physical:sys-0/node-$i2cMasterNode/membuf-$i2cMasterPosition"; + + # Populate the key => value pairs for a given Centaur + $vddrEnableHash{$vddrKey} = { + 'i2cMasterKey' => $i2cMasterKey, + 'i2cMasterEntityPath' => $i2cMasterEntityPath, + 'i2cMasterNode' => $i2cMasterNode, + 'i2cMasterPosition' => $i2cMasterPosition, + 'i2cMasterPort' => $i2cMasterPort, + 'i2cMasterEngine' => $i2cMasterEngine, + 'i2cAddress' => $i2cAddress, + 'i2cAddressHexStr' => $i2cAddressHexStr, + 'vddrPin' => $vddrPin, + }; + } +} + +#------------------------------------------------------------------------------ # Process the i2c-busses MRW file #------------------------------------------------------------------------------ my $i2c_busses_file = open_mrw_file($mrwdir, "${sysname}-i2c-busses.xml"); @@ -4056,6 +4130,51 @@ sub generate_centaur addI2cBusSpeedArray($sys, $node, $ctaur, "memb"); } + if($useGpioToEnableVddr) + { + my $vddrKey = "n" . $node . "p" . $ctaur; + if(!exists $vddrEnableHash{$vddrKey}) + { + die "FATAL! Cannot find required GPIO info for memory buffer " + . "$vddrKey VDDR enable.\n" + } + elsif(!exists $vddrEnableHash{$vddrEnableHash{$vddrKey}{i2cMasterKey}}) + { + die "FATAL! Must reference real membuf as I2C master for VDDR " + . "enable. Membuf $vddrEnableHash{$vddrKey}{i2cMasterKey} " + . "requested.\n"; + } + else + { + print +"\n <attribute> + <id>GPIO_INFO</id> + <default> + <field> + <id>i2cMasterPath</id> + <value>$vddrEnableHash{$vddrKey}{i2cMasterEntityPath}</value> + </field> + <field> + <id>port</id> + <value>$vddrEnableHash{$vddrKey}{i2cMasterPort}</value> + </field> + <field> + <id>devAddr</id> + <value>$vddrEnableHash{$vddrKey}{i2cAddressHexStr}</value> + </field> + <field> + <id>engine</id> + <value>$vddrEnableHash{$vddrKey}{i2cMasterEngine}</value> + </field> + <field> + <id>vddrPin</id> + <value>$vddrEnableHash{$vddrKey}{vddrPin}</value> + </field> + </default> + </attribute>\n"; + } + } + print "\n</targetInstance>\n"; } |