diff options
-rwxr-xr-x | src/usr/i2c/i2c.C | 12 | ||||
-rw-r--r-- | src/usr/targeting/common/Targets.pm | 16 | ||||
-rw-r--r-- | src/usr/targeting/common/processMrw.pl | 190 | ||||
-rw-r--r-- | src/usr/targeting/common/xmltohb/attribute_types_openpower.xml | 4 | ||||
-rw-r--r-- | src/usr/targeting/common/xmltohb/target_types_openpower.xml | 6 |
5 files changed, 216 insertions, 12 deletions
diff --git a/src/usr/i2c/i2c.C b/src/usr/i2c/i2c.C index 835d9ea48..38924975b 100755 --- a/src/usr/i2c/i2c.C +++ b/src/usr/i2c/i2c.C @@ -3854,9 +3854,6 @@ void getDeviceInfo( TARGETING::Target* i_i2cMaster, case EEPROM::VPD_BACKUP: l_currentDI.devicePurpose = TARGETING::HDAT_I2C_DEVICE_PURPOSE_MODULE_VPD; - //TODO RTC:165485 this isn't currently right. we'll need - //to add the changes in the enum and possibly the other - //struct/attribute. break; case EEPROM::SBE_PRIMARY: case EEPROM::SBE_BACKUP: @@ -3941,8 +3938,8 @@ void getDeviceInfo( TARGETING::Target* i_i2cMaster, TARGETING::ATTR_HDAT_I2C_MASTER_PORT_type l_i2cMasterPort; (*childItr)->tryGetAttr<TARGETING::ATTR_HDAT_I2C_MASTER_PORT>( l_i2cMasterPort); - TARGETING::ATTR_HDAT_I2C_DEVTYPE_type l_i2cDevType; - (*childItr)->tryGetAttr<TARGETING::ATTR_HDAT_I2C_DEVTYPE>( + TARGETING::ATTR_HDAT_I2C_DEVICE_TYPE_type l_i2cDevType; + (*childItr)->tryGetAttr<TARGETING::ATTR_HDAT_I2C_DEVICE_TYPE>( l_i2cDevType); TARGETING::ATTR_HDAT_I2C_ADDR_type l_i2cAddr; (*childItr)->tryGetAttr<TARGETING::ATTR_HDAT_I2C_ADDR>(l_i2cAddr); @@ -3952,8 +3949,8 @@ void getDeviceInfo( TARGETING::Target* i_i2cMaster, TARGETING::ATTR_HDAT_I2C_BUS_FREQ_type l_i2cBusFreq; (*childItr)->tryGetAttr<TARGETING::ATTR_HDAT_I2C_BUS_FREQ>( l_i2cBusFreq); - TARGETING::ATTR_HDAT_I2C_DEV_PURPOSE_type l_i2cDevPurpose; - (*childItr)->tryGetAttr<TARGETING::ATTR_HDAT_I2C_DEV_PURPOSE>( + TARGETING::ATTR_HDAT_I2C_DEVICE_PURPOSE_type l_i2cDevPurpose; + (*childItr)->tryGetAttr<TARGETING::ATTR_HDAT_I2C_DEVICE_PURPOSE>( l_i2cDevPurpose); uint8_t l_arrayLength = @@ -3969,6 +3966,7 @@ void getDeviceInfo( TARGETING::Target* i_i2cMaster, l_idx++) { DeviceInfo_t l_currentDevice; + l_currentDevice.masterChip = (*childItr); l_currentDevice.engine = l_i2cEngine[l_idx]; l_currentDevice.masterPort = l_i2cMasterPort[l_idx]; l_currentDevice.addr = l_i2cAddr[l_idx]; diff --git a/src/usr/targeting/common/Targets.pm b/src/usr/targeting/common/Targets.pm index 9009b4d43..44b24bb6a 100644 --- a/src/usr/targeting/common/Targets.pm +++ b/src/usr/targeting/common/Targets.pm @@ -1708,6 +1708,18 @@ sub getBusAttribute ->{default}; } +## returns a boolean for if a given bus attribute is defined +sub isBusAttributeDefined +{ + my $self = shift; + my $target = shift; + my $busnum = shift; + my $attr = shift; + my $target_ptr = $self->getTarget($target); + + return defined($target_ptr->{CONNECTION}->{BUS}->[$busnum]->{bus_attribute} + ->{$attr}->{default}); +} ## returns a pointer to an array of children target names sub getTargetChildren @@ -2047,6 +2059,10 @@ to value C<VALUE>. This is for complex attributes. Gets the attribute C<ATTRIBUTE_NAME> from bus C<TARGET_STRING> bus number C<INDEX>. +=item isBusAttributeDefined(C<TARGET_STRING>,C<INDEX>.C<ATTRIBUTE_NAME>) + +Looks for a specific attribute and returns if it exists or not + =item getTargetChildren(C<TARGET_STRING>) Returns an array of target strings representing all the children of target diff --git a/src/usr/targeting/common/processMrw.pl b/src/usr/targeting/common/processMrw.pl index aeb405dc0..1d2b7bfd6 100644 --- a/src/usr/targeting/common/processMrw.pl +++ b/src/usr/targeting/common/processMrw.pl @@ -460,6 +460,15 @@ sub processProcessor $targetObj->setMasterProc($target); } + # I2C arrays + my @engine = (); + my @port = (); + my @slavePort = (); + my @addr = (); + my @speed = (); + my @type = (); + my @purpose = (); + $targetObj->log($target, "Processing PROC"); foreach my $child (@{ $targetObj->getTargetChildren($target) }) { @@ -511,8 +520,58 @@ sub processProcessor { processOcc($targetObj, $child, $target); } + # Ideally this should be $child_type eq "I2C", but we need a change + # in serverwiz and the witherspoon.xml first + elsif (index($child,"i2c-master") != -1) + { + my ($i2cEngine, $i2cPort, $i2cSlavePort, $i2cAddr, + $i2cSpeed, $i2cType, $i2cPurpose) = + processI2C($targetObj, $child, $target); + + # Add this I2C device's information to the proc array + push(@engine,@$i2cEngine); + push(@port,@$i2cPort); + push(@slavePort,@$i2cSlavePort); + push(@addr,@$i2cAddr); + push(@speed,@$i2cSpeed); + push(@type,@$i2cType); + push(@purpose,@$i2cPurpose); + + } } + # Add final I2C arrays to processor + my $size = scalar @engine; + my $engine_attr = $engine[0]; + my $port_attr = $port[0]; + my $slave_attr = $slavePort[0]; + my $addr_attr = $addr[0]; + my $speed_attr = $speed[0]; + my $type_attr = "0x".$type[0]; + my $purpose_attr = "0x".$purpose[0]; + + # Parse out array to print as a string + foreach my $n (1..($size-1)) + { + $engine_attr .= ",".$engine[$n]; + $port_attr .= ",".$port[$n]; + $slave_attr .= ",".$slavePort[$n]; + $addr_attr .= ",".$addr[$n]; + $speed_attr .= ",".$speed[$n]; + $type_attr .= ",0x".$type[$n]; + $purpose_attr .= ",0x".$purpose[$n]; + } + + # Set the arrays to the corresponding attribute on the proc + $targetObj->setAttribute($target,"HDAT_I2C_ENGINE",$engine_attr); + $targetObj->setAttribute($target,"HDAT_I2C_MASTER_PORT",$port_attr); + $targetObj->setAttribute($target,"HDAT_I2C_SLAVE_PORT",$slave_attr); + $targetObj->setAttribute($target,"HDAT_I2C_ADDR",$addr_attr); + $targetObj->setAttribute($target,"HDAT_I2C_BUS_FREQ",$speed_attr); + $targetObj->setAttribute($target,"HDAT_I2C_DEVICE_TYPE",$type_attr); + $targetObj->setAttribute($target,"HDAT_I2C_DEVICE_PURPOSE",$purpose_attr); + $targetObj->setAttribute($target,"HDAT_I2C_ELEMENTS",$size); + ## update path for mvpd's and sbe's my $path = $targetObj->getAttribute($target, "PHYS_PATH"); my $model = $targetObj->getAttribute($target, "MODEL"); @@ -1214,6 +1273,137 @@ sub getI2cMapField return $hexfield; } +#------------------------------------------------------------------------------ +# I2C +# +sub processI2C +{ + my $targetObj = shift; # Top Hierarchy of targeting structure + my $target = shift; # I2C targetInstance + my $parentTarget = shift; # Processor target + + # Initialize output arrays + my @i2cEngine = (); + my @i2cPort = (); + my @i2cSlave = (); + my @i2cAddr = (); + my @i2cSpeed = (); + my @i2cType = (); + my @i2cPurpose = (); + + # Step 1: get I2C_ENGINE and PORT from <targetInstance> + + my $engine = $targetObj->getAttribute($target, "I2C_ENGINE"); + if($engine eq "") {$engine = "0xFF";} + + my $port = $targetObj->getAttribute($target, "I2C_PORT"); + if($port eq "") {$port = "0xFF";} + + # Step 2: get I2C_ADDRESS and I2C_SPEED from <bus> + # This is different for each connection. + + my $i2cs = $targetObj->findConnections($parentTarget, "I2C",""); + if ($i2cs ne "") + { + # This gives all i2c connections + foreach my $i2c (@{$i2cs->{CONN}}) + { + # Here we are checking that the i2c source matches our target + my $source = $i2c->{SOURCE}; + if ($source ne $target) + { + next; + } + + # Most I2C devices will default the slave port, it is only valid + # for gpio expanders. + my $slavePort = "0xFF"; + + my @source_array = split(/-/,$source); + my $source_idx = scalar @source_array; + + # If the last part of the source only includes numbers + if($source_array[$source_idx-1] =~ /^[0-9,.E]+$/) + { + $slavePort = $source_array[$source_idx-1]; + } + + my $addr; + my $speed; + my $type; + my $purpose; + + # For all these attributes, we need to check if they're defined, + # and if not we set them to a default value. + if ($targetObj->isBusAttributeDefined( + $i2c->{SOURCE},$i2c->{BUS_NUM},"I2C_ADDRESS")) + { + $addr = $targetObj->getBusAttribute( + $i2c->{SOURCE},$i2c->{BUS_NUM},"I2C_ADDRESS"); + } + + if ($addr eq "") {$addr = "0xFF";} + + if ($targetObj->isBusAttributeDefined( + $i2c->{SOURCE},$i2c->{BUS_NUM},"I2C_SPEED")) + { + $speed = $targetObj->getBusAttribute( + $i2c->{SOURCE},$i2c->{BUS_NUM},"I2C_SPEED"); + } + + if ($speed eq "") {$speed = "0";} + + if ($targetObj->isBusAttributeDefined( + $i2c->{SOURCE},$i2c->{BUS_NUM},"I2C_TYPE")) + { + $type = $targetObj->getBusAttribute( + $i2c->{SOURCE},$i2c->{BUS_NUM},"I2C_TYPE"); + } + + if ($type eq "") + { + $type = "FF"; + } + else + { + $type = $targetObj->getEnumValue("HDAT_I2C_DEVICE_TYPE",$type); + } + + if ($targetObj->isBusAttributeDefined( + $i2c->{SOURCE},$i2c->{BUS_NUM},"I2C_PURPOSE")) + { + $purpose = $targetObj->getBusAttribute( + $i2c->{SOURCE},$i2c->{BUS_NUM},"I2C_PURPOSE"); + } + + if ($purpose eq "") + { + $purpose = "FF"; + } + else + { + $purpose = $targetObj->getEnumValue("HDAT_I2C_DEVICE_PURPOSE", + $purpose); + } + + # Step 3: For each connection, create an instance in the array + # for the DeviceInfo_t struct. + push @i2cEngine, $engine; + push @i2cPort, $port; + push @i2cSlave, $slavePort; + push @i2cAddr, $addr; + push @i2cSpeed, $speed; + push @i2cType, $type; + push @i2cPurpose, $purpose; + + } + } + + # Return this i2c device's information back to the processor + return (\@i2cEngine, \@i2cPort, \@i2cSlave, \@i2cAddr, + \@i2cSpeed, \@i2cType, \@i2cPurpose); +} + sub setEepromAttributes { diff --git a/src/usr/targeting/common/xmltohb/attribute_types_openpower.xml b/src/usr/targeting/common/xmltohb/attribute_types_openpower.xml index 841d3d21d..e40f8ebce 100644 --- a/src/usr/targeting/common/xmltohb/attribute_types_openpower.xml +++ b/src/usr/targeting/common/xmltohb/attribute_types_openpower.xml @@ -191,7 +191,7 @@ </attribute> <attribute> - <id>HDAT_I2C_DEVTYPE</id> + <id>HDAT_I2C_DEVICE_TYPE</id> <description> This attribute holds the values of the I2C device type from the i2c device connections as defined in the MRW. It is parsed into a @@ -255,7 +255,7 @@ </attribute> <attribute> - <id>HDAT_I2C_DEV_PURPOSE</id> + <id>HDAT_I2C_DEVICE_PURPOSE</id> <description> This attribute holds the values of the I2C device purpose from the i2c device connections as defined in the MRW. It is parsed into a diff --git a/src/usr/targeting/common/xmltohb/target_types_openpower.xml b/src/usr/targeting/common/xmltohb/target_types_openpower.xml index 548c5594a..6efbbd1d7 100644 --- a/src/usr/targeting/common/xmltohb/target_types_openpower.xml +++ b/src/usr/targeting/common/xmltohb/target_types_openpower.xml @@ -32,14 +32,14 @@ ===================================================================== --> <targetTypeExtension> - <id>base</id> + <id>chip-processor</id> <attribute><id>HDAT_I2C_ENGINE</id></attribute> <attribute><id>HDAT_I2C_MASTER_PORT</id></attribute> - <attribute><id>HDAT_I2C_DEVTYPE</id></attribute> + <attribute><id>HDAT_I2C_DEVICE_TYPE</id></attribute> <attribute><id>HDAT_I2C_ADDR</id></attribute> <attribute><id>HDAT_I2C_SLAVE_PORT</id></attribute> <attribute><id>HDAT_I2C_BUS_FREQ</id></attribute> - <attribute><id>HDAT_I2C_DEV_PURPOSE</id></attribute> + <attribute><id>HDAT_I2C_DEVICE_PURPOSE</id></attribute> <attribute><id>HDAT_I2C_ELEMENTS</id></attribute> <attribute> <id>IPMI_INSTANCE</id> |