Files
raspberrypi/boards/pizero/asmdelay/asmdelay.c

290 lines
6.6 KiB
C

//-------------------------------------------------------------------
// Copyright (C) 2010 Netronome Systems
//-------------------------------------------------------------------
//d6004024 <ASMDELAY>:
//d6004024: e2500001 subs r0, r0, #1
//d6004028: 1afffffd bne d6004024 <ASMDELAY>
//d600402c: e12fff1e bx lr
#define ARM_TIMER_LOD 0x2000B400
#define ARM_TIMER_VAL 0x2000B404
#define ARM_TIMER_CTL 0x2000B408
#define ARM_TIMER_DIV 0x2000B41C
#define ARM_TIMER_CNT 0x2000B420
extern void PUT32 ( unsigned int, unsigned int );
extern unsigned int GET32 ( unsigned int );
extern void ASMDELAY ( unsigned int );
extern void uart_init(void);
extern void hexstrings ( unsigned int );
extern void hexstring ( unsigned int );
extern void HOP ( unsigned int, unsigned int );
extern unsigned int GET_CONTROL ( void );
extern void SET_CONTROL ( unsigned int );
extern void CLR_CONTROL ( unsigned int );
extern void start_l1cache ( void );
extern void stop_l1cache ( void );
extern void invalidate_l1cache ( void );
extern void PrefetchFlush ( void );
unsigned int gmin,gmax;
void do_it ( unsigned int base )
{
unsigned int ra;
unsigned int beg,end;
unsigned int rb;
unsigned int min,max;
unsigned int rc;
stop_l1cache(); //just in case
invalidate_l1cache();
hexstrings(base);
hexstrings(base);
hexstrings(base);
hexstring(base);
hexstring(GET_CONTROL());
CLR_CONTROL(1<<11);
hexstring(GET_CONTROL());
max=0;
min=0; min--;
for(ra=base+0x6000;ra<base+0x6100;ra+=4)
{
unsigned int flag;
PUT32(ra+0x00,0xe2500001);
PUT32(ra+0x04,0x1afffffd);
PUT32(ra+0x08,0xe12fff1e);
GET32(ra+0x08);
PrefetchFlush();
for(rc=0;rc<4;rc++)
{
beg=GET32(ARM_TIMER_CNT);
HOP(0x20000,ra);
end=GET32(ARM_TIMER_CNT);
rb=end-beg;
flag=0;
if(rb>gmax) gmax=rb;
if(rb<gmin) gmin=rb;
if(rb>max) { flag++; max=rb; }
if(rb<min) { flag++; min=rb; }
if(flag)
{
hexstrings(ra);
hexstrings(rb);
hexstrings(min);
hexstrings(max);
hexstring(max-min);
}
}
}
hexstring(GET_CONTROL());
SET_CONTROL(1<<11);
hexstring(GET_CONTROL());
if(1)
{
max=0;
min=0; min--;
for(ra=base+0x6000;ra<base+0x6100;ra+=4)
{
unsigned int flag;
PUT32(ra+0x00,0xe2500001);
PUT32(ra+0x04,0x1afffffd);
PUT32(ra+0x08,0xe12fff1e);
GET32(ra+0x08);
PrefetchFlush();
for(rc=0;rc<4;rc++)
{
beg=GET32(ARM_TIMER_CNT);
HOP(0x20000,ra);
end=GET32(ARM_TIMER_CNT);
rb=end-beg;
flag=0;
if(rb>gmax) gmax=rb;
if(rb<gmin) gmin=rb;
if(rb>max) { flag++; max=rb; }
if(rb<min) { flag++; min=rb; }
if(flag)
{
hexstrings(ra);
hexstrings(rb);
hexstrings(min);
hexstrings(max);
hexstring(max-min);
}
}
}
}
hexstring(GET_CONTROL());
CLR_CONTROL(1<<11);
hexstring(GET_CONTROL());
ra=GET32(ARM_TIMER_CNT);
start_l1cache();
max=0;
min=0; min--;
for(ra=base+0x6000;ra<base+0x6100;ra+=4)
{
unsigned int flag;
PUT32(ra+0x00,0xe2500001);
PUT32(ra+0x04,0x1afffffd);
PUT32(ra+0x08,0xe12fff1e);
GET32(ra+0x08);
PrefetchFlush();
invalidate_l1cache();
for(rc=0;rc<4;rc++)
{
beg=GET32(ARM_TIMER_CNT);
HOP(0x20000,ra);
end=GET32(ARM_TIMER_CNT);
rb=end-beg;
flag=0;
if(rb>gmax) gmax=rb;
if(rb<gmin) gmin=rb;
if(rb>max) { flag++; max=rb; }
if(rb<min) { flag++; min=rb; }
if(flag)
{
hexstrings(ra);
hexstrings(rb);
hexstrings(min);
hexstrings(max);
hexstring(max-min);
}
}
}
hexstring(GET_CONTROL());
SET_CONTROL(1<<11);
hexstring(GET_CONTROL());
max=0;
min=0; min--;
for(ra=base+0x6000;ra<base+0x6100;ra+=4)
{
unsigned int flag;
PUT32(ra+0x00,0xe2500001);
PUT32(ra+0x04,0x1afffffd);
PUT32(ra+0x08,0xe12fff1e);
GET32(ra+0x08);
PrefetchFlush();
invalidate_l1cache();
for(rc=0;rc<4;rc++)
{
beg=GET32(ARM_TIMER_CNT);
HOP(0x20000,ra);
end=GET32(ARM_TIMER_CNT);
rb=end-beg;
flag=0;
if(rb>gmax) gmax=rb;
if(rb<gmin) gmin=rb;
if(rb>max) { flag++; max=rb; }
if(rb<min) { flag++; min=rb; }
if(flag)
{
hexstrings(ra);
hexstrings(rb);
hexstrings(min);
hexstrings(max);
hexstring(max-min);
}
}
}
hexstring(GET_CONTROL());
CLR_CONTROL(1<<11);
hexstring(GET_CONTROL());
stop_l1cache();
}
//-------------------------------------------------------------------------
int notmain ( void )
{
//unsigned int ra,rb;
unsigned int ra;
unsigned int beg,end;
//uart_init();
hexstrings(0x12345678);
hexstrings(0x12345678);
hexstrings(0x12345678);
hexstrings(0x12345678);
hexstring(0x12345678);
gmax=0;
gmin=0; gmin--;
PUT32(ARM_TIMER_CTL,0x00000000);
PUT32(ARM_TIMER_CTL,0x00000200);
beg=GET32(ARM_TIMER_CNT);
ASMDELAY(100000);
end=GET32(ARM_TIMER_CNT);
hexstring(end-beg);
for(ra=0;ra<4;ra++)
{
beg=GET32(ARM_TIMER_CNT);
ASMDELAY(100000);
end=GET32(ARM_TIMER_CNT);
hexstring(end-beg);
}
start_l1cache();
for(ra=0;ra<4;ra++)
{
beg=GET32(ARM_TIMER_CNT);
ASMDELAY(100000);
end=GET32(ARM_TIMER_CNT);
hexstring(end-beg);
}
invalidate_l1cache();
for(ra=0;ra<4;ra++)
{
beg=GET32(ARM_TIMER_CNT);
ASMDELAY(10);
end=GET32(ARM_TIMER_CNT);
hexstring(end-beg);
}
invalidate_l1cache();
for(ra=0;ra<4;ra++)
{
beg=GET32(ARM_TIMER_CNT);
ASMDELAY(10);
end=GET32(ARM_TIMER_CNT);
hexstring(end-beg);
}
stop_l1cache();
do_it(0xC0000000);
do_it(0x80000000);
do_it(0x40000000);
hexstrings(gmin); hexstrings(gmax); hexstring(gmax-gmin);
hexstring(0x12345678);
return(0);
}