summaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>2000-01-27 01:05:20 +0000
committerRalf Baechle <ralf@linux-mips.org>2000-01-27 01:05:20 +0000
commit546db14ee74118296f425f3b91634fb767d67290 (patch)
tree22b613a3da8d4bf663eec5e155af01b87fdf9094 /arch/arm/kernel
parent1e25e41c4f5474e14452094492dbc169b800e4c8 (diff)
Merge with Linux 2.3.23. The new bootmem stuff has broken various
platforms. At this time I've only verified that IP22 support compiles and IP27 actually works.
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)) {