summaryrefslogtreecommitdiff
path: root/src/mainboard/technologic/ts5300
diff options
context:
space:
mode:
Diffstat (limited to 'src/mainboard/technologic/ts5300')
-rw-r--r--src/mainboard/technologic/ts5300/auto.c105
-rw-r--r--src/mainboard/technologic/ts5300/debug.c128
-rw-r--r--src/mainboard/technologic/ts5300/failover.c37
-rw-r--r--src/mainboard/technologic/ts5300/irq_tables.c39
4 files changed, 141 insertions, 168 deletions
diff --git a/src/mainboard/technologic/ts5300/auto.c b/src/mainboard/technologic/ts5300/auto.c
index 1ffc7ae415..294c802713 100644
--- a/src/mainboard/technologic/ts5300/auto.c
+++ b/src/mainboard/technologic/ts5300/auto.c
@@ -30,6 +30,8 @@ static void memreset(int controllers, const struct mem_controller *ctrl)
{
}
+
+
static inline void activate_spd_rom(const struct mem_controller *ctrl)
{
/* nothing to do */
@@ -59,6 +61,102 @@ static inline void dumpmem(void){
}
}
+
+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 main(unsigned long bist)
{
volatile int i;
@@ -67,6 +165,7 @@ static void main(unsigned long bist)
setupsc520();
+ irqinit();
uart_init();
console_init();
for(i = 0; i < 100; i++)
@@ -117,11 +216,11 @@ static void main(unsigned long bist)
// Check 32MB of memory @ 0
ram_check(0x00000000, 0x02000000);
#endif
-#if 0
+#if 1
{
- volatile unsigned char *src = (unsigned char *) 0x2000000 + 0x70000;
+ volatile unsigned char *src = (unsigned char *) 0x2000000 + 0x60000;
volatile unsigned char *dst = (unsigned char *) 0x4000;
- for(i = 0; i < 0x10000; i++) {
+ 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");
diff --git a/src/mainboard/technologic/ts5300/debug.c b/src/mainboard/technologic/ts5300/debug.c
index 714fcc5783..e69de29bb2 100644
--- a/src/mainboard/technologic/ts5300/debug.c
+++ b/src/mainboard/technologic/ts5300/debug.c
@@ -1,128 +0,0 @@
-
-static void print_debug_pci_dev(unsigned dev)
-{
- print_debug("PCI: ");
- print_debug_hex8((dev >> 16) & 0xff);
- print_debug_char(':');
- print_debug_hex8((dev >> 11) & 0x1f);
- print_debug_char('.');
- print_debug_hex8((dev >> 8) & 7);
-}
-
-static void print_pci_devices(void)
-{
- device_t dev;
- for(dev = PCI_DEV(0, 0, 0);
- dev <= PCI_DEV(0, 0x1f, 0x7);
- dev += PCI_DEV(0,0,1)) {
- uint32_t id;
- id = pci_read_config32(dev, PCI_VENDOR_ID);
- if (((id & 0xffff) == 0x0000) || ((id & 0xffff) == 0xffff) ||
- (((id >> 16) & 0xffff) == 0xffff) ||
- (((id >> 16) & 0xffff) == 0x0000)) {
- continue;
- }
- print_debug_pci_dev(dev);
- print_debug("\r\n");
- }
-}
-
-static void dump_pci_device(unsigned dev)
-{
- int i;
- print_debug_pci_dev(dev);
- print_debug("\r\n");
-
- for(i = 0; i <= 255; i++) {
- unsigned char val;
- if ((i & 0x0f) == 0) {
- print_debug_hex8(i);
- print_debug_char(':');
- }
- val = pci_read_config8(dev, i);
- print_debug_char(' ');
- print_debug_hex8(val);
- if ((i & 0x0f) == 0x0f) {
- print_debug("\r\n");
- }
- }
-}
-
-static void dump_pci_devices(void)
-{
- device_t dev;
- for(dev = PCI_DEV(0, 0, 0);
- dev <= PCI_DEV(0, 0x1f, 0x7);
- dev += PCI_DEV(0,0,1)) {
- uint32_t id;
- id = pci_read_config32(dev, PCI_VENDOR_ID);
- if (((id & 0xffff) == 0x0000) || ((id & 0xffff) == 0xffff) ||
- (((id >> 16) & 0xffff) == 0xffff) ||
- (((id >> 16) & 0xffff) == 0x0000)) {
- continue;
- }
- dump_pci_device(dev);
- }
-}
-#if 0
-static void dump_spd_registers(const struct mem_controller *ctrl)
-{
- int i;
- print_debug("\r\n");
- for(i = 0; i < 4; i++) {
- unsigned device;
- device = ctrl->channel0[i];
- if (device) {
- int j;
- print_debug("dimm: ");
- print_debug_hex8(i);
- print_debug(".0: ");
- print_debug_hex8(device);
- for(j = 0; j < 256; j++) {
- int status;
- unsigned char byte;
- if ((j & 0xf) == 0) {
- print_debug("\r\n");
- print_debug_hex8(j);
- print_debug(": ");
- }
- status = smbus_read_byte(device, j);
- if (status < 0) {
- print_debug("bad device\r\n");
- break;
- }
- byte = status & 0xff;
- print_debug_hex8(byte);
- print_debug_char(' ');
- }
- print_debug("\r\n");
- }
- device = ctrl->channel1[i];
- if (device) {
- int j;
- print_debug("dimm: ");
- print_debug_hex8(i);
- print_debug(".1: ");
- print_debug_hex8(device);
- for(j = 0; j < 256; j++) {
- int status;
- unsigned char byte;
- if ((j & 0xf) == 0) {
- print_debug("\r\n");
- print_debug_hex8(j);
- print_debug(": ");
- }
- status = smbus_read_byte(device, j);
- if (status < 0) {
- print_debug("bad device\r\n");
- break;
- }
- byte = status & 0xff;
- print_debug_hex8(byte);
- print_debug_char(' ');
- }
- print_debug("\r\n");
- }
- }
-}
-#endif
diff --git a/src/mainboard/technologic/ts5300/failover.c b/src/mainboard/technologic/ts5300/failover.c
index bd0df4e89d..bdcb9eaed2 100644
--- a/src/mainboard/technologic/ts5300/failover.c
+++ b/src/mainboard/technologic/ts5300/failover.c
@@ -5,25 +5,28 @@
#include <arch/io.h>
#include "arch/romcc_io.h"
#include "pc80/mc146818rtc_early.c"
-#include "cpu/p6/boot_cpu.c"
-static void main(void)
+static unsigned long main(unsigned long bist)
{
- /* for now, just always assume failure */
-
-#if 0
- /* Is this a cpu reset? */
- if (cpu_init_detected()) {
- if (last_boot_normal()) {
- asm("jmp __normal_image");
- } else {
- asm("jmp __cpu_reset");
- }
- }
-
/* This is the primary cpu how should I boot? */
- else if (do_normal_boot()) {
- asm("jmp __normal_image");
+ if (do_normal_boot()) {
+ goto normal_image;
+ }
+ else {
+ goto fallback_image;
}
-#endif
+ normal_image:
+ asm volatile ("jmp __normal_image"
+ : /* outputs */
+ : "a" (bist) /* inputs */
+ : /* clobbers */
+ );
+ cpu_reset:
+ asm volatile ("jmp __cpu_reset"
+ : /* outputs */
+ : "a"(bist) /* inputs */
+ : /* clobbers */
+ );
+ fallback_image:
+ return bist;
}
diff --git a/src/mainboard/technologic/ts5300/irq_tables.c b/src/mainboard/technologic/ts5300/irq_tables.c
index a2463b9e6b..4e7a1fe82e 100644
--- a/src/mainboard/technologic/ts5300/irq_tables.c
+++ b/src/mainboard/technologic/ts5300/irq_tables.c
@@ -1,29 +1,28 @@
-// This pirq table is dummy and only here for existance.
-// It MUST be replaced as soon as LinuxBIOS is operable on this board.
+/* This file was generated by getpir.c, do not modify!
+ (but if you do, please run checkpir on it to verify)
+ * Contains the IRQ Routing Table dumped directly from your memory, which BIOS sets up
+ *
+ * Documentation at : http://www.microsoft.com/hwdev/busbios/PCIIRQ.HTM
+*/
#include <arch/pirq_routing.h>
const struct irq_routing_table intel_irq_routing_table = {
- PIRQ_SIGNATURE, /* u32 signature */
- PIRQ_VERSION, /* u16 version */
- 32+16*5, /* there can be total 5 devices on the bus */
- 0, /* Where the interrupt router lies (bus) */
- 0x88, /* Where the interrupt router lies (dev) */
- 0x1c20, /* IRQs devoted exclusively to PCI usage */
- 0x1106, /* Vendor */
- 0x8231, /* Device */
- 0, /* Crap (miniport) */
+ PIRQ_SIGNATURE, /* u32 signature */
+ PIRQ_VERSION, /* u16 version */
+ 32+16*7, /* there can be total 7 devices on the bus */
+ 0x00, /* Where the interrupt router lies (bus) */
+ (0x00<<3)|0x0, /* Where the interrupt router lies (dev) */
+ 0, /* IRQs devoted exclusively to PCI usage */
+ 0x8086, /* Vendor */
+ 0x122e, /* Device */
+ 0, /* Crap (miniport) */
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* u8 rfu[11] */
- 0x5e, /* u8 checksum , this hase to set to some value that would give 0 after the sum of all bytes for this structure (including checksum) */
+ 0x50, /* u8 checksum , this hase to set to some value that would give 0 after the sum of all bytes for this structure (including checksum) */
{
- /* 8231 ethernet */
- {0,0x90, {{0x1, 0xdeb8}, {0x2, 0xdeb8}, {0x3, 0xdeb8}, {0x4, 0xdeb8}}, 0x1, 0},
- /* 8231 internal */
- {0,0x88, {{0x2, 0xdeb8}, {0x3, 0xdeb8}, {0x4, 0xdeb8}, {0x1, 0xdeb8}}, 0x2, 0},
- /* PCI slot */
- {0,0xa0, {{0x3, 0xdeb8}, {0x4, 0xdeb8}, {0x1, 0xdeb8}, {0x2, 0xdeb8}}, 0, 0},
- {0,0x50, {{0x4, 0xdeb8}, {0x3, 0xdeb8}, {0x2, 0xdeb8}, {0x1, 0xdeb8}}, 0x3, 0},
- {0,0x98, {{0x4, 0xdeb8}, {0x3, 0xdeb8}, {0x2, 0xdeb8}, {0x1, 0xdeb8}}, 0x4, 0},
+ /* bus, dev|fn, {link, bitmap}, {link, bitmap}, {link, bitmap}, {link, bitmap}, slot, rfu */
+ {0x00,(0x12<<3)|0x0, {{0x30, 0x8000}, {0x00, 0x0}, {0x00, 0x0}, {0x00, 0x00}}, 0x0, 0x0},
+ {0x00,(0x14<<3)|0x0, {{0x30, 0x8000}, {0x31, 0x0}, {0x32, 0x0}, {0x33, 0x00}}, 0x0, 0x0},
}
};
unsigned long write_pirq_routing_table(unsigned long addr)