diff options
Diffstat (limited to 'src/mainboard')
-rw-r--r-- | src/mainboard/technologic/ts5300/auto.c | 289 |
1 files changed, 100 insertions, 189 deletions
diff --git a/src/mainboard/technologic/ts5300/auto.c b/src/mainboard/technologic/ts5300/auto.c index 4ef1a100cc..0bd62f81fc 100644 --- a/src/mainboard/technologic/ts5300/auto.c +++ b/src/mainboard/technologic/ts5300/auto.c @@ -1,5 +1,11 @@ +/* + * TS5300 specific initialization code. + * written by Stefan Reinauer <stepan@coresystems.de> + * (c) 2006 coresystems GmbH + */ + #define ASSEMBLY 1 -#define ASM_CONSOLE_LOGLEVEL 8 +#define ASM_CONSOLE_LOGLEVEL 6 #include <stdint.h> #include <device/pci_def.h> #include <arch/io.h> @@ -11,17 +17,20 @@ #include "arch/i386/lib/console.c" #include "ram/ramtest.c" #include "cpu/x86/bist.h" -//#include "lib/delay.c" +#define TS5300_LED_OFF outb((inb(0x77)&0xfe), 0x77) +#define TS5300_LED_ON outb((inb(0x77)|1), 0x77) + +#define TS9500_LED_OFF outb((inb(0x19a)&0xfe), 0x19a) +#define TS9500_LED_ON outb((inb(0x19a)|1), 0x19a) + +/* PAR register setup */ void setup_pars(void) { volatile unsigned long *par; - /* as per the book: */ - /* PAR register setup */ - /* set up the PAR registers as they are on the MSM586SEG */ par = (unsigned long *) 0xfffef088; - /* NOTE: move this to mainboard.c ASAP */ + /* NOTE: Ron says, move this to mainboard.c */ *par++ = 0x00000000; *par++ = 0x340f0070; *par++ = 0x380701f0; @@ -35,7 +44,7 @@ void setup_pars(void) *par++ = 0x00000000; *par++ = 0x00000000; *par++ = 0x00000000; - *par++ = 0x8a07c940; + *par++ = 0x8a07c940; /* Flash setup */ *par++ = 0x00000000; *par++ = 0xee00400e; } @@ -44,218 +53,120 @@ void setup_pars(void) #include "debug.c" -static void hard_reset(void) +static void identify_ts9500(void) { - print_err("Hard reset called.\n"); - while (1) ; + unsigned i, val; + + TS9500_LED_ON; + + print_err("TS-9500 add-on found:\r\n"); + val=inb(0x19b); + for (i=0; i<8; i++) { + print_err(" DIP"); + print_err_char(i+0x31); + print_err(": "); + if((val&(1<<i))!=0) + print_err("on\r\n"); + else + print_err("off\r\n"); + } + print_err("\r\n"); + + val=inb(0x19a); + + for (i=6; i<8; i++) { + print_err(" JP"); + print_err_char(i+0x30-5); + print_err(": "); + if((val&(1<<i))!=0) + print_err("on\r\n"); + else + print_err("off\r\n"); + } + print_err("\r\n"); + + TS9500_LED_OFF; } -static inline void dumpmem(void) +static void identify_system(void) { - int i, j; - unsigned char *l; - unsigned char c; + unsigned i,val; - for(i = 0x4000; i < 0x5000; i += 16) { - print_err_hex32(i); print_err(":"); - for(j = 0; j < 16; j++) { - l = (unsigned char *)i + j; - c = *l; - print_err_hex8(c); - print_err(" "); - } - print_err("\r\n"); - } -} + print_err("Mainboard: "); + val=inb(0x74); + switch(val) { + case 0x50: print_err("TS-5300\r\n"); break; + default: print_err("unknown\r\n"); break; + } + val=inb(0x75); + print_err(" SRAM option: "); + if((val&1)==0) print_err("not "); + print_err("installed\r\n"); + + print_err(" RS-485 option: "); + if((val&2)==0) print_err("not "); + print_err("installed\r\n"); + print_err("\r\n"); + val=inb(0x77); + for (i=1; i<8; i++) { + print_err(" JP"); + print_err_char(i+0x30); + print_err(": "); + if((val&(1<<i))!=0) + print_err("on\r\n"); + else + print_err("off\r\n"); + } + print_err("\r\n"); + + /* Detect TS-9500 */ + val=inb(0x19d); + if(val==0x5f) + identify_ts9500(); -static inline void irqinit(void){ - volatile unsigned char *cp; -#if 0 -/* these values taken from the msm board itself. - * and they cause the board to not even come out of calibrating_delay_loop - * if you can believe it. Our problem right now is no IDE or serial interrupts - * So we'll try to put interrupts in, one at a time. IDE first. - */ - cp = (volatile unsigned char *) 0xfffefd00; - *cp = 0x11; - cp = (volatile unsigned char *) 0xfffefd02; - *cp = 0x02; - cp = (volatile unsigned char *) 0xfffefd03; - *cp = 0x00; - cp = (volatile unsigned char *) 0xfffefd04; - *cp = 0xf7; - cp = (volatile unsigned char *) 0xfffefd08; - *cp = 0xf7; - cp = (volatile unsigned char *) 0xfffefd0a; - *cp = 0x8b; - cp = (volatile unsigned char *) 0xfffefd10; - *cp = 0x18; - cp = (volatile unsigned char *) 0xfffefd14; - *cp = 0x09; - cp = (volatile unsigned char *) 0xfffefd18; - *cp = 0x88; - cp = (volatile unsigned char *) 0xfffefd1a; - *cp = 0x00; - cp = (volatile unsigned char *) 0xfffefd1b; - *cp = 0x00; - cp = (volatile unsigned char *) 0xfffefd1c; - *cp = 0x00; - cp = (volatile unsigned char *) 0xfffefd20; - *cp = 0x00; - cp = (volatile unsigned char *) 0xfffefd21; - *cp = 0x00; - cp = (volatile unsigned char *) 0xfffefd22; - *cp = 0x00; - cp = (volatile unsigned char *) 0xfffefd28; - *cp = 0x00; - cp = (volatile unsigned char *) 0xfffefd29; - *cp = 0x00; - cp = (volatile unsigned char *) 0xfffefd30; - *cp = 0x00; - cp = (volatile unsigned char *) 0xfffefd31; - *cp = 0x00; - cp = (volatile unsigned char *) 0xfffefd32; - *cp = 0x00; - cp = (volatile unsigned char *) 0xfffefd33; - *cp = 0x00; - cp = (volatile unsigned char *) 0xfffefd40; - *cp = 0x10; - cp = (volatile unsigned char *) 0xfffefd41; - *cp = 0x00; - cp = (volatile unsigned char *) 0xfffefd42; - *cp = 0x00; - cp = (volatile unsigned char *) 0xfffefd43; - *cp = 0x00; - cp = (volatile unsigned char *) 0xfffefd44; - *cp = 0x00; - cp = (volatile unsigned char *) 0xfffefd45; - *cp = 0x00; - cp = (volatile unsigned char *) 0xfffefd46; - *cp = 0x00; - cp = (volatile unsigned char *) 0xfffefd50; - *cp = 0x37; - cp = (volatile unsigned char *) 0xfffefd51; - *cp = 0x00; - cp = (volatile unsigned char *) 0xfffefd52; - *cp = 0x00; - cp = (volatile unsigned char *) 0xfffefd53; - *cp = 0x00; - cp = (volatile unsigned char *) 0xfffefd54; - *cp = 0x37; - cp = (volatile unsigned char *) 0xfffefd55; - *cp = 0x00; - cp = (volatile unsigned char *) 0xfffefd56; - *cp = 0x37; - cp = (volatile unsigned char *) 0xfffefd57; - *cp = 0x00; - cp = (volatile unsigned char *) 0xfffefd58; - *cp = 0xff; - cp = (volatile unsigned char *) 0xfffefd59; - *cp = 0xff; - cp = (volatile unsigned char *) 0xfffefd5a; - *cp = 0xff; -#endif -#if 0 - /* this fails too */ - /* IDE only ... */ - cp = (volatile unsigned char *) 0xfffefd56; - *cp = 0xe; -#endif +} + +static void hard_reset(void) +{ + print_err("Hard reset called.\n"); + while (1) ; } static void main(unsigned long bist) { volatile int i; + unsigned val; + + TS5300_LED_ON; + for(i = 0; i < 100; i++) ; - + setupsc520(); - irqinit(); uart_init(); console_init(); - //for(i = 0; i < 100; i++) - // print_err("fill usart\r\n"); print_err("Technologic Systems TS5300 - http://www.embeddedx86.com/\r\n"); - staticmem(); - - // sw ctimer millisecond count - //print_err("\r\nc60 is "); print_err_hex16(*(unsigned short *)0xfffefc60); - //print_err("\r\n"); - print_err("Memory initialized: 32MB\r\n"); - -#if 0 - - /* clear memory 1meg */ - __asm__ volatile( - "1: \n\t" - "movl %0, %%fs:(%1)\n\t" - "addl $4,%1\n\t" - "subl $4,%2\n\t" - "jnz 1b\n\t" - : - : "a" (0), "D" (0), "c" (1024*1024) - ); - - -#endif - -#if 0 - dump_pci_devices(); +#if 1 + identify_system(); #endif + #if 0 dump_pci_device(PCI_DEV(0, 0, 0)); #endif #if 0 - print_err("RAM CHECK!\r\n"); - // Check 16MB of memory @ 0 - ram_check(0x00000000, 0x01000000); -#endif -#if 0 - print_err("RAM CHECK for 32 MB!\r\n"); - // Check 32MB of memory @ 0 - ram_check(0x00000000, 0x02000000); + // Check 32MB of memory @ 0 (very slow!) + print_err("Checking memory:\r\n"); + ram_check(0x00000000, 0x000a0000); + ram_check(0x000b0000, 0x02000000); #endif - - /* Don't think this is needed for the ts5300. - * The MMCRs are at fffef000 and the image is only 64k (without - * payload) so it fits exactly between MMCR and 4G - */ -#if 0 - { - volatile unsigned char *src = (unsigned char *) 0x2000000 + 0x60000; - volatile unsigned char *dst = (unsigned char *) 0x4000; - for(i = 0; i < 0x20000; i++) { - /* - print_err("Set dst "); print_err_hex32((unsigned long) dst); - print_err(" to "); print_err_hex32(*src); print_err("\r\n"); - */ - *dst = *src; - //print_err(" dst is now "); print_err_hex32(*dst); print_err("\r\n"); - dst++, src++; - outb((unsigned char)i, 0x80); - } - } - dumpmem(); - outb(0, 0x80); - print_err("loop forever\r\n"); - outb(0xdd, 0x80); - __asm__ volatile( - "movl %0, %%edi\n\t" - "jmp *%%edi\n\t" - : - : "a" (0x4000) - ); - - print_err("FUCK\r\n"); - while(1); -#endif + TS5300_LED_OFF; } |