summaryrefslogtreecommitdiff
path: root/src/mainboard
diff options
context:
space:
mode:
Diffstat (limited to 'src/mainboard')
-rw-r--r--src/mainboard/technologic/ts5300/auto.c289
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;
}