#!/usr/bin/perl
use bignum;
push @INC,qq(./scripts);
require qq(io.pm);

sub report_freq
{
my ($clk,$cpu,$ddr,$pll,$ctrl);
($pll,$ctrl)=@_;
$clk=(12+($pll&0x3f))*33333333/2 + (($pll>>8)&0x3ff)*33333333/2/1024;
$cpu = (($ctrl&0x300)==0x300)?33333333:($ctrl&(1<<25))?$clk/(($ctrl>>20)&0x1f):$clk/2;
$ddr= (($ctrl&0xc00)==0xc00)?33333333:($ctrl&(1<<19))?$clk/(($ctrl>>14)&0x1f):$clk/2;
print "cpuclk=$cpu,ddrclk=$ddr\n";
do_cmd("scallbin bin/caclfreq.bin");
return ($cpu,$ddr);
}

$ctrl = inl(0xbfe78034);
$pll = inl(0xbfe78030);

report_freq($pll,$ctrl);

$ctrl=(1<<31)|(4<<26)|(1<<25)|(1<<20)|(1<<19)|(2<<14)|0x2a00;
$pll=0;

outl(0xbfe78034,$ctrl);
outl(0xbfe78030,$pll);
sleep 1;

$pll=inl(0xbfe78030);
$ctrl=inl(0xbfe78034);

($cpu,$ddr)=report_freq($pll,$ctrl);


$serial=int($ddr)/115200/16/2;
$base=@ARGV?hex($ARGV[0]):0xbfe48000;
outb($base+3,0x80);
outb($base+0,int($serial)&0xff);
outb($base+1,int($serial)>>8);
outb($base+3,3);
outb($base,0x31);
outb($base,13);
outb($base,10);
do_cmd("ddr2_config ddr2.txt");
do_cmd("memtest 0xa0000000 0xa0000100");
do_cmd("set pc 0xbfc03dbc;cont");
