summaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/kernel')
-rw-r--r--arch/arm/kernel/Makefile26
-rw-r--r--arch/arm/kernel/armksyms.c14
-rw-r--r--arch/arm/kernel/bios32.c33
-rw-r--r--arch/arm/kernel/debug-armo.S86
-rw-r--r--arch/arm/kernel/debug-armv.S206
-rw-r--r--arch/arm/kernel/dec21285.c399
-rw-r--r--arch/arm/kernel/dma-dummy.c19
-rw-r--r--arch/arm/kernel/dma-footbridge.c5
-rw-r--r--arch/arm/kernel/dma-isa.c7
-rw-r--r--arch/arm/kernel/dma-rpc.c2
-rw-r--r--arch/arm/kernel/ecard.c4
-rw-r--r--arch/arm/kernel/entry-armv.S42
-rw-r--r--arch/arm/kernel/head-armo.S8
-rw-r--r--arch/arm/kernel/head-armv.S717
-rw-r--r--arch/arm/kernel/hw-footbridge.c269
-rw-r--r--arch/arm/kernel/init_task.c1
-rw-r--r--arch/arm/kernel/ioport.c8
-rw-r--r--arch/arm/kernel/irq.c3
-rw-r--r--arch/arm/kernel/leds-footbridge.c18
-rw-r--r--arch/arm/kernel/process.c64
-rw-r--r--arch/arm/kernel/ptrace.c4
-rw-r--r--arch/arm/kernel/semaphore.c1
-rw-r--r--arch/arm/kernel/setup.c363
-rw-r--r--arch/arm/kernel/signal.c3
-rw-r--r--arch/arm/kernel/sys_arm.c1
-rw-r--r--arch/arm/kernel/traps.c1
26 files changed, 1222 insertions, 1082 deletions
diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile
index 557aa6fc5..31ca81ddc 100644
--- a/arch/arm/kernel/Makefile
+++ b/arch/arm/kernel/Makefile
@@ -22,6 +22,7 @@ O_OBJS_rpc = dma-rpc.o iic.o fiq.o
O_OBJS_ebsa110 = dma-dummy.o
O_OBJS_footbridge = dma-footbridge.o $(ISA_DMA_OBJS) isa.o
O_OBJS_nexuspci = dma-dummy.o
+O_OBJS_sa1100 = dma-dummy.o fiq.o
OX_OBJS_arc = dma.o
OX_OBJS_a5k = dma.o
@@ -29,11 +30,16 @@ OX_OBJS_rpc = dma.o
OX_OBJS_ebsa110 =
OX_OBJS_footbridge= dma.o hw-footbridge.o
OX_OBJS_nexuspci =
+OX_OBJS_sa1100 =
all: kernel.o $(HEAD_OBJ) init_task.o
O_OBJS += $(O_OBJS_$(MACHINE))
+ifeq ($(CONFIG_DEBUG_LL),y)
+ O_OBJS += debug-$(PROCESSOR).o
+endif
+
ifeq ($(CONFIG_MODULES),y)
OX_OBJS = armksyms.o
endif
@@ -42,17 +48,15 @@ ifeq ($(CONFIG_ARCH_ACORN),y)
OX_OBJS += ecard.o
endif
-ifeq ($(MACHINE),nexuspci)
- ifdef CONFIG_PCI
+ifeq ($(CONFIG_PCI),y)
+ ifeq ($(MACHINE),nexuspci)
O_OBJS += plx9080.o
- endif
-else
- ifdef CONFIG_PCI
+ else
O_OBJS += bios32.o dec21285.o
endif
endif
-ifdef CONFIG_LEDS
+ifeq ($(CONFIG_LEDS),y)
OX_OBJS += leds-$(MACHINE).o
endif
@@ -73,13 +77,11 @@ endif
$(HEAD_OBJ): $(HEAD_OBJ:.o=.S)
$(CC) -D__ASSEMBLY__ -DTEXTADDR=$(TEXTADDR) -traditional -c $(HEAD_OBJ:.o=.S) -o $@
-$(ENTRY_OBJ): $(ENTRY_OBJ:.o=.S)
- $(CC) $(CFLAGS) -D__ASSEMBLY__ -c $(ENTRY_OBJ:.o=.S) -o $@
-
include $(TOPDIR)/Rules.make
-$(ENTRY_OBJ): ../lib/constants.h
+.S.o:
+ $(CC) -D__ASSEMBLY__ $(AFLAGS) $(AFLAGS_$@) -c -o $*.o $<
# Spell out some dependencies that `make dep' doesn't spot
-entry-armv.o: calls.S
-entry-armo.o: calls.S
+entry-armv.o: calls.S ../lib/constants.h
+entry-armo.o: calls.S ../lib/constants.h
diff --git a/arch/arm/kernel/armksyms.c b/arch/arm/kernel/armksyms.c
index 0905d55b5..ebb2f150d 100644
--- a/arch/arm/kernel/armksyms.c
+++ b/arch/arm/kernel/armksyms.c
@@ -2,12 +2,14 @@
#include <linux/module.h>
#include <linux/user.h>
#include <linux/string.h>
+#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/mman.h>
#include <linux/pci.h>
#include <linux/delay.h>
#include <linux/in6.h>
+#include <asm/byteorder.h>
#include <asm/elf.h>
#include <asm/io.h>
#include <asm/dma.h>
@@ -93,6 +95,9 @@ EXPORT_SYMBOL(__ioremap);
EXPORT_SYMBOL(__iounmap);
#endif
EXPORT_SYMBOL(kernel_thread);
+EXPORT_SYMBOL(system_rev);
+EXPORT_SYMBOL(system_serial_low);
+EXPORT_SYMBOL(system_serial_high);
EXPORT_SYMBOL(enable_irq);
EXPORT_SYMBOL(disable_irq);
@@ -108,7 +113,7 @@ EXPORT_SYMBOL(cpu_clean_cache_area);
EXPORT_SYMBOL(cpu_flush_ram_page);
EXPORT_SYMBOL(cpu_flush_tlb_all);
EXPORT_SYMBOL(cpu_flush_tlb_area);
-EXPORT_SYMBOL(cpu_switch_mm);
+EXPORT_SYMBOL(cpu_set_pgd);
EXPORT_SYMBOL(cpu_set_pmd);
EXPORT_SYMBOL(cpu_set_pte);
EXPORT_SYMBOL(cpu_flush_icache_area);
@@ -165,19 +170,20 @@ EXPORT_SYMBOL_NOVERS(strpbrk);
EXPORT_SYMBOL_NOVERS(strtok);
EXPORT_SYMBOL_NOVERS(strrchr);
EXPORT_SYMBOL_NOVERS(strstr);
-EXPORT_SYMBOL_NOVERS(memset);
+EXPORT_SYMBOL_NOVERS(__memset);
+EXPORT_SYMBOL_NOVERS(memset); /* needed for some versions of gcc */
EXPORT_SYMBOL_NOVERS(memcpy);
EXPORT_SYMBOL_NOVERS(memmove);
EXPORT_SYMBOL_NOVERS(memcmp);
EXPORT_SYMBOL_NOVERS(memscan);
-EXPORT_SYMBOL_NOVERS(memzero);
+EXPORT_SYMBOL_NOVERS(__memzero);
/* user mem (segment) */
#if defined(CONFIG_CPU_32)
EXPORT_SYMBOL(__arch_copy_from_user);
EXPORT_SYMBOL(__arch_copy_to_user);
EXPORT_SYMBOL(__arch_clear_user);
-EXPORT_SYMBOL(__arch_strlen_user);
+EXPORT_SYMBOL(__arch_strnlen_user);
#elif defined(CONFIG_CPU_26)
EXPORT_SYMBOL(uaccess_kernel);
EXPORT_SYMBOL(uaccess_user);
diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c
index 35bb0a36a..3bd7a7358 100644
--- a/arch/arm/kernel/bios32.c
+++ b/arch/arm/kernel/bios32.c
@@ -7,6 +7,7 @@
*/
#include <linux/kernel.h>
#include <linux/pci.h>
+#include <linux/errno.h>
#include <linux/init.h>
#include <asm/irq.h>
@@ -73,6 +74,38 @@ struct pci_fixup pcibios_fixups[] = {
};
/*
+ * Assign new address to PCI resource. We hope our resource information
+ * is complete. On the PC, we don't re-assign resources unless we are
+ * forced to do so.
+ *
+ * Expects start=0, end=size-1, flags=resource type.
+ */
+
+int __init pcibios_assign_resource(struct pci_dev *dev, int i)
+{
+ struct resource *r = &dev->resource[i];
+ struct resource *pr = pci_find_parent_resource(dev, r);
+ unsigned long size = r->end + 1;
+ unsigned long flags = 0;
+
+ if (!pr)
+ return -EINVAL;
+ if (r->flags & IORESOURCE_IO) {
+ if (size > 0x100)
+ return -EFBIG;
+ if (allocate_resource(pr, r, size, 0x9000, ~0, 1024))
+ return -EBUSY;
+ flags = PCI_BASE_ADDRESS_SPACE_IO;
+ } else {
+ if (allocate_resource(pr, r, size, 0x00100000, 0x7fffffff, size))
+ return -EBUSY;
+ }
+ if (i < 6)
+ pci_write_config_dword(dev, PCI_BASE_ADDRESS_0 + 4*i, r->start | flags);
+ return 0;
+}
+
+/*
* Assign an address to an I/O range.
*/
static void __init pcibios_fixup_io_addr(struct pci_dev *dev, struct resource *r, int idx)
diff --git a/arch/arm/kernel/debug-armo.S b/arch/arm/kernel/debug-armo.S
new file mode 100644
index 000000000..1c6aaccc3
--- /dev/null
+++ b/arch/arm/kernel/debug-armo.S
@@ -0,0 +1,86 @@
+/*
+ * linux/arch/arm/kernel/debug-armo.S
+ *
+ * Copyright (C) 1999 Russell King
+ *
+ * 26-bit debugging code
+ */
+#include <linux/linkage.h>
+
+ .macro addruart,rx
+ mov \rx, #0x03000000
+ orr \rx, \rx, #0x00010000
+ orr \rx, \rx, #0x00000fe0
+ .endm
+
+ .macro senduart,rd,rx
+ strb \rd, [\rx]
+ .endm
+
+ .macro busyuart,rd,rx
+1002: ldrb \rd, [\rx, #0x14]
+ and \rd, \rd, #0x60
+ teq \rd, #0x60
+ bne 1002b
+ .endm
+
+ .macro waituart,rd,rx
+1001: ldrb \rd, [\rx, #0x18]
+ tst \rd, #0x10
+ beq 1001b
+ .endm
+
+ .text
+/*
+ * Useful debugging routines
+ */
+ENTRY(printhex8)
+ mov r1, #8
+ b printhex
+
+ENTRY(printhex4)
+ mov r1, #4
+ b printhex
+
+ENTRY(printhex2)
+ mov r1, #2
+printhex: ldr r2, =hexbuf
+ add r3, r2, r1
+ mov r1, #0
+ strb r1, [r3]
+1: and r1, r0, #15
+ mov r0, r0, lsr #4
+ cmp r1, #10
+ addlt r1, r1, #'0'
+ addge r1, r1, #'a' - 10
+ strb r1, [r3, #-1]!
+ teq r3, r2
+ bne 1b
+ mov r0, r2
+ b printascii
+
+ .ltorg
+
+ENTRY(printascii)
+ addruart r3
+ b 2f
+1: waituart r2, r3
+ senduart r1, r3
+ busyuart r2, r3
+ teq r1, #'\n'
+ moveq r1, #'\r'
+ beq 1b
+2: teq r0, #0
+ ldrneb r1, [r0], #1
+ teqne r1, #0
+ bne 1b
+ mov pc, lr
+
+ENTRY(printch)
+ addruart r3
+ mov r1, r0
+ mov r0, #0
+ b 1b
+
+ .bss
+hexbuf: .space 16
diff --git a/arch/arm/kernel/debug-armv.S b/arch/arm/kernel/debug-armv.S
new file mode 100644
index 000000000..fef1489b7
--- /dev/null
+++ b/arch/arm/kernel/debug-armv.S
@@ -0,0 +1,206 @@
+/*
+ * linux/arch/arm/kernel/debug-armv.S
+ *
+ * Copyright (C) 1994-1999 Russell King
+ *
+ * 32-bit debugging code
+ */
+#include <linux/config.h>
+#include <linux/linkage.h>
+#include <asm/hardware.h>
+#include <asm/dec21285.h>
+
+ .text
+
+/*
+ * Some debugging routines (useful if you've got MM problems and
+ * printk isn't working). For DEBUGGING ONLY!!! Do not leave
+ * references to these in a production kernel!
+ */
+#if defined(CONFIG_ARCH_RPC)
+ .macro addruart,rx
+ mov \rx, #0xe0000000
+ orr \rx, \rx, #0x00010000
+ orr \rx, \rx, #0x00000fe0
+ .endm
+
+ .macro senduart,rd,rx
+ strb \rd, [\rx]
+ .endm
+
+ .macro busyuart,rd,rx
+1002: ldrb \rd, [\rx, #0x14]
+ and \rd, \rd, #0x60
+ teq \rd, #0x60
+ bne 1002b
+ .endm
+
+ .macro waituart,rd,rx
+1001: ldrb \rd, [\rx, #0x18]
+ tst \rd, #0x10
+ beq 1001b
+ .endm
+
+#elif defined(CONFIG_ARCH_EBSA110)
+ .macro addruart,rx
+ mov \rx, #0xf0000000
+ orr \rx, \rx, #0x00000be0
+ .endm
+
+ .macro senduart,rd,rx
+ strb \rd, [\rx]
+ .endm
+
+ .macro busyuart,rd,rx
+1002: ldrb \rd, [\rx, #0x14]
+ and \rd, \rd, #0x60
+ teq \rd, #0x60
+ bne 1002b
+ .endm
+
+ .macro waituart,rd,rx
+1001: ldrb \rd, [\rx, #0x18]
+ tst \rd, #0x10
+ beq 1001b
+ .endm
+
+#elif defined(CONFIG_HOST_FOOTBRIDGE) || defined(CONFIG_ADDIN_FOOTBRIDGE)
+#ifndef CONFIG_DEBUG_DC21285_PORT
+ /* For NetWinder debugging */
+ .macro addruart,rx
+ mov \rx, #0xff000000
+ orr \rx, \rx, #0x000003f8
+ .endm
+
+ .macro senduart,rd,rx
+ strb \rd, [\rx]
+ .endm
+
+ .macro busyuart,rd,rx
+1002: ldrb \rd, [\rx, #0x5]
+ and \rd, \rd, #0x60
+ teq \rd, #0x60
+ bne 1002b
+ .endm
+
+ .macro waituart,rd,rx
+1001: ldrb \rd, [\rx, #0x6]
+ tst \rd, #0x10
+ beq 1001b
+ .endm
+#else
+ /* For EBSA285 debugging */
+ .equ dc21285_high, ARMCSR_BASE & 0xff000000
+ .equ dc21285_low, ARMCSR_BASE & 0x00ffffff
+
+ .macro addruart,rx
+ mov \rx, #dc21285_high
+ .if dc21285_low
+ orr \rx, \rx, #dc21285_low
+ .endif
+ .endm
+
+ .macro senduart,rd,rx
+ str \rd, [\rx, #0x160] @ UARTDR
+ .endm
+
+ .macro busyuart,rd,rx
+1001: ldr \rd, [\rx, #0x178] @ UARTFLG
+ tst \rd, #1 << 3
+ bne 1001b
+ .endm
+
+ .macro waituart,rd,rx
+ .endm
+#endif
+#elif defined(CONFIG_ARCH_NEXUSPCI)
+ .macro addruart,rx
+ ldr \rx, =0xfff00000
+ .endm
+
+ .macro senduart,rd,rx
+ str \rd, [\rx, #0xc]
+ .endm
+
+ .macro busyuart,rd,rx
+1001: ldr \rd, [\rx, #0x4]
+ tst \rd, #1 << 0
+ bne 1001b
+ .endm
+
+ .macro waituart,rd,rx
+ .endm
+
+#elif defined(CONFIG_ARCH_SA1100)
+ .macro addruart,rx
+ mov \rx, #0xf8000000
+ add \rx, \rx, #0x00050000
+ .endm
+
+ .macro senduart,rd,rx
+ str \rd, [\rx, #0x14] @ UARTDR
+ .endm
+
+ .macro busyuart,rd,rx
+1001: ldr \rd, [\rx, #0x20] @ UTSR1
+ tst \rd, #1 << 2
+ beq 1001b
+ .endm
+
+#else
+#error Unknown architecture
+#endif
+
+/*
+ * Useful debugging routines
+ */
+ENTRY(printhex8)
+ mov r1, #8
+ b printhex
+
+ENTRY(printhex4)
+ mov r1, #4
+ b printhex
+
+ENTRY(printhex2)
+ mov r1, #2
+printhex: ldr r2, =hexbuf
+ add r3, r2, r1
+ mov r1, #0
+ strb r1, [r3]
+1: and r1, r0, #15
+ mov r0, r0, lsr #4
+ cmp r1, #10
+ addlt r1, r1, #'0'
+ addge r1, r1, #'a' - 10
+ strb r1, [r3, #-1]!
+ teq r3, r2
+ bne 1b
+ mov r0, r2
+ b printascii
+
+ .ltorg
+
+ENTRY(printascii)
+ addruart r3
+ b 2f
+1: waituart r2, r3
+ senduart r1, r3
+ busyuart r2, r3
+ teq r1, #'\n'
+ moveq r1, #'\r'
+ beq 1b
+2: teq r0, #0
+ ldrneb r1, [r0], #1
+ teqne r1, #0
+ bne 1b
+ mov pc, lr
+
+ENTRY(printch)
+ addruart r3
+ mov r1, r0
+ mov r0, #0
+ b 1b
+
+ .bss
+hexbuf: .space 16
diff --git a/arch/arm/kernel/dec21285.c b/arch/arm/kernel/dec21285.c
index 6a4988b15..42a9a616f 100644
--- a/arch/arm/kernel/dec21285.c
+++ b/arch/arm/kernel/dec21285.c
@@ -13,241 +13,318 @@
#include <linux/init.h>
#include <linux/ioport.h>
+#include <asm/dec21285.h>
+#include <asm/io.h>
#include <asm/irq.h>
#include <asm/system.h>
-#include <asm/hardware.h>
#define MAX_SLOTS 21
-extern void pcibios_fixup_ebsa285(struct pci_dev *dev);
-extern void pcibios_init_ebsa285(void);
-
-int
-pcibios_present(void)
-{
- return 1;
-}
+extern int setup_arm_irq(int, struct irqaction *);
+extern void pcibios_report_device_errors(void);
+extern int (*pci_irq_fixup)(struct pci_dev *dev);
static unsigned long
-pcibios_base_address(unsigned char bus, unsigned char dev_fn)
+dc21285_base_address(struct pci_dev *dev, int where)
{
- if (bus == 0) {
- int slot = PCI_SLOT(dev_fn);
-
- if (slot < MAX_SLOTS)
- return PCICFG0_BASE + 0xc00000 +
- (slot << 11) + (PCI_FUNC(dev_fn) << 8);
- else
- return 0;
- } else
- return PCICFG1_BASE | (bus << 16) | (dev_fn << 8);
+ unsigned long addr = 0;
+ unsigned int devfn = dev->devfn;
+
+ if (dev->bus->number != 0)
+ addr = PCICFG1_BASE | (dev->bus->number << 16) | (devfn << 8);
+ else if (devfn < PCI_DEVFN(MAX_SLOTS, 0))
+ addr = PCICFG0_BASE | 0xc00000 | (devfn << 8);
+
+ return addr;
}
-int
-pcibios_read_config_byte(unsigned char bus, unsigned char dev_fn,
- unsigned char where, unsigned char *val)
+static int
+dc21285_read_config_byte(struct pci_dev *dev, int where, u8 *value)
{
- unsigned long addr = pcibios_base_address(bus, dev_fn);
- unsigned char v;
+ unsigned long addr = dc21285_base_address(dev, where);
+ u8 v;
if (addr)
- __asm__("ldr%?b %0, [%1, %2]"
- : "=r" (v)
- : "r" (addr), "r" (where));
+ asm("ldr%?b %0, [%1, %2]"
+ : "=r" (v) : "r" (addr), "r" (where));
else
v = 0xff;
- *val = v;
+
+ *value = v;
+
return PCIBIOS_SUCCESSFUL;
}
-int
-pcibios_read_config_word(unsigned char bus, unsigned char dev_fn,
- unsigned char where, unsigned short *val)
+static int
+dc21285_read_config_word(struct pci_dev *dev, int where, u16 *value)
{
- unsigned long addr = pcibios_base_address(bus, dev_fn);
- unsigned short v;
+ unsigned long addr = dc21285_base_address(dev, where);
+ u16 v;
if (addr)
- __asm__("ldr%?h %0, [%1, %2]"
- : "=r" (v)
- : "r" (addr), "r" (where));
+ asm("ldr%?h %0, [%1, %2]"
+ : "=r" (v) : "r" (addr), "r" (where));
else
v = 0xffff;
- *val = v;
+
+ *value = v;
+
return PCIBIOS_SUCCESSFUL;
}
-int
-pcibios_read_config_dword(unsigned char bus, unsigned char dev_fn,
- unsigned char where, unsigned int *val)
+static int
+dc21285_read_config_dword(struct pci_dev *dev, int where, u32 *value)
{
- unsigned long addr = pcibios_base_address(bus, dev_fn);
- unsigned int v;
+ unsigned long addr = dc21285_base_address(dev, where);
+ u32 v;
if (addr)
- __asm__("ldr%? %0, [%1, %2]"
- : "=r" (v)
- : "r" (addr), "r" (where));
+ asm("ldr%? %0, [%1, %2]"
+ : "=r" (v) : "r" (addr), "r" (where));
else
v = 0xffffffff;
- *val = v;
+
+ *value = v;
+
return PCIBIOS_SUCCESSFUL;
}
-int
-pcibios_write_config_byte(unsigned char bus, unsigned char dev_fn,
- unsigned char where, unsigned char val)
+static int
+dc21285_write_config_byte(struct pci_dev *dev, int where, u8 value)
{
- unsigned long addr = pcibios_base_address(bus, dev_fn);
+ unsigned long addr = dc21285_base_address(dev, where);
if (addr)
- __asm__("str%?b %0, [%1, %2]"
- : : "r" (val), "r" (addr), "r" (where));
+ asm("str%?b %0, [%1, %2]"
+ : : "r" (value), "r" (addr), "r" (where));
+
return PCIBIOS_SUCCESSFUL;
}
-int
-pcibios_write_config_word(unsigned char bus, unsigned char dev_fn,
- unsigned char where, unsigned short val)
+static int
+dc21285_write_config_word(struct pci_dev *dev, int where, u16 value)
{
- unsigned long addr = pcibios_base_address(bus, dev_fn);
+ unsigned long addr = dc21285_base_address(dev, where);
if (addr)
- __asm__("str%?h %0, [%1, %2]"
- : : "r" (val), "r" (addr), "r" (where));
+ asm("str%?h %0, [%1, %2]"
+ : : "r" (value), "r" (addr), "r" (where));
+
return PCIBIOS_SUCCESSFUL;
}
-int
-pcibios_write_config_dword(unsigned char bus, unsigned char dev_fn,
- unsigned char where, unsigned int val)
+static int
+dc21285_write_config_dword(struct pci_dev *dev, int where, u32 value)
{
- unsigned long addr = pcibios_base_address(bus, dev_fn);
+ unsigned long addr = dc21285_base_address(dev, where);
if (addr)
- __asm__("str%? %0, [%1, %2]"
- : : "r" (val), "r" (addr), "r" (where));
+ asm("str%? %0, [%1, %2]"
+ : : "r" (value), "r" (addr), "r" (where));
+
return PCIBIOS_SUCCESSFUL;
}
-void __init pci_set_cmd(struct pci_dev *dev, unsigned short clear, unsigned short set)
+static struct pci_ops dc21285_ops = {
+ dc21285_read_config_byte,
+ dc21285_read_config_word,
+ dc21285_read_config_dword,
+ dc21285_write_config_byte,
+ dc21285_write_config_word,
+ dc21285_write_config_dword,
+};
+
+/*
+ * Warn on PCI errors.
+ */
+static void
+dc21285_error(int irq, void *dev_id, struct pt_regs *regs)
{
- unsigned short cmd;
+ static unsigned long next_warn;
+ unsigned long cmd = *CSR_PCICMD & 0x0000ffff;
+ unsigned long ctrl = (*CSR_SA110_CNTL) & 0xffffde07;
+ unsigned long irqstatus = *CSR_IRQ_RAWSTATUS;
+ int warn = time_after_eq(jiffies, next_warn);
- pci_read_config_word(dev, PCI_COMMAND, &cmd);
- cmd = (cmd & ~clear) | set;
- pci_write_config_word(dev, PCI_COMMAND, cmd);
-}
+ ctrl |= SA110_CNTL_DISCARDTIMER;
-void __init pci_set_base_addr(struct pci_dev *dev, int idx, unsigned int addr)
-{
- int reg = PCI_BASE_ADDRESS_0 + (idx << 2);
+ if (warn) {
+ next_warn = jiffies + HZ;
+ printk(KERN_DEBUG "PCI: ");
+ }
- pci_write_config_dword(dev, reg, addr);
- pci_read_config_dword(dev, reg, &addr);
+ if (irqstatus & (1 << 31)) {
+ if (warn)
+ printk("parity error ");
+ cmd |= 1 << 31;
+ }
- dev->base_address[idx] = addr;
-}
+ if (irqstatus & (1 << 30)) {
+ if (warn)
+ printk("target abort ");
+ cmd |= 1 << 28;
+ }
-void __init pcibios_fixup(void)
-{
- struct pci_dev *dev;
+ if (irqstatus & (1 << 29)) {
+ if (warn)
+ printk("master abort ");
+ cmd |= 1 << 29;
+ }
- for (dev = pci_devices; dev; dev = dev->next) {
- pcibios_fixup_ebsa285(dev);
+ if (irqstatus & (1 << 28)) {
+ if (warn)
+ printk("data parity error ");
+ cmd |= 1 << 24;
+ }
- pcibios_write_config_byte(dev->bus->number, dev->devfn,
- PCI_INTERRUPT_LINE, dev->irq);
+ if (irqstatus & (1 << 27)) {
+ if (warn)
+ printk("discard timer expired ");
+ ctrl &= ~SA110_CNTL_DISCARDTIMER;
+ }
- printk(KERN_DEBUG
- "PCI: %02x:%02x [%04x/%04x] on irq %d\n",
- dev->bus->number, dev->devfn,
- dev->vendor, dev->device, dev->irq);
+ if (irqstatus & (1 << 23)) {
+ if (warn)
+ printk("system error ");
+ ctrl |= SA110_CNTL_RXSERR;
}
- hw_init();
+ if (warn)
+ printk("pc=[<%08lX>]\n", instruction_pointer(regs));
+
+ pcibios_report_device_errors();
+
+ *CSR_PCICMD = cmd;
+ *CSR_SA110_CNTL = ctrl;
}
-void __init pcibios_init(void)
-{
- unsigned int mem_size = (unsigned int)high_memory - PAGE_OFFSET;
- unsigned long cntl;
+static struct irqaction dc21285_error_action = {
+ dc21285_error, SA_INTERRUPT, 0, "PCI error", NULL, NULL
+};
- *CSR_SDRAMBASEMASK = (mem_size - 1) & 0x0ffc0000;
- *CSR_SDRAMBASEOFFSET = 0;
- *CSR_ROMBASEMASK = 0x80000000;
- *CSR_CSRBASEMASK = 0;
- *CSR_CSRBASEOFFSET = 0;
- *CSR_PCIADDR_EXTN = 0;
+static int irqmap_ebsa[] __initdata = { IRQ_IN1, IRQ_IN0, IRQ_PCI, IRQ_IN3 };
-#ifdef CONFIG_HOST_FOOTBRIDGE
- /*
- * Against my better judgement, Philip Blundell still seems
- * to be saying that we should initialise the PCI stuff here
- * when the PCI_CFN bit is not set, dispite my comment below,
- * which he decided to remove. If it is not set, then
- * the card is in add-in mode, and we're in a machine where
- * the bus is set up by 'others'.
- *
- * We should therefore not mess about with the mapping in
- * anyway, and we should not be using the virt_to_bus functions
- * that exist in the HOST architecture mode (since they assume
- * a fixed mapping).
- *
- * Instead, you should be using ADDIN mode, which allows for
- * this situation. This does assume that you have correctly
- * initialised the PCI bus, which you must have done to get
- * your PC booted.
- *
- * Unfortunately, he seems to be blind to this. I guess he'll
- * also remove all this.
- *
- * And THIS COMMENT STAYS, even if this gets patched, thank
- * you.
- */
-
- /*
- * Map our SDRAM at a known address in PCI space, just in case
- * the firmware had other ideas. Using a nonzero base is
- * necessary, since some VGA cards forcefully use PCI addresses
- * in the range 0x000a0000 to 0x000c0000. (eg, S3 cards).
- *
- * NOTE! If you need to chec the PCI_CFN bit in the SA110
- * control register then you've configured the kernel wrong.
- * If you're not using host mode, then DO NOT set
- * CONFIG_HOST_FOOTBRIDGE, but use CONFIG_ADDIN_FOOTBRIDGE
- * instead. In this case, you MUST supply some firmware
- * to allow your PC to boot, plus we should not modify the
- * mappings that the PC BIOS has set up for us.
- */
- *CSR_PCICACHELINESIZE = 0x00002008;
- *CSR_PCICSRBASE = 0;
- *CSR_PCICSRIOBASE = 0;
- *CSR_PCISDRAMBASE = virt_to_bus((void *)PAGE_OFFSET);
- *CSR_PCIROMBASE = 0;
- *CSR_PCICMD = PCI_COMMAND_IO | PCI_COMMAND_MEMORY |
- PCI_COMMAND_MASTER | PCI_COMMAND_FAST_BACK |
- PCI_COMMAND_INVALIDATE | PCI_COMMAND_PARITY |
- (1 << 31) | (1 << 29) | (1 << 28) | (1 << 24);
-#endif
+static int __init ebsa_irqval(struct pci_dev *dev)
+{
+ u8 pin;
+
+ pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
- /*
- * Clear any existing errors - we aren't
- * interested in historical data...
- */
- cntl = *CSR_SA110_CNTL & 0xffffde07;
- *CSR_SA110_CNTL = cntl | SA110_CNTL_RXSERR;
+ return irqmap_ebsa[(PCI_SLOT(dev->devfn) + pin) & 3];
+}
- pcibios_init_ebsa285();
+static int irqmap_cats[] __initdata = { IRQ_PCI, IRQ_IN0, IRQ_IN1, IRQ_IN3 };
- printk(KERN_DEBUG"PCI: DEC21285 revision %02lX\n", *CSR_CLASSREV & 0xff);
+static int __init cats_irqval(struct pci_dev *dev)
+{
+ if (dev->irq >= 128)
+ return 16 + (dev->irq & 0x1f);
+
+ switch (dev->irq) {
+ case 1 ... 4:
+ return irqmap_cats[dev->irq - 1];
+
+ default:
+ printk("PCI: device %02x:%02x has unknown irq line %x\n",
+ dev->bus->number, dev->devfn, dev->irq);
+ case 0:
+ break;
+ }
+ return 0;
}
-void __init pcibios_fixup_bus(struct pci_bus *bus)
+static int __init netwinder_irqval(struct pci_dev *dev)
{
+#define DEV(v,d) ((v)<<16|(d))
+ switch (DEV(dev->vendor, dev->device)) {
+ case DEV(PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_21142):
+ return IRQ_NETWINDER_ETHER100;
+
+ case DEV(PCI_VENDOR_ID_WINBOND2, 0x5a5a):
+ return IRQ_NETWINDER_ETHER10;
+
+ case DEV(PCI_VENDOR_ID_WINBOND, PCI_DEVICE_ID_WINBOND_83C553):
+ return 0;
+
+ case DEV(PCI_VENDOR_ID_WINBOND, PCI_DEVICE_ID_WINBOND_82C105):
+ return IRQ_ISA_HARDDISK1;
+
+ case DEV(PCI_VENDOR_ID_INTERG, PCI_DEVICE_ID_INTERG_2000):
+ return IRQ_NETWINDER_VGA;
+
+ default:
+ printk(KERN_ERR "PCI: %02X:%02X [%04X:%04X] unknown device\n",
+ dev->bus->number, dev->devfn,
+ dev->vendor, dev->device);
+ return 0;
+ }
}
-char * __init pcibios_setup(char *str)
+struct pci_ops * __init dc21285_init(int pass)
{
- return str;
+ unsigned int mem_size;
+ unsigned long cntl;
+
+ if (pass == 0) {
+ mem_size = (unsigned int)high_memory - PAGE_OFFSET;
+ *CSR_SDRAMBASEMASK = (mem_size - 1) & 0x0ffc0000;
+ *CSR_SDRAMBASEOFFSET = 0;
+ *CSR_ROMBASEMASK = 0x80000000;
+ *CSR_CSRBASEMASK = 0;
+ *CSR_CSRBASEOFFSET = 0;
+ *CSR_PCIADDR_EXTN = 0;
+
+#ifdef CONFIG_HOST_FOOTBRIDGE
+ /*
+ * Map our SDRAM at a known address in PCI space, just in case
+ * the firmware had other ideas. Using a nonzero base is
+ * necessary, since some VGA cards forcefully use PCI addresses
+ * in the range 0x000a0000 to 0x000c0000. (eg, S3 cards).
+ */
+ *CSR_PCICACHELINESIZE = 0x00002008;
+ *CSR_PCICSRBASE = 0;
+ *CSR_PCICSRIOBASE = 0;
+ *CSR_PCISDRAMBASE = virt_to_bus((void *)PAGE_OFFSET);
+ *CSR_PCIROMBASE = 0;
+ *CSR_PCICMD = PCI_COMMAND_IO | PCI_COMMAND_MEMORY |
+ PCI_COMMAND_MASTER | PCI_COMMAND_FAST_BACK |
+ PCI_COMMAND_INVALIDATE | PCI_COMMAND_PARITY |
+ (1 << 31) | (1 << 29) | (1 << 28) | (1 << 24);
+#endif
+
+ printk(KERN_DEBUG"PCI: DC21285 footbridge, revision %02lX\n",
+ *CSR_CLASSREV & 0xff);
+
+ switch (machine_arch_type) {
+ case MACH_TYPE_EBSA285:
+ pci_irq_fixup = ebsa_irqval;
+ break;
+
+ case MACH_TYPE_CATS:
+ pci_irq_fixup = cats_irqval;
+ break;
+
+ case MACH_TYPE_NETWINDER:
+ pci_irq_fixup = netwinder_irqval;
+ break;
+ }
+
+ return &dc21285_ops;
+ } else {
+ /*
+ * Clear any existing errors - we aren't
+ * interested in historical data...
+ */
+ cntl = *CSR_SA110_CNTL & 0xffffde07;
+ *CSR_SA110_CNTL = cntl | SA110_CNTL_RXSERR;
+ cntl = *CSR_PCICMD & 0x0000ffff;
+ *CSR_PCICMD = cntl | 1 << 31 | 1 << 29 | 1 << 28 | 1 << 24;
+
+ /*
+ * Initialise PCI error IRQ after we've finished probing
+ */
+ setup_arm_irq(IRQ_PCI_ERR, &dc21285_error_action);
+
+ return NULL;
+ }
}
diff --git a/arch/arm/kernel/dma-dummy.c b/arch/arm/kernel/dma-dummy.c
index 7efc85363..ebb9755c1 100644
--- a/arch/arm/kernel/dma-dummy.c
+++ b/arch/arm/kernel/dma-dummy.c
@@ -17,15 +17,18 @@ int request_dma(int channel, const char *device_id)
return -EINVAL;
}
-void free_dma(int channel)
-{
-}
-
-int get_dma_list(char *buf)
+int no_dma(void)
{
return 0;
}
-void __init init_dma(void)
-{
-}
+#define GLOBAL_ALIAS(_a,_b) asm (".set " #_a "," #_b "; .globl " #_a)
+GLOBAL_ALIAS(disable_dma, no_dma);
+GLOBAL_ALIAS(enable_dma, no_dma);
+GLOBAL_ALIAS(free_dma, no_dma);
+GLOBAL_ALIAS(get_dma_residue, no_dma);
+GLOBAL_ALIAS(get_dma_list, no_dma);
+GLOBAL_ALIAS(set_dma_mode, no_dma);
+GLOBAL_ALIAS(set_dma_count, no_dma);
+GLOBAL_ALIAS(set_dma_addr, no_dma);
+GLOBAL_ALIAS(init_dma, no_dma);
diff --git a/arch/arm/kernel/dma-footbridge.c b/arch/arm/kernel/dma-footbridge.c
index 016b11c15..65875831c 100644
--- a/arch/arm/kernel/dma-footbridge.c
+++ b/arch/arm/kernel/dma-footbridge.c
@@ -13,14 +13,11 @@
#include <linux/config.h>
#include <linux/sched.h>
-#include <linux/malloc.h>
-#include <linux/mman.h>
+#include <linux/errno.h>
#include <linux/init.h>
-#include <asm/page.h>
#include <asm/dma.h>
#include <asm/io.h>
-#include <asm/hardware.h>
#include "dma.h"
#include "dma-isa.h"
diff --git a/arch/arm/kernel/dma-isa.c b/arch/arm/kernel/dma-isa.c
index f5f98bbac..74967a055 100644
--- a/arch/arm/kernel/dma-isa.c
+++ b/arch/arm/kernel/dma-isa.c
@@ -126,6 +126,13 @@ void isa_disable_dma(int channel, dma_t *dma)
outb(channel | 4, isa_dma_port[channel][ISA_DMA_MASK]);
}
+static struct resource dma_resources[] = {
+ { "dma1", 0x0000, 0x000f },
+ { "dma low page", 0x0080, 0x008f },
+ { "dma2", 0x00c0, 0x00df },
+ { "dma high page", 0x0480, 0x048f }
+};
+
int __init isa_init_dma(void)
{
int dmac_found;
diff --git a/arch/arm/kernel/dma-rpc.c b/arch/arm/kernel/dma-rpc.c
index e27232255..ad9afac30 100644
--- a/arch/arm/kernel/dma-rpc.c
+++ b/arch/arm/kernel/dma-rpc.c
@@ -357,6 +357,8 @@ int arch_set_dma_speed(dmach_t channel, dma_t *dma, int cycle)
}
outb(tcr, IOMD_DMATCR);
+
+ return speed;
}
void __init arch_dma_init(dma_t *dma)
diff --git a/arch/arm/kernel/ecard.c b/arch/arm/kernel/ecard.c
index c4b0efef8..99b2b2b1d 100644
--- a/arch/arm/kernel/ecard.c
+++ b/arch/arm/kernel/ecard.c
@@ -82,7 +82,7 @@ static unsigned int have_expmask;
/* List of descriptions of cards which don't have an extended
* identification, or chunk directories containing a description.
*/
-static const struct expcard_blacklist __init blacklist[] = {
+static struct expcard_blacklist __initdata blacklist[] = {
{ MANU_ACORN, PROD_ACORN_ETHER1, "Acorn Ether1" }
};
@@ -827,6 +827,8 @@ unsigned int ecard_address(ecard_t *ec, card_type_t type, card_speed_t speed)
ectcr |= 1 << slot;
break;
#endif
+ default:
+ break;
}
#ifdef IOMD_ECTCR
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
index 3e015d866..7e6d4fe51 100644
--- a/arch/arm/kernel/entry-armv.S
+++ b/arch/arm/kernel/entry-armv.S
@@ -298,6 +298,30 @@ irq_prio_ebsa110:
.macro irq_prio_table
.endm
+
+#elif defined(CONFIG_ARCH_SA1100)
+
+ .macro disable_fiq
+ .endm
+
+ .macro get_irqnr_and_base, irqnr, irqstat, base
+ mov r4, #0xfa000000 @ ICIP = 0xfa050000
+ add r4, r4, #0x00050000
+ ldr \irqstat, [r4] @ get irqs
+ ldr \irqnr, [r4, #4] @ ICMR = 0xfa050004
+ ands \irqstat, \irqstat, \irqnr
+ mov \irqnr, #0
+ beq 1002f
+1001: tst \irqstat, #1
+ addeq \irqnr, \irqnr, #1
+ moveq \irqstat, \irqstat, lsr #1
+ beq 1001b
+1002:
+ .endm
+
+ .macro irq_prio_table
+ .endm
+
#else
#error Unknown architecture
#endif
@@ -449,11 +473,15 @@ __dabt_svc: sub sp, sp, #S_FRAME_SIZE
add r5, sp, #S_SP
mov r1, lr
stmia r5, {r0 - r4} @ save sp_SVC, lr_SVC, pc, cpsr, old_ro
+
+ mrs r9, cpsr @ Enable interrupts if they were
tst r3, #I_BIT
- mrseq r0, cpsr @ Enable interrupts if they were
- biceq r0, r0, #I_BIT @ previously
- msreq cpsr, r0
+ biceq r9, r9, #I_BIT @ previously
+
mov r0, r2
+/*
+ * This routine must not corrupt r9
+ */
#ifdef MULTI_CPU
ldr r2, .LCprocfns
mov lr, pc
@@ -461,6 +489,7 @@ __dabt_svc: sub sp, sp, #S_FRAME_SIZE
#else
bl cpu_data_abort
#endif
+ msr cpsr, r9
mov r3, sp
bl SYMBOL_NAME(do_DataAbort)
ldr r0, [sp, #S_PSR]
@@ -544,9 +573,6 @@ __dabt_usr: sub sp, sp, #S_FRAME_SIZE @ Allocate frame size in one go
#endif
mov fp, #0
- mrs r2, cpsr @ Enable interrupts if they were
- bic r2, r2, #I_BIT @ previously
- msr cpsr, r2
#ifdef MULTI_CPU
ldr r2, .LCprocfns
mov lr, pc
@@ -554,6 +580,10 @@ __dabt_usr: sub sp, sp, #S_FRAME_SIZE @ Allocate frame size in one go
#else
bl cpu_data_abort
#endif
+ mrs r3, cpsr @ Enable interrupts if they were
+ bic r3, r3, #I_BIT @ previously
+ msr cpsr, r3
+
mov r3, sp
adrsvc al, lr, ret_from_sys_call
b SYMBOL_NAME(do_DataAbort)
diff --git a/arch/arm/kernel/head-armo.S b/arch/arm/kernel/head-armo.S
index d6b2b79e6..df5b02ae8 100644
--- a/arch/arm/kernel/head-armo.S
+++ b/arch/arm/kernel/head-armo.S
@@ -1,5 +1,5 @@
/*
- * linux/arch/arm/kernel/head.S
+ * linux/arch/arm/kernel/head-armo.S
*
* Copyright (C) 1994, 1995, 1996, 1997 Russell King
*
@@ -7,11 +7,13 @@
*/
#include <linux/linkage.h>
- .text
- .align
+ .globl SYMBOL_NAME(swapper_pg_dir)
+ .equ SYMBOL_NAME(swapper_pg_dir), 0x0207d000
+
/*
* Entry point.
*/
+ .section ".text.init",#alloc,#execinstr
ENTRY(stext)
ENTRY(_stext)
__entry: cmp pc, #0x02000000
diff --git a/arch/arm/kernel/head-armv.S b/arch/arm/kernel/head-armv.S
index e9a05aed6..16436684e 100644
--- a/arch/arm/kernel/head-armv.S
+++ b/arch/arm/kernel/head-armv.S
@@ -1,54 +1,60 @@
/*
- * linux/arch/arm/kernel/head32.S
+ * linux/arch/arm/kernel/head-armv.S
*
- * Copyright (C) 1994-1998 Russell King
+ * Copyright (C) 1994-1999 Russell King
*
- * Kernel 32 bit startup code for ARM6 / ARM7 / StrongARM
+ * 32-bit kernel startup code for all architectures
*/
#include <linux/config.h>
#include <linux/linkage.h>
+
+#include <asm/assembler.h>
#include <asm/hardware.h>
#include <asm/dec21285.h>
+#if (TEXTADDR & 0xffff) != 0x8000
+#error TEXTADDR must start at 0xXXXX8000
+#endif
+
+#define SWAPPER_PGDIR_OFFSET 0x4000
+
.globl SYMBOL_NAME(swapper_pg_dir)
- .equ SYMBOL_NAME(swapper_pg_dir), TEXTADDR - 0x4000
+ .equ SYMBOL_NAME(swapper_pg_dir), TEXTADDR - 0x8000 + SWAPPER_PGDIR_OFFSET
.section ".text.init",#alloc,#execinstr
ENTRY(stext)
ENTRY(_stext)
-#if (TEXTADDR & 0xffff) != 0x8000
-#error TEXTADDR must start at 0xXXXX8000
-#endif
-
#ifdef CONFIG_ARCH_NETWINDER
+/*
+ * Compatability cruft for old NetWinder NeTTroms. This
+ * code is currently scheduled for destruction in 2.5.xx
+ */
+ .rept 8
mov r0, r0
- mov r0, r0
- mov r0, r0
- mov r0, r0
- mov r0, r0
- mov r0, r0
- mov r0, r0
- mov r0, r0
+ .endr
adr r2, 1f
ldmdb r2, {r7, r8}
- and r3, r2, #0x0000c000
- teq r3, #0x00008000
+ and r3, r2, #0xc000
+ teq r3, #0x8000
beq __entry
bic r3, r2, #0xc000
orr r3, r3, #0x8000
mov r0, r3
- mov r4, #32
+ mov r4, #64
sub r5, r8, r7
b 1f
.word _stext
- .word _end
+ .word __bss_start
-1: ldmia r2!, {r6, r7, r8, r9}
+1:
+ .rept 4
+ ldmia r2!, {r6, r7, r8, r9}
stmia r3!, {r6, r7, r8, r9}
- subs r4, r4, #16
+ .endr
+ subs r4, r4, #64
bcs 1b
movs r4, r5
mov r5, #0
@@ -59,78 +65,114 @@ ENTRY(_stext)
#endif
/*
- * Entry point and restart point. Entry *must* be called with r0 == 0,
- * MMU off. Note! These should be unique!!! Please read Documentation/ARM-README
- * for more information.
- *
- * r1 = 0 -> DEC EBSA-110
- * r1 = 1 -> Acorn RiscPC
- * r1 = 2 -> ebsit
- * r1 = 3 -> nexuspci
- * r1 = 4 -> DEC EBSA-285
- * r1 = 5 -> Corel Netwinder
- * r1 = 6 -> CATS
- * r1 = 7 -> tbox
- * r1 = 8 -> SA110/21285 as co-processor
- * r1 = 9 -> CL-PS7110 system
- * r1 = 12 -> SA1100 based system
+ * Entry point. Entry *must* be called with r0 == 0, with the MMU off.
+ * r1 contains the unique architecture number. See
+ * linux/arch/arm/kernel/setup.c machine_desc[] array for the complete
+ * list. If you require a new number, please follow the instructions
+ * given in Documentation/ARM-README.
*/
+__entry: teq r0, #0
+ movne r0, #'i'
+ bne __error
+ bl __lookup_processor_type
+ teq r10, #0 @ invalid processor?
+ moveq r0, #'p'
+ beq __error
+ bl __lookup_architecture_type
+ teq r7, #0 @ invalid architecture?
+ moveq r0, #'a'
+ beq __error
+ bl __create_page_tables
+ adr lr, __aligned_call
+ add pc, r10, #12 @ flush caches (returns ctrl reg)
+
+__switch_data: .long __mmap_switched
+ .long SYMBOL_NAME(__bss_start)
+ .long SYMBOL_NAME(_end)
+ .long SYMBOL_NAME(processor_id)
+ .long SYMBOL_NAME(__machine_arch_type)
+ .long SYMBOL_NAME(cr_alignment)
+ .long SYMBOL_NAME(init_task_union)+8192
+
+ /*
+ * This needs to be aligned to a cache line.
+ */
+ .align 5
+__aligned_call:
+ ldr lr, __switch_data
+#ifdef CONFIG_ALIGNMENT_TRAP
+ orr r0, r0, #2 @ ...........A.
+#endif
+ mcr p15, 0, r0, c1, c0
+ mov pc, lr
+
+ /*
+ * This code follows on after the page
+ * table switch and jump above.
+ *
+ * r0 = processor control register
+ * r1 = machine ID
+ * r9 = processor ID
+ */
+ .align 5
+__mmap_switched:
+ adr r3, __switch_data + 4
+ ldmia r3, {r4, r5, r6, r7, r8, sp} @ Setup stack
+
+ mov fp, #0 @ Clear BSS
+1: cmp r4, r5
+ strcc fp, [r4],#4
+ bcc 1b
+
+ str r9, [r6] @ Save processor ID
+ str r1, [r7] @ Save machine type
+ bic r2, r0, #2 @ Clear 'A' bit
+ stmia r8, {r0, r2} @ Save control register values
+ b SYMBOL_NAME(start_kernel)
+
-__entry: teq r0, #0 @ check for illegal entry...
- bne .Lerror @ loop indefinitely
- cmp r1, #9 @ Unknown machine architecture
- bge .Lerror
-/* First thing to do is to get the page tables set up so that we can call
- * the kernel in the correct place. This is relocatable code...
- * - Read processor ID register (CP#15, CR0).
- */
- mrc p15, 0, r9, c0, c0 @ get Processor ID
-/* Values are:
- * XX01XXXX = ARMv4 architecture (StrongARM)
- * XX00XXXX = ARMv3 architecture
- * 4156061X = ARM 610
- */
- adr r10, .LCProcTypes
-1: ldmia r10!, {r5, r6, r8} @ Get Set, Mask, MMU Flags
- teq r5, #0 @ End of list?
- beq .Lerror
- eor r5, r5, r9
- tst r5, r6
- addne r10, r10, #8
- bne 1b
- adr r4, .LCMachTypes
- add r4, r4, r1, lsl #4
- ldmia r4, {r4, r5, r6, r7}
/*
- * r4 = page dir in physical ram
+ * Setup the initial page tables. We only setup the barest
+ * amount which are required to get the kernel running, which
+ * generally means mapping in the kernel code.
+ *
+ * We only map in 2MB of RAM, which should be sufficient in
+ * all cases.
+ *
+ * r4 = physical address of page tables
* r5 = physical address of start of RAM
- * r6 = I/O address
+ * r6 = physical IO address
+ * r7 = byte offset into page tables for IO
+ * r8 = page table flags
*/
+__create_page_tables:
mov r0, r4
mov r3, #0
- add r2, r0, #0x4000
-1: str r3, [r0], #4 @ Clear page table
+ add r2, r0, #0x4000 @ Clear page table
+1: str r3, [r0], #4
+ str r3, [r0], #4
+ str r3, [r0], #4
+ str r3, [r0], #4
teq r0, r2
bne 1b
-/*
- * Add enough entries to allow the kernel to be called.
- * It will sort out the real mapping in paging_init.
- * We map in 2MB of memory into (TEXTADDR-0x8000) + 2MB
- */
+ /*
+ * map in two sections (2MB) for kernel.
+ * these are marked cacheable and bufferable.
+ */
add r0, r4, #(TEXTADDR - 0x8000) >> 18
- mov r3, #0x0000000c @ SECT_CACHEABLE | SECT_BUFFERABLE
+ mov r3, #0x0c
orr r3, r3, r8
add r3, r3, r5
str r3, [r0], #4
add r3, r3, #1 << 20
str r3, [r0], #4
- add r3, r3, #1 << 20
#ifdef CONFIG_DEBUG_LL
-/* Map in IO space
- * This allows debug messages to be output via a serial
- * before/while paging_init.
- */
+ /*
+ * Map in IO space for serial debugging.
+ * This allows debug messages to be output
+ * via a serial before paging_init.
+ */
add r0, r4, r7
orr r3, r6, r8
add r2, r0, #0x0800
@@ -147,45 +189,39 @@ __entry: teq r0, #0 @ check for illegal entry...
str r3, [r0], #4
add r3, r3, #1 << 20
str r3, [r0], #4
-1:
#endif
#endif
#ifdef CONFIG_ARCH_RPC
-/* Map in screen at 0x02000000 & SCREEN2_BASE
- * Similar reasons here - for debug, and when things go
- * wrong to a certain extent. This is of limited use to
- * non-Acorn RiscPC architectures though.
- */
+ /*
+ * Map in screen at 0x02000000 & SCREEN2_BASE
+ * Similar reasons here - for debug. This is
+ * only for Acorn RiscPC architectures.
+ */
teq r5, #0
- addne r0, r4, #0x80 @ 02000000
+ addne r0, r4, #0x80 @ 02000000
movne r3, #0x02000000
orrne r3, r3, r8
strne r3, [r0]
- addne r0, r4, #0x3600 @ d8000000
+ addne r0, r4, #0x3600 @ d8000000
strne r3, [r0]
#endif
- b aligned_call
-/*
- * The following should work on both v3 and v4 implementations
- * Note: it seems that if the mov pc,lr is on the next cache
- * line, it doesn't get fetched before the MMU starts
- * translating, which prevents the kernel from booting.
- * Ensure that this never happens.
- */
- .align 5
-aligned_call:
- mov lr, pc
- mov pc, r10 @ Call processor flush (returns ctrl reg)
- adr r5, __entry
- sub r10, r10, r5 @ Make r10 PIC
- ldr lr, .Lbranch
- mcr p15, 0, r0, c1, c0 @ Enable MMU & caches. In 3 instructions
- @ we lose this page!
mov pc, lr
-.Lerror:
+
+
+/*
+ * Exception handling. Something went wrong and we can't
+ * proceed. We ought to tell the user, but since we
+ * don't have any guarantee that we're even running on
+ * the right architecture, we do virtually nothing.
+ * r0 = ascii error character
+ *
+ * Generally, only serious errors cause this.
+ */
+__error:
#ifdef CONFIG_ARCH_RPC
-/* Turn the screen red on a error - RiscPC only.
+/*
+ * Turn the screen red on a error - RiscPC only.
*/
mov r0, #0x02000000
mov r3, #0x11
@@ -199,356 +235,171 @@ aligned_call:
1: mov r0, r0
b 1b
-.Lbranch: .long .Lalready_done_mmap @ Real address of routine
- @ DEC EBSA110 (pg dir phys, phys ram start, phys i/o)
-.LCMachTypes: .long SYMBOL_NAME(swapper_pg_dir) - 0xc0000000 @ Address of page tables (physical)
- .long 0 @ Address of RAM
- .long 0xe0000000 @ I/O address
- .long 0x3800
- @ Acorn RiscPC
- .long SYMBOL_NAME(swapper_pg_dir) - 0xc0000000 + 0x10000000
- .long 0x10000000
- .long 0x03000000
- .long 0x3800
+/*
+ * Read processor ID register (CP#15, CR0), and determine
+ * processor type.
+ *
+ * Returns:
+ * r5, r6, r7 corrupted
+ * r8 = page table flags
+ * r9 = processor ID
+ * r10 = pointer to processor structure
+ */
+__lookup_processor_type:
+ adr r5, 2f
+ ldmia r5, {r7, r9, r10}
+ sub r5, r5, r9
+ add r7, r7, r5
+ add r10, r10, r5
+ mrc p15, 0, r9, c0, c0 @ get processor id
+1: ldmia r10, {r5, r6, r8} @ value, mask, mmuflags
+ eor r5, r5, r9
+ tst r5, r6
+ moveq pc, lr
+ add r10, r10, #36 @ sizeof(proc_info_list)
+ cmp r10, r7
+ blt 1b
+ mov r10, #0
+ mov pc, lr
- @ EBSIT ???
- .long SYMBOL_NAME(swapper_pg_dir) - 0xc0000000
- .long 0
- .long 0xe0000000
- .long 0x3800
+2: .long __proc_info_end
+ .long 2b
+ .long __proc_info_begin
- @ NexusPCI
- .long SYMBOL_NAME(swapper_pg_dir) - 0xc0000000 + 0x40000000
- .long 0x40000000
- .long 0x10000000
- .long 0x3800
-
- @ DEC EBSA285
- .long SYMBOL_NAME(swapper_pg_dir) - 0xc0000000 @ Address of page tables (physical)
- .long 0 @ Address of RAM
- .long 0x24000000 @ I/O base address (0x42000000 -> 0xFE000000)
- .long 0x3800
-
- @ Corel VNC
- .long SYMBOL_NAME(swapper_pg_dir) - 0xc0000000 @ Address of page tables (physical)
- .long 0 @ Address of RAM
- .long 0x24000000 @ I/O base address (0x42000000 -> 0xfe000000)
- .long 0x3800
-
- @ CATS
- .long SYMBOL_NAME(swapper_pg_dir) - 0xc0000000 @ Address of page tables (physical)
- .long 0 @ Address of RAM
- .long 0x24000000 @ I/O base address (0x42000000 -> 0xfe000000)
- .long 0x3800
-
- @ tbox
- .long SYMBOL_NAME(swapper_pg_dir) - 0xc0000000 + 0x80000000
- .long 0x80000000 @ Address of RAM
- .long 0x00400000 @ Uart
- .long 0x3800
-
- @ DEC EBSA285 as co-processor
- .long 0x4000 @ Address of page tables (physical)
- .long 0 @ Address of RAM
- .long DC21285_ARMCSR_BASE @ Physical I/O base address
- .long 0x7cf00000 >> 18 @ Virtual I/O base address
-
- @ SA1100
- .long SYMBOL_NAME(swapper_pg_dir) - 0xc0000000 + 0xc0000000
- .long 0xc0000000
- .long 0x80000000 @ IO mapping will change when kernel gets on its feet
- .long 0x3800
-
-.LCProcTypes: @ ARM6 / 610
- .long 0x41560600
- .long 0xffffff00
- .long 0x00000c12
- b .Larmv3_flush_early @ arm v3 flush & ctrl early setup
+/*
+ * Lookup machine architecture
+ * r1 = machine architecture number
+ * Returns:
+ * r4 = physical address of page tables
+ * r5 = physical start address of RAM
+ * r6 = physical address of IO
+ * r7 = byte offset into page tables for IO
+ */
+__lookup_architecture_type:
+ cmp r1, #(__arch_types_end - __arch_types_start) / 16
+ bge 1f
+ adr r4, __arch_types_start
+ add r4, r4, r1, lsl #4
+ ldmia r4, {r4, r5, r6, r7}
+ add r4, r5, #SWAPPER_PGDIR_OFFSET
+ mov r7, r7, lsr #18
mov pc, lr
-
- @ ARM7
- .long 0x41007000
- .long 0xfffff000
- .long 0x00000c12
- b .Larmv3_flush_late @ arm v3 flush & ctrl late setup
+1: mov r7, #0
mov pc, lr
- @ ARM710
- .long 0x41007000
- .long 0xfff8f000 @ arm710 processors are weird
- .long 0x00000c12
- b .Larmv3_flush_late @ arm v3 flush & ctrl late setup
- mov pc, lr
+/*
+ * Machine parameters. Each machine requires 4 words, which are:
+ *
+ * word0: unused
+ * word1: physical start address of RAM
+ * word2: physical start address of IO
+ * word3: virtual start address of IO
+ *
+ * The IO mappings entered here are used to set up mappings
+ * required for debugging information to be shown to the user.
+ * paging_init() does the real page table initialisation.
+ */
+ @ 0x00 - DEC EBSA110
+__arch_types_start:
+ .long 0
+ .long 0
+ .long 0xe0000000
+ .long 0xe0000000
- @ StrongARM-110 and StrongARM-1100
- .long 0x4401a100 @ 4401a100 and 4401a110
- .long 0xffffffe0
- .long 0x00000c02
- b .Larmv4_flush_early
- b .Lsa_fastclock
+ @ 0x01 - Acorn RiscPC
+ .long 0
+ .long 0x10000000
+ .long 0x03000000
+ .long 0xe0000000
+ @ 0x02 - Unused
+ .long 0
.long 0
- .align
+ .long 0xe0000000
+ .long 0xe0000000
-.Larmv3_flush_early:
- mov r0, #0
- mcr p15, 0, r0, c7, c0 @ flush caches on v3
- mcr p15, 0, r0, c5, c0 @ flush TLBs on v3
- mcr p15, 0, r4, c2, c0 @ load page table pointer
- mov r0, #0x1f @ Domains 0, 1 = client
- mcr p15, 0, r0, c3, c0 @ load domain access register
-#ifdef CONFIG_ALIGNMENT_TRAP
- mov r0, #0x3f @ ....S..DPWCAM
-#else
- mov r0, #0x3d @ ....S..DPWC.M
-#endif
- orr r0, r0, #0x100
- mov pc, lr
+ @ 0x03 - NexusPCI
+ .long 0
+ .long 0x40000000
+ .long 0x10000000
+ .long 0xe0000000
-.Larmv3_flush_late:
- mov r0, #0
- mcr p15, 0, r0, c7, c0 @ flush caches on v3
- mcr p15, 0, r0, c5, c0 @ flush TLBs on v3
- mcr p15, 0, r4, c2, c0 @ load page table pointer
- mov r0, #0x1f @ Domains 0, 1 = client
- mcr p15, 0, r0, c3, c0 @ load domain access register
-#ifdef CONFIG_ALIGNMENT_TRAP
- mov r0, #0x7f @ ....S.LDPWCAM
-#else
- mov r0, #0x7d @ ....S.LDPWC.M
-#endif
- orr r0, r0, #0x100
- mov pc, lr
+ @ 0x04 - DEC EBSA285
+ .long 0
+ .long 0
+ .long 0x24000000 @ I/O base address (0x42000000 -> 0xfe000000)
+ .long 0xe0000000
-.Larmv4_flush_early:
- mov r0, #0
- mcr p15, 0, r0, c7, c7 @ flush I,D caches on v4
- mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4
- mcr p15, 0, r0, c8, c7 @ flush I,D TLBs on v4
- mcr p15, 0, r4, c2, c0 @ load page table pointer
- mov r0, #0x1f @ Domains 0, 1 = client
- mcr p15, 0, r0, c3, c0 @ load domain access register
- mrc p15, 0, r0, c1, c0 @ get control register v4
- bic r0, r0, #0x0e00
- bic r0, r0, #0x0002
-#ifdef CONFIG_ALIGNMENT_TRAP
- orr r0, r0, #0x003f @ I...S..DPWCAM
-#else
- orr r0, r0, #0x003d @ I...S..DPWC.M
-#endif
- orr r0, r0, #0x1100 @ v4 supports separate I cache
- mov pc, lr
+ @ 0x05 - Rebel.com NetWinder
+ .long 0
+ .long 0
+ .long 0x24000000 @ I/O base address (0x42000000 -> 0xfe000000)
+ .long 0xe0000000
-.Lsa_fastclock: mcr p15, 0, r4, c15, c1, 2 @ Enable clock switching
- mov pc, lr
+ @ 0x06 - CATS
+ .long 0
+ .long 0
+ .long 0x24000000 @ I/O base address (0x42000000 -> 0xfe000000)
+ .long 0xe0000000
-.LC0: .long SYMBOL_NAME(__entry)
- .long SYMBOL_NAME(__machine_arch_type)
- .long SYMBOL_NAME(__bss_start)
- .long SYMBOL_NAME(processor_id)
- .long SYMBOL_NAME(_end)
- .long SYMBOL_NAME(cr_alignment)
- .long SYMBOL_NAME(init_task_union)+8192
- .align
-
-.Lalready_done_mmap:
- adr r4, .LC0
- ldmia r4, {r3, r4, r5, r6, r7, r8, sp} @ Setup stack
- add r10, r10, r3 @ Add base back in
- mov fp, #0
-1: cmp r5, r7 @ Clear BSS
- strcc fp, [r5],#4
- bcc 1b
+ @ 0x07 - tbox
+ .long 0
+ .long 0x80000000
+ .long 0x00400000 @ Uart
+ .long 0xe0000000
- bic r2, r0, #2 @ Clear 'A' bit
- stmia r8, {r0, r2} @ Save control register values
+ @ 0x08 - DEC EBSA285 as co-processor
+ .long 0
+ .long 0
+ .long DC21285_ARMCSR_BASE @ Physical I/O base address
+ .long 0x7cf00000 @ Virtual I/O base address
- str r1, [r4] @ Save machine type
- str r9, [r6] @ Save processor ID
- mov lr, pc
- add pc, r10, #4 @ Call post-processor init
- mov fp, #0
- b SYMBOL_NAME(start_kernel)
+ @ 0x09 - CL-PS7110
+ .long 0
+ .long 0
+ .long 0
+ .long 0
- .text
+ @ 0x0a - Acorn Archimedes
+ .long 0
+ .long 0
+ .long 0
+ .long 0
-#ifdef CONFIG_DEBUG_LL
-/*
- * Some debugging routines (useful if you've got MM problems and
- * printk isn't working). For DEBUGGING ONLY!!! Do not leave
- * references to these in a production kernel!
- */
-#if defined(CONFIG_ARCH_RPC)
- .macro addruart,rx
- mov \rx, #0xe0000000
- orr \rx, \rx, #0x00010000
- orr \rx, \rx, #0x00000fe0
- .endm
-
- .macro senduart,rd,rx
- strb \rd, [\rx]
- .endm
-
- .macro busyuart,rd,rx
-1002: ldrb \rd, [\rx, #0x14]
- and \rd, \rd, #0x60
- teq \rd, #0x60
- bne 1002b
- .endm
-
- .macro waituart,rd,rx
-1001: ldrb \rd, [\rx, #0x18]
- tst \rd, #0x10
- beq 1001b
- .endm
-
-#elif defined(CONFIG_ARCH_EBSA110)
- .macro addruart,rx
- mov \rx, #0xf0000000
- orr \rx, \rx, #0x00000be0
- .endm
-
- .macro senduart,rd,rx
- strb \rd, [\rx]
- .endm
-
- .macro busyuart,rd,rx
-1002: ldrb \rd, [\rx, #0x14]
- and \rd, \rd, #0x60
- teq \rd, #0x60
- bne 1002b
- .endm
-
- .macro waituart,rd,rx
-1001: ldrb \rd, [\rx, #0x18]
- tst \rd, #0x10
- beq 1001b
- .endm
-
-#elif defined(CONFIG_HOST_FOOTBRIDGE) || defined(CONFIG_ADDIN_FOOTBRIDGE)
-#ifndef CONFIG_DEBUG_DC21285_PORT
- /* For NetWinder debugging */
- .macro addruart,rx
- mov \rx, #0xff000000
- orr \rx, \rx, #0x000003f8
- .endm
-
- .macro senduart,rd,rx
- strb \rd, [\rx]
- .endm
-
- .macro busyuart,rd,rx
-1002: ldrb \rd, [\rx, #0x5]
- and \rd, \rd, #0x60
- teq \rd, #0x60
- bne 1002b
- .endm
-
- .macro waituart,rd,rx
-1001: ldrb \rd, [\rx, #0x6]
- tst \rd, #0x10
- beq 1001b
- .endm
-#else
- /* For EBSA285 debugging */
- .equ dc21285_high, ARMCSR_BASE & 0xff000000
- .equ dc21285_low, ARMCSR_BASE & 0x00ffffff
-
- .macro addruart,rx
- mov \rx, #dc21285_high
- .if dc21285_low
- orr \rx, \rx, #dc21285_low
- .endif
- .endm
-
- .macro senduart,rd,rx
- str \rd, [\rx, #0x160] @ UARTDR
- .endm
-
- .macro busyuart,rd,rx
-1001: ldr \rd, [\rx, #0x178] @ UARTFLG
- tst \rd, #1 << 3
- bne 1001b
- .endm
-
- .macro waituart,rd,rx
- .endm
-#endif
-#elif defined(CONFIG_ARCH_NEXUSPCI)
- .macro addruart,rx
- ldr \rx, =0xfff00000
- .endm
-
- .macro senduart,rd,rx
- str \rd, [\rx, #0xc]
- .endm
-
- .macro busyuart,rd,rx
-1001: ldr \rd, [\rx, #0x4]
- tst \rd, #1 << 0
- bne 1001b
- .endm
-
- .macro waituart,rd,rx
- .endm
-#else
-#error Unknown architecture
-#endif
+ @ 0x0b - Acorn A5000
+ .long 0
+ .long 0
+ .long 0
+ .long 0
-/*
- * Useful debugging routines
- */
-ENTRY(printhex8)
- mov r1, #8
- b printhex
-
-ENTRY(printhex4)
- mov r1, #4
- b printhex
-
-ENTRY(printhex2)
- mov r1, #2
-printhex: ldr r2, =hexbuf
- add r3, r2, r1
- mov r1, #0
- strb r1, [r3]
-1: and r1, r0, #15
- mov r0, r0, lsr #4
- cmp r1, #10
- addlt r1, r1, #'0'
- addge r1, r1, #'a' - 10
- strb r1, [r3, #-1]!
- teq r3, r2
- bne 1b
- mov r0, r2
- b printascii
-
- .ltorg
-
-ENTRY(printascii)
- addruart r3
- b 2f
-1: waituart r2, r3
- senduart r1, r3
- busyuart r2, r3
- teq r1, #'\n'
- moveq r1, #'\r'
- beq 1b
-2: teq r0, #0
- ldrneb r1, [r0], #1
- teqne r1, #0
- bne 1b
- mov pc, lr
+ @ 0x0c - Etoile
+ .long 0
+ .long 0
+ .long 0
+ .long 0
-ENTRY(printch)
- addruart r3
- mov r1, r0
- mov r0, #0
- b 1b
+ @ 0x0d - LaCie_NAS
+ .long 0
+ .long 0
+ .long 0
+ .long 0
- .bss
-hexbuf: .space 16
+ @ 0x0e - CL-PS7500
+ .long 0
+ .long 0
+ .long 0
+ .long 0
-#endif
+ @ 0x0f - Shark
+ .long 0
+ .long 0
+ .long 0
+ .long 0
+__arch_types_end:
+ @ unknown - SA1100
+ .long 0
+ .long 0xc0000000
+ .long 0x80000000
+ .long 0xe0000000
diff --git a/arch/arm/kernel/hw-footbridge.c b/arch/arm/kernel/hw-footbridge.c
index 54a64b811..117011e1d 100644
--- a/arch/arm/kernel/hw-footbridge.c
+++ b/arch/arm/kernel/hw-footbridge.c
@@ -25,269 +25,8 @@
#include <asm/system.h>
#define IRDA_IO_BASE 0x180
-#define ETHER10_IO_BASE 0x301
#define GP1_IO_BASE 0x338
#define GP2_IO_BASE 0x33a
-#define DEC21143_IO_BASE 0x401
-#define DEC21143_MEM_BASE 0x00800000
-#define CYBER2000_MEM_BASE 0x01000000
-
-int have_isa_bridge;
-
-extern int setup_arm_irq(int, struct irqaction *);
-extern void pci_set_cmd(struct pci_dev *dev, unsigned short clear, unsigned short set);
-extern void pci_set_base_addr(struct pci_dev *dev, int idx, unsigned int addr);
-extern void pci_set_irq_line(struct pci_dev *dev, unsigned int irq);
-extern void (*kd_mksound)(unsigned int hz, unsigned int ticks);
-
-#ifdef CONFIG_PCI
-
-static int irqmap_ebsa[] __initdata = { IRQ_IN1, IRQ_IN0, IRQ_PCI, IRQ_IN3 };
-
-static int __init ebsa_irqval(struct pci_dev *dev)
-{
- unsigned char pin;
-
- pcibios_read_config_byte(dev->bus->number,
- dev->devfn,
- PCI_INTERRUPT_PIN,
- &pin);
-
- return irqmap_ebsa[(PCI_SLOT(dev->devfn) + pin) & 3];
-}
-
-#ifdef CONFIG_CATS
-static int irqmap_cats[] __initdata = { IRQ_PCI, IRQ_IN0, IRQ_IN1, IRQ_IN3 };
-
-static int __init cats_irqval(struct pci_dev *dev)
-{
- if (dev->irq >= 128)
- return 16 + (dev->irq & 0x1f);
-
- switch (dev->irq) {
- case 1:
- case 2:
- case 3:
- case 4:
- return irqmap_cats[dev->irq - 1];
- case 0:
- return 0;
- }
-
- printk("PCI: device %02x:%02x has unknown irq line %x\n",
- dev->bus->number, dev->devfn, dev->irq);
- return 0;
-}
-#endif
-
-void __init pcibios_fixup_ebsa285(struct pci_dev *dev)
-{
- /* Latency timer of 32 */
- pci_write_config_byte(dev, PCI_LATENCY_TIMER, 32);
-
- /* 32-byte cache line size */
- pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, 8);
-
- /* Set SysErr enable, Parity enable */
- pci_set_cmd(dev, 0, PCI_COMMAND_FAST_BACK | PCI_COMMAND_SERR | PCI_COMMAND_PARITY);
-
- /* If this device is an ISA bridge, set the
- * have_isa_bridge flag. We will then go looking
- * for things like keyboard, etc
- */
- if ((dev->class >> 8) == PCI_CLASS_BRIDGE_ISA ||
- (dev->class >> 8) == PCI_CLASS_BRIDGE_EISA)
- have_isa_bridge = !0;
-
- /* sort out the irq mapping for this device */
- switch (machine_arch_type) {
- case MACH_TYPE_EBSA285:
- dev->irq = ebsa_irqval(dev);
- /* Turn on bus mastering - boot loader doesn't
- * - perhaps it should! - dag
- */
- pci_set_cmd(dev, 0, PCI_COMMAND_MASTER);
- break;
-
-#ifdef CONFIG_CATS
- case MACH_TYPE_CATS:
- dev->irq = cats_irqval(dev);
- /* Turn on bus mastering - boot loader doesn't
- * - perhaps it should! - dag
- */
- pci_set_cmd(dev, 0, PCI_COMMAND_MASTER);
- break;
-#endif
-#ifdef CONFIG_ARCH_NETWINDER
- case MACH_TYPE_NETWINDER:
- /* disable ROM */
- pci_write_config_dword(dev, PCI_ROM_ADDRESS, 0);
-
-#define DEV(v,d) ((v)<<16|(d))
- switch (DEV(dev->vendor, dev->device)) {
- /* Ether 100 */
- case DEV(PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_21142):
- pci_set_base_addr(dev, 0, DEC21143_IO_BASE);
- pci_set_base_addr(dev, 1, DEC21143_MEM_BASE);
- pci_set_cmd(dev, 0, PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY | PCI_COMMAND_IO);
- /* Put the chip to sleep in case the driver isn't loaded */
- pci_write_config_dword(dev, 0x40, 0x80000000);
- dev->irq = IRQ_NETWINDER_ETHER100;
- break;
-
- /* Ether 10 */
- case DEV(PCI_VENDOR_ID_WINBOND2,0x5a5a):
- pci_set_base_addr(dev, 0, ETHER10_IO_BASE);
- pci_set_cmd(dev, PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY, PCI_COMMAND_IO);
- dev->irq = IRQ_NETWINDER_ETHER10;
- break;
-
- /* ISA bridge */
- case DEV(PCI_VENDOR_ID_WINBOND,PCI_DEVICE_ID_WINBOND_83C553):
- pci_set_base_addr(dev, 0, 0);
- pci_set_cmd(dev, PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY, PCI_COMMAND_IO);
- /*
- * Enable all memory requests from ISA to be channeled to PCI
- */
- pci_write_config_byte(dev, 0x48, 255);
- /*
- * Disable ping-pong (as per errata)
- */
- pci_write_config_byte(dev, 0x42, 0);
- /*
- * Enable PCI packet retry
- */
- pci_write_config_byte(dev, 0x40, 0x22);
- /*
- * Do not use PCI CPU park enable, park on
- * last master, disable GAT bit
- */
- pci_write_config_byte(dev, 0x83, 0x02);
- /*
- * Default rotating priorities
- */
- pci_write_config_byte(dev, 0x80, 0xe0);
- /*
- * Rotate bank 4
- */
- pci_write_config_byte(dev, 0x81, 0x01);
- break;
-
- /* IDE */
- case DEV(PCI_VENDOR_ID_WINBOND,PCI_DEVICE_ID_WINBOND_82C105):
- pci_set_base_addr(dev, 0, 0x1f1);
- pci_set_base_addr(dev, 1, 0x3f5);
- pci_set_base_addr(dev, 2, 0x171);
- pci_set_base_addr(dev, 3, 0x375);
- pci_set_base_addr(dev, 4, 0xe801);
- pci_set_cmd(dev, PCI_COMMAND_MEMORY, PCI_COMMAND_MASTER | PCI_COMMAND_IO);
- dev->irq = IRQ_ISA_HARDDISK1;
- break;
-
- /* VGA */
- case DEV(PCI_VENDOR_ID_INTERG,0x2000):
- pci_set_base_addr(dev, 0, CYBER2000_MEM_BASE);
- pci_set_cmd(dev, PCI_COMMAND_MASTER, PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
- dev->irq = IRQ_NETWINDER_VGA;
- break;
- }
-#endif
- }
-}
-
-static inline void
-report_pci_dev_error(void)
-{
- struct pci_dev *dev;
-
- for (dev = pci_devices; dev; dev = dev->next) {
- unsigned short status;
-
- pci_read_config_word(dev, PCI_STATUS, &status);
- if (status & 0xf900) {
- printk(KERN_DEBUG "PCI: [%04X:%04X] status = %X\n",
- dev->vendor, dev->device, status);
-
- pci_write_config_word(dev, PCI_STATUS, status & 0xf900);
- }
- }
-}
-#else
-#define report_pci_dev_error()
-#endif
-
-/*
- * Warn on PCI errors. Please report any occurances!
- */
-static void
-irq_pci_err(int irq, void *dev_id, struct pt_regs *regs)
-{
- static unsigned long next_warn;
- unsigned long cmd = *CSR_PCICMD & 0x0000ffff;
- unsigned long ctrl = (*CSR_SA110_CNTL) & 0xffffde07;
- unsigned long irqstatus = *CSR_IRQ_RAWSTATUS;
- int warn = time_after_eq(jiffies, next_warn);
-
- ctrl |= SA110_CNTL_DISCARDTIMER;
-
- if (warn) {
- next_warn = jiffies + 3 * HZ / 100;
- printk(KERN_DEBUG "PCI: ");
- }
-
- if (irqstatus & (1 << 31)) {
- if (warn)
- printk("parity error ");
- cmd |= 1 << 31;
- }
-
- if (irqstatus & (1 << 30)) {
- if (warn)
- printk("target abort ");
- cmd |= 1 << 28;
- }
-
- if (irqstatus & (1 << 29)) {
- if (warn)
- printk("master abort ");
- cmd |= 1 << 29;
- }
-
- if (irqstatus & (1 << 28)) {
- if (warn)
- printk("data parity error ");
- cmd |= 1 << 24;
- }
-
- if (irqstatus & (1 << 27)) {
- if (warn)
- printk("discard timer expired ");
- ctrl &= ~SA110_CNTL_DISCARDTIMER;
- }
-
- if (irqstatus & (1 << 23)) {
- if (warn)
- printk("system error ");
- ctrl |= SA110_CNTL_RXSERR;
- }
-
- if (warn)
- printk("pc=[<%08lX>]\n", instruction_pointer(regs));
-
- report_pci_dev_error();
-
- *CSR_PCICMD = cmd;
- *CSR_SA110_CNTL = ctrl;
-}
-
-static struct irqaction irq_pci_error = {
- irq_pci_err, SA_INTERRUPT, 0, "PCI error", NULL, NULL
-};
-
-void __init pcibios_init_ebsa285(void)
-{
- setup_arm_irq(IRQ_PCI_ERR, &irq_pci_error);
-}
/*
* Netwinder stuff
@@ -627,7 +366,7 @@ void __netwinder_text cpld_modify(int mask, int set)
current_cpld = (current_cpld & ~mask) | set;
- gpio_modify_io(GPIO_DATA, 0);
+ gpio_modify_io(GPIO_DATA | GPIO_IOCLK | GPIO_IOLOAD, 0);
gpio_modify_op(GPIO_IOLOAD, 0);
for (msk = 8; msk; msk >>= 1) {
@@ -647,7 +386,7 @@ static void __init cpld_init(void)
unsigned long flags;
spin_lock_irqsave(&gpio_lock, flags);
- cpld_modify(-1, CPLD_UNMUTE | 4);
+ cpld_modify(-1, CPLD_UNMUTE | CPLD_7111_DISABLE);
spin_unlock_irqrestore(&gpio_lock, flags);
}
@@ -713,12 +452,15 @@ static inline void rwa010_global_init(void)
dprintk("Card no = %d\n", inb(0x203));
+ /* disable the modem section of the chip */
WRITE_RWA(7, 3);
WRITE_RWA(0x30, 0);
+ /* disable the cdrom section of the chip */
WRITE_RWA(7, 4);
WRITE_RWA(0x30, 0);
+ /* disable the MPU-401 section of the chip */
WRITE_RWA(7, 2);
WRITE_RWA(0x30, 0);
}
@@ -925,6 +667,7 @@ void __init hw_init(void)
extern void register_isa_ports(unsigned int, unsigned int,
unsigned int);
register_isa_ports(DC21285_PCI_MEM, DC21285_PCI_IO, 0);
+
#ifdef CONFIG_ARCH_NETWINDER
/*
* this ought to have a better home...
diff --git a/arch/arm/kernel/init_task.c b/arch/arm/kernel/init_task.c
index e3853f3d5..1a379ee10 100644
--- a/arch/arm/kernel/init_task.c
+++ b/arch/arm/kernel/init_task.c
@@ -1,4 +1,5 @@
#include <linux/mm.h>
+#include <linux/fs.h>
#include <linux/sched.h>
#include <asm/uaccess.h>
diff --git a/arch/arm/kernel/ioport.c b/arch/arm/kernel/ioport.c
index bae897747..d40ea1cf1 100644
--- a/arch/arm/kernel/ioport.c
+++ b/arch/arm/kernel/ioport.c
@@ -9,10 +9,12 @@
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/ioport.h>
+#include <linux/mm.h>
#include <asm/pgtable.h>
#include <asm/uaccess.h>
+#ifdef CONFIG_CPU_32
asmlinkage int sys_iopl(unsigned long turn_on)
{
if (turn_on && !capable(CAP_SYS_RAWIO))
@@ -25,3 +27,9 @@ asmlinkage int sys_iopl(unsigned long turn_on)
return 0;
}
+#else
+asmlinkage int sys_iopl(unsigned long turn_on)
+{
+ return -ENOSYS;
+}
+#endif
diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c
index 41e2050e6..f6c310905 100644
--- a/arch/arm/kernel/irq.c
+++ b/arch/arm/kernel/irq.c
@@ -494,8 +494,5 @@ void __init init_IRQ(void)
}
irq_init_irq();
-#ifdef CONFIG_ARCH_ACORN
- init_FIQ();
-#endif
init_dma();
}
diff --git a/arch/arm/kernel/leds-footbridge.c b/arch/arm/kernel/leds-footbridge.c
index 6b4cb001b..90f2fe109 100644
--- a/arch/arm/kernel/leds-footbridge.c
+++ b/arch/arm/kernel/leds-footbridge.c
@@ -138,7 +138,7 @@ static void __netwinder_text netwinder_leds_event(led_event_t evt)
switch (evt) {
case led_start:
led_state |= LED_STATE_ENABLED;
- hw_led_state = 0;
+ hw_led_state = GPIO_GREEN_LED;
break;
case led_stop:
@@ -223,26 +223,20 @@ static void dummy_leds_event(led_event_t evt)
{
}
-void __init
+static void __init
init_leds_event(led_event_t evt)
{
- switch (machine_arch_type) {
+ leds_event = dummy_leds_event;
+
#ifdef CONFIG_FOOTBRIDGE
- case MACH_TYPE_EBSA285:
- case MACH_TYPE_CO285:
+ if (machine_is_ebsa285() || machine_is_co285())
leds_event = ebsa285_leds_event;
- break;
#endif
#ifdef CONFIG_ARCH_NETWINDER
- case MACH_TYPE_NETWINDER:
+ if (machine_is_netwinder())
leds_event = netwinder_leds_event;
- break;
#endif
- default:
- leds_event = dummy_leds_event;
- }
-
leds_event(evt);
}
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
index 776dc9b88..ab92aae52 100644
--- a/arch/arm/kernel/process.c
+++ b/arch/arm/kernel/process.c
@@ -1,7 +1,7 @@
/*
* linux/arch/arm/kernel/process.c
*
- * Copyright (C) 1996 Russell King - Converted to ARM.
+ * Copyright (C) 1996-1999 Russell King - Converted to ARM.
* Origional Copyright (C) 1995 Linus Torvalds
*/
@@ -32,6 +32,7 @@
#include <asm/uaccess.h>
#include <asm/system.h>
+#include <asm/arch/system.h>
#include <asm/io.h>
extern char *processor_modes[];
@@ -60,26 +61,38 @@ void cpu_idle(void)
current->priority = 0;
current->counter = -100;
while (1) {
- if (!current->need_resched && !hlt_counter)
- proc_idle();
- schedule();
+ if (!hlt_counter)
+ arch_do_idle();
+ if (current->need_resched) {
+ schedule();
#ifndef CONFIG_NO_PGT_CACHE
- check_pgt_cache();
+ check_pgt_cache();
#endif
+ }
}
}
static char reboot_mode = 'h';
-void __init reboot_setup(char *str, int *ints)
+int __init reboot_setup(char *str)
{
reboot_mode = str[0];
+ return 0;
}
+__setup("reboot=", reboot_setup);
+
void machine_restart(char * __unused)
{
+ /*
+ * Turn off caches, interrupts, etc
+ */
+ cpu_proc_fin();
+
arch_reset(reboot_mode);
- panic("Reboot failed\n");
+
+ printk("Reboot failed -- System halted\n");
+
while (1);
}
@@ -135,6 +148,35 @@ void show_regs(struct pt_regs * regs)
#endif
}
+void show_fpregs(struct user_fp *regs)
+{
+ int i;
+
+ for (i = 0; i < 8; i++) {
+ unsigned long *p;
+ char type;
+
+ p = (unsigned long *)(regs->fpregs + i);
+
+ switch (regs->ftype[i]) {
+ case 1: type = 'f'; break;
+ case 2: type = 'd'; break;
+ case 3: type = 'e'; break;
+ default: type = '?'; break;
+ }
+ if (regs->init_flag)
+ type = '?';
+
+ printk(" f%d(%c): %08lx %08lx %08lx%c",
+ i, type, p[0], p[1], p[2], i & 1 ? '\n' : ' ');
+ }
+
+
+ printk("FPSR: %08lx FPCR: %08lx\n",
+ (unsigned long)regs->fpsr,
+ (unsigned long)regs->fpcr);
+}
+
/*
* Task structure and kernel stack allocation.
*
@@ -206,6 +248,7 @@ void exit_thread(void)
void flush_thread(void)
{
memset(&current->thread.debug, 0, sizeof(current->thread.debug));
+ memset(&current->thread.fpstate, 0, sizeof(current->thread.fpstate));
current->used_math = 0;
current->flags &= ~PF_USEDFPU;
}
@@ -237,12 +280,10 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long esp,
*/
int dump_fpu (struct pt_regs *regs, struct user_fp *fp)
{
- int fpvalid = 0;
-
if (current->used_math)
- memcpy (fp, &current->thread.fpstate.soft, sizeof (fp));
+ memcpy(fp, &current->thread.fpstate.soft, sizeof (fp));
- return fpvalid;
+ return current->used_math;
}
/*
@@ -281,6 +322,7 @@ void dump_thread(struct pt_regs * regs, struct user * dump)
*/
pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)
{
+ extern long sys_exit(int) __attribute__((noreturn));
pid_t __ret;
__asm__ __volatile__(
diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c
index 6104b4dbe..0692d1a6c 100644
--- a/arch/arm/kernel/ptrace.c
+++ b/arch/arm/kernel/ptrace.c
@@ -447,8 +447,8 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
unsigned long tmp;
ret = read_long(child, addr, &tmp);
- if (ret)
- put_user(tmp, (unsigned long *) data);
+ if (!ret)
+ ret = put_user(tmp, (unsigned long *) data);
goto out;
}
diff --git a/arch/arm/kernel/semaphore.c b/arch/arm/kernel/semaphore.c
index 1bb21be3f..71bf85e09 100644
--- a/arch/arm/kernel/semaphore.c
+++ b/arch/arm/kernel/semaphore.c
@@ -8,6 +8,7 @@
* Modified for ARM by Russell King
*/
#include <linux/sched.h>
+#include <linux/errno.h>
#include <asm/semaphore.h>
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index 8258bd767..b09b3798b 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -10,36 +10,27 @@
*/
#include <linux/config.h>
-#include <linux/errno.h>
-#include <linux/sched.h>
#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/stddef.h>
-#include <linux/unistd.h>
-#include <linux/ptrace.h>
-#include <linux/malloc.h>
-#include <linux/user.h>
-#include <linux/a.out.h>
#include <linux/tty.h>
#include <linux/ioport.h>
#include <linux/delay.h>
-#include <linux/major.h>
#include <linux/utsname.h>
#include <linux/blk.h>
-#include <linux/init.h>
#include <linux/console.h>
+#include <linux/init.h>
#include <asm/elf.h>
#include <asm/hardware.h>
#include <asm/io.h>
-#include <asm/pgtable.h>
#include <asm/procinfo.h>
-#include <asm/segment.h>
#include <asm/setup.h>
#include <asm/system.h>
+#ifndef MEM_SIZE
#define MEM_SIZE (16*1024*1024)
-#define COMMAND_LINE_SIZE 256
+#endif
#ifndef CONFIG_CMDLINE
#define CONFIG_CMDLINE ""
@@ -50,7 +41,6 @@
#endif
extern void reboot_setup(char *str, int *ints);
-extern void fpe_init(void);
extern void disable_hlt(void);
struct drive_info_struct { char dummy[32]; } drive_info;
@@ -64,10 +54,9 @@ struct screen_info screen_info = {
};
extern int root_mountflags;
-extern int _etext, _edata, _end;
+extern int _text, _etext, _edata, _end;
unsigned char aux_device_present;
-
char elf_platform[ELF_PLATFORM_SIZE];
unsigned int elf_hwcap;
@@ -76,13 +65,16 @@ unsigned int elf_hwcap;
*/
unsigned int processor_id;
unsigned int __machine_arch_type;
+unsigned int vram_size;
+unsigned int system_rev;
+unsigned int system_serial_low;
+unsigned int system_serial_high;
#ifdef MULTI_CPU
struct processor processor;
#endif
#ifdef CONFIG_ARCH_ACORN
-int memc_ctrl_reg;
-int number_mfm_drives;
-unsigned int vram_size;
+unsigned int memc_ctrl_reg;
+unsigned int number_mfm_drives;
#endif
static struct proc_info_item proc_info;
@@ -95,39 +87,41 @@ static union { char c[4]; unsigned long l; } endian_test __initdata = { { 'l', '
* symbol to be empty if not configured.
*/
-/*
- * initial ram disk
- */
-#ifdef CONFIG_BLK_DEV_INITRD
-static void __init
-check_initrd(unsigned long mem_start, unsigned long mem_end)
+static void __init setup_processor(void)
{
- if (initrd_end > mem_end) {
- printk ("initrd extends beyond end of memory "
- "(0x%08lx > 0x%08lx) - disabling initrd\n",
- initrd_end, mem_end);
- initrd_start = 0;
- }
-}
+ extern struct proc_info_list __proc_info_begin, __proc_info_end;
+ struct proc_info_list *list;
-#else
-#define check_initrd(ms,me)
-#endif
+ /*
+ * locate processor in the list of supported processor
+ * types. The linker builds this table for us from the
+ * entries in arch/arm/mm/proc-*.S
+ */
+ for (list = &__proc_info_begin; list < &__proc_info_end ; list++)
+ if ((processor_id & list->cpu_mask) == list->cpu_val)
+ break;
-void __init
-setup_processor(void)
-{
- armidindex = 0;
+ /*
+ * If processor type is unrecognised, then we
+ * can do nothing...
+ */
+ if (list >= &__proc_info_end) {
+ printk("CPU configuration botched (ID %08x), unable "
+ "to continue.\n", processor_id);
+ while (1);
+ }
- while ((armidlist[armidindex].id ^ processor_id) &
- armidlist[armidindex].mask)
- armidindex += 1;
+ proc_info = *list->info;
- if (armidlist[armidindex].id == 0)
- while (1);
+#ifdef MULTI_CPU
+ processor = *list->proc;
+#endif
- processor = *armidlist[armidindex].proc;
- processor._proc_init();
+ sprintf(system_utsname.machine, "%s%c", list->arch_name, ENDIANNESS);
+ sprintf(elf_platform, "%s%c", list->elf_name, ENDIANNESS);
+ elf_hwcap = list->elf_hwcap;
+
+ cpu_proc_init();
}
static char default_command_line[COMMAND_LINE_SIZE] __initdata = CONFIG_CMDLINE;
@@ -135,12 +129,13 @@ static char command_line[COMMAND_LINE_SIZE] = { 0, };
char saved_command_line[COMMAND_LINE_SIZE];
static void __init
-setup_mem(char *cmd_line, unsigned long *mem_start, unsigned long *mem_sz)
+setup_mem(char *cmd_line, unsigned long *mem_sz)
{
char c = ' ', *to = command_line;
int len = 0;
- *mem_start = (unsigned long)&_end;
+ if (!*mem_sz)
+ *mem_sz = MEM_SIZE;
for (;;) {
if (c == ' ') {
@@ -181,24 +176,27 @@ setup_mem(char *cmd_line, unsigned long *mem_start, unsigned long *mem_sz)
}
static void __init
-setup_ram(int doload, int prompt, int image_start)
+setup_ramdisk(int doload, int prompt, int image_start, unsigned int rd_sz)
{
#ifdef CONFIG_BLK_DEV_RAM
extern int rd_doload;
extern int rd_prompt;
extern int rd_image_start;
+ extern int rd_size;
rd_image_start = image_start;
rd_prompt = prompt;
rd_doload = doload;
+
+ if (rd_sz)
+ rd_size = rd_sz;
#endif
}
/*
* initial ram disk
*/
-static void __init
-setup_initrd(unsigned int start, unsigned int size)
+static void __init setup_initrd(unsigned int start, unsigned int size)
{
#ifdef CONFIG_BLK_DEV_INITRD
if (start) {
@@ -211,30 +209,62 @@ setup_initrd(unsigned int start, unsigned int size)
#endif
}
-#ifdef CONFIG_ARCH_ACORN
-int memc_ctrl_reg;
-int number_mfm_drives;
-unsigned int vram_size;
+static void __init check_initrd(unsigned long mem_end)
+{
+#ifdef CONFIG_BLK_DEV_INITRD
+ if (initrd_end > mem_end) {
+ printk ("initrd extends beyond end of memory "
+ "(0x%08lx > 0x%08lx) - disabling initrd\n",
+ initrd_end, mem_end);
+ initrd_start = 0;
+ }
#endif
+}
-#ifndef PARAMS_BASE
-#define PARAMS_BASE NULL
-#endif
+/*
+ * Standard memory resources
+ */
+static struct resource system_ram = { "System RAM", 0, 0, IORESOURCE_MEM | IORESOURCE_BUSY };
+static struct resource video_ram = { "Video RAM", 0, 0, IORESOURCE_MEM };
+static struct resource kernel_code = { "Kernel code", 0, 0, IORESOURCE_MEM };
+static struct resource kernel_data = { "Kernel data", 0, 0, IORESOURCE_MEM };
+static struct resource lpt1 = { "reserved", 0x3bc, 0x3be, IORESOURCE_IO | IORESOURCE_BUSY };
+static struct resource lpt2 = { "reserved", 0x378, 0x37f, IORESOURCE_IO | IORESOURCE_BUSY };
+static struct resource lpt3 = { "reserved", 0x278, 0x27f, IORESOURCE_IO | IORESOURCE_BUSY };
+
+static void __init request_standard_resources(unsigned long end)
+{
+ kernel_code.start = __virt_to_bus((unsigned long) &_text);
+ kernel_code.end = __virt_to_bus((unsigned long) &_etext - 1);
+ kernel_data.start = __virt_to_bus((unsigned long) &_etext);
+ kernel_data.end = __virt_to_bus((unsigned long) &_edata - 1);
+ system_ram.start = __virt_to_bus(PAGE_OFFSET);
+ system_ram.end = __virt_to_bus(end - 1);
+
+ request_resource(&iomem_resource, &system_ram);
+ request_resource(&system_ram, &kernel_code);
+ request_resource(&system_ram, &kernel_data);
+ if (video_ram.start != video_ram.end)
+ request_resource(&iomem_resource, &video_ram);
-static union { char c[4]; unsigned long l; } endian_test __initdata = { { 'l', '?', '?', 'b' } };
-#define ENDIANNESS ((char)endian_test.l)
+ /*
+ * Some machines don't have the possibility of ever
+ * possessing LPT1 (lp0) and LPT3 (lp2)
+ */
+ if (machine_is_ebsa110() || machine_is_riscpc() ||
+ machine_is_netwinder())
+ request_resource(&ioport_resource, &lpt1);
+ if (machine_is_riscpc())
+ request_resource(&ioport_resource, &lpt2);
+ if (machine_is_ebsa110() || machine_is_netwinder())
+ request_resource(&ioport_resource, &lpt3);
+}
-void __init
-setup_arch(char **cmdline_p, unsigned long * memory_start_p, unsigned long * memory_end_p)
+void __init setup_arch(char **cmdline_p, unsigned long * memory_start_p, unsigned long * memory_end_p)
{
struct param_struct *params = (struct param_struct *)PARAMS_BASE;
- static unsigned char smptrap;
unsigned long memory_end = 0;
- char *from = NULL;
-
- if (smptrap == 1)
- return;
- smptrap = 1;
+ char *from = default_command_line;
#if defined(CONFIG_ARCH_ARC)
__machine_arch_type = MACH_TYPE_ARCHIMEDES;
@@ -244,10 +274,11 @@ setup_arch(char **cmdline_p, unsigned long * memory_start_p, unsigned long * mem
setup_processor();
- init_mm.start_code = TASK_SIZE;
- init_mm.end_code = TASK_SIZE + (unsigned long) &_etext;
- init_mm.end_data = TASK_SIZE + (unsigned long) &_edata;
- init_mm.brk = TASK_SIZE + (unsigned long) &_end;
+ /*
+ * Defaults
+ */
+ ROOT_DEV = MKDEV(0, 255);
+ setup_ramdisk(1, 1, 0, 0);
/*
* Add your machine dependencies here
@@ -256,14 +287,35 @@ setup_arch(char **cmdline_p, unsigned long * memory_start_p, unsigned long * mem
case MACH_TYPE_EBSA110:
/* EBSA110 locks if we execute 'wait for interrupt' */
disable_hlt();
- if (params && params->u1.s.page_size != 4096)
+ if (params && params->u1.s.page_size != PAGE_SIZE)
params = NULL;
break;
+#ifdef CONFIG_ARCH_ACORN
+#ifdef CONFIG_ARCH_RPC
case MACH_TYPE_RISCPC:
/* RiscPC can't handle half-word loads and stores */
elf_hwcap &= ~HWCAP_HALF;
+ {
+ extern void init_dram_banks(struct param_struct *);
+ init_dram_banks(params);
+ }
+
+ switch (params->u1.s.pages_in_vram) {
+ case 512:
+ vram_size += PAGE_SIZE * 256;
+ case 256:
+ vram_size += PAGE_SIZE * 256;
+ default:
+ break;
+ }
+#endif
+ case MACH_TYPE_ARCHIMEDES:
+ case MACH_TYPE_A5K:
+ memc_ctrl_reg = params->u1.s.memc_control_reg;
+ number_mfm_drives = (params->u1.s.adfsdrives >> 3) & 3;
break;
+#endif
case MACH_TYPE_EBSA285:
if (params) {
@@ -271,6 +323,8 @@ setup_arch(char **cmdline_p, unsigned long * memory_start_p, unsigned long * mem
ORIG_Y = params->u1.s.video_y;
ORIG_VIDEO_COLS = params->u1.s.video_num_cols;
ORIG_VIDEO_LINES = params->u1.s.video_num_rows;
+ video_ram.start = 0x0a0000;
+ video_ram.end = 0x0bffff;
}
break;
@@ -288,53 +342,67 @@ setup_arch(char **cmdline_p, unsigned long * memory_start_p, unsigned long * mem
break;
case MACH_TYPE_CATS:
- /* CATS must use soft-reboot */
+ /* CATS uses soft-reboot by default, since hard reboots
+ * fail on early boards.
+ */
reboot_setup("s", NULL);
+ params = NULL;
+ ORIG_VIDEO_LINES = 25;
+ ORIG_VIDEO_POINTS = 16;
+ ORIG_Y = 24;
+ video_ram.start = 0x0a0000;
+ video_ram.end = 0x0bffff;
break;
case MACH_TYPE_NETWINDER:
/*
* to be fixed in a future NeTTrom
*/
- if (params->u1.s.page_size == 4096) {
+ if (params->u1.s.page_size == PAGE_SIZE) {
if (params->u1.s.nr_pages != 0x2000 &&
params->u1.s.nr_pages != 0x4000) {
printk("Warning: bad NeTTrom parameters detected, using defaults\n");
- /*
- * This stuff doesn't appear to be initialised
- * properly by NeTTrom 2.0.6 and 2.0.7
- */
+ /*
+ * This stuff doesn't appear to be initialised
+ * properly by NeTTrom 2.0.6 and 2.0.7
+ */
params->u1.s.nr_pages = 0x2000; /* 32MB */
params->u1.s.ramdisk_size = 0;
params->u1.s.flags = FLAG_READONLY;
params->u1.s.initrd_start = 0;
params->u1.s.initrd_size = 0;
params->u1.s.rd_start = 0;
- params->u1.s.video_x = 0;
- params->u1.s.video_y = 0;
- params->u1.s.video_num_cols = 80;
- params->u1.s.video_num_rows = 30;
}
} else {
printk("Warning: no NeTTrom parameter page detected, using "
"compiled-in settings\n");
params = NULL;
}
+ video_ram.start = 0x0a0000;
+ video_ram.end = 0x0bffff;
break;
default:
break;
}
- if (params) {
- memory_end = params->u1.s.page_size *
- params->u1.s.nr_pages;
+ if (params && params->u1.s.page_size != PAGE_SIZE) {
+ printk("Warning: wrong page size configuration, "
+ "trying to continue\n");
+ params = NULL;
+ }
- ROOT_DEV = to_kdev_t(params->u1.s.rootdev);
+ if (params) {
+ memory_end = PAGE_SIZE * params->u1.s.nr_pages;
+ ROOT_DEV = to_kdev_t(params->u1.s.rootdev);
+ system_rev = params->u1.s.system_rev;
+ system_serial_low = params->u1.s.system_serial_low;
+ system_serial_high = params->u1.s.system_serial_high;
- setup_ram((params->u1.s.flags & FLAG_RDLOAD) == 0,
- (params->u1.s.flags & FLAG_RDPROMPT) == 0,
- params->u1.s.rd_start);
+ setup_ramdisk((params->u1.s.flags & FLAG_RDLOAD) == 0,
+ (params->u1.s.flags & FLAG_RDPROMPT) == 0,
+ params->u1.s.rd_start,
+ params->u1.s.ramdisk_size);
setup_initrd(params->u1.s.initrd_start,
params->u1.s.initrd_size);
@@ -342,57 +410,27 @@ setup_arch(char **cmdline_p, unsigned long * memory_start_p, unsigned long * mem
if (!(params->u1.s.flags & FLAG_READONLY))
root_mountflags &= ~MS_RDONLY;
-#ifdef CONFIG_ARCH_ACORN
-#ifdef CONFIG_ARCH_RPC
- {
- extern void init_dram_banks(struct param_struct *);
- init_dram_banks(params);
- }
-#endif
-
- memc_ctrl_reg = params->u1.s.memc_control_reg;
- number_mfm_drives = (params->u1.s.adfsdrives >> 3) & 3;
- vram_size = 0;
-
- switch (params->u1.s.pages_in_vram) {
- case 512:
- vram_size += PAGE_SIZE * 256;
- case 256:
- vram_size += PAGE_SIZE * 256;
- default:
- break;
- }
-
- memory_end -= vram_size;
-#endif
-
from = params->commandline;
- } else {
- ROOT_DEV = to_kdev_t(0x00ff);
-
- setup_ram(1, 1, 0);
- setup_initrd(0, 0);
}
- if (!memory_end)
- memory_end = MEM_SIZE;
-
- if (!from)
- from = default_command_line;
-
-#ifdef CONFIG_NWFPE
- fpe_init();
-#endif
-
/* Save unparsed command line copy for /proc/cmdline */
memcpy(saved_command_line, from, COMMAND_LINE_SIZE);
saved_command_line[COMMAND_LINE_SIZE-1] = '\0';
- setup_mem(from, memory_start_p, &memory_end);
+ setup_mem(from, &memory_end);
memory_end += PAGE_OFFSET;
- check_initrd(*memory_start_p, memory_end);
+ *cmdline_p = command_line;
+ init_mm.start_code = (unsigned long) &_text;
+ init_mm.end_code = (unsigned long) &_etext;
+ init_mm.end_data = (unsigned long) &_edata;
+ init_mm.brk = (unsigned long) &_end;
+ *memory_start_p = (unsigned long) &_end;
+ *memory_end_p = memory_end;
+
+ request_standard_resources(memory_end);
+ check_initrd(memory_end);
#ifdef CONFIG_VT
#if defined(CONFIG_VGA_CONSOLE)
@@ -401,40 +439,49 @@ setup_arch(char **cmdline_p, unsigned long * memory_start_p, unsigned long * mem
conswitchp = &dummy_con;
#endif
#endif
-
- *cmdline_p = command_line;
- *memory_end_p = memory_end;
}
static const char *machine_desc[] = {
- "EBSA110",
- "Acorn-RiscPC",
+ /* Machine name Allocater */
+ "EBSA110", /* RMK */
+ "Acorn-RiscPC", /* RMK */
"unknown",
- "Nexus-FTV/PCI",
- "EBSA285",
- "Rebel-NetWinder",
- "Chalice-CATS",
- "unknown-TBOX",
- "co-EBSA285",
- "CL-PS7110",
- "Acorn-Archimedes",
- "Acorn-A5000"
+ "Nexus-FTV/PCI", /* Philip Blundell */
+ "EBSA285", /* RMK */
+ "Rebel-NetWinder", /* RMK */
+ "Chalice-CATS", /* Philip Blundell */
+ "unknown-TBOX", /* Philip Blundell */
+ "co-EBSA285", /* Mark van Doesburg */
+ "CL-PS7110", /* Werner Almesberger */
+ "Acorn-Archimedes", /* RMK/DAG */
+ "Acorn-A5000", /* RMK/PB */
+ "Etoile", /* Alex de Vries */
+ "LaCie_NAS", /* Benjamin Herrenschmidt */
+ "CL-PS7500", /* Philip Blundell */
+ "Shark" /* Alexander Schulz */
};
int get_cpuinfo(char * buffer)
{
- int len;
-
- len = sprintf(buffer,
- "Processor\t: %s %s rev %d (%s)\n"
- "BogoMips\t: %lu.%02lu\n"
- "Hardware\t: %s\n",
- proc_info.manufacturer,
- proc_info.cpu_name,
- (int)processor_id & 15,
- elf_platform,
- (loops_per_sec+2500) / 500000,
- ((loops_per_sec+2500) / 5000) % 100,
- machine_desc[machine_arch_type]);
- return len;
+ char *p = buffer;
+
+ p += sprintf(p, "Processor\t: %s %s rev %d (%s)\n",
+ proc_info.manufacturer, proc_info.cpu_name,
+ (int)processor_id & 15, elf_platform);
+
+ p += sprintf(p, "BogoMIPS\t: %lu.%02lu\n",
+ (loops_per_sec+2500) / 500000,
+ ((loops_per_sec+2500) / 5000) % 100);
+
+ p += sprintf(p, "Hardware\t: %s\n",
+ machine_desc[machine_arch_type]);
+
+ p += sprintf(p, "Revision\t: %04x\n",
+ system_rev);
+
+ p += sprintf(p, "Serial\t\t: %08x%08x\n",
+ system_serial_high,
+ system_serial_low);
+
+ return p - buffer;
}
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c
index 7b2f430c1..3f86f4740 100644
--- a/arch/arm/kernel/signal.c
+++ b/arch/arm/kernel/signal.c
@@ -16,6 +16,8 @@
#include <linux/ptrace.h>
#include <linux/unistd.h>
#include <linux/stddef.h>
+#include <linux/binfmts.h>
+#include <linux/tty.h>
#include <asm/ucontext.h>
#include <asm/uaccess.h>
@@ -550,6 +552,7 @@ asmlinkage int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall)
default:
lock_kernel();
sigaddset(&current->signal, signr);
+ recalc_sigpending(current);
current->flags |= PF_SIGNALED;
do_exit(exit_code);
/* NOTREACHED */
diff --git a/arch/arm/kernel/sys_arm.c b/arch/arm/kernel/sys_arm.c
index 94f158b3e..3d39c8d39 100644
--- a/arch/arm/kernel/sys_arm.c
+++ b/arch/arm/kernel/sys_arm.c
@@ -19,6 +19,7 @@
#include <linux/shm.h>
#include <linux/stat.h>
#include <linux/mman.h>
+#include <linux/fs.h>
#include <linux/file.h>
#include <linux/utsname.h>
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c
index 9f9e6934f..da0d464f6 100644
--- a/arch/arm/kernel/traps.c
+++ b/arch/arm/kernel/traps.c
@@ -365,7 +365,6 @@ asmlinkage void baddataabort(int code, unsigned long instr, struct pt_regs *regs
{
pgd_t *pgd;
- printk ("current->thread.memmap = %08lX\n", current->thread.memmap);
pgd = pgd_offset(current->mm, addr);
printk ("*pgd = %08lx", pgd_val (*pgd));
if (!pgd_none (*pgd)) {