@ -1074,7 +1074,7 @@ sub ddr2_core_timings($$$$$)
my ($cas, $ctime, $trcd, $trp, $tras) = @_;
return $cas . "-" . ceil($trcd/$ctime) . "-" . ceil($trp/$ctime) .
"-" . ceil($tras/$ctime) . " as DDR2-" . int(2000 / $ctime) ;
"-" . ceil($tras/$ctime);
}
# Parameter: EEPROM bytes 0-127 (using 3-62)
@ -1082,7 +1082,7 @@ sub decode_ddr2_sdram($)
{
my $bytes = shift;
my $temp;
my $ctime;
my ( $ctime, $ctime1, $ctime2, $ctime_min, $ctime_max) ;
# SPD revision
printl_cond($bytes->[62] != 0xff, "SPD Revision",
@ -1091,7 +1091,7 @@ sub decode_ddr2_sdram($)
# speed
prints("Memory Characteristics");
$ctime = ddr2_sdram_ctime($bytes->[9]);
$ctime_min = $ctime = ddr2_sdram_ctime($bytes->[9]);
my $ddrclk = 2 * (1000 / $ctime);
my $tbits = ($bytes->[7] * 256) + $bytes->[6];
if ($bytes->[11] & 0x03) { $tbits = $tbits - 8; }
@ -1168,7 +1168,7 @@ sub decode_ddr2_sdram($)
if (exists $cas{$highestCAS}) {
$core_timings = ddr2_core_timings($highestCAS, $ctime,
$trcd, $trp, $tras);
$trcd, $trp, $tras) . " as DDR2-" . int(2000 / $ctime) ;
$cycle_time = tns($ctime) . " at CAS $highestCAS (tCK min)";
$access_time = tns(ddr2_sdram_atime($bytes->[10]))
@ -1176,35 +1176,56 @@ sub decode_ddr2_sdram($)
}
if (exists $cas{$highestCAS-1} && spd_written(@$bytes[23..24])) {
$ctime = ddr2_sdram_ctime($bytes->[23]);
$core_timings .= "\n".ddr2_core_timings($highestCAS-1, $ctime,
$trcd, $trp, $tras);
$ctime1 = ddr2_sdram_ctime($bytes->[23]);
$core_timings .= "\n".ddr2_core_timings($highestCAS-1, $ctime1 ,
$trcd, $trp, $tras) . " as DDR2-" . int(2000 / $ctime1) ;
$cycle_time .= "\n".tns($ctime)
$cycle_time .= "\n".tns($ctime1 )
. " at CAS ".($highestCAS-1);
$access_time .= "\n".tns(ddr2_sdram_atime($bytes->[24]))
. " at CAS ".($highestCAS-1);
}
if (exists $cas{$highestCAS-2} && spd_written(@$bytes[25..26])) {
$ctime = ddr2_sdram_ctime($bytes->[25]);
$core_timings .= "\n".ddr2_core_timings($highestCAS-2, $ctime,
$trcd, $trp, $tras);
$ctime2 = ddr2_sdram_ctime($bytes->[25]);
$core_timings .= "\n".ddr2_core_timings($highestCAS-2, $ctime2 ,
$trcd, $trp, $tras) . " as DDR2-" . int(2000 / $ctime2) ;
$cycle_time .= "\n".tns($ctime)
$cycle_time .= "\n".tns($ctime2 )
. " at CAS ".($highestCAS-2);
$access_time .= "\n".tns(ddr2_sdram_atime($bytes->[26]))
. " at CAS ".($highestCAS-2);
}
$ctime_max = ddr2_sdram_ctime($bytes->[43]);
printl_cond(defined $core_timings, "tCL-tRCD-tRP-tRAS", $core_timings);
printl_cond(defined $cycle_time, "Minimum Cycle Time", $cycle_time);
printl_cond(defined $access_time, "Maximum Access Time", $access_time);
$temp = ddr2_sdram_ctime($bytes->[43]);
printl_cond(($bytes->[43] & 0xf0) && $bytes->[43] != 0xff,
"Maximum Cycle Time (tCK max)",
$temp == 0 ? "" : # Wouldn't be displayed, prevent div by 0
tns($temp)." (DDR2-".int(2000 / $temp).")");
$ctime_max == 0 ? "" : # Wouldn't be displayed, prevent div by 0
tns($ctime_max)." (DDR2-".int(2000 / $ctime_max).")");
# standard DDR2 speeds
prints("Timings at Standard Speeds");
foreach $ctime (1.875, 2.5, 3, 3.75, 5) {
my $best_cas;
# Find min CAS latency at this speed
if (defined $ctime2 && $ctime >= $ctime2) {
$best_cas = $highestCAS-2;
} elsif (defined $ctime1 && $ctime >= $ctime1) {
$best_cas = $highestCAS-1;
} else {
$best_cas = $highestCAS;
}
printl_cond($ctime >= $ctime_min && $ctime <= $ctime_max,
"tCL-tRCD-tRP-tRAS as DDR2-".int(2000 / $ctime),
ddr2_core_timings($best_cas, $ctime,
$trcd, $trp, $tras));
}
# more timing information
prints("Timing Parameters");