From 3fd00c599a9cd3f9e1d2f100e793fe6edb36dc63 Mon Sep 17 00:00:00 2001 From: jbjohnso Date: Wed, 10 Oct 2012 19:05:42 +0000 Subject: [PATCH] Change IPMI to use IMM properties interface instead of FMAPI, must faster and simpler and likely to work git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@13978 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- xCAT-server/lib/xcat/plugins/ipmi.pm | 111 ++++++++++++++++++++++++++- 1 file changed, 110 insertions(+), 1 deletion(-) diff --git a/xCAT-server/lib/xcat/plugins/ipmi.pm b/xCAT-server/lib/xcat/plugins/ipmi.pm index cba66aaf7..220ebcef8 100644 --- a/xCAT-server/lib/xcat/plugins/ipmi.pm +++ b/xCAT-server/lib/xcat/plugins/ipmi.pm @@ -1682,11 +1682,120 @@ sub got_bmc_fw_info { $fru->value($mprom); $sessdata->{fru_hash}->{mprom} = $fru; if ($isanimm) { - $sessdata->{ipmisession}->subcmd(netfn=>0x3a,command=>0xf0,data=>[0,0,0,0],callback=>\&get_uefi_version_with_fmapi,callback_args=>$sessdata); + #$sessdata->{ipmisession}->subcmd(netfn=>0x3a,command=>0xf0,data=>[0,0,0,0],callback=>\&get_uefi_version_with_fmapi,callback_args=>$sessdata); + get_imm_property(property=>"/v2/bios/build_id",callback=>\&got_bios_buildid,sessdata=>$sessdata); } else { initfru_with_mprom($sessdata); } } +sub got_bios_buildid { + my %res = @_; + my $sessdata = $res{sessdata}; + if ($res{data}) { + $sessdata->{biosbuildid} = $res{data}; + get_imm_property(property=>"/v2/bios/build_version",callback=>\&got_bios_version,sessdata=>$sessdata); + } else { + initfru_with_mprom($sessdata); + } +} +sub got_bios_version { + my %res = @_; + my $sessdata = $res{sessdata}; + if ($res{data}) { + $sessdata->{biosbuildversion} = $res{data}; + get_imm_property(property=>"/v2/bios/build_date",callback=>\&got_bios_date,sessdata=>$sessdata); + } else { + initfru_with_mprom($sessdata); + } +} +sub got_bios_date { + my %res = @_; + my $sessdata = $res{sessdata}; + if ($res{data}) { + $sessdata->{biosbuilddate} = $res{data}; + my $fru = FRU->new(); + $fru->rec_type("bios,uefi,firmware"); + $fru->desc("UEFI Version"); + $fru->value($sessdata->{biosbuildversion}." (".$sessdata->{biosbuildid}." ".$sessdata->{biosbuilddate}.")"); + $sessdata->{fru_hash}->{uefi} = $fru; + get_imm_property(property=>"/v2/fpga/build_id",callback=>\&got_fpga_buildid,sessdata=>$sessdata); + } else { + initfru_with_mprom($sessdata); + } +} +sub got_fpga_buildid { + my %res = @_; + my $sessdata = $res{sessdata}; + if ($res{data}) { + $sessdata->{fpgabuildid} = $res{data}; + get_imm_property(property=>"/v2/fpga/build_version",callback=>\&got_fpga_version,sessdata=>$sessdata); + } else { + initfru_with_mprom($sessdata); + } +} +sub got_fpga_version { + my %res = @_; + my $sessdata = $res{sessdata}; + if ($res{data}) { + $sessdata->{fpgabuildversion} = $res{data}; + get_imm_property(property=>"/v2/fpga/build_date",callback=>\&got_fpga_date,sessdata=>$sessdata); + } else { + initfru_with_mprom($sessdata); + } +} +sub got_fpga_date { + my %res = @_; + my $sessdata = $res{sessdata}; + if ($res{data}) { + $sessdata->{fpgabuilddate} = $res{data}; + my $fru = FRU->new(); + $fru->rec_type("fpga,firmware"); + $fru->desc("FPGA Version"); + $fru->value($sessdata->{fpgabuildversion}." (".$sessdata->{fpgabuildid}." ".$sessdata->{fpgabuilddate}.")"); + $sessdata->{fru_hash}->{fpga} = $fru; + } + initfru_with_mprom($sessdata); +} +sub get_imm_property { + my %args = @_; + my @getpropertycommand; + my $sessdata = $args{sessdata}; + $sessdata->{property_callback} = $args{callback}; + @getpropertycommand = unpack("C*",$args{property}); + my $length = 0b10000000 | (scalar @getpropertycommand);#use length to store tlv + unshift @getpropertycommand,$length; + #command also needs the overall length + $length = (scalar @getpropertycommand); + unshift @getpropertycommand,$length&0xff; + unshift @getpropertycommand,($length>>8)&0xff; + unshift @getpropertycommand,0; #the actual 'get proprety' command is 0. + $sessdata->{ipmisession}->subcmd(netfn=>0x3a,command=>0xc4,data=>\@getpropertycommand,callback=>\&got_imm_property,callback_args=>$sessdata); + +} +sub got_imm_property { + if (check_rsp_errors(@_)) { + return; + } + my $rsp = shift; + my $sessdata = shift; + my @data = @{$rsp->{data}}; + my $propval = shift @data; + my %res; + $res{sessdata}=$sessdata; + if ($propval == 0) { #success + shift @data; #discard payload size + shift @data; #discard payload size + while (@data) { + my $tlv = shift @data; + if ($tlv & 0b10000000) { + $tlv = $tlv & 0b1111111; + my @val = splice(@data,0,$tlv); + $res{data}= unpack("Z*",pack("C*",@val)); + } + } + } + $sessdata->{property_callback}->(%res); +} sub get_uefi_version_with_fmapi { if (check_rsp_errors(@_)) { return;