Commit c4ed38a0 authored by Ralf Baechle's avatar Ralf Baechle

Resurrect Cobalt support for 2.6.

Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent 049b13c3
...@@ -323,6 +323,7 @@ load-$(CONFIG_MIPS_XXS1500) += 0xffffffff80100000 ...@@ -323,6 +323,7 @@ load-$(CONFIG_MIPS_XXS1500) += 0xffffffff80100000
# Cobalt Server # Cobalt Server
# #
core-$(CONFIG_MIPS_COBALT) += arch/mips/cobalt/ core-$(CONFIG_MIPS_COBALT) += arch/mips/cobalt/
cflags-$(CONFIG_MIPS_COBALT) += -Iinclude/asm-mips/cobalt
load-$(CONFIG_MIPS_COBALT) += 0xffffffff80080000 load-$(CONFIG_MIPS_COBALT) += 0xffffffff80080000
# #
......
...@@ -2,6 +2,6 @@ ...@@ -2,6 +2,6 @@
# Makefile for the Cobalt micro systems family specific parts of the kernel # Makefile for the Cobalt micro systems family specific parts of the kernel
# #
obj-y := irq.o int-handler.o reset.o setup.o promcon.o obj-y := irq.o int-handler.o reset.o setup.o
EXTRA_AFLAGS := $(CFLAGS) EXTRA_AFLAGS := $(CFLAGS)
...@@ -18,8 +18,8 @@ ...@@ -18,8 +18,8 @@
SAVE_ALL SAVE_ALL
CLI CLI
la ra, ret_from_irq PTR_LA ra, ret_from_irq
move a1, sp move a0, sp
j cobalt_irq j cobalt_irq
END(cobalt_handle_int) END(cobalt_handle_int)
...@@ -10,6 +10,8 @@ ...@@ -10,6 +10,8 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/interrupt.h>
#include <linux/pci.h>
#include <asm/i8259.h> #include <asm/i8259.h>
#include <asm/irq_cpu.h> #include <asm/irq_cpu.h>
...@@ -25,8 +27,8 @@ extern void cobalt_handle_int(void); ...@@ -25,8 +27,8 @@ extern void cobalt_handle_int(void);
* the CPU interrupt lines, and ones that come in on the via chip. The CPU * the CPU interrupt lines, and ones that come in on the via chip. The CPU
* mappings are: * mappings are:
* *
* 16, - Software interrupt 0 (unused) IE_SW0 * 16 - Software interrupt 0 (unused) IE_SW0
* 17 - Software interrupt 1 (unused) IE_SW0 * 17 - Software interrupt 1 (unused) IE_SW1
* 18 - Galileo chip (timer) IE_IRQ0 * 18 - Galileo chip (timer) IE_IRQ0
* 19 - Tulip 0 + NCR SCSI IE_IRQ1 * 19 - Tulip 0 + NCR SCSI IE_IRQ1
* 20 - Tulip 1 IE_IRQ2 * 20 - Tulip 1 IE_IRQ2
...@@ -42,61 +44,94 @@ extern void cobalt_handle_int(void); ...@@ -42,61 +44,94 @@ extern void cobalt_handle_int(void);
* 15 - IDE1 * 15 - IDE1
*/ */
asmlinkage void cobalt_irq(struct pt_regs *regs) static inline void galileo_irq(struct pt_regs *regs)
{ {
unsigned int pending = read_c0_status() & read_c0_cause(); unsigned int mask, pending, devfn;
if (pending & CAUSEF_IP2) { /* int 18 */
unsigned long irq_src = GALILEO_INL(GT_INTRCAUSE_OFS);
/* Check for timer irq ... */
if (irq_src & GALILEO_T0EXP) {
/* Clear the int line */
GALILEO_OUTL(0, GT_INTRCAUSE_OFS);
do_IRQ(COBALT_TIMER_IRQ, regs);
}
return;
}
if (pending & CAUSEF_IP6) { /* int 22 */ mask = GALILEO_INL(GT_INTRMASK_OFS);
int irq = i8259_irq(); pending = GALILEO_INL(GT_INTRCAUSE_OFS) & mask;
if (irq >= 0) if (pending & GALILEO_INTR_T0EXP) {
do_IRQ(irq, regs);
return;
}
if (pending & CAUSEF_IP3) { /* int 19 */ GALILEO_OUTL(~GALILEO_INTR_T0EXP, GT_INTRCAUSE_OFS);
do_IRQ(COBALT_ETH0_IRQ, regs); do_IRQ(COBALT_GALILEO_IRQ, regs);
return;
}
if (pending & CAUSEF_IP4) { /* int 20 */ } else if (pending & GALILEO_INTR_RETRY_CTR) {
do_IRQ(COBALT_ETH1_IRQ, regs);
return;
}
if (pending & CAUSEF_IP5) { /* int 21 */ devfn = GALILEO_INL(GT_PCI0_CFGADDR_OFS) >> 8;
do_IRQ(COBALT_SERIAL_IRQ, regs); GALILEO_OUTL(~GALILEO_INTR_RETRY_CTR, GT_INTRCAUSE_OFS);
return; printk(KERN_WARNING "Galileo: PCI retry count exceeded (%02x.%u)\n",
} PCI_SLOT(devfn), PCI_FUNC(devfn));
} else {
if (pending & CAUSEF_IP7) { /* int 23 */ GALILEO_OUTL(mask & ~pending, GT_INTRMASK_OFS);
do_IRQ(COBALT_QUBE_SLOT_IRQ, regs); printk(KERN_WARNING "Galileo: masking unexpected interrupt %08x\n", pending);
return;
} }
} }
static inline void via_pic_irq(struct pt_regs *regs)
{
int irq;
irq = i8259_irq();
if (irq >= 0)
do_IRQ(irq, regs);
}
asmlinkage void cobalt_irq(struct pt_regs *regs)
{
unsigned pending;
pending = read_c0_status() & read_c0_cause();
if (pending & CAUSEF_IP2) /* COBALT_GALILEO_IRQ (18) */
galileo_irq(regs);
else if (pending & CAUSEF_IP6) /* COBALT_VIA_IRQ (22) */
via_pic_irq(regs);
else if (pending & CAUSEF_IP3) /* COBALT_ETH0_IRQ (19) */
do_IRQ(COBALT_CPU_IRQ + 3, regs);
else if (pending & CAUSEF_IP4) /* COBALT_ETH1_IRQ (20) */
do_IRQ(COBALT_CPU_IRQ + 4, regs);
else if (pending & CAUSEF_IP5) /* COBALT_SERIAL_IRQ (21) */
do_IRQ(COBALT_CPU_IRQ + 5, regs);
else if (pending & CAUSEF_IP7) /* IRQ 23 */
do_IRQ(COBALT_CPU_IRQ + 7, regs);
}
static struct irqaction irq_via = {
no_action, 0, { { 0, } }, "cascade", NULL, NULL
};
void __init arch_init_irq(void) void __init arch_init_irq(void)
{ {
/*
* Mask all Galileo interrupts. The Galileo
* handler is set in cobalt_timer_setup()
*/
GALILEO_OUTL(0, GT_INTRMASK_OFS);
set_except_vector(0, cobalt_handle_int); set_except_vector(0, cobalt_handle_int);
init_i8259_irqs(); /* 0 ... 15 */ init_i8259_irqs(); /* 0 ... 15 */
mips_cpu_irq_init(16); /* 16 ... 23 */ mips_cpu_irq_init(COBALT_CPU_IRQ); /* 16 ... 23 */
/* /*
* Mask all cpu interrupts * Mask all cpu interrupts
* (except IE4, we already masked those at VIA level) * (except IE4, we already masked those at VIA level)
*/ */
change_c0_status(ST0_IM, IE_IRQ4); change_c0_status(ST0_IM, IE_IRQ4);
setup_irq(COBALT_VIA_IRQ, &irq_via);
} }
/*
* PROM console for Cobalt Raq2
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
* Copyright (C) 1995, 1996, 1997 by Ralf Baechle
* Copyright (C) 2001 by Liam Davies (ldavies@agile.tv)
*
*/
#include <linux/init.h>
#include <linux/console.h>
#include <linux/kdev_t.h>
#include <linux/serial_reg.h>
#include <asm/delay.h>
#include <asm/serial.h>
#include <asm/io.h>
static unsigned long port = 0xc800000;
static __inline__ void ns16550_cons_put_char(char ch, unsigned long ioaddr)
{
char lsr;
do {
lsr = inb(ioaddr + UART_LSR);
} while ((lsr & (UART_LSR_TEMT | UART_LSR_THRE)) != (UART_LSR_TEMT | UART_LSR_THRE));
outb(ch, ioaddr + UART_TX);
}
static __inline__ char ns16550_cons_get_char(unsigned long ioaddr)
{
while ((inb(ioaddr + UART_LSR) & UART_LSR_DR) == 0)
udelay(1);
return inb(ioaddr + UART_RX);
}
void ns16550_console_write(struct console *co, const char *s, unsigned count)
{
char lsr, ier;
unsigned i;
ier = inb(port + UART_IER);
outb(0x00, port + UART_IER);
for (i=0; i < count; i++, s++) {
if(*s == '\n')
ns16550_cons_put_char('\r', port);
ns16550_cons_put_char(*s, port);
}
do {
lsr = inb(port + UART_LSR);
} while ((lsr & (UART_LSR_TEMT | UART_LSR_THRE)) != (UART_LSR_TEMT | UART_LSR_THRE));
outb(ier, port + UART_IER);
}
char getDebugChar(void)
{
return ns16550_cons_get_char(port);
}
void putDebugChar(char kgdb_char)
{
ns16550_cons_put_char(kgdb_char, port);
}
static struct console ns16550_console = {
.name = "prom",
.setup = NULL,
.write = ns16550_console_write,
.flags = CON_PRINTBUFFER,
.index = -1,
};
static int __init ns16550_setup_console(void)
{
register_console(&ns16550_console);
return 0;
}
console_initcall(ns16550_setup_console);
...@@ -16,48 +16,45 @@ ...@@ -16,48 +16,45 @@
#include <asm/reboot.h> #include <asm/reboot.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/mipsregs.h> #include <asm/mipsregs.h>
#include <asm/cobalt/cobalt.h>
void cobalt_machine_restart(char *command) void cobalt_machine_halt(void)
{ {
*(volatile char *)0xbc000000 = 0x0f; int state, last, diff;
unsigned long mark;
/* /*
* Ouch, we're still alive ... This time we take the silver bullet ... * turn off bar on Qube, flash power off LED on RaQ (0.5Hz)
* ... and find that we leave the hardware in a state in which the *
* kernel in the flush locks up somewhen during of after the PCI * restart if ENTER and SELECT are pressed
* detection stuff.
*/ */
set_c0_status(ST0_BEV | ST0_ERL);
change_c0_config(CONF_CM_CMASK, CONF_CM_UNCACHED);
flush_cache_all();
write_c0_wired(0);
__asm__ __volatile__(
"jr\t%0"
:
: "r" (0xbfc00000));
}
extern int led_state; last = COBALT_KEY_PORT;
#define kLED 0xBC000000
#define LEDSet(x) (*(volatile unsigned char *) kLED) = (( unsigned char)x)
void cobalt_machine_halt(void) for (state = 0;;) {
{
int mark; state ^= COBALT_LED_POWER_OFF;
COBALT_LED_PORT = state;
diff = COBALT_KEY_PORT ^ last;
last ^= diff;
/* Blink our cute? little LED (number 3)... */ if((diff & (COBALT_KEY_ENTER | COBALT_KEY_SELECT)) && !(~last & (COBALT_KEY_ENTER | COBALT_KEY_SELECT)))
while (1) { COBALT_LED_PORT = COBALT_LED_RESET;
led_state = led_state | ( 1 << 3 );
LEDSet(led_state); for (mark = jiffies; jiffies - mark < HZ;)
mark = jiffies; ;
while (jiffies<(mark+HZ));
led_state = led_state & ~( 1 << 3 );
LEDSet(led_state);
mark = jiffies;
while (jiffies<(mark+HZ));
} }
} }
void cobalt_machine_restart(char *command)
{
COBALT_LED_PORT = COBALT_LED_RESET;
/* we should never get here */
cobalt_machine_halt();
}
/* /*
* This triggers the luser mode device driver for the power switch ;-) * This triggers the luser mode device driver for the power switch ;-)
*/ */
......
...@@ -13,6 +13,8 @@ ...@@ -13,6 +13,8 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/serial.h>
#include <linux/serial_core.h>
#include <asm/bootinfo.h> #include <asm/bootinfo.h>
#include <asm/time.h> #include <asm/time.h>
...@@ -21,6 +23,7 @@ ...@@ -21,6 +23,7 @@
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/reboot.h> #include <asm/reboot.h>
#include <asm/gt64120.h> #include <asm/gt64120.h>
#include <asm/serial.h>
#include <asm/cobalt/cobalt.h> #include <asm/cobalt/cobalt.h>
...@@ -30,45 +33,44 @@ extern void cobalt_machine_power_off(void); ...@@ -30,45 +33,44 @@ extern void cobalt_machine_power_off(void);
int cobalt_board_id; int cobalt_board_id;
static char my_cmdline[CL_SIZE] = {
"console=ttyS0,115200 "
#ifdef CONFIG_IP_PNP
"ip=on "
#endif
#ifdef CONFIG_ROOT_NFS
"root=/dev/nfs "
#else
"root=/dev/hda1 "
#endif
};
const char *get_system_type(void) const char *get_system_type(void)
{ {
switch (cobalt_board_id) {
case COBALT_BRD_ID_QUBE1:
return "Cobalt Qube";
case COBALT_BRD_ID_RAQ1:
return "Cobalt RaQ";
case COBALT_BRD_ID_QUBE2:
return "Cobalt Qube2";
case COBALT_BRD_ID_RAQ2:
return "Cobalt RaQ2";
}
return "MIPS Cobalt"; return "MIPS Cobalt";
} }
static void __init cobalt_timer_setup(struct irqaction *irq) static void __init cobalt_timer_setup(struct irqaction *irq)
{ {
/* Load timer value for 150 Hz */ /* Load timer value for 1KHz (TCLK is 50MHz) */
GALILEO_OUTL(500000, GT_TC0_OFS); GALILEO_OUTL(50*1000*1000 / 1000, GT_TC0_OFS);
/* Register our timer interrupt */ /* Enable timer */
setup_irq(COBALT_TIMER_IRQ, irq); GALILEO_OUTL(GALILEO_ENTC0 | GALILEO_SELTC0, GT_TC_CONTROL_OFS);
/* Enable timer ints */ /* Register interrupt */
GALILEO_OUTL((GALILEO_ENTC0 | GALILEO_SELTC0), GT_TC_CONTROL_OFS); setup_irq(COBALT_GALILEO_IRQ, irq);
/* Unmask timer int */
GALILEO_OUTL(0x100, GT_INTRMASK_OFS); /* Enable interrupt */
GALILEO_OUTL(GALILEO_INTR_T0EXP | GALILEO_INL(GT_INTRMASK_OFS), GT_INTRMASK_OFS);
} }
extern struct pci_ops gt64111_pci_ops; extern struct pci_ops gt64111_pci_ops;
static struct resource cobalt_mem_resource = { static struct resource cobalt_mem_resource = {
"GT64111 PCI MEM", GT64111_IO_BASE, 0xffffffffUL, IORESOURCE_MEM "PCI memory", GT64111_MEM_BASE, GT64111_MEM_END, IORESOURCE_MEM
}; };
static struct resource cobalt_io_resource = { static struct resource cobalt_io_resource = {
"GT64111 IO MEM", 0x00001000UL, 0x0fffffffUL, IORESOURCE_IO "PCI I/O", 0x1000, 0xffff, IORESOURCE_IO
}; };
static struct resource cobalt_io_resources[] = { static struct resource cobalt_io_resources[] = {
...@@ -86,11 +88,12 @@ static struct pci_controller cobalt_pci_controller = { ...@@ -86,11 +88,12 @@ static struct pci_controller cobalt_pci_controller = {
.mem_resource = &cobalt_mem_resource, .mem_resource = &cobalt_mem_resource,
.mem_offset = 0, .mem_offset = 0,
.io_resource = &cobalt_io_resource, .io_resource = &cobalt_io_resource,
.io_offset = 0x00001000UL - GT64111_IO_BASE .io_offset = 0 - GT64111_IO_BASE
}; };
void __init plat_setup(void) void __init plat_setup(void)
{ {
static struct uart_port uart;
unsigned int devfn = PCI_DEVFN(COBALT_PCICONF_VIA, 0); unsigned int devfn = PCI_DEVFN(COBALT_PCICONF_VIA, 0);
int i; int i;
...@@ -100,7 +103,10 @@ void __init plat_setup(void) ...@@ -100,7 +103,10 @@ void __init plat_setup(void)
board_timer_setup = cobalt_timer_setup; board_timer_setup = cobalt_timer_setup;
set_io_port_base(KSEG1ADDR(GT64111_IO_BASE)); set_io_port_base(CKSEG1ADDR(GT64111_IO_BASE));
/* I/O port resource must include UART and LCD/buttons */
ioport_resource.end = 0x0fffffff;
/* /*
* This is a prom style console. We just poke at the * This is a prom style console. We just poke at the
...@@ -120,25 +126,61 @@ void __init plat_setup(void) ...@@ -120,25 +126,61 @@ void __init plat_setup(void)
cobalt_board_id >>= ((VIA_COBALT_BRD_ID_REG & 3) * 8); cobalt_board_id >>= ((VIA_COBALT_BRD_ID_REG & 3) * 8);
cobalt_board_id = VIA_COBALT_BRD_REG_to_ID(cobalt_board_id); cobalt_board_id = VIA_COBALT_BRD_REG_to_ID(cobalt_board_id);
printk("Cobalt board ID: %d\n", cobalt_board_id);
#ifdef CONFIG_PCI #ifdef CONFIG_PCI
register_pci_controller(&cobalt_pci_controller); register_pci_controller(&cobalt_pci_controller);
#endif #endif
#ifdef CONFIG_SERIAL_8250
if (cobalt_board_id > COBALT_BRD_ID_RAQ1) {
uart.line = 0;
uart.type = PORT_UNKNOWN;
uart.uartclk = 18432000;
uart.irq = COBALT_SERIAL_IRQ;
uart.flags = STD_COM_FLAGS;
uart.iobase = 0xc800000;
uart.iotype = UPIO_PORT;
early_serial_setup(&uart);
}
#endif
} }
/* /*
* Prom init. We read our one and only communication with the firmware. * Prom init. We read our one and only communication with the firmware.
* Grab the amount of installed memory * Grab the amount of installed memory.
* Better boot loaders (CoLo) pass a command line too :-)
*/ */
void __init prom_init(void) void __init prom_init(void)
{ {
int argc = fw_arg0; int narg, indx, posn, nchr;
unsigned long memsz;
strcpy(arcs_cmdline, my_cmdline); char **argv;
mips_machgroup = MACH_GROUP_COBALT; mips_machgroup = MACH_GROUP_COBALT;
add_memory_region(0x0, argc & 0x7fffffff, BOOT_MEM_RAM); memsz = fw_arg0 & 0x7fff0000;
narg = fw_arg0 & 0x0000ffff;
if (narg) {
arcs_cmdline[0] = '\0';
argv = (char **) fw_arg1;
posn = 0;
for (indx = 1; indx < narg; ++indx) {
nchr = strlen(argv[indx]);
if (posn + 1 + nchr + 1 > sizeof(arcs_cmdline))
break;
if (posn)
arcs_cmdline[posn++] = ' ';
strcpy(arcs_cmdline + posn, argv[indx]);
posn += nchr;
}
}
add_memory_region(0x0, memsz, BOOT_MEM_RAM);
} }
unsigned long __init prom_free_prom_memory(void) unsigned long __init prom_free_prom_memory(void)
......
...@@ -21,6 +21,20 @@ ...@@ -21,6 +21,20 @@
extern int cobalt_board_id; extern int cobalt_board_id;
static void qube_raq_galileo_early_fixup(struct pci_dev *dev)
{
if (dev->devfn == PCI_DEVFN(0, 0) &&
(dev->class >> 8) == PCI_CLASS_MEMORY_OTHER) {
dev->class = (PCI_CLASS_BRIDGE_HOST << 8) | (dev->class & 0xff);
printk(KERN_INFO "Galileo: fixed bridge class\n");
}
}
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_MARVELL, PCI_DEVICE_ID_MARVELL_GT64111,
qube_raq_galileo_early_fixup);
static void qube_raq_via_bmIDE_fixup(struct pci_dev *dev) static void qube_raq_via_bmIDE_fixup(struct pci_dev *dev)
{ {
unsigned short cfgword; unsigned short cfgword;
...@@ -48,6 +62,9 @@ static void qube_raq_galileo_fixup(struct pci_dev *dev) ...@@ -48,6 +62,9 @@ static void qube_raq_galileo_fixup(struct pci_dev *dev)
{ {
unsigned short galileo_id; unsigned short galileo_id;
if (dev->devfn != PCI_DEVFN(0, 0))
return;
/* Fix PCI latency-timer and cache-line-size values in Galileo /* Fix PCI latency-timer and cache-line-size values in Galileo
* host bridge. * host bridge.
*/ */
...@@ -55,6 +72,13 @@ static void qube_raq_galileo_fixup(struct pci_dev *dev) ...@@ -55,6 +72,13 @@ static void qube_raq_galileo_fixup(struct pci_dev *dev)
pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, 7); pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, 7);
/* /*
* The code described by the comment below has been removed
* as it causes bus mastering by the Ethernet controllers
* to break under any kind of network load. We always set
* the retry timeouts to their maximum.
*
* --x--x--x--x--x--x--x--x--x--x--x--x--x--x--x--x--x--x--x--x--
*
* On all machines prior to Q2, we had the STOP line disconnected * On all machines prior to Q2, we had the STOP line disconnected
* from Galileo to VIA on PCI. The new Galileo does not function * from Galileo to VIA on PCI. The new Galileo does not function
* correctly unless we have it connected. * correctly unless we have it connected.
...@@ -64,21 +88,43 @@ static void qube_raq_galileo_fixup(struct pci_dev *dev) ...@@ -64,21 +88,43 @@ static void qube_raq_galileo_fixup(struct pci_dev *dev)
*/ */
pci_read_config_word(dev, PCI_REVISION_ID, &galileo_id); pci_read_config_word(dev, PCI_REVISION_ID, &galileo_id);
galileo_id &= 0xff; /* mask off class info */ galileo_id &= 0xff; /* mask off class info */
printk(KERN_INFO "Galileo: revision %u\n", galileo_id);
#if 0
if (galileo_id >= 0x10) { if (galileo_id >= 0x10) {
/* New Galileo, assumes PCI stop line to VIA is connected. */ /* New Galileo, assumes PCI stop line to VIA is connected. */
GALILEO_OUTL(0x4020, GT_PCI0_TOR_OFS); GALILEO_OUTL(0x4020, GT_PCI0_TOR_OFS);
} else if (galileo_id == 0x1 || galileo_id == 0x2) { } else if (galileo_id == 0x1 || galileo_id == 0x2)
#endif
{
signed int timeo; signed int timeo;
/* XXX WE MUST DO THIS ELSE GALILEO LOCKS UP! -DaveM */ /* XXX WE MUST DO THIS ELSE GALILEO LOCKS UP! -DaveM */
timeo = GALILEO_INL(GT_PCI0_TOR_OFS); timeo = GALILEO_INL(GT_PCI0_TOR_OFS);
/* Old Galileo, assumes PCI STOP line to VIA is disconnected. */ /* Old Galileo, assumes PCI STOP line to VIA is disconnected. */
GALILEO_OUTL(0xffff, GT_PCI0_TOR_OFS); GALILEO_OUTL(
(0xff << 16) | /* retry count */
(0xff << 8) | /* timeout 1 */
0xff, /* timeout 0 */
GT_PCI0_TOR_OFS);
/* enable PCI retry exceeded interrupt */
GALILEO_OUTL(GALILEO_INTR_RETRY_CTR | GALILEO_INL(GT_INTRMASK_OFS), GT_INTRMASK_OFS);
} }
} }
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_GALILEO, PCI_ANY_ID, DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL, PCI_DEVICE_ID_MARVELL_GT64111,
qube_raq_galileo_fixup); qube_raq_galileo_fixup);
static char irq_tab_qube1[] __initdata = {
[COBALT_PCICONF_CPU] = 0,
[COBALT_PCICONF_ETH0] = COBALT_QUBE1_ETH0_IRQ,
[COBALT_PCICONF_RAQSCSI] = COBALT_SCSI_IRQ,
[COBALT_PCICONF_VIA] = 0,
[COBALT_PCICONF_PCISLOT] = COBALT_QUBE_SLOT_IRQ,
[COBALT_PCICONF_ETH1] = 0
};
static char irq_tab_cobalt[] __initdata = { static char irq_tab_cobalt[] __initdata = {
[COBALT_PCICONF_CPU] = 0, [COBALT_PCICONF_CPU] = 0,
[COBALT_PCICONF_ETH0] = COBALT_ETH0_IRQ, [COBALT_PCICONF_ETH0] = COBALT_ETH0_IRQ,
...@@ -99,6 +145,9 @@ static char irq_tab_raq2[] __initdata = { ...@@ -99,6 +145,9 @@ static char irq_tab_raq2[] __initdata = {
int __init pcibios_map_irq(struct pci_dev *dev, u8 slot, u8 pin) int __init pcibios_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
{ {
if (cobalt_board_id < COBALT_BRD_ID_QUBE2)
return irq_tab_qube1[slot];
if (cobalt_board_id == COBALT_BRD_ID_RAQ2) if (cobalt_board_id == COBALT_BRD_ID_RAQ2)
return irq_tab_raq2[slot]; return irq_tab_raq2[slot];
......
...@@ -18,15 +18,15 @@ ...@@ -18,15 +18,15 @@
#include <asm/cobalt/cobalt.h> #include <asm/cobalt/cobalt.h>
/* /*
* Accessing device 31 hangs the GT64120. Not sure if this will also hang * Device 31 on the GT64111 is used to generate PCI special
* the GT64111, let's be paranoid for now. * cycles, so we shouldn't expected to find a device there ...
*/ */
static inline int pci_range_ck(struct pci_bus *bus, unsigned int devfn) static inline int pci_range_ck(struct pci_bus *bus, unsigned int devfn)
{ {
if (bus->number == 0 && devfn == PCI_DEVFN(31, 0)) if (bus->number == 0 && PCI_SLOT(devfn) < 31)
return -1; return 0;
return 0; return -1;
} }
static int gt64111_pci_read_config(struct pci_bus *bus, unsigned int devfn, static int gt64111_pci_read_config(struct pci_bus *bus, unsigned int devfn,
......
...@@ -575,8 +575,8 @@ static inline int button_pressed(void) ...@@ -575,8 +575,8 @@ static inline int button_pressed(void)
static int lcd_waiters = 0; static int lcd_waiters = 0;
static long lcd_read(struct inode *inode, struct file *file, char *buf, static ssize_t lcd_read(struct file *file, char *buf,
unsigned long count) size_t count, loff_t *ofs)
{ {
long buttons_now; long buttons_now;
......
...@@ -22,7 +22,7 @@ static int timeout(volatile unsigned long); ...@@ -22,7 +22,7 @@ static int timeout(volatile unsigned long);
#define MAX_IDLE_TIME 120 #define MAX_IDLE_TIME 120
struct lcd_display { struct lcd_display {
unsigned long buttons; unsigned buttons;
int size1; int size1;
int size2; int size2;
unsigned char line1[LCD_CHARS_PER_LINE]; unsigned char line1[LCD_CHARS_PER_LINE];
......
...@@ -19,18 +19,23 @@ ...@@ -19,18 +19,23 @@
* 9 - PCI * 9 - PCI
* 14 - IDE0 * 14 - IDE0
* 15 - IDE1 * 15 - IDE1
* */
#define COBALT_QUBE_SLOT_IRQ 9
/*
* CPU IRQs are 16 ... 23 * CPU IRQs are 16 ... 23
*/ */
#define COBALT_TIMER_IRQ 18 #define COBALT_CPU_IRQ 16
#define COBALT_SCC_IRQ 19 /* pre-production has 85C30 */
#define COBALT_RAQ_SCSI_IRQ 19 #define COBALT_GALILEO_IRQ (COBALT_CPU_IRQ + 2)
#define COBALT_ETH0_IRQ 19 #define COBALT_SCC_IRQ (COBALT_CPU_IRQ + 3) /* pre-production has 85C30 */
#define COBALT_ETH1_IRQ 20 #define COBALT_RAQ_SCSI_IRQ (COBALT_CPU_IRQ + 3)
#define COBALT_SERIAL_IRQ 21 #define COBALT_ETH0_IRQ (COBALT_CPU_IRQ + 3)
#define COBALT_SCSI_IRQ 21 #define COBALT_QUBE1_ETH0_IRQ (COBALT_CPU_IRQ + 4)
#define COBALT_VIA_IRQ 22 /* Chained to VIA ISA bridge */ #define COBALT_ETH1_IRQ (COBALT_CPU_IRQ + 4)
#define COBALT_QUBE_SLOT_IRQ 23 #define COBALT_SERIAL_IRQ (COBALT_CPU_IRQ + 5)
#define COBALT_SCSI_IRQ (COBALT_CPU_IRQ + 5)
#define COBALT_VIA_IRQ (COBALT_CPU_IRQ + 6) /* Chained to VIA ISA bridge */
/* /*
* PCI configuration space manifest constants. These are wired into * PCI configuration space manifest constants. These are wired into
...@@ -69,16 +74,21 @@ ...@@ -69,16 +74,21 @@
* Most of this really should go into a separate GT64111 header file. * Most of this really should go into a separate GT64111 header file.
*/ */
#define GT64111_IO_BASE 0x10000000UL #define GT64111_IO_BASE 0x10000000UL
#define GT64111_IO_END 0x11ffffffUL
#define GT64111_MEM_BASE 0x12000000UL
#define GT64111_MEM_END 0x13ffffffUL
#define GT64111_BASE 0x14000000UL #define GT64111_BASE 0x14000000UL
#define GALILEO_REG(ofs) (KSEG0 + GT64111_BASE + (unsigned long)(ofs)) #define GALILEO_REG(ofs) CKSEG1ADDR(GT64111_BASE + (unsigned long)(ofs))
#define GALILEO_INL(port) (*(volatile unsigned int *) GALILEO_REG(port)) #define GALILEO_INL(port) (*(volatile unsigned int *) GALILEO_REG(port))
#define GALILEO_OUTL(val, port) \ #define GALILEO_OUTL(val, port) \
do { \ do { \
*(volatile unsigned int *) GALILEO_REG(port) = (port); \ *(volatile unsigned int *) GALILEO_REG(port) = (val); \
} while (0) } while (0)
#define GALILEO_T0EXP 0x0100 #define GALILEO_INTR_T0EXP (1 << 8)
#define GALILEO_INTR_RETRY_CTR (1 << 20)
#define GALILEO_ENTC0 0x01 #define GALILEO_ENTC0 0x01
#define GALILEO_SELTC0 0x02 #define GALILEO_SELTC0 0x02
...@@ -86,5 +96,21 @@ do { \ ...@@ -86,5 +96,21 @@ do { \
GALILEO_OUTL((0x80000000 | (PCI_SLOT (devfn) << 11) | \ GALILEO_OUTL((0x80000000 | (PCI_SLOT (devfn) << 11) | \
(PCI_FUNC (devfn) << 8) | (where)), GT_PCI0_CFGADDR_OFS) (PCI_FUNC (devfn) << 8) | (where)), GT_PCI0_CFGADDR_OFS)
#define COBALT_LED_PORT (*(volatile unsigned char *) CKSEG1ADDR(0x1c000000))
# define COBALT_LED_BAR_LEFT (1 << 0) /* Qube */
# define COBALT_LED_BAR_RIGHT (1 << 1) /* Qube */
# define COBALT_LED_WEB (1 << 2) /* RaQ */
# define COBALT_LED_POWER_OFF (1 << 3) /* RaQ */
# define COBALT_LED_RESET 0x0f
#define COBALT_KEY_PORT ((~*(volatile unsigned int *) CKSEG1ADDR(0x1d000000) >> 24) & COBALT_KEY_MASK)
# define COBALT_KEY_CLEAR (1 << 1)
# define COBALT_KEY_LEFT (1 << 2)
# define COBALT_KEY_UP (1 << 3)
# define COBALT_KEY_DOWN (1 << 4)
# define COBALT_KEY_RIGHT (1 << 5)
# define COBALT_KEY_ENTER (1 << 6)
# define COBALT_KEY_SELECT (1 << 7)
# define COBALT_KEY_MASK 0xfe
#endif /* __ASM_COBALT_H */ #endif /* __ASM_COBALT_H */
/* there's something here ... in the dark */
...@@ -52,16 +52,6 @@ ...@@ -52,16 +52,6 @@
#define JAZZ_SERIAL_PORT_DEFNS #define JAZZ_SERIAL_PORT_DEFNS
#endif #endif
#ifdef CONFIG_MIPS_COBALT
#include <asm/cobalt/cobalt.h>
#define COBALT_BASE_BAUD (18432000 / 16)
#define COBALT_SERIAL_PORT_DEFNS \
/* UART CLK PORT IRQ FLAGS */ \
{ 0, COBALT_BASE_BAUD, 0xc800000, COBALT_SERIAL_IRQ, STD_COM_FLAGS }, /* ttyS0 */
#else
#define COBALT_SERIAL_PORT_DEFNS
#endif
/* /*
* Both Galileo boards have the same UART mappings. * Both Galileo boards have the same UART mappings.
*/ */
...@@ -342,7 +332,6 @@ ...@@ -342,7 +332,6 @@
#endif /* CONFIG_SGI_IP32 */ #endif /* CONFIG_SGI_IP32 */
#define SERIAL_PORT_DFNS \ #define SERIAL_PORT_DFNS \
COBALT_SERIAL_PORT_DEFNS \
DDB5477_SERIAL_PORT_DEFNS \ DDB5477_SERIAL_PORT_DEFNS \
EV96100_SERIAL_PORT_DEFNS \ EV96100_SERIAL_PORT_DEFNS \
IP32_SERIAL_PORT_DEFNS \ IP32_SERIAL_PORT_DEFNS \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment