From 546db14ee74118296f425f3b91634fb767d67290 Mon Sep 17 00:00:00 2001 From: Ralf Baechle Date: Thu, 27 Jan 2000 01:05:20 +0000 Subject: 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. --- arch/arm/kernel/Makefile | 26 +- arch/arm/kernel/armksyms.c | 14 +- arch/arm/kernel/bios32.c | 33 ++ arch/arm/kernel/debug-armo.S | 86 +++++ arch/arm/kernel/debug-armv.S | 206 +++++++++++ arch/arm/kernel/dec21285.c | 399 ++++++++++++--------- arch/arm/kernel/dma-dummy.c | 19 +- arch/arm/kernel/dma-footbridge.c | 5 +- arch/arm/kernel/dma-isa.c | 7 + arch/arm/kernel/dma-rpc.c | 2 + arch/arm/kernel/ecard.c | 4 +- arch/arm/kernel/entry-armv.S | 42 ++- arch/arm/kernel/head-armo.S | 8 +- arch/arm/kernel/head-armv.S | 717 +++++++++++++++----------------------- arch/arm/kernel/hw-footbridge.c | 269 +------------- arch/arm/kernel/init_task.c | 1 + arch/arm/kernel/ioport.c | 8 + arch/arm/kernel/irq.c | 3 - arch/arm/kernel/leds-footbridge.c | 18 +- arch/arm/kernel/process.c | 64 +++- arch/arm/kernel/ptrace.c | 4 +- arch/arm/kernel/semaphore.c | 1 + arch/arm/kernel/setup.c | 363 ++++++++++--------- arch/arm/kernel/signal.c | 3 + arch/arm/kernel/sys_arm.c | 1 + arch/arm/kernel/traps.c | 1 - 26 files changed, 1222 insertions(+), 1082 deletions(-) create mode 100644 arch/arm/kernel/debug-armo.S create mode 100644 arch/arm/kernel/debug-armv.S (limited to 'arch/arm/kernel') 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 #include #include +#include #include #include #include #include #include +#include #include #include #include @@ -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 #include +#include #include #include @@ -72,6 +73,38 @@ struct pci_fixup pcibios_fixups[] = { { 0 } }; +/* + * 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. */ 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 + + .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 +#include +#include +#include + + .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 #include +#include +#include #include #include -#include #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 #include -#include -#include +#include #include -#include #include #include -#include #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 - .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 #include + +#include #include #include +#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 #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 +#include #include #include 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 #include #include +#include #include #include +#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 #include +#include #include 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(¤t->thread.debug, 0, sizeof(current->thread.debug)); + memset(¤t->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, ¤t->thread.fpstate.soft, sizeof (fp)); + memcpy(fp, ¤t->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 +#include #include 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 -#include -#include #include #include #include -#include -#include -#include -#include -#include #include #include #include -#include #include #include -#include #include +#include #include #include #include -#include #include -#include #include #include +#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 #include #include +#include +#include #include #include @@ -550,6 +552,7 @@ asmlinkage int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall) default: lock_kernel(); sigaddset(¤t->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 #include #include +#include #include #include 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)) { -- cgit v1.2.3