Commit 225b563b authored by David S. Miller's avatar David S. Miller

Merge nuts.ninka.net:/home/davem/src/BK/zaitcev-2.5

into nuts.ninka.net:/home/davem/src/BK/sparc-2.5
parents cc8a6820 23340580
...@@ -59,6 +59,9 @@ endmenu ...@@ -59,6 +59,9 @@ endmenu
mainmenu_option next_comment mainmenu_option next_comment
comment 'Console drivers' comment 'Console drivers'
bool 'PROM console' CONFIG_PROM_CONSOLE bool 'PROM console' CONFIG_PROM_CONSOLE
if [ "$CONFIG_PROM_CONSOLE" != "y" ]; then
define_bool CONFIG_DUMMY_CONSOLE y
fi
source drivers/video/Config.in source drivers/video/Config.in
endmenu endmenu
...@@ -214,6 +217,8 @@ if [ "$CONFIG_UNIX98_PTYS" = "y" ]; then ...@@ -214,6 +217,8 @@ if [ "$CONFIG_UNIX98_PTYS" = "y" ]; then
fi fi
endmenu endmenu
source drivers/input/Config.in
source fs/Config.in source fs/Config.in
if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
......
This diff is collapsed.
...@@ -13,7 +13,7 @@ export-objs := sparc_ksyms.o ...@@ -13,7 +13,7 @@ export-objs := sparc_ksyms.o
IRQ_OBJS := irq.o sun4m_irq.o sun4c_irq.o sun4d_irq.o IRQ_OBJS := irq.o sun4m_irq.o sun4c_irq.o sun4d_irq.o
obj-y := entry.o wof.o wuf.o etrap.o rtrap.o traps.o ${IRQ_OBJS} \ obj-y := entry.o wof.o wuf.o etrap.o rtrap.o traps.o ${IRQ_OBJS} \
process.o signal.o ioport.o setup.o idprom.o \ process.o signal.o ioport.o setup.o idprom.o \
sys_sparc.o sunos_asm.o sparc-stub.o systbls.o \ sys_sparc.o sunos_asm.o systbls.o \
time.o windows.o cpu.o devices.o sclow.o \ time.o windows.o cpu.o devices.o sclow.o \
tadpole.o tick14.o ptrace.o sys_solaris.o \ tadpole.o tick14.o ptrace.o sys_solaris.o \
unaligned.o muldiv.o pcic.o semaphore.o sparc_ksyms.o unaligned.o muldiv.o pcic.o semaphore.o sparc_ksyms.o
......
...@@ -24,8 +24,6 @@ ...@@ -24,8 +24,6 @@
struct linux_ebus *ebus_chain = 0; struct linux_ebus *ebus_chain = 0;
extern void rs_init(void);
/* We are together with pcic.c under CONFIG_PCI. */ /* We are together with pcic.c under CONFIG_PCI. */
extern unsigned int pcic_pin_to_irq(unsigned int, char *name); extern unsigned int pcic_pin_to_irq(unsigned int, char *name);
...@@ -361,6 +359,4 @@ void __init ebus_init(void) ...@@ -361,6 +359,4 @@ void __init ebus_init(void)
ebus->next = 0; ebus->next = 0;
++num_ebus; ++num_ebus;
} }
rs_init();
} }
...@@ -53,6 +53,7 @@ in_trap_handler: ...@@ -53,6 +53,7 @@ in_trap_handler:
.text .text
.align 4 .align 4
#if 0 /* kgdb is dropped from 2.5.33 */
! This function is called when any SPARC trap (except window overflow or ! This function is called when any SPARC trap (except window overflow or
! underflow) occurs. It makes sure that the invalid register window is still ! underflow) occurs. It makes sure that the invalid register window is still
! available before jumping into C code. It will also restore the world if you ! available before jumping into C code. It will also restore the world if you
...@@ -119,7 +120,7 @@ C_LABEL(trap_low): ...@@ -119,7 +120,7 @@ C_LABEL(trap_low):
STORE_PT_PRIV(sp, l0, l1, l2) STORE_PT_PRIV(sp, l0, l1, l2)
RESTORE_ALL RESTORE_ALL
#endif
#ifdef CONFIG_BLK_DEV_FD #ifdef CONFIG_BLK_DEV_FD
.text .text
......
/* $Id: pcic.c,v 1.23 2002/01/23 14:33:55 davem Exp $ /*
* pcic.c: Sparc/PCI controller support * pcic.c: MicroSPARC-IIep PCI controller support
* *
* Copyright (C) 1998 V. Roganov and G. Raiko * Copyright (C) 1998 V. Roganov and G. Raiko
* *
...@@ -193,48 +193,26 @@ static void pci_do_settimeofday(struct timeval *tv); ...@@ -193,48 +193,26 @@ static void pci_do_settimeofday(struct timeval *tv);
#define CONFIG_CMD(bus, device_fn, where) (0x80000000 | (((unsigned int)bus) << 16) | (((unsigned int)device_fn) << 8) | (where & ~3)) #define CONFIG_CMD(bus, device_fn, where) (0x80000000 | (((unsigned int)bus) << 16) | (((unsigned int)device_fn) << 8) | (where & ~3))
static int pcic_read_config(struct pci_bus *bus, unsigned int devfn, static int pcic_read_config_dword(unsigned int busno, unsigned int devfn,
int where, int size, u32 *value) int where, u32 *value)
{ {
unsigned int v;
unsigned char busnum = bus->number;
struct linux_pcic *pcic; struct linux_pcic *pcic;
unsigned long flags; unsigned long flags;
/* unsigned char where; */
switch (size) {
case 1:
pcic_read_config(bus, devfn, where&~3, 4, &v);
*value = 0xff & (v >> (8*(where & 3)));
return PCIBIOS_SUCCESSFUL;
break;
case 2:
if (where&1) return PCIBIOS_BAD_REGISTER_NUMBER;
pcic_read_config(bus, devfn, where&~3, 4, &v);
*value = 0xffff & (v >> (8*(where & 3)));
return PCIBIOS_SUCCESSFUL;
break;
}
/* size == 4, i.e. dword */
if (where&3) return PCIBIOS_BAD_REGISTER_NUMBER;
if (busnum != 0) return PCIBIOS_DEVICE_NOT_FOUND;
pcic = &pcic0; pcic = &pcic0;
save_and_cli(flags); local_irq_save(flags);
#if 0 /* does not fail here */ #if 0 /* does not fail here */
pcic_speculative = 1; pcic_speculative = 1;
pcic_trapped = 0; pcic_trapped = 0;
#endif #endif
writel(CONFIG_CMD(busnum,devfn,where), pcic->pcic_config_space_addr); writel(CONFIG_CMD(busno, devfn, where), pcic->pcic_config_space_addr);
#if 0 /* does not fail here */ #if 0 /* does not fail here */
nop(); nop();
if (pcic_trapped) { if (pcic_trapped) {
restore_flags(flags); local_irq_restore(flags);
*value = ~0; *value = ~0;
return PCIBIOS_SUCCESSFUL; return 0;
} }
#endif #endif
pcic_speculative = 2; pcic_speculative = 2;
...@@ -243,50 +221,77 @@ static int pcic_read_config(struct pci_bus *bus, unsigned int devfn, ...@@ -243,50 +221,77 @@ static int pcic_read_config(struct pci_bus *bus, unsigned int devfn,
nop(); nop();
if (pcic_trapped) { if (pcic_trapped) {
pcic_speculative = 0; pcic_speculative = 0;
restore_flags(flags); local_irq_restore(flags);
*value = ~0; *value = ~0;
return PCIBIOS_SUCCESSFUL; return 0;
} }
pcic_speculative = 0; pcic_speculative = 0;
restore_flags(flags); local_irq_restore(flags);
return PCIBIOS_SUCCESSFUL; return 0;
} }
static int pcic_write_config(struct pci_bus *bus, unsigned int devfn, static int pcic_read_config(struct pci_bus *bus, unsigned int devfn,
int where, int size, u32 value) int where, int size, u32 *val)
{ {
unsigned int v; unsigned int v;
unsigned char busnum = bus->number;
struct linux_pcic *pcic;
unsigned long flags;
if (bus->number != 0) return -EINVAL;
switch (size) { switch (size) {
case 1: case 1:
pcic_read_config(bus, devfn, where&~3, 4, &v); pcic_read_config_dword(bus->number, devfn, where&~3, &v);
v = (v & ~(0xff << (8*(where&3)))) | *val = 0xff & (v >> (8*(where & 3)));
((0xff&(unsigned)value) << (8*(where&3))); return 0;
return pcic_write_config(bus, devfn, where&~3, 4, v);
break;
case 2: case 2:
if (where&1) return PCIBIOS_BAD_REGISTER_NUMBER; if (where&1) return -EINVAL;
pcic_read_config(bus, devfn, where&~3, 4, &v); pcic_read_config_dword(bus->number, devfn, where&~3, &v);
v = (v & ~(0xffff << (8*(where&3)))) | *val = 0xffff & (v >> (8*(where & 3)));
((0xffff&(unsigned)value) << (8*(where&3))); return 0;
return pcic_write_config(bus, devfn, where&~3, 4, v); case 4:
break; if (where&3) return -EINVAL;
pcic_read_config_dword(bus->number, devfn, where&~3, val);
return 0;
} }
return -EINVAL;
}
static int pcic_write_config_dword(unsigned int busno, unsigned int devfn,
int where, u32 value)
{
struct linux_pcic *pcic;
unsigned long flags;
/* size == 4, i.e. dword */
if (where&3) return PCIBIOS_BAD_REGISTER_NUMBER;
if (busnum != 0) return PCIBIOS_DEVICE_NOT_FOUND;
pcic = &pcic0; pcic = &pcic0;
save_and_cli(flags); local_irq_save(flags);
writel(CONFIG_CMD(busnum,devfn,where), pcic->pcic_config_space_addr); writel(CONFIG_CMD(busno, devfn, where), pcic->pcic_config_space_addr);
writel(value, pcic->pcic_config_space_data + (where&4)); writel(value, pcic->pcic_config_space_data + (where&4));
restore_flags(flags); local_irq_restore(flags);
return PCIBIOS_SUCCESSFUL; return 0;
}
static int pcic_write_config(struct pci_bus *bus, unsigned int devfn,
int where, int size, u32 val)
{
unsigned int v;
if (bus->number != 0) return -EINVAL;
switch (size) {
case 1:
pcic_read_config_dword(bus->number, devfn, where&~3, &v);
v = (v & ~(0xff << (8*(where&3)))) |
((0xff&val) << (8*(where&3)));
return pcic_write_config_dword(bus->number, devfn, where&~3, v);
case 2:
if (where&1) return -EINVAL;
pcic_read_config_dword(bus->number, devfn, where&~3, &v);
v = (v & ~(0xffff << (8*(where&3)))) |
((0xffff&val) << (8*(where&3)));
return pcic_write_config_dword(bus->number, devfn, where&~3, v);
case 4:
if (where&3) return -EINVAL;
return pcic_write_config_dword(bus->number, devfn, where, val);
}
return -EINVAL;
} }
static struct pci_ops pcic_ops = { static struct pci_ops pcic_ops = {
...@@ -420,7 +425,7 @@ static void __init pcic_pbm_scan_bus(struct linux_pcic *pcic) ...@@ -420,7 +425,7 @@ static void __init pcic_pbm_scan_bus(struct linux_pcic *pcic)
/* /*
* Main entry point from the PCI subsystem. * Main entry point from the PCI subsystem.
*/ */
static int __init pcibios_init(void) static int __init pcic_init(void)
{ {
struct linux_pcic *pcic; struct linux_pcic *pcic;
...@@ -623,7 +628,7 @@ void __init pcibios_fixup_bus(struct pci_bus *bus) ...@@ -623,7 +628,7 @@ void __init pcibios_fixup_bus(struct pci_bus *bus)
{ {
struct list_head *walk; struct list_head *walk;
int i, has_io, has_mem; int i, has_io, has_mem;
unsigned short cmd; unsigned int cmd;
struct linux_pcic *pcic; struct linux_pcic *pcic;
/* struct linux_pbm_info* pbm = &pcic->pbm; */ /* struct linux_pbm_info* pbm = &pcic->pbm; */
int node; int node;
...@@ -663,19 +668,21 @@ void __init pcibios_fixup_bus(struct pci_bus *bus) ...@@ -663,19 +668,21 @@ void __init pcibios_fixup_bus(struct pci_bus *bus)
} else if (f & IORESOURCE_MEM) } else if (f & IORESOURCE_MEM)
has_mem = 1; has_mem = 1;
} }
pcic_read_config_word(dev, PCI_COMMAND, &cmd); pcic_read_config(dev->bus, dev->devfn, PCI_COMMAND, 2, &cmd);
if (has_io && !(cmd & PCI_COMMAND_IO)) { if (has_io && !(cmd & PCI_COMMAND_IO)) {
printk("PCIC: Enabling I/O for device %02x:%02x\n", printk("PCIC: Enabling I/O for device %02x:%02x\n",
dev->bus->number, dev->devfn); dev->bus->number, dev->devfn);
cmd |= PCI_COMMAND_IO; cmd |= PCI_COMMAND_IO;
pcic_write_config_word(dev, PCI_COMMAND, cmd); pcic_write_config(dev->bus, dev->devfn,
PCI_COMMAND, 2, cmd);
} }
if (has_mem && !(cmd & PCI_COMMAND_MEMORY)) { if (has_mem && !(cmd & PCI_COMMAND_MEMORY)) {
printk("PCIC: Enabling memory for device %02x:%02x\n", printk("PCIC: Enabling memory for device %02x:%02x\n",
dev->bus->number, dev->devfn); dev->bus->number, dev->devfn);
cmd |= PCI_COMMAND_MEMORY; cmd |= PCI_COMMAND_MEMORY;
pcic_write_config_word(dev, PCI_COMMAND, cmd); pcic_write_config(dev->bus, dev->devfn,
} PCI_COMMAND, 2, cmd);
}
node = pdev_to_pnode(&pcic->pbm, dev); node = pdev_to_pnode(&pcic->pbm, dev);
if(node == 0) if(node == 0)
...@@ -791,7 +798,7 @@ static void pci_do_gettimeofday(struct timeval *tv) ...@@ -791,7 +798,7 @@ static void pci_do_gettimeofday(struct timeval *tv)
{ {
unsigned long flags; unsigned long flags;
save_and_cli(flags); local_irq_save(flags);
*tv = xtime; *tv = xtime;
tv->tv_usec += do_gettimeoffset(); tv->tv_usec += do_gettimeoffset();
...@@ -803,7 +810,7 @@ static void pci_do_gettimeofday(struct timeval *tv) ...@@ -803,7 +810,7 @@ static void pci_do_gettimeofday(struct timeval *tv)
if ((jiffies - wall_jiffies) != 0) if ((jiffies - wall_jiffies) != 0)
tv->tv_usec += USECS_PER_JIFFY; tv->tv_usec += USECS_PER_JIFFY;
restore_flags(flags); local_irq_restore(flags);
if (tv->tv_usec >= 1000000) { if (tv->tv_usec >= 1000000) {
tv->tv_usec -= 1000000; tv->tv_usec -= 1000000;
...@@ -813,7 +820,9 @@ static void pci_do_gettimeofday(struct timeval *tv) ...@@ -813,7 +820,9 @@ static void pci_do_gettimeofday(struct timeval *tv)
static void pci_do_settimeofday(struct timeval *tv) static void pci_do_settimeofday(struct timeval *tv)
{ {
cli(); unsigned long flags;
local_irq_save(flags);
tv->tv_usec -= do_gettimeoffset(); tv->tv_usec -= do_gettimeoffset();
if(tv->tv_usec < 0) { if(tv->tv_usec < 0) {
tv->tv_usec += 1000000; tv->tv_usec += 1000000;
...@@ -824,7 +833,7 @@ static void pci_do_settimeofday(struct timeval *tv) ...@@ -824,7 +833,7 @@ static void pci_do_settimeofday(struct timeval *tv)
time_status |= STA_UNSYNC; time_status |= STA_UNSYNC;
time_maxerror = NTP_PHASE_LIMIT; time_maxerror = NTP_PHASE_LIMIT;
time_esterror = NTP_PHASE_LIMIT; time_esterror = NTP_PHASE_LIMIT;
sti(); local_irq_restore(flags);
} }
#if 0 #if 0
...@@ -898,9 +907,9 @@ static void pcic_disable_irq(unsigned int irq_nr) ...@@ -898,9 +907,9 @@ static void pcic_disable_irq(unsigned int irq_nr)
unsigned long mask, flags; unsigned long mask, flags;
mask = get_irqmask(irq_nr); mask = get_irqmask(irq_nr);
save_and_cli(flags); local_irq_save(flags);
writel(mask, pcic0.pcic_regs+PCI_SYS_INT_TARGET_MASK_SET); writel(mask, pcic0.pcic_regs+PCI_SYS_INT_TARGET_MASK_SET);
restore_flags(flags); local_irq_restore(flags);
} }
static void pcic_enable_irq(unsigned int irq_nr) static void pcic_enable_irq(unsigned int irq_nr)
...@@ -908,9 +917,9 @@ static void pcic_enable_irq(unsigned int irq_nr) ...@@ -908,9 +917,9 @@ static void pcic_enable_irq(unsigned int irq_nr)
unsigned long mask, flags; unsigned long mask, flags;
mask = get_irqmask(irq_nr); mask = get_irqmask(irq_nr);
save_and_cli(flags); local_irq_save(flags);
writel(mask, pcic0.pcic_regs+PCI_SYS_INT_TARGET_MASK_CLEAR); writel(mask, pcic0.pcic_regs+PCI_SYS_INT_TARGET_MASK_CLEAR);
restore_flags(flags); local_irq_restore(flags);
} }
static void pcic_clear_profile_irq(int cpu) static void pcic_clear_profile_irq(int cpu)
...@@ -1021,4 +1030,4 @@ void insl(unsigned long addr, void *dst, unsigned long count) { ...@@ -1021,4 +1030,4 @@ void insl(unsigned long addr, void *dst, unsigned long count) {
#endif #endif
subsys_initcall(pcibios_init); subsys_initcall(pcic_init);
...@@ -94,7 +94,7 @@ int cpu_idle(void) ...@@ -94,7 +94,7 @@ int cpu_idle(void)
extern unsigned long sun4c_kernel_faults; extern unsigned long sun4c_kernel_faults;
extern void sun4c_grow_kernel_ring(void); extern void sun4c_grow_kernel_ring(void);
save_and_cli(flags); local_irq_save(flags);
now = jiffies; now = jiffies;
count -= (now - last_jiffies); count -= (now - last_jiffies);
last_jiffies = now; last_jiffies = now;
...@@ -110,7 +110,7 @@ int cpu_idle(void) ...@@ -110,7 +110,7 @@ int cpu_idle(void)
sun4c_grow_kernel_ring(); sun4c_grow_kernel_ring();
} }
} }
restore_flags(flags); local_irq_restore(flags);
} }
while((!need_resched()) && pm_idle) { while((!need_resched()) && pm_idle) {
...@@ -144,8 +144,6 @@ int cpu_idle(void) ...@@ -144,8 +144,6 @@ int cpu_idle(void)
extern char reboot_command []; extern char reboot_command [];
extern int serial_console;
extern void (*prom_palette)(int); extern void (*prom_palette)(int);
void machine_halt(void) void machine_halt(void)
......
...@@ -34,7 +34,6 @@ ...@@ -34,7 +34,6 @@
#include <asm/segment.h> #include <asm/segment.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/kgdb.h>
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/oplib.h> #include <asm/oplib.h>
#include <asm/page.h> #include <asm/page.h>
...@@ -67,8 +66,6 @@ struct screen_info screen_info = { ...@@ -67,8 +66,6 @@ struct screen_info screen_info = {
*/ */
extern unsigned long trapbase; extern unsigned long trapbase;
extern int serial_console;
extern void breakpoint(void);
void (*prom_palette)(int); void (*prom_palette)(int);
asmlinkage void sys_sync(void); /* it's really int */ asmlinkage void sys_sync(void); /* it's really int */
...@@ -105,28 +102,15 @@ void prom_sync_me(void) ...@@ -105,28 +102,15 @@ void prom_sync_me(void)
return; return;
} }
extern void rs_kgdb_hook(int tty_num); /* sparc/serial.c */
unsigned int boot_flags __initdata = 0; unsigned int boot_flags __initdata = 0;
#define BOOTME_DEBUG 0x1 #define BOOTME_DEBUG 0x1
#define BOOTME_SINGLE 0x2 #define BOOTME_SINGLE 0x2
#define BOOTME_KGDBA 0x4
#define BOOTME_KGDBB 0x8
#define BOOTME_KGDB 0xc
static int console_fb __initdata = 0; static int console_fb __initdata = 0;
/* Exported for mm/init.c:paging_init. */ /* Exported for mm/init.c:paging_init. */
unsigned long cmdline_memory_size __initdata = 0; unsigned long cmdline_memory_size __initdata = 0;
void kernel_enter_debugger(void)
{
if (boot_flags & BOOTME_KGDB) {
printk("KGDB: Entered\n");
breakpoint();
}
}
static void static void
prom_console_write(struct console *con, const char *s, unsigned n) prom_console_write(struct console *con, const char *s, unsigned n)
{ {
...@@ -142,11 +126,6 @@ static struct console prom_debug_console = { ...@@ -142,11 +126,6 @@ static struct console prom_debug_console = {
int obp_system_intr(void) int obp_system_intr(void)
{ {
if (boot_flags & BOOTME_KGDB) {
printk("KGDB: system interrupted\n");
breakpoint();
return 1;
}
if (boot_flags & BOOTME_DEBUG) { if (boot_flags & BOOTME_DEBUG) {
printk("OBP: system interrupted\n"); printk("OBP: system interrupted\n");
prom_halt(); prom_halt();
...@@ -196,24 +175,6 @@ static void __init boot_flags_init(char *commands) ...@@ -196,24 +175,6 @@ static void __init boot_flags_init(char *commands)
commands++; commands++;
while (*commands && *commands != ' ') while (*commands && *commands != ' ')
process_switch(*commands++); process_switch(*commands++);
} else if (strlen(commands) >= 9
&& !strncmp(commands, "kgdb=tty", 8)) {
switch (commands[8]) {
#ifdef CONFIG_SUN_SERIAL
case 'a':
boot_flags |= BOOTME_KGDBA;
prom_printf("KGDB: Using serial line /dev/ttya.\n");
break;
case 'b':
boot_flags |= BOOTME_KGDBB;
prom_printf("KGDB: Using serial line /dev/ttyb.\n");
break;
#endif
default:
printk("KGDB: Unknown tty line.\n");
break;
}
commands += 9;
} else { } else {
if (!strncmp(commands, "console=", 8)) { if (!strncmp(commands, "console=", 8)) {
commands += 8; commands += 8;
...@@ -378,65 +339,48 @@ void __init setup_arch(char **cmdline_p) ...@@ -378,65 +339,48 @@ void __init setup_arch(char **cmdline_p)
prom_setsync(prom_sync_me); prom_setsync(prom_sync_me);
{ #ifndef CONFIG_SERIAL_CONSOLE /* Not CONFIG_SERIAL_SUNCORE: to be gone. */
#if !CONFIG_SUN_SERIAL serial_console = 0;
serial_console = 0;
#else #else
switch (console_fb) { switch (console_fb) {
case 0: /* Let get our io devices from prom */ case 0: /* Let get our io devices from prom */
{ {
int idev = prom_query_input_device(); int idev = prom_query_input_device();
int odev = prom_query_output_device(); int odev = prom_query_output_device();
if (idev == PROMDEV_IKBD && odev == PROMDEV_OSCREEN) { if (idev == PROMDEV_IKBD && odev == PROMDEV_OSCREEN) {
serial_console = 0; serial_console = 0;
} else if (idev == PROMDEV_ITTYA && odev == PROMDEV_OTTYA) { } else if (idev == PROMDEV_ITTYA && odev == PROMDEV_OTTYA) {
serial_console = 1; serial_console = 1;
} else if (idev == PROMDEV_ITTYB && odev == PROMDEV_OTTYB) { } else if (idev == PROMDEV_ITTYB && odev == PROMDEV_OTTYB) {
serial_console = 2; serial_console = 2;
} else if (idev == PROMDEV_I_UNK && odev == PROMDEV_OTTYA) { } else if (idev == PROMDEV_I_UNK && odev == PROMDEV_OTTYA) {
prom_printf("MrCoffee ttya\n"); prom_printf("MrCoffee ttya\n");
serial_console = 1; serial_console = 1;
} else if (idev == PROMDEV_I_UNK && odev == PROMDEV_OSCREEN) { } else if (idev == PROMDEV_I_UNK && odev == PROMDEV_OSCREEN) {
serial_console = 0; serial_console = 0;
prom_printf("MrCoffee keyboard\n"); prom_printf("MrCoffee keyboard\n");
} else { } else {
prom_printf("Inconsistent or unknown console\n"); prom_printf("Inconsistent or unknown console\n");
prom_printf("You cannot mix serial and non serial input/output devices\n"); prom_printf("You cannot mix serial and non serial input/output devices\n");
prom_halt(); prom_halt();
}
} }
break;
case 1: serial_console = 0; break; /* Force one of the framebuffers as console */
case 2: serial_console = 1; break; /* Force ttya as console */
case 3: serial_console = 2; break; /* Force ttyb as console */
} }
#endif break;
} case 1: serial_console = 0; break; /* Force one of the framebuffers as console */
case 2: serial_console = 1; break; /* Force ttya as console */
if ((boot_flags & BOOTME_KGDBA)) { case 3: serial_console = 2; break; /* Force ttyb as console */
rs_kgdb_hook(0);
}
if ((boot_flags & BOOTME_KGDBB)) {
rs_kgdb_hook(1);
} }
#endif
if((boot_flags&BOOTME_DEBUG) && (linux_dbvec!=0) && if((boot_flags&BOOTME_DEBUG) && (linux_dbvec!=0) &&
((*(short *)linux_dbvec) != -1)) { ((*(short *)linux_dbvec) != -1)) {
printk("Booted under KADB. Syncing trap table.\n"); printk("Booted under KADB. Syncing trap table.\n");
(*(linux_dbvec->teach_debugger))(); (*(linux_dbvec->teach_debugger))();
} }
if((boot_flags & BOOTME_KGDB)) {
set_debug_traps();
prom_printf ("Breakpoint!\n");
breakpoint();
}
init_mm.context = (unsigned long) NO_CONTEXT; init_mm.context = (unsigned long) NO_CONTEXT;
init_task.thread.kregs = &fake_swapper_regs; init_task.thread.kregs = &fake_swapper_regs;
if (serial_console)
conswitchp = NULL;
paging_init(); paging_init();
} }
...@@ -514,3 +458,19 @@ struct seq_operations cpuinfo_op = { ...@@ -514,3 +458,19 @@ struct seq_operations cpuinfo_op = {
.stop = c_stop, .stop = c_stop,
.show = show_cpuinfo, .show = show_cpuinfo,
}; };
extern int stop_a_enabled;
void sun_do_break(void)
{
if (!stop_a_enabled)
return;
printk("\n");
flush_user_windows();
prom_cmdline();
}
int serial_console;
int stop_a_enabled = 1;
...@@ -188,22 +188,16 @@ static inline void copy_ttentry(struct tt_entry *src, struct tt_entry *dest) ...@@ -188,22 +188,16 @@ static inline void copy_ttentry(struct tt_entry *src, struct tt_entry *dest)
/* Initialize the kgdb_savettable so that debugging can commence */ /* Initialize the kgdb_savettable so that debugging can commence */
static void eh_init(void) static void eh_init(void)
{ {
int i, flags; int i;
save_and_cli(flags);
for(i=0; i < 256; i++) for(i=0; i < 256; i++)
copy_ttentry(&sparc_ttable[i], &kgdb_savettable[i]); copy_ttentry(&sparc_ttable[i], &kgdb_savettable[i]);
restore_flags(flags);
} }
/* Install an exception handler for kgdb */ /* Install an exception handler for kgdb */
static void exceptionHandler(int tnum, trapfunc_t trap_entry) static void exceptionHandler(int tnum, trapfunc_t trap_entry)
{ {
unsigned long te_addr = (unsigned long) trap_entry; unsigned long te_addr = (unsigned long) trap_entry;
int flags;
/* We are dorking with a live trap table, all irqs off */
save_and_cli(flags);
/* Make new vector */ /* Make new vector */
sparc_ttable[tnum].inst_one = sparc_ttable[tnum].inst_one =
...@@ -212,8 +206,6 @@ static void exceptionHandler(int tnum, trapfunc_t trap_entry) ...@@ -212,8 +206,6 @@ static void exceptionHandler(int tnum, trapfunc_t trap_entry)
sparc_ttable[tnum].inst_two = SPARC_RD_PSR_L0; sparc_ttable[tnum].inst_two = SPARC_RD_PSR_L0;
sparc_ttable[tnum].inst_three = SPARC_NOP; sparc_ttable[tnum].inst_three = SPARC_NOP;
sparc_ttable[tnum].inst_four = SPARC_NOP; sparc_ttable[tnum].inst_four = SPARC_NOP;
restore_flags(flags);
} }
/* Convert ch from a hex digit to an int */ /* Convert ch from a hex digit to an int */
...@@ -406,7 +398,7 @@ set_debug_traps(void) ...@@ -406,7 +398,7 @@ set_debug_traps(void)
struct hard_trap_info *ht; struct hard_trap_info *ht;
unsigned long flags; unsigned long flags;
save_and_cli(flags); local_irq_save(flags);
#if 0 #if 0
/* Have to sort this out. This cannot be done after initialization. */ /* Have to sort this out. This cannot be done after initialization. */
BTFIXUPSET_CALL(flush_cache_all, flush_cache_all_nop, BTFIXUPCALL_NOP); BTFIXUPSET_CALL(flush_cache_all, flush_cache_all_nop, BTFIXUPCALL_NOP);
...@@ -438,7 +430,7 @@ set_debug_traps(void) ...@@ -438,7 +430,7 @@ set_debug_traps(void)
#endif #endif
initialized = 1; /* connect! */ initialized = 1; /* connect! */
restore_flags(flags); local_irq_restore(flags);
} }
/* Convert the SPARC hardware trap type code to a unix signal number. */ /* Convert the SPARC hardware trap type code to a unix signal number. */
......
...@@ -56,6 +56,9 @@ static void clk_slow(void) ...@@ -56,6 +56,9 @@ static void clk_slow(void)
"g2", "g3", "g4", "g5"); "g2", "g3", "g4", "g5");
} }
/*
* Tadpole is guaranteed to be UP, using local_irq_save.
*/
static void tsu_clockstop(void) static void tsu_clockstop(void)
{ {
unsigned int mcsr; unsigned int mcsr;
...@@ -64,28 +67,28 @@ static void tsu_clockstop(void) ...@@ -64,28 +67,28 @@ static void tsu_clockstop(void)
if (!clk_ctrl) if (!clk_ctrl)
return; return;
if (!(clk_state & CLOCK_INIT_DONE)) { if (!(clk_state & CLOCK_INIT_DONE)) {
save_and_cli(flags); local_irq_save(flags);
clk_init(); clk_init();
clk_state |= CLOCK_INIT_DONE; /* all done */ clk_state |= CLOCK_INIT_DONE; /* all done */
restore_flags(flags); local_irq_restore(flags);
return; return;
} }
if (!(clk_ctrl[2] & 1)) if (!(clk_ctrl[2] & 1))
return; /* no speed up yet */ return; /* no speed up yet */
save_and_cli(flags); local_irq_save(flags);
/* if SCSI DMA in progress, don't slow clock */ /* if SCSI DMA in progress, don't slow clock */
mcsr = ldphys(MACIO_SCSI_CSR_ADDR); mcsr = ldphys(MACIO_SCSI_CSR_ADDR);
if ((mcsr&MACIO_EN_DMA) != 0) { if ((mcsr&MACIO_EN_DMA) != 0) {
restore_flags(flags); local_irq_restore(flags);
return; return;
} }
/* TODO... the minimum clock setting ought to increase the /* TODO... the minimum clock setting ought to increase the
* memory refresh interval.. * memory refresh interval..
*/ */
clk_slow(); clk_slow();
restore_flags(flags); local_irq_restore(flags);
} }
static void swift_clockstop(void) static void swift_clockstop(void)
......
...@@ -29,32 +29,30 @@ extern unsigned long lvl14_save[5]; ...@@ -29,32 +29,30 @@ extern unsigned long lvl14_save[5];
static unsigned long *linux_lvl14 = NULL; static unsigned long *linux_lvl14 = NULL;
static unsigned long obp_lvl14[4]; static unsigned long obp_lvl14[4];
/*
* Call with timer IRQ closed.
* First time we do it with disable_irq, later prom code uses spin_lock_irq().
*/
void install_linux_ticker(void) void install_linux_ticker(void)
{ {
unsigned long flags;
if (!linux_lvl14) if (!linux_lvl14)
return; return;
save_and_cli(flags);
linux_lvl14[0] = lvl14_save[0]; linux_lvl14[0] = lvl14_save[0];
linux_lvl14[1] = lvl14_save[1]; linux_lvl14[1] = lvl14_save[1];
linux_lvl14[2] = lvl14_save[2]; linux_lvl14[2] = lvl14_save[2];
linux_lvl14[3] = lvl14_save[3]; linux_lvl14[3] = lvl14_save[3];
restore_flags(flags);
} }
void install_obp_ticker(void) void install_obp_ticker(void)
{ {
unsigned long flags;
if (!linux_lvl14) if (!linux_lvl14)
return; return;
save_and_cli(flags);
linux_lvl14[0] = obp_lvl14[0]; linux_lvl14[0] = obp_lvl14[0];
linux_lvl14[1] = obp_lvl14[1]; linux_lvl14[1] = obp_lvl14[1];
linux_lvl14[2] = obp_lvl14[2]; linux_lvl14[2] = obp_lvl14[2];
linux_lvl14[3] = obp_lvl14[3]; linux_lvl14[3] = obp_lvl14[3];
restore_flags(flags);
} }
void claim_ticker14(void (*handler)(int, void *, struct pt_regs *), void claim_ticker14(void (*handler)(int, void *, struct pt_regs *),
......
...@@ -506,9 +506,18 @@ asmlinkage void user_unaligned_trap(struct pt_regs *regs, unsigned int insn) ...@@ -506,9 +506,18 @@ asmlinkage void user_unaligned_trap(struct pt_regs *regs, unsigned int insn)
break; break;
case both: case both:
#if 0 /* unsupported */
do_atomic(fetch_reg_addr(((insn>>25)&0x1f), regs), do_atomic(fetch_reg_addr(((insn>>25)&0x1f), regs),
(unsigned long *) addr, (unsigned long *) addr,
user_unaligned_trap_fault); user_unaligned_trap_fault);
#else
/*
* This was supported in 2.4. However, we question
* the value of SWAP instruction across word boundaries.
*/
printk("Unaligned SWAP unsupported.\n");
goto kill_user;
#endif
break; break;
default: default:
......
...@@ -1212,7 +1212,6 @@ extern int linux_num_cpus; ...@@ -1212,7 +1212,6 @@ extern int linux_num_cpus;
void (*poke_srmmu)(void) __initdata = NULL; void (*poke_srmmu)(void) __initdata = NULL;
extern unsigned long bootmem_init(unsigned long *pages_avail); extern unsigned long bootmem_init(unsigned long *pages_avail);
extern void sun_serial_setup(void);
void __init srmmu_paging_init(void) void __init srmmu_paging_init(void)
{ {
...@@ -1281,13 +1280,6 @@ void __init srmmu_paging_init(void) ...@@ -1281,13 +1280,6 @@ void __init srmmu_paging_init(void)
flush_cache_all(); flush_cache_all();
flush_tlb_all(); flush_tlb_all();
/*
* This does not logically belong here, but we need to
* call it at the moment we are able to use the bootmem
* allocator.
*/
sun_serial_setup();
sparc_context_init(num_contexts); sparc_context_init(num_contexts);
kmap_init(); kmap_init();
......
...@@ -2001,7 +2001,6 @@ extern void sparc_context_init(int); ...@@ -2001,7 +2001,6 @@ extern void sparc_context_init(int);
extern unsigned long end; extern unsigned long end;
extern unsigned long bootmem_init(unsigned long *pages_avail); extern unsigned long bootmem_init(unsigned long *pages_avail);
extern unsigned long last_valid_pfn; extern unsigned long last_valid_pfn;
extern void sun_serial_setup(void);
void __init sun4c_paging_init(void) void __init sun4c_paging_init(void)
{ {
...@@ -2018,12 +2017,6 @@ void __init sun4c_paging_init(void) ...@@ -2018,12 +2017,6 @@ void __init sun4c_paging_init(void)
last_valid_pfn = bootmem_init(&pages_avail); last_valid_pfn = bootmem_init(&pages_avail);
end_pfn = last_valid_pfn; end_pfn = last_valid_pfn;
/* This does not logically belong here, but we need to
* call it at the moment we are able to use the bootmem
* allocator.
*/
sun_serial_setup();
sun4c_probe_mmu(); sun4c_probe_mmu();
invalid_segment = (num_segmaps - 1); invalid_segment = (num_segmaps - 1);
sun4c_init_mmu_entry_pool(); sun4c_init_mmu_entry_pool();
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include <asm/openprom.h> #include <asm/openprom.h>
#include <asm/oplib.h> #include <asm/oplib.h>
#include <asm/auxio.h> #include <asm/auxio.h>
#include <asm/system.h>
extern void restore_current(void); extern void restore_current(void);
...@@ -47,7 +48,6 @@ prom_feval(char *fstring) ...@@ -47,7 +48,6 @@ prom_feval(char *fstring)
/* We want to do this more nicely some day. */ /* We want to do this more nicely some day. */
extern void (*prom_palette)(int); extern void (*prom_palette)(int);
extern int serial_console;
/* Drop into the prom, with the chance to continue with the 'go' /* Drop into the prom, with the chance to continue with the 'go'
* prom command. * prom command.
...@@ -55,20 +55,18 @@ extern int serial_console; ...@@ -55,20 +55,18 @@ extern int serial_console;
void void
prom_cmdline(void) prom_cmdline(void)
{ {
extern void kernel_enter_debugger(void);
extern void install_obp_ticker(void); extern void install_obp_ticker(void);
extern void install_linux_ticker(void); extern void install_linux_ticker(void);
unsigned long flags; unsigned long flags;
kernel_enter_debugger();
if(!serial_console && prom_palette) if(!serial_console && prom_palette)
prom_palette (1); prom_palette (1);
install_obp_ticker();
spin_lock_irqsave(&prom_lock, flags); spin_lock_irqsave(&prom_lock, flags);
install_obp_ticker();
(*(romvec->pv_abort))(); (*(romvec->pv_abort))();
restore_current(); restore_current();
spin_unlock_irqrestore(&prom_lock, flags);
install_linux_ticker(); install_linux_ticker();
spin_unlock_irqrestore(&prom_lock, flags);
#ifdef CONFIG_SUN_AUXIO #ifdef CONFIG_SUN_AUXIO
TURN_ON_LED; TURN_ON_LED;
#endif #endif
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <linux/signal.h> #include <linux/signal.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <asm/system.h>
#include <asm/ebus.h> #include <asm/ebus.h>
#define __KERNEL_SYSCALLS__ #define __KERNEL_SYSCALLS__
...@@ -37,8 +38,6 @@ extern void machine_halt(void); ...@@ -37,8 +38,6 @@ extern void machine_halt(void);
extern void machine_alt_power_off(void); extern void machine_alt_power_off(void);
static void (*poweroff_method)(void) = machine_alt_power_off; static void (*poweroff_method)(void) = machine_alt_power_off;
extern int serial_console;
void machine_power_off(void) void machine_power_off(void)
{ {
if (!serial_console) { if (!serial_console) {
......
...@@ -110,7 +110,6 @@ int cpu_idle(void) ...@@ -110,7 +110,6 @@ int cpu_idle(void)
extern char reboot_command []; extern char reboot_command [];
extern void (*prom_palette)(int); extern void (*prom_palette)(int);
extern int serial_console;
extern void (*prom_keyboard)(void); extern void (*prom_keyboard)(void);
void machine_halt(void) void machine_halt(void)
......
...@@ -314,12 +314,9 @@ int prom_callback(long *args) ...@@ -314,12 +314,9 @@ int prom_callback(long *args)
return 0; return 0;
} }
extern void rs_kgdb_hook(int tty_num); /* sparc/serial.c */
unsigned int boot_flags = 0; unsigned int boot_flags = 0;
#define BOOTME_DEBUG 0x1 #define BOOTME_DEBUG 0x1
#define BOOTME_SINGLE 0x2 #define BOOTME_SINGLE 0x2
#define BOOTME_KGDB 0x4
static int console_fb __initdata = 0; static int console_fb __initdata = 0;
...@@ -389,26 +386,6 @@ static void __init boot_flags_init(char *commands) ...@@ -389,26 +386,6 @@ static void __init boot_flags_init(char *commands)
commands++; commands++;
while (*commands && *commands != ' ') while (*commands && *commands != ' ')
process_switch(*commands++); process_switch(*commands++);
} else if (strlen(commands) >= 9
&& !strncmp(commands, "kgdb=tty", 8)) {
boot_flags |= BOOTME_KGDB;
switch (commands[8]) {
#ifdef CONFIG_SUN_SERIAL
case 'a':
rs_kgdb_hook(0);
prom_printf("KGDB: Using serial line /dev/ttya.\n");
break;
case 'b':
rs_kgdb_hook(1);
prom_printf("KGDB: Using serial line /dev/ttyb.\n");
break;
#endif
default:
printk("KGDB: Unknown tty line.\n");
boot_flags &= ~BOOTME_KGDB;
break;
}
commands += 9;
} else { } else {
if (!strncmp(commands, "console=", 8)) { if (!strncmp(commands, "console=", 8)) {
commands += 8; commands += 8;
...@@ -484,7 +461,6 @@ extern void paging_init(void); ...@@ -484,7 +461,6 @@ extern void paging_init(void);
void __init setup_arch(char **cmdline_p) void __init setup_arch(char **cmdline_p)
{ {
extern int serial_console; /* in console.c, of course */
unsigned long highest_paddr; unsigned long highest_paddr;
int i; int i;
...@@ -568,7 +544,6 @@ void __init setup_arch(char **cmdline_p) ...@@ -568,7 +544,6 @@ void __init setup_arch(char **cmdline_p)
} }
#endif #endif
#ifdef CONFIG_SUN_SERIAL
switch (console_fb) { switch (console_fb) {
case 0: /* Let's get our io devices from prom */ case 0: /* Let's get our io devices from prom */
{ {
...@@ -597,10 +572,7 @@ void __init setup_arch(char **cmdline_p) ...@@ -597,10 +572,7 @@ void __init setup_arch(char **cmdline_p)
case 3: /* Force ttyb as console */ case 3: /* Force ttyb as console */
serial_console = 2; serial_console = 2;
break; break;
} };
#else
serial_console = 0;
#endif
if (serial_console) if (serial_console)
conswitchp = NULL; conswitchp = NULL;
......
...@@ -1515,14 +1515,6 @@ void __init paging_init(void) ...@@ -1515,14 +1515,6 @@ void __init paging_init(void)
pages_avail = 0; pages_avail = 0;
last_valid_pfn = end_pfn = bootmem_init(&pages_avail); last_valid_pfn = end_pfn = bootmem_init(&pages_avail);
#ifdef CONFIG_SUN_SERIAL
/* This does not logically belong here, but we need to
* call it at the moment we are able to use the bootmem
* allocator.
*/
sun_serial_setup();
#endif
/* Inherit non-locked OBP mappings. */ /* Inherit non-locked OBP mappings. */
inherit_prom_mappings(); inherit_prom_mappings();
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <asm/openprom.h> #include <asm/openprom.h>
#include <asm/oplib.h> #include <asm/oplib.h>
#include <asm/system.h>
/* Reset and reboot the machine with the command 'bcommand'. */ /* Reset and reboot the machine with the command 'bcommand'. */
void prom_reboot(char *bcommand) void prom_reboot(char *bcommand)
...@@ -33,7 +34,6 @@ void prom_feval(char *fstring) ...@@ -33,7 +34,6 @@ void prom_feval(char *fstring)
/* We want to do this more nicely some day. */ /* We want to do this more nicely some day. */
extern void (*prom_palette)(int); extern void (*prom_palette)(int);
extern int serial_console;
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
extern void smp_capture(void); extern void smp_capture(void);
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#include <linux/serio.h> #include <linux/serio.h>
#endif #endif
#include <linux/init.h> #include <linux/init.h>
#include <linux/delay.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/irq.h> #include <asm/irq.h>
...@@ -1019,6 +1020,8 @@ static void sunsu_autoconfig(struct uart_sunsu_port *up) ...@@ -1019,6 +1020,8 @@ static void sunsu_autoconfig(struct uart_sunsu_port *up)
if (!up->port_node || !up->su_type) if (!up->port_node || !up->su_type)
return; return;
up->port.iotype = SERIAL_IO_MEM;
/* /*
* First we look for Ebus-bases su's * First we look for Ebus-bases su's
*/ */
......
...@@ -382,13 +382,6 @@ static void sunzilog_receive_chars(struct uart_sunzilog_port *up, ...@@ -382,13 +382,6 @@ static void sunzilog_receive_chars(struct uart_sunzilog_port *up,
sun_do_break(); sun_do_break();
return; return;
} }
#ifndef CONFIG_SPARC64
/* Look for kgdb 'stop' character. */
if (ZS_IS_KGDB(up) && (ch == '\003')) {
breakpoint();
return;
}
#endif
/* A real serial line, record the character and status. */ /* A real serial line, record the character and status. */
*tty->flip.char_buf_ptr = ch; *tty->flip.char_buf_ptr = ch;
...@@ -1152,11 +1145,11 @@ static struct zilog_layout * __init get_zs_sun4u(int chip) ...@@ -1152,11 +1145,11 @@ static struct zilog_layout * __init get_zs_sun4u(int chip)
static struct zilog_layout * __init get_zs_sun4cmd(int chip) static struct zilog_layout * __init get_zs_sun4cmd(int chip)
{ {
struct linux_prom_irqs irq_info[2]; struct linux_prom_irqs irq_info[2];
unsigned long mapped_addr; unsigned long mapped_addr = 0;
int zsnode, chipid, cpunode; int zsnode, chipid, cpunode, bbnode;
if (sparc_cpu_model == sun4d) { if (sparc_cpu_model == sun4d) {
int bbnode, walk, no; int walk, no;
zsnode = 0; zsnode = 0;
bbnode = 0; bbnode = 0;
...@@ -1249,7 +1242,7 @@ static struct zilog_layout * __init get_zs_sun4cmd(int chip) ...@@ -1249,7 +1242,7 @@ static struct zilog_layout * __init get_zs_sun4cmd(int chip)
} else if (zilog_irq != irq_info[0].pri) { } else if (zilog_irq != irq_info[0].pri) {
prom_printf("SunZilog: Inconsistent IRQ layout for Zilog %d.\n", prom_printf("SunZilog: Inconsistent IRQ layout for Zilog %d.\n",
chip); chip);
promt_halt(); prom_halt();
} }
break; break;
} }
...@@ -1290,7 +1283,7 @@ static struct zilog_layout * __init get_zs(int chip) ...@@ -1290,7 +1283,7 @@ static struct zilog_layout * __init get_zs(int chip)
zilog_irq = 12; zilog_irq = 12;
res.end = (res.start + (8 - 1)); res.end = (res.start + (8 - 1));
res.flags = IORESOURCE_IO; res.flags = IORESOURCE_IO;
return sbus_ioremap(&res, 0, 8, "SunZilog"); return (struct zilog_layout *) sbus_ioremap(&res, 0, 8, "SunZilog");
} }
return get_zs_sun4cmd(chip); return get_zs_sun4cmd(chip);
...@@ -1649,13 +1642,10 @@ static int __init sunzilog_init(void) ...@@ -1649,13 +1642,10 @@ static int __init sunzilog_init(void)
/* Sun4 Zilog setup is hard coded, no probing to do. */ /* Sun4 Zilog setup is hard coded, no probing to do. */
if (sparc_cpu_model == sun4) { if (sparc_cpu_model == sun4) {
NUM_SUNZILOG = 2; NUM_SUNZILOG = 2;
goto no_probe; } else if (sparc_cpu_model == sun4d) {
}
node = prom_getchild(prom_root_node);
if (sparc_cpu_model == sun4d) {
int bbnode; int bbnode;
node = prom_getchild(prom_root_node);
NUM_SUNZILOG = 0; NUM_SUNZILOG = 0;
while (node && while (node &&
(node = prom_searchsiblings(node, "cpu-unit"))) { (node = prom_searchsiblings(node, "cpu-unit"))) {
...@@ -1664,7 +1654,6 @@ static int __init sunzilog_init(void) ...@@ -1664,7 +1654,6 @@ static int __init sunzilog_init(void)
NUM_SUNZILOG += 2; NUM_SUNZILOG += 2;
node = prom_getsibling(node); node = prom_getsibling(node);
} }
goto no_probe;
} else if (sparc_cpu_model == sun4u) { } else if (sparc_cpu_model == sun4u) {
int central_node; int central_node;
...@@ -1675,27 +1664,28 @@ static int __init sunzilog_init(void) ...@@ -1675,27 +1664,28 @@ static int __init sunzilog_init(void)
if (central_node != 0 && central_node != -1) if (central_node != 0 && central_node != -1)
node = prom_searchsiblings(prom_getchild(central_node), "fhc"); node = prom_searchsiblings(prom_getchild(central_node), "fhc");
else else
node = prom_searchsiblings(node, "sbus"); node = prom_searchsiblings(prom_getchild(prom_root_node), "sbus");
if (node != 0 && node != -1) if (node != 0 && node != -1)
node = prom_getchild(node); node = prom_getchild(node);
if (node == 0 || node == -1) if (node == 0 || node == -1)
return -ENODEV; return -ENODEV;
node = prom_searchsiblings(node, "zs");
if (!node)
return -ENODEV;
NUM_SUNZILOG = 2;
} else { } else {
node = prom_getchild(prom_root_node);
node = prom_searchsiblings(node, "obio"); node = prom_searchsiblings(node, "obio");
if (node) if (node)
node = prom_getchild(node); node = prom_getchild(node);
if (!node)
return -ENODEV;
NUM_SUNZILOG = 2; NUM_SUNZILOG = 2;
goto no_probe;
} }
node = prom_searchsiblings(node, "zs");
if (!node)
return -ENODEV;
NUM_SUNZILOG = 2;
no_probe:
sunzilog_alloc_tables(); sunzilog_alloc_tables();
sunzilog_ports_init(); sunzilog_ports_init();
......
...@@ -121,7 +121,7 @@ do { \ ...@@ -121,7 +121,7 @@ do { \
#ifndef CONFIG_SMP #ifndef CONFIG_SMP
#define synchronize_irq() barrier() #define synchronize_irq(irq) barrier()
#else /* (CONFIG_SMP) */ #else /* (CONFIG_SMP) */
......
...@@ -21,6 +21,8 @@ BTFIXUPDEF_CALL(char *, __irq_itoa, unsigned int) ...@@ -21,6 +21,8 @@ BTFIXUPDEF_CALL(char *, __irq_itoa, unsigned int)
#define NR_IRQS 15 #define NR_IRQS 15
#define irq_cannonicalize(irq) (irq)
/* Dave Redman (djhr@tadpole.co.uk) /* Dave Redman (djhr@tadpole.co.uk)
* changed these to function pointers.. it saves cycles and will allow * changed these to function pointers.. it saves cycles and will allow
* the irq dependencies to be split into different files at a later date * the irq dependencies to be split into different files at a later date
......
...@@ -11,6 +11,8 @@ enum km_type { ...@@ -11,6 +11,8 @@ enum km_type {
KM_BIO_DST_IRQ, KM_BIO_DST_IRQ,
KM_PTE0, KM_PTE0,
KM_PTE1, KM_PTE1,
KM_IRQ0,
KM_IRQ1,
KM_TYPE_NR KM_TYPE_NR
}; };
......
...@@ -56,6 +56,17 @@ extern unsigned long empty_zero_page; ...@@ -56,6 +56,17 @@ extern unsigned long empty_zero_page;
extern struct linux_romvec *romvec; extern struct linux_romvec *romvec;
#define halt() romvec->pv_halt() #define halt() romvec->pv_halt()
extern void sun_do_break(void);
extern int serial_console;
extern int stop_a_enabled;
static __inline__ int con_is_present(void)
{
return serial_console ? 0 : 1;
}
extern struct pt_regs *kbd_pt_regs;
/* When a context switch happens we must flush all user windows so that /* When a context switch happens we must flush all user windows so that
* the windows of the current process are flushed onto its stack. This * the windows of the current process are flushed onto its stack. This
* way the windows are all clean for the next process and the stack * way the windows are all clean for the next process and the stack
...@@ -113,6 +124,7 @@ extern void fpsave(unsigned long *fpregs, unsigned long *fsr, ...@@ -113,6 +124,7 @@ extern void fpsave(unsigned long *fpregs, unsigned long *fsr,
"restore; restore; restore; restore; restore; restore; restore"); \ "restore; restore; restore; restore; restore; restore; restore"); \
} while(0) } while(0)
#define finish_arch_switch(rq, next) do{ }while(0) #define finish_arch_switch(rq, next) do{ }while(0)
#define task_running(rq, p) ((rq)->curr == (p))
/* Much care has gone into this code, do not touch it. /* Much care has gone into this code, do not touch it.
* *
...@@ -282,9 +294,6 @@ extern void __global_restore_flags(unsigned long flags); ...@@ -282,9 +294,6 @@ extern void __global_restore_flags(unsigned long flags);
#define cli() local_irq_disable() #define cli() local_irq_disable()
#define sti() local_irq_enable() #define sti() local_irq_enable()
#define save_flags(x) local_save_flags(x)
#define restore_flags(x) local_irq_restore(x)
#define save_and_cli(x) local_irq_save(x)
#endif #endif
......
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